今天在用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文件: