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.