本来以为matlab+gurobi求解只会出现unfeasible的问题,没想到今天遇到了numerical problem?!
在使用matlab+yalmip+gurobi求解MILP问题时,可以求得解(解有数值,但解不满足约束)出现了报错“numerical problems”。
原因分析:
数值问题(不良数据)
打印警告信息如下:
在yalmip官网上发现相关的解释,当模型中出现坏数据时(极大数和极小数,或者没有定义范围引起的大小数,1e9),求解器工作可能会出现数值问题。
这是因为求解器以浮点数值的有限精度工作,这意味着大多数计算一直到加法和减法,都只是近似值。当求解器工作时,这些小错误会累积起来,在某些数据错误的模型中,这可能会导致失败,即numerical problems。链接如下: Debugging numerical problems - YALMIP
解决方案:
1.改良模型或消除不良模型
例如,定义更合适的变量范围;或者,给没有定义范围的变量添加范围。
2.修改求解器的NumericFocus参数
然而,由于模型是根据实际问题建立的,很多时候一些系数无法修改。这时,为了避免数值问题,提高求解的精度,可以修改 NumericFocus
参数。
NumericFocus
参数控制代码尝试检测和管理数字问题的程度。数值越大,数值计算更加精确,但花费时间也更多。默认为0,范围:0-3。可以通过以下代码修改:ops=sdpsettings('solver','gurobi','verbos',0,'gurobi.NumericFocus' , 3);
至此,问题解决。日志如下: