surrogateopt
Сформируйтесь и другие формы решателяПопробовать различные решатели включая surrogateopt
на проблеме, которая имеет нелинейные ограничения неравенства, необходимо преобразовать между формой, требуемой surrogateopt
и форма требуется другими решателями.
surrogateopt
Форма структуры к другим решателямЦелевая функция objconstr(x)
для surrogateopt
возвращает структуру. Fval
поле содержит значение целевой функции, скаляр. 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.3499 3.7601
Решать ту же задачу с помощью 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.6544 0.4266