專門做品牌網(wǎng)站設計服務seo搜索引擎優(yōu)化原理
好像還是要學一下Gurobi如何使用的,不然這代碼著實有點抽象了
一、入門操作
一般來說,求解一個數(shù)學規(guī)劃模型的時候,通常會按照如下步驟解決問題:
設置變量---addVar()。
更新變量空間---update()。
設定目標函數(shù)---setObjective()。
設定約束條件---addConstr()。
執(zhí)行最優(yōu)化---optimize()。
創(chuàng)建模型:
import gurobipy
model = gurobipy.Model('LP模型測試1') # 創(chuàng)建一個模型
(1) 設置決策變量
一次創(chuàng)建一個變量:
x = model.addVar(lb=0.0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name="")
- lb=0.0:變量的下界,默認為0.0。?
- ub=gurobipy.GRB.INFINITY:變量的上界,默認為無窮大。?
- vtype=gurobipy.GRB.CONTINUOUS:變量的類型,默認為連續(xù)型號。變?yōu)镚RB.BINARY則是0-1變量,變?yōu)镚RB.INTEGER則為整數(shù)變量。?
- name="":變量名,默認為空。?
一次創(chuàng)建多個變量:
x = model.addVars(*indexes, lb=0, ub=gurobipy.GRB.INFINITY, vtype=gurobipy.GRB.CONTINUOUS, name="")
示例:?
x = model.addVars(3, 4, 5, vtype=gurobipy.GRB.BINARY, name="C")
一次性生成3x4x5個變量。x包含了3x4x5個變量,可以通過x[i,j,k]來訪問單個的變量。
(2)更新變量空間
model.update()
(3)設定目標函數(shù)
單目標優(yōu)化
model.setObjective(expression,sense=None)
- expression:表達式,可以是一次或者二次函數(shù)的類型。?
- sense:求解類型,GRB.MINIMIZE則為最小值,GRB.MAXMIZE則為最大值。?
model.setObjective(8 * x1 + 10 * x2 + 7 * x3 + 6 * x4 + 11 * x5 + 9 * x6, gurobipy.GRB.MINIMIZE)
多目標優(yōu)化代碼:
model.setObjectiveN(expression, index, priority=0, weight=1.0, abstol=0, reltol=0, name="")
- expression:表達式,可以是一次或者二次函數(shù)類型。?
- index:目標函數(shù)對應的序號(默認0,1,2,...),以index=0作為目標函數(shù)的值,其余值需要另外設置參數(shù)。?
- priority:分層序列法多目標決策的優(yōu)先級,值越大優(yōu)先級越高。?
- weight:線性加權多目標決策權重(在優(yōu)先級相同的時候發(fā)揮作用)。?
- abstol:分層序列法多目標決策時允許的目標函數(shù)值的最大降低量。?
- reltol:分層序列法多目標決策時允許的目標函數(shù)值的最大降低比率。
(4)添加約束條件:
創(chuàng)建一個約束條件
model.addConstr(expression, name="")
- expression: 布爾表達式,可以是一次或二次函數(shù)類型
- name: 約束式的名稱?
model.addConstr(12 * x1 + 9 * x2 + 25 * x3 + 20 * x4 + 17 * x5 + 13 * x6 >= 60, "c0")
創(chuàng)建多個約束條件
model.addConstrs(expressions, name="")
創(chuàng)建一個指示變量約束
model.addGenConstrIndicator(binvar, binval, expression, name="")
指示變量 binvar 的值取 binval 時, 進行約束 expression?
或者?
方法1: 構造指示變量??,則上述約束轉化為:?(M是一個很大的數(shù),可以取1000)
方法2:轉化為二次約束,但是如果矩陣為非正定矩陣,則無法求解:
(5)執(zhí)行最優(yōu)化
model.Params.LogToConsole=True # 顯示求解過程
model.Params.MIPGap=0.0001 # 百分比界差
model.Params.TimeLimit=100 # 限制求解時間為 100s
model.Params.Presolve = -1 # 預處理程度, 0關閉,1保守,2激進
model.Params.MIPFocus = 0 # 求解側重點. 1快速找到可行解, 2證明最有, 3側重邊界提升, 0均衡搜索
model.Params.SolutionLimit = inf # 求解數(shù)量, 默認求所有解, 比較出最優(yōu)的結果, 只需要可行解時可以設置該參數(shù)為1
model.Params.NonConvex = 1 # 默認求解器,改為 2 時可以解決非凸二次優(yōu)化問題
?
model.optimize()
(6)查看模型優(yōu)化結果
- 查看函數(shù)值以及變量值
# 查看單目標規(guī)劃模型的目標函數(shù)值
print("Optimal Objective Value", model.objVal)
# 查看多目標規(guī)劃模型的目標函數(shù)值
for i in range(model.NumObj):MODEL.setParam(gurobipy.GRB.Param.ObjNumber, i)print(f"Obj {i+1} = {model.ObjNVal}")
# 查看變量取值
for var in model.getVars():print(f"{var.varName}: {round(var.X, 3)}")
(7)輔助函數(shù)
quicksum()
quicksum相當于sum及其求和符號,效率更高。
寫為:?
for i in I:model.addConstr(quicksum(x[i,j] for j in J) <= 5)
此外,它還支持迭代器、生成器協(xié)議,也就是說,可以通過下面的代碼,實現(xiàn)更為復雜的過濾、求和方法.?
for c in C:model.addConstr(gurobipy.quicksum(x[d,i,j] for d in D for i in range(0, 24) for j in range(i + 1, 25) if i <= c < j) >= R[c])
?
?
?