1. 程式人生 > 其它 >python +gurobipy數學建模

python +gurobipy數學建模

技術標籤:工程矩陣

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變數裡

專案程式碼連結

總計67個約束20個變數