FMINCON 步长公差

计算科学 优化 约束优化
2021-12-11 03:31:16

实现附加代码后出现以下错误。

错误信息

“fmincon 已停止,因为当前步长的大小小于步长容差的默认值,但在所选的约束容差值范围内不满足约束。”

代码:

rho = (1/3)*eye(3);


v1 = sdpvar(3,1);
v2 = sdpvar(3,1);
v3 = sdpvar(3,1);
v4 = sdpvar(3,1);
v5 = sdpvar(3,1);

obj2 = trace((v1*v1' + v2*v2'+v3*v3'+v4*v4'+v5*v5')*rho);


cons2 = [sum(v1.*v1) == 1; sum(v2.*v2) == 1;sum(v3.*v3) == 1;sum(v4.*v4) == 1;sum(v5.*v5) == 1; sum(v1.*v2) == 0;sum(v2.*v3) == 0;sum(v3.*v4) == 0;sum(v4.*v5) == 0;sum(v5.*v1) == 0];

ops2 = sdpsettings('solver','fmincon');

optimize(cons2, -obj2, ops2);

obj2 = double(obj2)

我尝试通过添加以下代码来更改容差。

options = optimset('TolX',1e-30,'TolFun', 1e-6)

我尝试了不同的值,但它不起作用。任何调试它的建议都会有所帮助。重新表述问题或使用另一个求解器的建议也将不胜感激(如果 fmincon 不是这个问题的最佳求解器)。

1个回答

FMINCON 无法从我认为 YALMIP 提供的所有变量为零向量的默认值开始找到可行的点。局部求解器(例如 FMINCON)可能难以找到此类非凸约束问题的可行点,并且可能依赖于具有足够的起点才能找到可行点。

在这种情况下,我只是为作为向量的所有变量选择了一些任意的起始值(顺便说一句,这是不可行的),FMINCON 很快找到了全局最优解。

或者,我使用 YALMIP 的 BMIBNB 全局优化器,以 FMINCON 作为上求解器,即使没有提供任何非默认起始值​​,BMIBNB 也几乎立即将问题解决到全局最优。

这是我使用的而不是您的优化命令:

% FMINCON with non-default starting values
assign(v1,ones(3,1));
assign(v2,ones(3,1));
assign(v3,ones(3,1));
assign(v4,ones(3,1));
assign(v5,ones(3,1));
optimize(cons2, -obj2,sdpsettings('solver','fmincon','usex0',1))

% BMIBNB, with FMINCON as upper solver, default starting values --> produces global optimum
optimize(cons2, -obj2,sdpsettings('solver','bmibnb','bmibnb.uppersolver','fmincon')

disp(value(obj2))
  1.6667

顺便说一句,我认为您的非默认容差设置不会有帮助,但没有使用它们。鉴于您使用的是 YALMIP,您需要在 sdpsettings 中指定任何非默认求解器选项,如https://yalmip.github.io/command/sdpsettings/中所述