GUROBI之如何快速定位模型infeasible的原因

今天在用GUROBI写EVRPTW问题的模型时,遇到了很多问题

参考:github上的一个用cplex来求解的

paper: The Electric Vehicle-Routing Problem with Time Windows and Recharging Stations (informs.org)

code:

E-VRPTW/E-VRPTW.mod at main · jmanzolli/E-VRPTW (github.com)

终于用gurobi写好之后进行求解时,出现了模型不可行的问题

Status:2 代表模型求得最优解 ; Status:3 代表模型不可行 infeasible

于是反复检查是哪里的问题,最后看到了下面这篇帖子

【Gurobi】针对优化模型Infeasible的错误,如何快速Debug? - 知乎 (zhihu.com)

于是按照这篇贴子里的教程,试了一下:

m.optimize()
m.computeIIS()
m.write("model1.ilp")

打开.ilp文件,发现是约束"c0" 和约束"c2"出现了冲突,于是再回过头来检查了一遍模型的数学逻辑,感觉没有任何问题,最终发现是约束"c2"多写了一个 "== 0 "(吐血~~~),约束本身的逻辑没有问题!!!

该正过来后,模型就正确求解啦!!!

个人小结:模型不可行大多时候应该是约束出现了冲突,使用上述方法可以快速定位到出现冲突的约束,根据有问题的约束再来检查一遍是否是语言上的问题(比如多了一个括号,恒等号或者括号的包含的层次不对等等),如若不是,则需要去检查一下是否是建模逻辑上的问题了。

快速定位到有问题的约束还有一个方法就是将约束一个个依次注释掉,再来看模型是否可以被优化,大致就能判断初是哪几个约束之间存在冲突了。

一下午都被这个infeasible的问题耗过去了,检查了很多遍是否是逻辑上的问题,以为是建模有问题,结果最后发现是多打了一个" ==0",导致约束的逻辑变了但语法上却没有出现错误,所以没有通过语法报错被发现。

以后出现问题第一步先检查是否是代码敲错了!!!!!!

补充:突然想到还有一个直观一点的方法,可以通过.lp问题输出模型的数学形式来检查

m.update()
m.write("model.lp")
m.optimize()

如打开.lp文件:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值