Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Метод Хука-Дживса (Метод конфигураций).






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

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

    Сначала задаются начальные значения оптимизируемого вектора параметров х0 и вектора приращений Δ х0. После чего вычисляются F(х0) в базисной точке b1. Затем каждая переменная по очереди изменяется прибавлением длины шага Δ х, в направлении х1. Если это приводит к уменьшению значения функции, то она заменяется на f(х10+ Δ х1) и базисная точка перемещается в этом направлении х1+ Δ х1 (b2).

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

    Если уменьшения функции не происходит, то осуществляется переход к новому х, т.е. к х2 и расчеты повторяются до тех пор пока не переберутся все n переменных.

    Если окажется, что точки совпадают b1 = b 2, а уменьшение функции не происходит, то уменьшается длина вектора приращений Δ х0 (в 10 раз).

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

    где – новая искомая точка, μ – множитель (при μ =2 ).

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

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

    Обследование широкого диапазона возможных значений оптимизируемых параметров по начальным значениям может дать гарантию определения глобального минимума.

     

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

    Он представлен программой №1, написанной на языке Турбо Паскаль.

    Программа №1

    program FUNXUK;

    var Z: real;

    var I, Ik, N: integer;

    type s=array[1..10] of real; var X: s;

    procedure FUNK;

    begin

    Z: =100*sqr(X[2]-sqr(X[1]))+sqr(1-X[1]); Ik: =Ik+1;

    { Z: =sqr(X[1]+10*X[2])+5*sqr(X[3]-X[4])+

    sqr(sqr(X[2]-2*X[3]))+10*sqr(sqr(X[1]-X[4])); }

    end;

    procedure NadMida;

    type vec=array[1..10] of real; var Fz, Xo, Xe, Xr, Xl, Xh, Xg, Xc: vec;

    type mat=array[1..10, 1..10] of real; var S: mat;

    var Fl, Fh, Fc, Fo, Fr, Fg, Fe, K, S1, S2, Sig, Xb, alfa, beta, gamma: real;

    var I, J, G, H, L: integer;

    label 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11;

     

    begin Ik: =0;

    writeln(' Введите число переменных'); read(N);

    writeln(' Введите начальное приближение');

    for I: =1 to N do

    read(S[1, I]);

    writeln(' Введите длину шага'); read(K);

    for I: =2 to N+1 do begin

    for J: =1 to N do

    begin

    if J=I-1 then begin S[I, J]: =S[1, J]+K; goto 1; end;

    S[I, J]: =S[1, J];

    1: end;

    end; { alfa: =1; beta: =0.5; gamma: =2; }

    writeln(' Введите alfa, beta, gamma'); read(alfa, beta, gamma);

    for I: =1 to N+1 do begin

    for J: =1 to N do

    X[J]: =S[I, J];

    Funk;

    Fz[I]: =Z; end;

    10: Fh: =-1E+20; Fl: =1E+20;

    for I: =1 to N+1 do begin

    if Fz[I]> Fh then begin Fh: =Fz[I]; H: =I; end;

    if Fz[I]< Fl then begin Fl: =Fz[I]; L: =I; end;

    end;

    Fg: =-1E+20;

    for I: =1 to N+1 do begin

    if I=H then goto 2;

    if Fz[I]> Fg then begin Fg: =Fz[I]; G: =I; end;

    2: end;

    for J: =1 to N do begin

    Xo[J]: =0;

    for I: =1 to N+1 do begin

    if I=H then goto 3;

    Xo[J]: =Xo[J]+S[I, J];

    3: end;

    Xo[J]: =Xo[J]/N;

    Xh[J]: =S[H, J];

    Xg[J]: =S[G, J];

    Xl[J]: =S[L, J]; end;

    for J: =1 to N do

    X[J]: =Xo[J];

    Funk;

    Fo: =Z;

    for J: =1 to N do begin

    Xr[J]: =Xo[J]+Alfa*(Xo[J]-Xh[J]);

    X[J]: =Xr[J];

    end;

    Funk;

    Fr: =Z;

    if Fr< Fl then goto 4;

    if Fr> Fg then goto 5;

    goto 7;

    4: for J: =1 to N do begin

    Xe[J]: =Gamma*Xr[J]+(1-Gamma)*Xo[J];

    X[J]: =Xe[J];

    end;

    Funk; Fe: =Z;

    if Fe< Fl then goto 6;

    goto 7;

    6: for J: =1 to N do

    S[H, J]: =Xe[J];

    Fz[H]: =Fe;

    goto 8;

    7: for J: =1 to N do

    S[H, J]: =Xr[J];

    Fz[H]: =Fr;

    goto 8;

    5: if Fr> Fh then goto 9;

    for J: =1 to N do

    Xh[J]: =Xr[J];

    Fz[H]: =Fr;

    9: for J: =1 to N do begin

    Xc[J]: =Beta*Xh[J]+(1-Beta)*Xo[J];

    X[J]: =Xc[J];

    end;

    Funk; Fc: =Z;

    if Fc> Fh then goto 11;

    for J: =1 to N do

    S[H, J]: =Xc[J];

    Fz[H]: =Fc;

     

    goto 8;

    11: for I: =1 to N+1 do begin

    for J: =1 to N do begin

    S[I, J]: =(S[I, J]+Xl[J])/2;

    X[J]: =S[I, J];

    end;

    Funk; Fz[I]: =Z;

    end;

    8: S1: =0; S2: =0;

    for I: =1 to N+1 do begin

    S1: =S1+Fz[I];

    S2: =S2+Fz[I]*Fz[I];

    end;

    Sig: =S2-S1*S1/(N+1); Sig: =Sig/(N+1);

    if Sig< 1E-10 then begin

    for J: =1 to N do

    writeln(Xl[J]);

    writeln(Fz[L]);

    writeln(Ik); readln;

    end else

    goto 10;

    end;

    procedure XUKA;

    label 1, 2;

    var I, J, PS, BS: integer;

    var K, H, FI, FB, F: real;

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

    begin

    writeln('Введите число переменных N='); readln(N);

    writeln('Введите начальное приближение');

    for I: =1 to N do begin writeln('Введите X[', I, ']='); readln(X[I]); end;

    writeln('Введите шаг H='); readln(H); K: =H;

    for I: =1 to N do begin Y[I]: =X[I]; P[I]: =X[I]; B[I]: =X[I]; end;

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

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

    if F< FI then begin Y[J]: =X[J]; FUNK; F: =Z; FI: =F;

    if J=N then goto 2;

    J: =J+1; goto 1; end;

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

    if F< FI then begin Y[J]: =X[J]; FUNK; F: =Z; FI: =F;

    if J=N then goto 2;

    J: =J+1; goto 1; end;

    X[J]: =Y[J]; begin FUNK; F: =Z; FI: =F;

    if J=N then goto 2;

    J: =J+1; goto 1; end;

    2: if FI< (FB-1E-18) then begin for I: =1 to N do

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

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

    goto 1;

    end;

    if ((PS=1)and(BS=0)) then begin

    for I: =1 to N do begin P[I]: =B[I]; Y[I]: =B[I]; X[I]: =B[I]; end;

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

    goto 1; end

    else begin K: =K/10;

    if K< 1E-15 then begin

    for I: =1 to N do writeln('X[', I, ']=', X[I]: 3, ' Ik=', Ik); exit;

    end;

    J: =1; goto 1; end;

    end;

    begin Ik: =0; {XUKA; } NadMida; readln; end.

    Программа состоит из 3-х процедур. Процедура расчета минимизируемой функции FUNXUK, процедура метода Хука – Дживса (XUKA), процедура метода Нелдера-Мида (NаdMida).

    В MATLAB имеется стандартный оператор, реализующая метод Нелдера-Мида. Для использования этого оператора необходимо запрограммировать в m - файле исследуемую функцию, например, funk(x), где x – вектор, задать начальное приближение x0 и вызвать функцию [M, f]=fminsearch(@funk, [ x0]). Получим вектор M координат искомых точек минимума и минимальное значение функции f.






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.