问题背景
这几天搭建了一个纯整数规划模型,因为规模太大,测试时发现用Pyomo调用SCIP求解太慢了。于是我抖了个机灵,因为我除了SCIP,之前也装好了IPOPT的环境,所以反手就把求解器改成了IPOPT,惊喜的发现速度快了很多,简单case测试的解也没啥问题,以为问题解决了,但是高兴的太早了…
在测试某个case时,模型求出了一个我百思不得其解的方案,排查了半天发现是我定义的binary variable,模型竟然算出了一个小数解!而且非常巧妙的满足了我给的约束条件…
问题分析
一开始问GPT说是我initialize=0不对,一本正经的胡说八道… 然后谷歌到有人遇到和我一样的问题:PYOMO:Binary variable giving float values with IPOPT.,看到下面有人给出的解答是:
IPOPT(Interior Point Optimizer)是一个用于非线性规划(NLP)问题求的优化求解器,而不是整数规划问题。改成SCIP后就解决了!但是性能问题又回来了。
这里有两个值得深钻的问题:
- 建立好运筹模型后,如何选择合适的求解器?
- 对于大规模的整数规划问题,怎么提高其求解速度。
后面会调研一下,单独出两篇文章回答这两个问题!
反思
选择求解器要小心,如果给自己的问题匹配了并不合适的求解器,很可能就此埋下了隐患,务必小心验证求出的解是否符合预期。