Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб3.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.07 Mб
Скачать

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

Результаты:

График движения по линиям уровня

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]