天天看點

Gurobi + Python

自學Gurobi的時候發現國内缺乏相對應的教程,大多止于淺層的gurobi安裝和搭載,稍微深入點也隻是最基礎的模型建立:add variable, update, add constraint, set objective, optimize 和基本的讀寫。 甚至缺乏對于結果的解讀。

Google到的内容比 百度 多的多。

最好的資料當然是官網的 http://www.gurobi.com/documentation/ 的 Example Tour 和 Referenec Manual;

存檔一下學習中遇到的坑。

1. addConstr()

隻能 ==, <=, >= ,不能<, >

2. if ... else 

如果想實作 if x>0 : a = 1 ; else : a = 0

不能直接實作,要進行一定的轉化。

x <= a * A <= A + x - B  (A 為足夠大的常數,B為足夠小的正數(小于x可能達到的最小值,大于0),a為binary)

3. max_(), abs_()

這些函數,括号裡面都必須是variable,不能是LinExpr(), 有必要的話,可以建成新的variable再使用max_()和abs_()函數

當結果是Model is infeasible 時:利用 Model.computeIIS() 來查問題(雖然我認為并不是太好用)

Reference :https://nathanbrixius.wordpress.com/2012/09/28/detecting-the-sources-of-model-infeasibility-using-gurobi/

model = Model()
vars = model.getVars()
constrs = model.getConstrs()
           
for i in range (len(constrs)):
    print (constrs[i].getAttr(GRB.Attr.IISConstr))
for i in range(len(solution)):
    print (solution[i].getAttr(GRB.Attr.IISLB), "  ", vars[i].getAttr(GRB.Attr.IISUB))
           

輸出 1 有問題; 0 沒問題

4. 如何輸出指定個數的較優解

PoolSearchMode 表示Gurobi搜尋最優解的方式。 預設值為0,表示目标為搜尋唯一最優解;設定為1,表示搜尋多個解,但不保證解的品質;設定為2,表示搜尋多個解,優先取高品質的解。

PoolSolutions 表示存儲的解的個數。改變該參數并不能改變該模型的可行解個數。但在使用過程中發現,當PoolSearchModel = 2, 如果有很多個可行解,SolCount不會顯示實際可行解個數(由于運作時間限制),此時改變PoolSolutions可改變SolCount,得到更多可行解。

X 當PoolSearchMode為預設值0時,求解得到唯一解,存儲在X中,可通過以下代碼得到該解

model = Model()
vars_x = model.addVar(lb=0, ub = 1, vtype = GRB.CONTINUOUS)

....
vars =  model.getVars()
print ("最優解為"vars[0].getAttr("X"))

           

Xn 當PoolSearchMode為1或者2時,得到多個解(包括sub-optimal),存儲在Xn中,可通過以下代碼得到解。其中當SolutionNumber 設定為 0 時, 得到的解與 X 相同

model = Model()
vars_x = model.addVar(lb=0, ub = 1, vtype = GRB.CONTINUOUS)
model.setParam("PoolSearchMode",2)
model.setParam("PoolSolutions",10)
....
vars =  model.getVars()
for i in range(10):
    model.setParam("SolutionNumber",i)
    print ("最優解為"vars[0].getAttr("Xn"))

           

SolCount 表示搜尋得到的解個數,SolutionNumber一定小于SolCount

SolutionNumber 表示得到的解個數,可以将這個參數看作Xn的index,範圍為[0,SolCount-1]。每修改一次,輸出不同的Xn