exponenta event banner

Функции вывода для оптимизации Toolbox™

Что такое функция вывода?

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

В этом примере используется подход на основе решателя для функций вывода. Подход, основанный на проблемах, см. в разделе Функция вывода для оптимизации на основе проблем.

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

Использование функции вывода

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

  • Постройте график текущей точки.

  • Сохранение текущей точки и соответствующего ей значения целевой функции в переменной с именем historyи сохранить текущее направление поиска в переменной с именем searchdir. Направление поиска - это вектор, который указывает в направлении от текущей точки к следующей.

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

Функции цели и ограничения

Проблема заключается в минимизации функции

f (x) = exp (x1) (4x12 + 2x22 + 4x1x2 + 2x2 + 1)

с учетом нелинейных ограничений неравенства

x1+x2-x1x2≥3/2x1x2≥-10.

objfun функция вложена в runfmincon реализует целевую функцию. confun функция вложена в runfmincon реализует функцию ограничения.

Вычислитель вызовов

Чтобы получить решение проблемы и посмотреть историю fmincon итерации, вызовите runfmincon функция.

[xsol,fval,history,searchdir] = runfmincon;
                                Max     Line search  Directional  First-order 
 Iter F-count        f(x)   constraint   steplength   derivative   optimality Procedure 
    0      3       1.8394          0.5                                         Infeasible start point
    1      6      1.85127     -0.09197            1        0.109        0.778   
    2      9     0.300167         9.33            1       -0.117        0.313  Hessian modified twice  
    3     12     0.529835       0.9209            1         0.12        0.232   
    4     16     0.186965       -1.517          0.5       -0.224         0.13   
    5     19    0.0729085       0.3313            1       -0.121        0.054   
    6     22    0.0353323     -0.03303            1      -0.0542       0.0271   
    7     25    0.0235566     0.003184            1      -0.0271      0.00587   
    8     28    0.0235504    9.035e-08            1      -0.0146     8.51e-07   
Active inequalities (to within options.ConstraintTolerance = 1e-06):
  lower      upper     ineqlin   ineqnonlin
                                     1
                                     2

Figure contains an axes. The axes with title Sequence of Points Computed by fmincon contains 18 objects of type line, text.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the  value of the constraint tolerance.

Функция вывода создает график точек, вычисляемых по fmincon. Каждая точка помечается номером итерации. Оптимальная точка возникает в восьмой итерации. Последние две точки в последовательности настолько близки, что перекрываются.

Продукция history - структура, содержащая два поля.

disp(history)
       x: [9x2 double]
    fval: [9x1 double]

fval поле в history содержит значения целевой функции, соответствующие последовательности точек fmincon вычисляет.

disp(history.fval)
    1.8394
    1.8513
    0.3002
    0.5298
    0.1870
    0.0729
    0.0353
    0.0236
    0.0236

Эти же значения отображаются в итеративном выводе в столбце с заголовком. f(x).

x поле history содержит последовательность точек, fmincon вычисляет.

disp(history.x)
   -1.0000    1.0000
   -1.3679    1.2500
   -5.5708    3.4699
   -4.8000    2.2752
   -6.7054    1.2618
   -8.0679    1.0186
   -9.0230    1.0532
   -9.5471    1.0471
   -9.5474    1.0474

searchdir выходные данные содержат направления поиска для fmincon на каждой итерации. Направление поиска - это вектор, указывающий от точки, вычисленной в текущей итерации, к точке, вычисленной в следующей итерации.

disp(searchdir)
   -0.3679    0.2500
   -4.2029    2.2199
    0.7708   -1.1947
   -3.8108   -2.0268
   -1.3625   -0.2432
   -0.9552    0.0346
   -0.5241   -0.0061
   -0.0003    0.0003

Вспомогательные функции

Следующий код создает runfmincon , которая содержит outfun функция вывода, objfun объективная функция, и confun нелинейная функция ограничения как вложенные функции.

function [xsol,fval,history,searchdir] = runfmincon
 
% Set up shared variables with outfun
history.x = [];
history.fval = [];
searchdir = [];
 
% Call optimization
x0 = [-1 1];
options = optimoptions(@fmincon,'OutputFcn',@outfun,... 
    'Display','iter','Algorithm','active-set');
[xsol,fval] = fmincon(@objfun,x0,[],[],[],[],[],[],@confun,options);
 
 function stop = outfun(x,optimValues,state)
     stop = false;
 
     switch state
         case 'init'
             hold on
         case 'iter'
         % Concatenate current point and objective function
         % value with history. x must be a row vector.
           history.fval = [history.fval; optimValues.fval];
           history.x = [history.x; x];
         % Concatenate current search direction with 
         % searchdir.
           searchdir = [searchdir;... 
                        optimValues.searchdirection'];
           plot(x(1),x(2),'o');
         % Label points with iteration number and add title.
         % Add .15 to x(1) to separate label from plotted 'o'.
           text(x(1)+.15,x(2),... 
                num2str(optimValues.iteration));
           title('Sequence of Points Computed by fmincon');
         case 'done'
             hold off
         otherwise
     end
 end
 
 function f = objfun(x)
     f = exp(x(1))*(4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) +... 
                    2*x(2) + 1);
 end
 
 function [c, ceq] = confun(x)
     % Nonlinear inequality constraints
     c = [1.5 + x(1)*x(2) - x(1) - x(2);
         -x(1)*x(2) - 10];
     % Nonlinear equality constraints
     ceq = [];
 end
end

Связанные темы