Минимизация Используя симулированный алгоритм отжига

В этом примере показано, как создать и минимизировать целевую функцию с помощью симулированного алгоритма отжига (simulannealbnd функция) в Global Optimization Toolbox. Для алгоритмических деталей смотрите Как Симулированные работы Отжига.

Простая целевая функция

Целевая функция, чтобы минимизировать является простой функцией двух переменных:

   min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2;
    x

Эта функция известна как "бегунок", как описано в L.C.W. Диксон и Г.П. Сзего [1].

Реализовывать вычисление целевой функции, файл MATLAB simple_objective.m имеет следующий код:

type simple_objective
function y = simple_objective(x)
%SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004 The MathWorks, Inc.  

x1 = x(1);
x2 = x(2);
y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;

Все решатели Global Optimization Toolbox принимают, что цель имеет один вход x, где x имеет столько же элементов сколько количество переменных в проблеме. Целевая функция вычисляет скалярное значение целевой функции и возвращает его в ее одном выходном аргументе y.

Минимизируйте Используя simulannealbnd

Минимизировать целевую функцию с помощью simulannealbnd, передайте в указателе на функцию целевой функции и начальной точке x0 в качестве второго аргумента. Для воспроизводимости установите поток случайных чисел.

ObjectiveFunction = @simple_objective;
x0 = [0.5 0.5];   % Starting point
rng default % For reproducibility
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0)
Optimization terminated: change in best function value less than options.FunctionTolerance.
x = 1×2

   -0.0896    0.7130

fval = -1.0316
exitFlag = 1
output = struct with fields:
     iterations: 2948
      funccount: 2971
        message: 'Optimization terminated: change in best function value less than options.FunctionTolerance.'
       rngstate: [1x1 struct]
    problemtype: 'unconstrained'
    temperature: [2x1 double]
      totaltime: 0.9521

simulannealbnd возвращает четыре выходных аргумента:

  • x — Лучшая точка найдена

  • fval — Значение функции в лучшей точке

  • exitFlag — Целое число, соответствующее причине остановленная функция

  • output — Информация о шагах оптимизации

Связанная ограниченная минимизация

Можно использовать simulannealbnd решать задачи со связанными ограничениями. Передайте нижние и верхние границы как векторы. Для каждого координатного i, решатель гарантирует тот lb(i) <= x(i) <= ub(i). Наложите границы –64 <= x(i) <= 64.

lb = [-64 -64];
ub = [64 64];

Запустите решатель с аргументами нижней и верхней границы.

[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0,lb,ub);
Optimization terminated: change in best function value less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);
The number of iterations was : 2428
fprintf('The number of function evaluations was : %d\n', output.funccount);
The number of function evaluations was : 2447
fprintf('The best function value found was : %g\n', fval);
The best function value found was : -1.03163

Решатель находит по существу то же решение как прежде.

Минимизируйте Используя дополнительные аргументы

Иногда вы хотите, чтобы целевая функция была параметрирована дополнительными аргументами, которые действуют как константы во время оптимизации. Например, в предыдущей целевой функции, вы можете хотеть заменить константы 4, 2.1, и 4 параметрами, которые можно изменить, чтобы создать семейство целевых функций. Для получения дополнительной информации смотрите Передающие Дополнительные Параметры (Optimization Toolbox).

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

   min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2;
    x

aB, и c параметры к целевой функции, которые действуют как константы во время оптимизации (они не варьируются как часть минимизации). Реализовывать вычисление целевой функции, файл MATLAB parameterized_objective.m содержит следующий код:

type parameterized_objective
function y = parameterized_objective(x,p1,p2,p3)
%PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver

%   Copyright 2004 The MathWorks, Inc.
  
x1 = x(1);
x2 = x(2);
y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;

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

simulannealbnd вызывает целевую функцию со всего одним аргументом x, но целевая функция имеет четыре аргумента: xAB, и c. Чтобы указать, какая переменная является аргументом, используйте анонимную функцию, чтобы получить значения дополнительных аргументов (константы aB, и c). Создайте указатель на функцию ObjectiveFunction к анонимной функции, которая берет один вход x, но вызовы parameterized_objective с xAB и c. Когда вы создаете указатель на функцию ObjectiveFunction, переменные aB, и c имейте значения, которые хранятся в анонимной функции.

a = 4; b = 2.1; c = 4;    % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
x0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,x0)
Optimization terminated: change in best function value less than options.FunctionTolerance.
x = 1×2

    0.0898   -0.7127

fval = -1.0316

Решатель находит по существу то же решение как прежде.

Ссылки

[1] Диксон, L. C. W. и G.P. Szego (редакторы).. К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.