python +gurobipy數學建模
阿新 • • 發佈:2021-01-12
python +gurobipy數學建模
簡述
最近幫人做了一個混合整數線性規劃case,使用了gurobipy優化庫。學術版官網可以直接申請licence,三個月有效然後可以繼續申請。總比要收費的cplex好點哈哈。但是還是遇到了一些坑,現在把整個問題與解決方案,程式碼,遇到的坑都記錄一下。
對比cplex,gurobipy更適合復現一個優化問題,因為gurobipy不用把優化問題寫成矩陣相乘的標準形式而是直接堆公式就行。
比如二次規劃,不用寫成:
XTQX + A*X的形式而是直接可以迴圈定義目標函式
然後就是gurobipy必須要求問題是半正定的,如果不是需要增加引數:
m.setParam('nonconvex', 2) # for nonconvex problem
# solve the problem :gurobipy.GurobiError: Objective Q not PSD (diagonal adjustment of 1.0e+00 would be required)
gurobipy 優化模型定義
from gurobipy import * # 匯入
# 定義一個模型
m = Model()
# 設定一些引數 求解時長,精度等
m.setParam('nonconvex', 2)
m.setParam('MIPGap', 0.0001 )
m.setParam('TimeLimit', 100)
# 定義優化變數
x1 = m.addVar(vtype=GRB.CONTINUOUS, lb=20, ub=30, name="x1")
x2 = m.addVar(vtype=GRB.CONTINUOUS, lb=20, ub=30, name="x2")
# 設定目標函式
m.setObjective(x1 * x2, GRB.MAXIMIZE)# 求最大問題 or 求最小問題
m.update()
# 新增約束 可以在設定目標函式前 或者後都可以
c_x = LinExpr()
c_x -=x1
c_x -= x2
m.addConstr(c_x<=50)
m.update()
# 進行求解
m.write('assign.lp')# 問題列印
m.optimize()
# 結果匯出
if m.solCount == 0:
print("Model is infeasible")
m.computeIIS()
m.write("model_iis.ilp")# 出問題無法滿足的約束與殘差可以打印出來debug
print('optimal value: %d' % obj.getValue())
print('optimal solution:{} {}'.format(x1,x2))
x1_output = x1.x
x2_output = x2.x# 取出變數最優值到python變數裡