Convert Nonlinear Constraints Between surrogateopt
Form and Other
Solver Forms
Why Convert Constraint Forms?
To try various solvers including surrogateopt
on a problem that has
nonlinear inequality constraints, you must convert between the form required by
surrogateopt
and the form required by other solvers.
Convert from surrogateopt
Structure Form to Other Solvers
The objective function objconstr(x)
for
surrogateopt
returns a structure. The Fval
field
contains the objective function value, a scalar. The Ineq
field contains
a vector of constraint function values. The solver attempts to make all values in the
Ineq
field be less than or equal to zero. Positive values indicate a
constraint violation.
Other solvers expect the objective function to return a scalar value, not a structure.
Other solvers also expect the nonlinear constraint function to return two outputs,
c(x)
and ceq(x)
, not a structure containing
c(x)
.
To convert the surrogateopt
function
objconstr(x)
for use in other solvers:
Set the objective function to
@(x)objconstr(x).Fval
.Set the nonlinear constraint function to
@(x)deal(objconstr(x).Ineq,[])
.
For example,
function ff = objconstr(x) ff.Fval = norm(x)^2; ff.Ineq = norm(x - [5,8])^2 - 25; end
To solve a constrained minimization problem using objconstr
, call
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.3504 3.7598
To solve the same problem using fmincon
, split the objective and
constraint into separate functions. Include the nonlinear equality constraint as
[]
by using the deal
function.
objfcn = @(x)objconstr(x).Fval; nlcon = @(x)deal(objconstr(x).Ineq,[]);
Call fmincon
with the objective function objfcn
and nonlinear constraint function 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.0397e-05 algorithm: 'interior-point' firstorderopt: 4.8151e-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.403047e-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.' bestfeasible: [1×1 struct]
You can also use patternsearch
or ga
to solve
the problem using the same conversion.
Convert from Other Solvers to surrogateopt
Structure Form
If you have a problem written in the form for other solvers, use the packfcn
function to
convert the objective and nonlinear constraints to the structure form for
surrogateopt
. If the objective function is a function handle
@obj
and the nonlinear constraint function is
@nlconst
, then use the objective function objconstr
for surrogateopt
.
objconstr = packfcn(@obj,@nlconst);
In this example, the objective function is Rosenbrock's function.
ros = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
Specify the constraint function to restrict the solution to lie inside a disk of radius 1/3 centered at the point [1/3,1/3].
function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];
Set bounds of –2 and 2 on each component.
lb = [-2,-2]; ub = [2,2];
Solve the problem using patternsearch
starting from [0,0].
x0 = [0,0]; x = patternsearch(ros,x0,[],[],[],[],lb,ub,@circlecon)
Optimization finished: mesh size less than options.MeshTolerance and constraint violation is less than options.ConstraintTolerance. x = 0.6523 0.4258
Convert the problem for solution by 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.4286