Найдите глобальную переменную или несколько локальных минимумов

Функция, чтобы оптимизировать

Этот пример иллюстрирует как GlobalSearch находит глобальный минимум эффективно, и как MultiStart находит намного больше локальных минимумов.

Целевая функция для этого примера имеет много локальных минимумов и уникальный глобальный минимум. В полярных координатах функция

f (r, t) = g (r) h (t),

где

g(r)=(sin(r)sin(2r)2+sin(3r)3sin(4r)4+4)r2r+1h(t)=2+cos(t)+cos(2t12)2.

Глобальный минимум в r = 0 с целевой функцией 0. Функциональный g (r) растет приблизительно линейно в r с повторяющейся пилообразной формой. Функциональный h (t) имеет два локальных минимума, один из которых является глобальной переменной.

 Код для генерации фигуры

Один глобальный минимум через GlobalSearch

  1. Запишите файл функции, чтобы вычислить цель:

    function f = sawtoothxy(x,y)
    [t r] = cart2pol(x,y); % change to polar coordinates
    h = cos(2*t - 1/2)/2 + cos(t) + 2;
    g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ...
        .*r.^2./(r+1);
    f = g.*h;
    end
  2. Создайте структуру задачи. Используйте 'sqp' алгоритм для fmincon:

    problem = createOptimProblem('fmincon',...
        'objective',@(x)sawtoothxy(x(1),x(2)),...
        'x0',[100,-50],'options',...
        optimoptions(@fmincon,'Algorithm','sqp','Display','off'));

    Стартовой точкой является [100,-50] вместо [0,0], так GlobalSearch не запускается в глобальном решении.

  3. Подтвердите структуру задачи путем выполнения fmincon:

    [x,fval] = fmincon(problem)
    
    x =
    
       45.7332 -107.6469
    
    
    fval =
    
      555.5422
  4. Создайте GlobalSearch объект и набор итеративное отображение:

    gs = GlobalSearch('Display','iter');
  5. Запустите решатель:

    rng(14,'twister') % for reproducibility
    [x,fval] = run(gs,problem)
    
     Num Pts                 Best       Current    Threshold        Local        Local                 
    Analyzed  F-count        f(x)       Penalty      Penalty         f(x)     exitflag        Procedure
           0      200       555.5                                   555.5            0    Initial Point
         200     1463   1.547e-15                               1.547e-15            1    Stage 1 Local
         300     1564   1.547e-15     5.858e+04        1.074                              Stage 2 Search
         400     1664   1.547e-15      1.84e+05         4.16                              Stage 2 Search
         500     1764   1.547e-15     2.683e+04        11.84                              Stage 2 Search
         600     1864   1.547e-15     1.122e+04        30.95                              Stage 2 Search
         700     1964   1.547e-15     1.353e+04        65.25                              Stage 2 Search
         800     2064   1.547e-15     6.249e+04        163.8                              Stage 2 Search
         900     2164   1.547e-15     4.119e+04        409.2                              Stage 2 Search
         950     2356   1.547e-15           477        589.7          387            2    Stage 2 Local
         952     2420   1.547e-15         368.4          477        250.7            2    Stage 2 Local
        1000     2468   1.547e-15     4.031e+04        530.9                              Stage 2 Search
    
    GlobalSearch stopped because it analyzed all the trial points.
    
    3 out of 4 local solver runs converged with a positive local solver exit flag.
    
    x =
    
       1.0e-07 *
    
        0.0414    0.1298
    
    
    fval =
    
       1.5467e-15

    Можно получить различные результаты, начиная с GlobalSearch является стохастическим.

Решатель нашел три локальных минимума, и он нашел глобальный минимум около [0,0].

Несколько локальных минимумов через MultiStart

  1. Запишите файл функции, чтобы вычислить цель:

    function f = sawtoothxy(x,y)
    [t r] = cart2pol(x,y); % change to polar coordinates
    h = cos(2*t - 1/2)/2 + cos(t) + 2;
    g = (sin(r) - sin(2*r)/2 + sin(3*r)/3 - sin(4*r)/4 + 4) ...
        .*r.^2./(r+1);
    f = g.*h;
    end
  2. Создайте структуру задачи. Используйте fminunc решатель с Algorithm набор опции к 'quasi-newton'. Причины этого выбора:

    • Проблема неограничена. Поэтому fminunc соответствующий решатель; см. Таблицу решений Оптимизации.

    • Значение по умолчанию fminunc алгоритм требует градиента; смотрите Выбор Algorithm. Поэтому установите Algorithm к 'quasi-newton'.

    problem = createOptimProblem('fminunc',...
        'objective',@(x)sawtoothxy(x(1),x(2)),...
        'x0',[100,-50],'options',...
        optimoptions(@fminunc,'Algorithm','quasi-newton','Display','off'));
  3. Подтвердите структуру задачи путем выполнения его:

    [x,fval] = fminunc(problem)
    
    x =
    
        1.7533 -111.9488
    
    
    fval =
    
      577.6960
  4. Создайте MultiStart по умолчанию объект:

    ms = MultiStart;
  5. Запустите решатель для 50 итераций, записав локальные минимумы:

    % rng(1) % uncomment to obtain the same result
    [x,fval,eflag,output,manymins] = run(ms,problem,50)
    
    MultiStart completed some of the runs from the start points.
    
    9 out of 50 local solver runs converged with a positive local solver exit flag.
    
    x =
    
     -142.4608  406.8030
    
    
    fval =
    
       1.2516e+03
    
    
    eflag =
    
         2
    
    
    output = 
    
      struct with fields:
    
                    funcCount: 8586
             localSolverTotal: 50
           localSolverSuccess: 9
        localSolverIncomplete: 41
        localSolverNoSolution: 0
                      message: 'MultiStart completed some of the runs from the start points.↵↵9 out of 50 local solver runs converged with a positive local solver exit flag.'
    
    
    manymins = 
    
      1×9 GlobalOptimSolution array with properties:
    
        X
        Fval
        Exitflag
        Output
        X0

    Можно получить различные результаты, начиная с MultiStart является стохастическим.

    Решатель не нашел глобальный минимум около [0,0]. Это нашло 10 отличных локальных минимумов.

  6. Постройте значения функции в локальных минимумах:

    histogram([manymins.Fval],10)

    Постройте значения функции в трех лучших точках:

    bestf = [manymins.Fval];
    histogram(bestf(1:3),10)

MultiStart запущенный fminunc от стартовых точек с компонентами, равномерно распределенными между –1000 и 1000. fminunc часто застревал в одном из многих локальных минимумов. fminunc превышенный его предел итерации или вычисление функции ограничивают 40 раз.

Похожие темы