仅使用可行的起点进行优化
您可以设置 StartPointsToRun 选项,以便 MultiStart 和 GlobalSearch 仅使用满足不等式约束的起点。由于局部求解器不必搜索可行区域,因此此选项可以加速您的优化。然而,该选项可能会导致求解器错过一些吸引域。
StartPointsToRun 选项有三种设置:
all- 接受所有起点bounds- 拒绝不满足边界的起点bounds-ineqs- 拒绝不满足边界或不等式约束的起点
例如,假设您的目标函数是
function y = tiltcircle(x) vx = x - [4 4]; y = sum(vx,2) + sqrt(16 - sum(vx.^2,2)); end
tiltcircle 为 norm(x - [4 4]) > 4 返回复数值。

编写一个约束函数,该函数在集合上为正,其中 norm(x - [4 4]) > 4
function [ineqnonlin,eqnonlin] = myconstraint(x) eqnonlin = []; vx = x - [4;4]; ineqnonlin = sum(vx.^2,1) - 16; % Negative where tiltcircle(x) is real end
设置 GlobalSearch 仅使用满足不等式约束的起点:
gs = GlobalSearch(StartPointsToRun="bounds-ineqs");为了完成示例,请创建一个问题结构体并运行求解器:
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

tiltcircle 函数只有一个局部最小值。然而 GlobalSearch (fmincon) 在几个点处停止了。这是否意味着 fmincon 犯了错误?
fmincon 在几个边界点停止的原因很微妙。tiltcircle 函数在边界上具有无限的梯度,从一维计算可以看出:
因此在边界的法线上存在巨大的梯度。该梯度压倒了线性项产生的微小额外倾斜。据 fmincon 所知,边界点是约束问题的驻点。
只要函数有平方根,就会出现这种行为。
