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

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

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 параметрами, которые можно изменить, чтобы создать семейство целевых функций. Для получения дополнительной информации см. «Передача дополнительных параметров».

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

   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] Dixon, L.C. W., and G .P. Szego (eds.). К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.

См. также

Похожие темы