如何使用Python-MIP解決優(yōu)化問題
MIP是基于Python的優(yōu)化問題建模package,全稱是Python- Mixed-Integer Linear Programming。MIP可以調(diào)用開源求解器CBC和商用求解器Gurobi。本質(zhì)上是一套優(yōu)化建模語言,將建立好的優(yōu)化模型轉(zhuǎn)化成計(jì)算機(jī)和求解器能看懂的形式。

Package的主頁是https://pypi.org/project/mip/
官方文檔和使用手冊看這里https://python-mip.readthedocs.io/en/latest/
下面介紹一下如何安裝使用MIP建立優(yōu)化問題的模型,并如何求解。
一、安裝
安裝很簡單,命令是
pip install mip
最新的版本是1.12.0,安裝時候可以指定版本
pip install mip==1.12.0
MIP的開發(fā)比較活躍,隔幾個月就會有新版本發(fā)布。在升級的時候一定要注意,千萬不要
pip install mip
而應(yīng)該指定更高的版本號,例如
pip install mip==1.12.0
二、如何建模
首先導(dǎo)入MIP
from mip import *
初始化一個模型
m = Model(solver_name=CBC)
注意,如果不指定求解器,默認(rèn)是Gurobi。CBC是開源求解器,可以免費(fèi)試用。
增加變量
x = m.add_var()
通常我們會加入很多相似變量,比如x_ij,這個時候可以使用dict() 去存儲變量,便于后續(xù)檢索。例如可以這樣,把變量名字當(dāng)做字典的key
x = {}
for i in [1, 2, 3]:
x[i] = m.add_var(name=’x’+str(i))
注意,這樣做以后,字典里的value是MIP的variable class。并且建議增加變量的時候加上name,便于以后檢索。
如果有變量的name,也可以這樣得到變量本身
var = m.var_by_name(var_name)
增加約束條件
可以這樣:
m += x + y <= 10
也可以這樣
m.add_constr(x + y <= 10)
這里也建議給每個constr起個名字。也可以設(shè)置一個字典去存儲所有約束條件。
這里有一個很有用的函數(shù)xsum(),用于求和,比如
m += xsum(w[i]*x[i] for i in range(n) if i%2 == 0) <= c
增加目標(biāo)函數(shù)
默認(rèn)是minimize,也可以設(shè)置maximize
m.objective = minimize(xsum(c[i]*x[i] for i in range(n)))
m.objective = maximize(xsum(c[i]*x[i] for i in range(n)))
存儲模型
強(qiáng)調(diào)一下MIP是一個很好的優(yōu)化建模工具。模型建立好以后不需要一定用CBC或者Gurobi求解。如果想用別的求解器,可以先把建立好的模型轉(zhuǎn)成mps格式或者lp格式。
m.write('model.lp')
m.write('model.mps')
多數(shù)求解器都可以讀lp文件和mps文件,然后去求解。
求解
m.optimize()
返回的是優(yōu)化模型狀態(tài)model status,是MIP的另外一個class,OptimizationStatus。
如何想知道某個變量的最優(yōu)值,可以用x這個屬性,比如
Var.x
想知道優(yōu)化目標(biāo)函數(shù)可以這樣
m.objective_value
CBC有時候會返回多個最優(yōu)值,
m.objective_values
這里是MIP的基本功能,掌握以后可以解決大部分優(yōu)化模型的建立問題。語法容易上手,和Gurobi非常相似,如果沒有Gurobi許可證,MIP是個很好的替代。
EI智能體 運(yùn)籌優(yōu)化 EI創(chuàng)新孵化Lab EI企業(yè)智能
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。