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

Этот пример показывает, как создать и минимизировать целевую функцию с помощью моделируемого алгоритма отжига (функция 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

Эта функция известна как "бегунок", как описано в Л.К.В. Диксоне и Г.П. Сзего [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.9889

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

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

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

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

  • вывод Информация о шагах оптимизации

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

Можно использовать 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

a, b и 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, но целевая функция имеет четыре аргумента: x, a, b и c. Чтобы указать, какая переменная является аргументом, используйте анонимную функцию, чтобы получить значения дополнительных аргументов (константы a, b и c). Создайте указатель на функцию ObjectiveFunction к анонимной функции, которая берет один вход x, но вызывает parameterized_objective с x, a, b и c. Когда вы создаете указатель на функцию ObjectiveFunction, переменные a, b, и 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.