Python PuLP 约束:如何构建递归约束
Pythong PuLP Constraints: How to build a recursive constraint
我正在 PuLp 中构建一个简单模型,它需要我基于以下 equation 构建一个递归函数作为约束。在 PuLp 中,约束写为:model += lpSum([y[j] + x[j] -z[j]]) == x[j+1]
然而,当 运行 这个模型时,我得到了 Keyerror。我尝试了一些方法,包括创建一个空白字典,或创建一个附加变量来包含 x[j+1]
列表。
如何在 PulP 中编写这个递归方程?或者是否有另一个库可以更好地处理这个等式?
模型已使用以下字典和 objective 函数初始化
from pulp import *
period = ['Q1', 'Q2', 'Q3', 'Q4']
z = [200, 0, 0, 500]
x = [50, 100, 100, 300]
cap = [1000, 1000, 1000, 1000]
z_dict = dict(zip(period, z))
x_dict = dict(zip(period, x))
cap_dict = dict(zip(period, cap))
model = LpProblem("Simple Model", LpMinimize)
y = LpVariable.dicts("decision", period, lowBound=0, cat='Continuous')
b = LpVariable.dicts("binary", period, cat='Binary')
model += (lpSum([15*b[j] for j in period]) + lpSum([y[j]*10 for j in period])) # Objective Function`
for j in period:
model += lpSum([x[j]]) + y[j] >= z[j]
model += lpSum([y[j]]) <= lpSum([cap_dict[j]*b[j]])
model += lpSum([y[j] + x[j] -z[j]]) == x[j+1] # The constraint in question
我认为你的基本问题是 x[j+1]
导致越界问题。
经过以下更改,产生了结果:
period = [0, 1, 2, 3]
和
for j in period:
model += lpSum([x[j]]) + y[j] >= z[j]
model += lpSum([y[j]]) <= lpSum([cap_dict[j]*b[j]])
if j < max(period):
model += lpSum([y[j] + x[j] -z[j]]) == x[j+1] # The constraint in question
另外添加了以下内容以显示结果:
model.solve()
print("Status : ", pulp.LpStatus[model.status])
print("Result : ", pulp.value(model.objective))
for v in model.variables():
print(v.name, "=", v.varValue)
我正在 PuLp 中构建一个简单模型,它需要我基于以下 equation 构建一个递归函数作为约束。在 PuLp 中,约束写为:model += lpSum([y[j] + x[j] -z[j]]) == x[j+1]
然而,当 运行 这个模型时,我得到了 Keyerror。我尝试了一些方法,包括创建一个空白字典,或创建一个附加变量来包含 x[j+1]
列表。
如何在 PulP 中编写这个递归方程?或者是否有另一个库可以更好地处理这个等式?
模型已使用以下字典和 objective 函数初始化
from pulp import *
period = ['Q1', 'Q2', 'Q3', 'Q4']
z = [200, 0, 0, 500]
x = [50, 100, 100, 300]
cap = [1000, 1000, 1000, 1000]
z_dict = dict(zip(period, z))
x_dict = dict(zip(period, x))
cap_dict = dict(zip(period, cap))
model = LpProblem("Simple Model", LpMinimize)
y = LpVariable.dicts("decision", period, lowBound=0, cat='Continuous')
b = LpVariable.dicts("binary", period, cat='Binary')
model += (lpSum([15*b[j] for j in period]) + lpSum([y[j]*10 for j in period])) # Objective Function`
for j in period:
model += lpSum([x[j]]) + y[j] >= z[j]
model += lpSum([y[j]]) <= lpSum([cap_dict[j]*b[j]])
model += lpSum([y[j] + x[j] -z[j]]) == x[j+1] # The constraint in question
我认为你的基本问题是 x[j+1]
导致越界问题。
经过以下更改,产生了结果:
period = [0, 1, 2, 3]
和
for j in period:
model += lpSum([x[j]]) + y[j] >= z[j]
model += lpSum([y[j]]) <= lpSum([cap_dict[j]*b[j]])
if j < max(period):
model += lpSum([y[j] + x[j] -z[j]]) == x[j+1] # The constraint in question
另外添加了以下内容以显示结果:
model.solve()
print("Status : ", pulp.LpStatus[model.status])
print("Result : ", pulp.value(model.objective))
for v in model.variables():
print(v.name, "=", v.varValue)