- •Лабораторная работа № 3
- •Постановка задачи
- •Методы безусловной оптимизации
- •Поиск точного значения координаты точки минимума с помощью необходимых и достаточных условий экстремума.
- •1. Метод деформируемого многогранника (метод Нелдера-Мида)
- •2.Метод конфигураций (алгоритм Хука-Дживса)
- •3. Метод Розенброка
- •Сводная таблица
2.Метод конфигураций (алгоритм Хука-Дживса)
Метод представляет собой комбинацию исследующего поиска с циклическим изменением переменных и ускоряющего поиска по образцу.
Целью исследующего
поиска
является определение направления
убывания целевой функции. Исследующий
поиск начинается с начальной точки
,
которую называют старым базисом.
Задается величина шага, которая может быть различной для разных направлений и переменной в процессе поиска. В качестве направлений поиска принимаются направления координат. Фиксируется первое координатное направление и делается шаг в сторону увеличения соответствующей переменной. Если значение функции в пробной точке меньше значения в исходной точке, то шаг считается удачным. В противном случае нужно вернуться в предыдущую точку и сделать шаг в противоположном направлении с последующей проверкой поведения функции.
После перебора
всех координат исследующий поиск
завершается. Полученная точка называется
новым базисом
.
Если исследующий поиск с данной величиной
шага неудачен, то величина шага уменьшается
и процедура поиска продолжается.
Поиск заканчивается, когда текущая величина шага станет меньше заданной величины.
Поиск по
образцу
заключается в движении по направлению
от старого базиса к новому. Величина
шага задается ускоряющим множителем
.
Если при этом значение функции в наилучшей
точке меньше, чем в точке предыдущего
базиса, то поиск по образцу удачен. Если
поиск по образцу неудачен, то производится
возврат в новый базис, где продолжается
исследующий поиск с уменьшенным шагом.
В качестве координатных векторов используются вектора
.
При поиске по
направлению
меняется только переменная
,
а остальные переменные остаются
зафиксированными.
Листинг программы:
[XDJ FDJ]=HookDJ(@func,[3.5 3.5],1,1.1,[1 1],0.001)
Листинг функции HookDJ:
function [x fx] = HookDJ(f,x0,lambda,alpha,dx,eps)
n = length(x0);
d = eye(n);
y1 = x0;
x1 = x0;
b(1,1)=x0(1);
b(2,1)=x0(2);
kk=2;
I = 1;
k=0;
while (1)
while (I <= n)
if (I >= 2)
y1 = y2;
end;
if (f(y1 + dx(i).*d(i,:) < f(y1))
y2 = y1 + dx(i).*d(i,:);
b(1,kk)=y2(1);
b(2,kk)=y2(2);
kk=kk+1;
elseif (f(y1 – dx(i).*d(i,:) < f(y1))
y2 = y1 – dx(i).*d(i,:);
b(1,kk)=y2(1);
b(2,kk)=y2(2);
kk=kk+1;
else
y2 = y1;
b(1,kk)=y2(1);
b(2,kk)=y2(2);
kk=kk+1;
end;
I = I + 1;
end;
if (f(y2) < f(x1))
x1 = y2;
y1 = x1 + lambda.*(y2 – x1);
I = 1;
k=k+1;
continue;
else
flag = false;
for j = 1:n
if (dx(j) > eps)
dx(j) = dx(j)/alpha;
flag = true;
end;
end;
if (flag)
y1 = x1;
I = 1;
k=k+1;
continue;
else
x = x1;
b(1,kk)=x(1);
b(2,kk)=x(2);
kk=kk+1;
fx = f(x);
break;
end;
end;
end;
kDJ=k
q = 0: .1 : 4;
z = 3: .1 :7 ;
[X, Y] = meshgrid(q, z);
Z = X.^2-4*X+4+Y.^2-10*Y+25;
figure;
[Cmatr,h]=contour(X, Y, Z, 6);
clabel(Cmatr,h)
clabel([2 5],h)
xlabel(‘X’);
ylabel(‘Y’);
grid on;
hold on;
plot(b(1,1:kk-1),b(2,1:kk-1),’-*r’);
end
Результаты:
График движения по линиям уровня
