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