surrogateopt
Форма и другие формы решателяЧтобы попробовать различные решатели, включая surrogateopt
для задачи, которая имеет нелинейные ограничения неравенства, вы должны преобразовать между формой, необходимой surrogateopt
и форму, требуемую другими решателями.
surrogateopt
Структурная форма другим решателямЦелевая функция objconstr(x)
для surrogateopt
возвращает структуру. The Fval
поле содержит значение целевой функции, скаляр. The Ineq
поле содержит вектор значений ограничительных функций. Решатель пытается сделать все значения в Ineq
поле меньше или равно нулю. Положительные значения указывают на нарушение ограничений.
Другие решатели ожидают, что целевая функция вернет скалярное значение, а не структуру. Другие решатели также ожидают, что нелинейная функция ограничения вернет два выхода, c(x)
и ceq(x)
, а не структура, содержащая c(x)
.
Чтобы преобразовать surrogateopt
функциональные objconstr(x)
для использования в других решателях:
Установите целевую функцию на @(x)objconstr(x).Fval
.
Установите нелинейную функцию ограничения равной @(x)deal(objconstr(x).Ineq,[])
.
Для примера,
function ff = objconstr(x) ff.Fval = norm(x)^2; ff.Ineq = norm(x - [5,8])^2 - 25; end
Чтобы решить ограниченную задачу минимизации с помощью objconstr
, вызов surrogateopt
.
lb = [-10,-20]; ub = [20,10]; sol = surrogateopt(@objconstr,lb,ub)
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'. sol = 2.3325 3.7711
Чтобы решить ту же задачу, используя fmincon
, разделите цель и ограничение на отдельные функции. Включите нелинейное ограничение равенства как []
при помощи deal
функция.
objfcn = @(x)objconstr(x).Fval; nlcon = @(x)deal(objconstr(x).Ineq,[]);
Звонить fmincon
с целевой функцией objfcn
и нелинейную функцию ограничения nlcon
.
[solf,fvalf,eflag,output] = ...
fmincon(objfcn,[0,0],[],[],[],[],lb,ub,nlcon)
Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. solf = 2.3500 3.7600 fvalf = 19.6602 eflag = 1 output = struct with fields: iterations: 7 funcCount: 24 constrviolation: 0 stepsize: 2.0395e-05 algorithm: 'interior-point' firstorderopt: 4.9651e-06 cgiterations: 0 message: '↵Local minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 6.602486e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.↵↵'
Вы также можете использовать patternsearch
или ga
решить задачу используя то же преобразование.
surrogateopt
Структурная формаЕсли у вас есть задача, написанная в форме для других решателей, используйте packfcn
функция для преобразования целевых и нелинейных ограничений в форму структуры для surrogateopt
. Если целевой функцией является указатель на функцию @obj
и нелинейная функция ограничения @nlconst
, затем используйте целевую функцию objconstr
для surrogateopt
.
objconstr = packfcn(@obj,@nlconst);
В этом примере целевой функцией является функция Розенбрка.
ros = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
Задайте функцию ограничения, чтобы ограничить решение лежать внутри диска радиусом 1/3 с центром в точке [1/3,1/3].
function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
Установите границы -2 и 2 для каждого компонента.
lb = [-2,-2]; ub = [2,2];
Решите задачу используя patternsearch
начиная с [0,0].
x0 = [0,0]; x = patternsearch(ros,x0,[],[],[],[],lb,ub,@circlecon)
Optimization terminated: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance. x = 0.6523 0.4258
Преобразуйте задачу для решения путем surrogateopt
.
objconstr = packfcn(ros,@circlecon); xs = surrogateopt(objconstr,lb,ub)
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'. xs = 0.6543 0.4284