В этом примере показано, как минимизировать целевую функцию согласно нелинейным ограничениям неравенства и границам, с помощью поиска шаблона.
Для этой проблемы целевая функция, чтобы минимизировать является простой функцией 2D переменной x
.
simple_objective(x) = (4 - 2.1*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + (-4 + 4*x(2)^2)*x(2)^2;
Эта функция известна как "бегунок", как описано в L.C.W. Диксон и Г.П. Сзего [1].
Кроме того, проблема имеет нелинейные ограничения и границы.
x(1)*x(2) + x(1) - x(2) + 1.5 <= 0 (nonlinear constraint) 10 - x(1)*x(2) <= 0 (nonlinear constraint) 0 <= x(1) <= 1 (bound) 0 <= x(2) <= 13 (bound)
Создайте файл 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;
Решатели, такие как patternsearch
примите один вход x
, где x
имеет столько же элементов сколько количество переменных в проблеме. Целевая функция вычисляет скалярное значение целевой функции и возвращает его в ее одном выходном аргументе y
.
Создайте файл MATLAB под названием simple_constraint.m
содержа следующий код:
type simple_constraint
function [c, ceq] = simple_constraint(x) %SIMPLE_CONSTRAINT Nonlinear inequality constraints. % Copyright 2005-2007 The MathWorks, Inc. c = [1.5 + x(1)*x(2) + x(1) - x(2); -x(1)*x(2) + 10]; % No nonlinear equality constraints: ceq = [];
Ограничительная функция вычисляет значения всех ограничений неравенства и ограничений равенства и возвращает векторы c
и ceq
, соответственно. Значение c
представляет нелинейные ограничения неравенства, которые решатель пытается сделать меньше чем или равным нулю. Значение ceq
представляет нелинейные ограничения равенства, которые решатель пытается сделать равным нулю. Этот пример не имеет никаких нелинейных ограничений равенства, таким образом, ceq = []
. Для получения дополнительной информации смотрите Нелинейные Ограничения.
patternsearch
Задайте целевую функцию как указатель на функцию.
ObjectiveFunction = @simple_objective;
Задайте проблемные границы.
lb = [0 0]; % Lower bounds ub = [1 13]; % Upper bounds
Задайте нелинейную ограничительную функцию как указатель на функцию.
ConstraintFunction = @simple_constraint;
Задайте начальную точку для решателя.
x0 = [0.5 0.5]; % Starting point
Вызовите решатель, запросив оптимальную точку x
и значение функции в оптимальной точке fval
.
[x,fval] = patternsearch(ObjectiveFunction,x0,[],[],[],[],lb,ub, ...
ConstraintFunction)
Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance.
x = 1×2
0.8122 12.3122
fval = 9.1324e+04
Чтобы наблюдать прогресс решателя, задайте опции тот выбор две функции построения графика. Функция построения графика psplotbestf
строит лучшее значение целевой функции в каждой итерации и функцию построения графика psplotmaxconstr
строит максимальное нарушение ограничений в каждой итерации. Установите эти две функции построения графика в массиве ячеек. Кроме того, информация об отображении о прогрессе решателя в Командном окне путем установки Display
опция к 'iter'
.
options = optimoptions(@patternsearch,'PlotFcn',{@psplotbestf,@psplotmaxconstr}, ... 'Display','iter');
Запустите решатель, включая options
аргумент.
[x,fval] = patternsearch(ObjectiveFunction,x0,[],[],[],[],lb,ub, ...
ConstraintFunction,options)
Max Iter Func-count f(x) Constraint MeshSize Method 0 1 0.373958 9.75 0.9086 1 18 113581 1.617e-10 0.001 Increase penalty 2 148 92267 0 1e-05 Increase penalty 3 374 91333.2 0 1e-07 Increase penalty 4 639 91324 0 1e-09 Increase penalty Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance.
x = 1×2
0.8122 12.3122
fval = 9.1324e+04
Нелинейные ограничения вызывают patternsearch
решить много подпроблем в каждой итерации. Как показано и в графиках и в итеративном отображении, процесс решения имеет немного итераций. Однако Func-count
столбец в итеративном отображении показывает много вычислений функции на итерацию. И графики и итеративное отображение показывают, что начальная точка неосуществима, и что целевая функция является низкой в начальной точке. Во время процесса решения значение целевой функции первоначально увеличивается, затем уменьшается к своему окончательному значению.
[1] Диксон, L. C. W. и G.P. Szego (редакторы).. К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.