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