MINLP,了解一下
MINLP,什麼鬼?
MINLP,混合整數非線性規劃(Mixed-Integer Nonlinear Programming),是比較複雜的一類線性(非線性)優化模型。MINLP模型有目標函數、等式約束條件、不等式約束條件以及各種類型的變數,如小數(一般情況)、整數和0-1變數。這些量混合在一起的模型一般很複雜,不過也比較接近實際生活的數學描述。
目前我正在研究的畢業設計與IGDT(信息間隙決策理論)相關,而由IGDT建立的模型一般都會轉換成MINLP的問題。
那麼MINLP應當如何編程、採用什麼語言編程、採用什麼樣的求解器呢?下面整理一下今天遍歷MINLP求解器的收穫,相信不會有文章比本文更加豐富了。
LINGO——快速、優雅、簡單
https://www.lindo.com/
LINGO是一款比較簡單的優化軟體,語法簡單、操作簡單,就連求解能力也很簡單。所以比較簡單的、變數數目比較少的MINLP模型適合用LINGO求解。
LINGO的語法簡單且寬鬆,一旦將目標函數、約束條件的數學公式完整列出,使用LINGO幾乎可以照著公式完成編程。
給個簡單的例子:
提示:LINGO中默認變數是正數,如果要任意取值,需要用 函數。
GAMS——複雜問題處理的神器
https://www.gams.com/
GAMS是一款優化神器(畢竟特別特別貴……),只要代碼沒問題,基本上沒有解決不了的問題。GAMS不僅有很多求解器而且還可以配合clpex、MATLAB等大佬工具。在數據方面,可以讀取純文本txt也可以讀取EXCEL表格。適合處理模型複雜、數據量大的工作,無論多少變數也沒有問題。
GAMS代碼中模型配置(部分)
GAMS在國外使用得比較廣泛,目前Github也有GAMS的文件匪類,Sublime有第三方的語法高亮插件。
Pyomo——Python黨的福利
Pyomo (Python Optimization Modeling Objects),是一款基於Python的開源模型優化軟體。印象中Pyomo好像是有實驗室參與開源工作,因此Pyomo的代碼質量與流行程度還是不錯的。
Pyomo的安裝方式自然是喜聞樂見的 咯,Pyomo在Github中也提供了常用的示例。
我在測試時Ubuntu環境下編譯,如
報錯
這是因為環境中沒有安裝求解器glpk,安裝一下即可:
pyOpt——好像不管用
pyOpt也是基於Python的線性與非線性優化軟體,不過沒有單獨針對MINLP的優化。比較有特點的功能應該是並行計算,需要配合mpi4py包一起使用。
經過實際測試,不推薦pip安裝(版本比較老),也不建議直接從官網下載安裝。因為又是經過我的實際測試,官方提供的示例多多少少會有問題,在import包名時總會有莫名其妙的問題。嘗試無果後果斷棄坑了,若有勇士,歡迎填坑。
midaco-solver——多麼痛的領悟
http://www.midaco-solver.com
MIDACO (Mixed Integer Distributed Ant Colony Optimization) 是非常優秀的一款優化軟體與求解器,由ESA(歐洲航天局)與Astrium(歐洲宇航防務集團下屬的子公司)贊助,厲害吧!
MIDACO吸引人的地方是提供了許多主流語言版本,如Matlab、C/C++、R、Python、C#、Java,或者是非主流的Fortran、Julia。代碼優美、簡練,每種語言均提供NLP、IP、MINLP等模型的示例代碼。
不過MIDACO的核心代碼似乎是不公開的,編譯成一個二進位文件調用。
同樣的,MIDACO也提供並行計算,不過比起pyOpt強大多了。不僅支持mip4py,還支持spark。完全適合一個實用軟體開發的條件。
示例文檔輸出的結果大致是這樣的:
用解釋/編譯語言寫優化演算法比用商業軟體的好處就是可以有一萬種方法彌補不足(比如我採用for循環與list將時間序列引入模型),不過同時也會引入一萬種迷之問題(自己體會)。
興緻沖沖的我研究了Python語言的示例後嘗試用畢設的問題重寫了模型代碼。運行結果卻出錯,查詢了錯誤手冊後讓我目瞪狗呆!
原來是超過4個變數就要收費!最低200歐元!你沒有聽錯!最低200歐元!
雖然真的超級好用(微笑
其它
其它的工具與GAMS之類大同小異,如Gurobi、AMPL。
最後推薦一個相關優化模型的合集,歡迎挖墳:
http://www.coin-or.org/
2018年4月19日晚
速寫於上海
TAG:曉霧札記 |