
- •Учреждение образования белорусский государственный университет информатики и электроники
- •Рабочая программа
- •Тема 9. Применение нелинейного программирования в задачах организации и планирования связи.
- •Тема 10. Динамическое программирование в электросвязи.
- •Тема 11. Сетевые методы планирования и управления.
- •I. Основы оптимизации управленческих решений
- •II. Использование методов линейного программирования в задачах связи
- •III. Транспортная задача линейного программирования в задачах связи
- •IV. Использование методов линейного программирования дня построения графиков работы на предприятиях связи
- •V. Нелинейное програмирование. Одномерный поиск.
- •VI. Методы многомерного поиска
- •VII динамическое программирование
- •Лабораторная работа n 4
- •Метод равномерного поиска
- •Метод поразрядного приближения
- •Метод последовательного перебора
- •Поиск минимума функции одной переменной методом квадратичной параболы
- •Минимизация функции методом Квадратичной интерполяции-экстраполяции
- •Метод пауэлла
- •Литература.
- •3.Построение опорного плана
- •3.1. Метод северо-западного угла.
- •3. 2. Метод наименьшей стоимости.
- •3.3. Метод Фогеля.
- •4.Оптимизация задачи методом потенциалов.
- •Для всех пустых клеток проверим критерий оптимальности:
- •Литература.
Метод последовательного перебора
Суть метода состоит в том, что спускаясь из точки X0 с заданным
шагом h в направлении уменьшения функции устанавливают интервал длиной h, на котором находится минимум и затем его уточняют.
Уточнение можно осуществлять любым ранее изученным методом, либо
повторяя спуск с последней точки, уменьшив шаг и изменив знак.
Алгоритм варианта с уменьшением шага и изменением знака задается x0, шаг h и погрешность e, вычисляется y0=f(x0).
1. Из точки x0 делается шаг вправо x1=x0+h и вычисляется y1=f(x1).
2. Если на первом шаге функция убывает y1<y0, то направление спуска выбрано удачно, переходим на п.3. Иначе меняем направление спуска h=-h, возвращаемся в исходную точку х1=х0, у1=у0 и переходим к п.3. Если оба направления оказались неудачными, то шаг делится на 4 и попытки делаются до тех пор, пока h не станет меньше e (в этом случае Xm=X0 и вычисление прекращается), или функция уменьшится в каком-то направлении.
3. x0=x1, y0=y1 - запоминается удачная точка.
4. Делаем k шагов в сторону убывания, пока f(x0+kh) не станет больше, чем f(x0+(k-1)h),т.е повторяем с п.3, пока y1<y0, иначе п.5.
5. h=-h/4. Шаг уменьшается в 4 раза, меняется его знак, мы перешагнули точку минимума и организуем спуск в обратном направлении.
6. Если ABSh > e/4, тогда повторить с п.3, иначе перейти к п.8.
7. Xm=X0, fm=f0, конец.
Задание: а) составить программу, найти минимальное значение функции;
б) уточнить минимум функции, используя программу поиска условного минимума из лабораторной работы N 1.
Скорость сходимости данных методов существенно зависит от удачного выбора х0 и шага h. Шаг h следует выбирать как половину оценки расстояния от х0 до предполагаемого минимума Xm.
Для ускорения спуска к минимуму из точки Х0 применим следующий подход. Используется несколько значений функции в определенных точках для аппроксимации функции обычным полиномом в небольшой области значений. Затем положение минимума функции аппроксимируется положением минимума полинома, поскольку последний вычислить проще. Это метод аппроксимирующий функцию квадратичным полиномом, он хорошо работает с несложной унимодальной функцией одной переменной, и метод аппроксимирующий функцию кубическим полиномом, он более скоростной чем первый, но и более сложный, так как использует при работе функции цели ее производную.
Поиск минимума функции одной переменной методом квадратичной параболы
Для ускорения спуска к минимуму из некоторой точки Х0 используют локальные свойства функции вблизи этой точки. Так скорость и направление убывания можно определить по величине и знаку первой производной. Вторая производная характеризует направление выпуклости: если f'' > 0, то функция имеет выпуклость вниз, иначе вверх. Вблизи локального безусловного минимума дважды дифференцируемая функция всегда выпукла вниз. Поэтому, если вблизи точки минимума функцию аппроксимировать квадратичной параболой, то она будет иметь минимум. Это свойство и используется в методе квадратичной параболы, суть которого в следующем.
Вблизи точки х0 выбираются три точки х1, х2, х3.
Вычисляется значение F1, F2, F3. Через эти точки проводится квадратичная парабола
P(z)=a*(x-x3)2 + b*(x-x2)+c = a*z2+b*z+c.
z=x-x3, z1=x1-x3, z2=x2-x3, c= F3
(y1-y3)*z2 - (y2-y3)*z1 (y1-y3)*z2*z2 - (y2-y3)*z1*z1
a= ---------------------------, b= ----------------------------------,
z1*z2*(z1-z2) z1*z2*(z2-z1)
Если a > 0, то парабола имеет минимум в точке Zm= -b / (2*a).
Следовательно, можно аппроксимировать положение минимума функции значением Хм1=х3+Zm и, если точность не достигнута, следующий спуск производить из этой точки X=Xm1, получая последовательность Xm1, Xm2, Xm3.... сходящуюся к точке Xm.
Этот метод может непосредственно применяться к функциям одной переменной. Он может быть очень полезен для выполнения линейного поиска в процедурах, где требуется найти минимум функции f(x) в точках прямой X0+LD, где Х0 - заданная точка, а LD определяет заданное направление. Значения функции F(X0+LD) на этой прямой являются значениями функции одной переменной Ф(L)= F(X0+LD).
Эти идеи используются в этой и следующей лабораторных работах.
Предположим, что заданы унимодальная функция 1-й переменной
f(x), начальная аппроксимация положения минимума и длинна шага h,
являющаяся величиной того же порядка, что и расстояние от точки А
до точки истинного минимума х* (данное условие не всегда можно
удовлетворить).
Алгоритм
Введите начальный шаг поиска h, задайте начальное значение X0, погрешность результата e.
1. Вычислить f(x0) и f(x0+h).
2. Если f(x0+h) > f(x0), то взять в качестве третьей точки X0-h и вычислить f(X0-h) [ x1=x0-h, x2=x0, x3=x0+h ].
В противном случае в качестве третьей точки взять X0+2h и найти f(X0+2h) [x1=x0, x2=x0+h, x3=x0+2h ],
3. Вычисляем y1=f(x1), y2=f(x2), y3=f(x3); Вычисляем a, b.
4. Проверяем a>0, если нет, то начальное приближение выбрано неудачно и следует закончить вычисление с таким значением и сделать два шага в сторону убывания функции x0=x0+2h и повторить снова с п.1, пока не выполнится a>0 рис 1.
5. Вычисляем Zm по выше приведенной формуле.
6. Проверяем ABSZm < e, если да, то Xm=x3+Zm, Ym=f(Xm), конец.
7. Если нет, переименовываем точки, отбрасывая точку х1: x1=x2, x2=x3, x3=x3+Zm, находим y1=y2, y2=y3, y3=f(x3).
8. Переходим на п. 4.
В программе, приведенной ниже реализован этот алгоритм.
Данный метод сходится очень быстро и является одним из наилучших методов спуска. Следует отметить, однако, что вблизи минимума расчет по приведенным здесь формулам для a и b приводит к накоплению погрешности из-за потери значащих цифр при вычитании близких чисел. Поэтому разные авторы предлагают свои эквивалентные формулы, счет с которыми более устойчив. Кроме того, в алгоритм вносятся некоторые поправки, позволяющие предусмотреть различные неприятные ситуации - переполнение, деление на 0, уход от корня.
Составить программу этим методом, найти минимальное значение функции и сравнить с результатами, полученными ранее. Сделать вывод.
Программа метода квадратичной параболы
function sqrm(f:func;x0,h,e:real):real;
VAR
it:integer;
t,x1,x2,x3,Xm,y1,y2,y3,Ym,z,z1,z2,z3,a,b,c,Zm:real;
lr,lw:text;
BEGIN
it:=0;
assign(lw,'p4681n46.out');rewrite(lw);
writeln(lw,'Результаты:');
writeln('Результаты: ');
if f(x0+h)>f(x0) then begin x1:=x0-h; x2:=x0; x3:=x0+h; end
else begin x1:=x0; x2:=x0+h; x3:=x0+2*h; end;
y1:=f(x1); y2:=f(x2); y3:=f(x3);
REPEAT
z1:=x1-x3;z2:=x2-x3;c:=y3;
a:=((y1-y3)*z2-(y2-y3)*z1)/(z1*z2*(z1-z2));
b:=((y1-y3)*z2*z2-(y2-y3)*z1*z1)/(z1*z2*(z2-z1));
if a<=0 then begin writeln('x0 выбрано неудачно!');
writeln(lw,'x0 выбрано неудачно!');exit;end;
zm:=-b/(2*a);
if abs(zm)<e then begin xm:=x3+zm;
ym:=f(xm);
writeln('При расчетах получено:');
writeln('Корень равен:.............',xm:12:10);
writeln('Значение функции:........',ym:12:10);
writeln('Количество итераций:.....',it);
close(lw);exit;end;
x1:=x2;x2:=x3;x3:=x3+zm;
y1:=y2;y2:=y3;y3:=f(x3);it:=it+1;
writeln(lw,'X=',x3:13:10,' Y=',y3:13:10);
writeln('X=',x3:13:10,' Y=',y3:13:10);
until(t>0);
end;