一个关于KeyError(0,0,0)的Python纸浆问题

问题描述 投票:0回答:1

我尝试使用pulp创建一个3维的决策变量x。然后我定义了一个目标函数。然而果肉显示

P[j] * min(D[j], pl.lpSum(x[i, j, t] * Y[i, j] for i in fields)) - pl.lpSum(C[i, j, t] * x[i, j, t] for i in fields)
                          ~^^^^^^^^^
KeyError: (0, 0, 0)

误差变量是x。 以下是关于pulp的完整代码

pb = pl.LpProblem("Maximize Cost", pl.LpMaximize)
x = pl.LpVariable.dicts("x", (fields, crops , times), cat=pl.LpBinary)
pb += pl.lpSum(
    P[j] * min(D[j], pl.lpSum(x[i, j, t] * Y[i, j] for i in fields)) - pl.lpSum(C[i, j, t] * x[i, j, t] for i in fields)
    for j in crops
    for t in times
)

这 3 个指数由

定义
fields = list(range(54))
crops = list(range(41))
times = list(range(6))

x(0,0,0)我试图找出 x 的集合是否有 (0,0,0),调试器显示它似乎有 (0,0,0),就像图像一样。

python keyerror pulp
1个回答
0
投票

好消息/坏消息...

解决索引问题非常容易。 我强烈建议您预先构建元组列表并使用它来设置索引,如下所示。 传入您正在执行的列表元组并不会产生您认为的结果。 (打印变量并亲自查看。)

所以尝试这样的事情:

from pulp import pulp

fields = [1, 2, 3]
crops = ['corn', 'wheat']
times = list(range(4))

FCT = [(f, c, t) for f in fields for c in crops for t in times]

plant = pulp.LpVariable.dicts('plant', indices=FCT, cat='Real')

print(plant)

print(plant[2, 'wheat', 0].varValue)  # None (no solve or initial value, but it proves the indexing)

坏消息是,我看到您正在尝试在“线性”程序中使用

min()
,但这不是线性函数,您必须以不同的方式找到变量中的最小值。

© www.soinside.com 2019 - 2024. All rights reserved.