Optimize Using Only Feasible Start Points
You can set the StartPointsToRun
option so that MultiStart
and GlobalSearch
use only start points that satisfy inequality constraints.
This option can speed your optimization, since the local solver does not have to search
for a feasible region. However, the option can cause the solvers to miss some basins of
attraction.
There are three settings for the StartPointsToRun
option:
all
— Accepts all start pointsbounds
— Rejects start points that do not satisfy boundsbounds-ineqs
— Rejects start points that do not satisfy bounds or inequality constraints
For example, suppose your objective function is
function y = tiltcircle(x) vx = x(:)-[4;4]; % ensure vx is in column form y = vx'*[1;1] + sqrt(16 - vx'*vx); % complex if norm(x-[4;4])>4
tiltcircle
returns complex values for
norm(x - [4 4]) > 4
.
Code for Generating the Figure
Write a constraint function that is positive on the set where
norm(x - [4 4]) > 4
function [c ceq] = myconstraint(x) ceq = []; cx = x(:) - [4;4]; % ensure x is a column vector c = cx'*cx - 16; % negative where tiltcircle(x) is real
Set GlobalSearch
to use only start points satisfying
inequality constraints:
gs = GlobalSearch('StartPointsToRun','bounds-ineqs');
To complete the example, create a problem structure and run the solver:
opts = optimoptions(@fmincon,'Algorithm','interior-point'); problem = createOptimProblem('fmincon',... 'x0',[4 4],'objective',@tiltcircle,... 'nonlcon',@myconstraint,'lb',[-10 -10],... 'ub',[10 10],'options',opts); rng(7,'twister'); % for reproducibility [x,fval,exitflag,output,solutionset] = run(gs,problem)
GlobalSearch stopped because it analyzed all the trial points. All 5 local solver runs converged with a positive local solver exit flag. x = 1.1716 1.1716 fval = -5.6530 exitflag = 1 output = struct with fields: funcCount: 3242 localSolverTotal: 5 localSolverSuccess: 5 localSolverIncomplete: 0 localSolverNoSolution: 0 message: 'GlobalSearch stopped because it analyzed all the trial po...' solutionset = 1x4 GlobalOptimSolution array with properties: X Fval Exitflag Output X0
tiltcircle With Local Minima
Code for Generating the Figure
The tiltcircle
function has just one local minimum. Yet GlobalSearch
(fmincon
) stops at
several points. Does this mean fmincon
makes an error?
The reason that fmincon
stops at several boundary points is
subtle. The tiltcircle
function has an infinite gradient on the
boundary, as you can see from a one-dimensional calculation:
So there is a huge gradient normal to the boundary. This gradient overwhelms the small
additional tilt from the linear term. As far as fmincon
can tell,
boundary points are stationary points for the constrained problem.
This behavior can arise whenever you have a function that has a square root.