Pythong PuLP 约束:如何构建递归约束



我正在 PuLp 中构建一个简单的模型,它需要我根据以下等式构建一个递归函数作为约束。在 PuLp 中,约束写为:model += lpSum([y[j] + x[j] -z[j]]) == x[j+1]

但是,运行此模型时我收到Keyerror。我已经尝试了一些事情,包括创建一个空白字典,或创建一个额外的变量来包含x[j+1]列表。

如何在 PulP 中编写这个递归方程?还是有没有另一个库可以更好地处理这个方程?

模型使用以下字典和目标函数初始化

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)

相关内容

最新更新