1. 需求的出現(xiàn)
- 由于我要做的是混合整數(shù)規(guī)劃問題(MIP)举哟,考慮到有現(xiàn)成的求解工具耕蝉,于是決定使用Cplex來進行計算韩肝。
2. 嘗試的第一種解決方法——Cplex+yalmip+Matlab
- 首先下載Cplex焊切,現(xiàn)在最新的已經(jīng)出到了12.9砰碴,當(dāng)然其實版本問題自己看吧躏筏。
下載的話可以去官網(wǎng)下載,如果是學(xué)生或者教師是有教育版的可供免費下載的呈枉,需要注冊一下即可趁尼。
(https://www.ibm.com/cn-zh/products/ilog-cplex-optimization-studio?mhq=Cplex%20product&mhsrc=ibmsearch_p
這個鏈接里有學(xué)生孩擂、教師版茵瘾。) - yalmip 是一個可以把不同優(yōu)化器用yalmip自己的語言來進行調(diào)用的一個“通用接口器”般的存在,在其官網(wǎng)上有詳細的安裝介紹芽死,在此不多贅述啃憎。官方鏈接附上:
https://yalmip.github.io/tutorial/installation/
里面有詳細的安裝方法和例子可供參考芝囤,而且據(jù)我的同學(xué)說有什么問題給作者留言他會耐心解答。 - 在如下鏈接中也有一些使用上的介紹辛萍,不過其實官網(wǎng)上的肯定是最直接的悯姊,如果能夠看懂的話建議還是去看官網(wǎng)上的tutorial:
http://ravenxrz.ink/2019/05/03/yalmip-usage-learning.html - Matlab不用多說了。
3. Cplex Python API
- 首先附上cplex的使用說明贩毕,里面有關(guān)于接口的詳細描述悯许,包括C++, java等等,當(dāng)然也有python的辉阶。https://www.ibm.com/support/knowledgecenter/SSSA5P_12.8.0/ilog.odms.studio.help/pdf/gscplex.pdf
按照這里面的安裝好python下的cplex module以后先壕,就可以參考一下里面幾個示例lpex.py瘩扼。其中l(wèi)pex1.py是關(guān)于人工輸入模型的方法的描述,lpex2.py是關(guān)于調(diào)用.lp文件的描述垃僚。
4. 使用文件導(dǎo)入模型并求解
- Cplex Python API +.lp文件導(dǎo)入模型:模型變量過多集绰、約束過多-->手動輸入不可能時,可以通過編寫模型的文件并使用python程序來調(diào)用Cplex谆棺、導(dǎo)入模型并求解來實現(xiàn)問題的解決栽燕。
- Cplex支持三種文件輸入來導(dǎo)入模型,包括LP包券、MPS和SAV。具體的文件編寫規(guī)則自己查找炫贤,這里附上一個寫的很好的LP文件的編寫規(guī)則的鏈接:
http://lpsolve.sourceforge.net/5.5/CPLEX-format.htm - 在寫好.lp文件以后溅固,可以按前面說的使用lpex2.py來從Terminal里面使用命令行實現(xiàn)問題的求解。
5. 總結(jié)
- 之所以后面使用了python Cplex API其實是因Matlab+yalmip+Cplex的組合雖然簡單易行兰珍,上手特別快侍郭,而且在matlab里面使用矩陣真的特別方便,但是有些想象不到的問題會出現(xiàn)掠河。
- 比如我的問題分為大中小三個時亮元,以不同的求解順序來使用Matlab+yalmip+Cplex求解時,大唠摹、中爆捞、小三個的求解時間有比較大的區(qū)別,也就是說勾拉,求解的時間或者說是效率和求解順序有關(guān)(這個就很神了煮甥,內(nèi)心有點不安)。
- 后來在求解一個更大的問題時使用Matlab+yalmip+Cplex又出現(xiàn)的問題——“跑->跑->matlab自動退出藕赞,跑->跑->matlab自動退出成肘,...,跑->跑->matlab自動退出”的情況斧蜕。
- 后面使用python調(diào)用API接口双霍,感覺效率比Matlab+yalmip+Cplex更高。
使用中碰到的問題:
- 問題1:Dual infeasible due to empty column 'x4161'.
網(wǎng)上找的解答:Like I said above, this problem occurs if presolve reduces the model to a model with an empty column. You can disable presolve (set CPX_PARAM_PREIND=0) but that will not fix the issue that your model is infeasible. You can use the conflict refiner to analyze the infeasibility of your model. You will have to check with yalmip support to figure out how to do any of this. 即應(yīng)該是有全零行出現(xiàn)批销。 - 問題2:Infeasibility row 'c27283': 0 = 1.
解決:出現(xiàn)0等于1的情況了洒闸,說明有0等于1這樣的約束出現(xiàn),不可能有可行解均芽∏牦埃可能是約束哪里寫錯了。我最后就是找了一下約束中的問題并進行了解決骡技。 - 問題3:raise CplexSolverError(error_string, env, status)
cplex.exceptions.errors.CplexSolverError: CPLEX Error 1464: Line 27618: Identifier/name too long to process.
解決:
This error is due to the fact that an LP file has a maximum length of any line (560)
說明一行的字太長了鸣个,在需要的時候在lp文件里面使用'\n'進行分行即可羞反,反正lp文件是可以分行的。
對應(yīng)問題的一個鏈接:https://www.ibm.com/developerworks/community/forums/html/threadTopic?id=77777777-0000-0000-0000-000014393504
注:
本文只是個人使用中的一些小小的總結(jié)囤萤,如果有讀者和其他人有更好的方法和更多的經(jīng)驗昼窗,歡迎批評指正和分享經(jīng)驗。