“关于边界的严格可行性
sqp算法采用受边界约束的区域中的每个迭代步骤。此外,有限差分步骤也遵循边界。界限并不严格;一步可以正好在边界上。当您的目标函数或非线性约束函数未定义或在受边界约束的区域之外复杂时,这种严格的可行性可能是有益的。“
我发现事实并非如此。在我的代码中,我有以下内容:
options = optimoptions(@fmincon,'Display','iter','Algorithm','sqp', ...
'SpecifyObjectiveGradient', false,'SpecifyConstraintGradient',false, ...
'OptimalityTolerance', 1e-6, 'MaxFunctionEvaluations', 1e6, 'StepTolerance', 1e-6, 'MaxIterations', 1e6, 'ConstraintTolerance', 1e-12,...
'DerivativeCheck', 'off', 'FiniteDifferenceType', 'central', 'OutputFcn', @outfun);
xP = fmincon(@(x)no_objective(x), xP(:), [], [], [], [], zeros(numel(xP), 1), ones(numel(xP), 1), @(x)constraint_combined(x), options);
xP = fmincon(@(x)objective_orig(x), xP(:), [], [], [], [], zeros(numel(xP), 1), ones(numel(xP), 1), @(x)constraint_combined(x), options);
此处,xP
是我的决策向量,constraint_combined
是一些组合的非线性约束。 no_objective
定义为
function [o, do] = no_objective(x)
o = 0;
do = zeros(numel(x), 1);
end
objective_orig
是我希望最小化的目标。
我执行两次调用以保证我在可行区域内开始第二次调用(选择xP
以便我知道它已接近并且可以找到可行区域。
令人沮丧的是,即使第一次通话收敛到可行点:
Norm of First-order
Iter F-count f(x) Feasibility Steplength step optimality
0 41 0.000000e+00 2.220e-16 0.000e+00
the second call leaves the feasible region and becomes infeasible:
Norm of First-order
Iter F-count f(x) Feasibility Steplength step optimality
0 41 4.203397e+05 2.220e-16 7.511e+05
1 115 4.203386e+05 8.348e-01 7.731e-06 5.180e-06 7.511e+05
2 191 4.203376e+05 1.544e+00 3.788e-06 4.783e-06 7.502e+05
3 269 4.203373e+05 1.772e+00 1.856e-06 2.063e-06 7.500e+05
4 342 4.203364e+05 2.679e+00 1.104e-05 1.161e-05 7.495e+05
5 379 4.203364e+05 2.679e+00 1.856e-06 1.654e-06 7.495e+05
这打破了MATLAB SQP算法的保证!我甚至设置了有限的差异(如上面的选项所示),因此根据MATLAB的文档,这不是问题。
这里发生了什么?怎么可能发生这种情况?
(道歉,因为这是交叉发布到MATLAB答案,但到目前为止该网站上唯一的观点是我,而且似乎更积极/更好地获得眼球。)