[英]Quadratic optimization equation where optimization equation have summation using Gurobi
所以我正在嘗試使用 gurobi 庫優化 python 中的二次方程,我的目標方程中有求和。 求和方程最有可能顯示錯誤,因為它不能接受變量 integer 並且需要常數 integer。有沒有辦法將求和方程放在目標 function 中?
我的代碼是這樣的:
from gurobipy import *
import sympy as sy
op1=sy.Symbol('op1')
op2=sy.Symbol('op2')
# Create a model
quadratic_model = Model('quadratic')
# Define decision variables
n = quadratic_model.addVar(vtype=GRB.INTEGER, lb=0, name='n')
t = quadratic_model.addVar(vtype=GRB.INTEGER, lb=0, name='t')
temp = quadratic_model.addVar(vtype=GRB.INTEGER, lb=0, name='temp')
# Define objective function
obj_fn = (1256*80/12.5)*n*t + 25*5*n*t + sy.summation(5*t*50*(365//n)*op1,(op1,1,n)) + sy.summation(5*24*op2,(op2,1,365))
quadratic_model.setObjective(obj_fn, GRB.MINIMIZE)
# Add constraints
quadratic_model.addConstr(50*n*t >= 4320)
quadratic_model.addConstr(n>=1)
quadratic_model.addConstr(t>=1)
quadratic_model.addConstr(n<=6*30/4)
# Solve model
quadratic_model.setParam('NonConvex', 2)
quadratic_model.optimize()
# Print results
for v in quadratic_model.getVars():
print('---------------------------------------')
print('%s : %g' % (v.varName, v.x))
print("minimized solution for the equation is:", quadratic_model.objVal)`
我試圖在優化方程式中運行這段代碼並求和,我嘗試了兩件事,如下所述
您不能將 gurobi 與 sympy 混合使用(sympy 不理解 gurobi 變量)。
第二個求和是一個常數 (7625520)。 您可以將其從目標中刪除。
第一個求和可以重寫為:
t*125*floor(365/n)*n*(n+1)
我們可以分塊做
x1=365/n : n*x1=365
x2=floor(365/n) : x2 <= x1, x2 >= x1-0.9999, x2 integer
x3=t*125*floor(365/n) : x3 = t*125*x2
x4=t*125*floor(365/n)*n : x4 = x3*n
x5=t*125*floor(365/n)*n*(n+1) : x5=x4*(n+1)
注意:我在這里使用了sy.summation(op1,(op1,1,n))=n*(n+1)/2
在使用這個之前檢查我的數學。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.