Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Численные методы.doc
Скачиваний:
14
Добавлен:
06.08.2019
Размер:
1.68 Mб
Скачать

Метод прямого поиска (конфигураций).

В иностранной литературе метод Хука - Дживса.

Алгоритм состоит из этапов. На первом этапе исследуются точки вблизи базисной , выбранной в качестве начального приближения. На втором этапе производится поиск в выбранном направлении , гарантирующем уменьшение функции.

Сначала задаются начальные значения оптимизируемого вектора х0 и вектора приращений Δх0.

После чего вычисляются F(х0) в точке b1. Затем каждая переменная по очереди изменяется прибавлением длины шага Δх, в направлении х1.

Если это приводит к уменьшению значения функции, то она заменяется на f(х10+ Δх1) и точка также перемещается в этом направлении х1+ Δх1 (b2).

В противном случае вычисляется функция f(х1 - Δх1 ), которая заменяет собой исходную, если она меньше ее и точка перемещается в новое положение х10 – Δх1.

Если умножения функции не происходит, то осуществляется переход к новому х, т.е. к х2 и

расчеты повторяются до тех пор пока не переберутся все n переменных. Если окажется, что точки совпадают l1=l 2 а уменьшение функции не происходит, то уменьшается длина шага (в 10 раз).

Если точки не совпадают, то происходит поиск по образцу. При этом используется информация , полученная на предыдущем этапе. Поиск идет в направлении заданном образцом и приводящем к успеху , те от точки b1 к точке b2

bi3 = bi1 +μ(bi+12 - bi1 )

где i – очередные точки , μ – множитель (при μ=2 bi3 = 2bi+12 - bi1 )

И исследование функции продолжается в окрестности новой базисной точки. Если функция уменьшается, то получается новая базисная точка и шаг поиска по образцу повторяется. В противном случае продолжается исследование в базовой точке.

Процесс завершается, когда длина шага будет уменьшена до заданного малого значения.

Алгоритм эффективен при min-ции f(x) с прямолинейными “оврагами”

procedure XUKA;

var I,J,PS,BS,N:integer; var K,H,FI,FB,Z:real;

type t=array[0..10] of real; var Y,P,B : t;

label 1,2,3,4,5,6,7,8;

begin

H:=0.1; N:=3; K:=H;

for I:=1 to N do

begin Y[I]:=x[I]; P[I]:=x[I]; B[I]:=x[I];

end;

FUNK; Z:=F; FI:=F;

PS:=0; BS:=1; {исследование вокруг базисной точки}

J:=1; FB:=FI;

4: x[J]:=Y[J]+k; FUNK; Z:=F;

if Z<FI then goto 1;

X[J]:=Y[J]-K; FUNK; Z:=F;

if Z<FI then goto 1;

x[J]:=Y[J]; goto 2;

1: Y[J]:=x[J];

2: FUNK; Z:=F; FI:=F; {исследующий поиск}

if J=N then goto 3;

J:=J+1; goto 4;

3: if FI<(FB-1E-8) then goto 5;

{если функция уменьшалась – произвести поиск по образцу}

if ((PS=1) and (BS=0)) then goto 6;

{но если исследование проводилось в точке образца и уменьшение функции не достигнуто, то необходимо изменить базисную точку в 6: иначе уменьшить длину шага в 7:}

6: for I:=1 to N do

begin

P[I]:=B[I]; Y[I]:=B[I]; x[I]:=B[I];

end;

FUNK;

Z:=F; BS:=1; PS:=0; FI:=Z; FB:=Z; J:=1; goto 4; {замена базисной точки}

7: K:=K/10; J:=1; goto 4;

if K<1E-8 then goto 8; {если поиск не закончен, то провести исследование вокруг новой базисной точки}

{поиск по образцу}

5: for I:=1 to N

begin P[I]:=2*Y[I]-B[I]; B[I]:=Y[I]; X[I]:=P[I]; Y[I]:=X[I];

end;

FUNK;

Z:=F; FB:=FI; PS:=1; BS:=0; FI:=Z;

{далее исследование вокруг последней точки образца}

J:=1; goto 4;

8: writeln(x[1]:3, x[2]:3, x[3]:3);

end;

Вектор Х должен быть задан по начальным приближениям и описан в главной программе. Прямые методы поиска не требуют дифференцирования.

Существует метод Нелдера-Мида (поиск по деформируемому многограннику). Он также требует для реализации знание лишь оптимизируемой функции. Эффективен до n 6.