Python线性规划

Python 线性规划报错。

x = LpVariable.dicts("Machine_", [(i,j) for i in range(N) for j in range(T)],
                     lowBound=0, upBound=None, cat='binary')
WIP = LpVariable.dicts("Buffer_Status_", [(i,j) for i in range(N-1) for j in range(T)],
                     lowBound=0, upBound=Capacity, cat='integer')
KeyError                                  Traceback (most recent call last)
/var/folders/1t/mwj66mvx0mv00rs70yc3hgk40000gn/T/ipykernel_11410/3319145547.py in 
      8         prb+=load[t]==P_inverteroutput[t]+Pgrid[t]
      9         if WIP[i,t]==0:
---> 10             prb+=x[i+1,t+1]==0
     11         if WIP[i,t]==Capacity[i]:
     12             prb+=x[i,t+1]==0

KeyError: (1, 288)

PULP库吧,不接受条件分支下的约束函数定义。
也就是说,不能在 if下 定义约束函数

x不存在键为(1,288)的元素,个人认为你可以核对一下N,T(x存在的索引)以及i+1,t+1(x报错的索引)的范围,还有就是能否发一下完整程序

错误是由于在尝试使用索引(i+1,t+1)或(i,t+1)访问变量x或WIP时引发的"KeyError"造成的。这意味着使用的索引超出了变量的范围。
可能是因为您的代码中的N和T的值设置不正确。也有可能是用于创建变量的范围在LpVariable.dicts函数中是不正确的。
我会检查N和T的值是否正确设置,并确保用于创建变量的范围与预期的索引范围匹配。
同时也检查一下Capacity变量的值是否设置正确。

这个错误是因为你访问了索引超出了字典的范围。请检查 x 和 WIP 的索引是否在字典内,并确保它们不会超出范围。例如,在 x[i+1,t+1] 表达式中,如果 i + 1 和 t + 1 超出了字典的范围,则会发生错误。

根据错误消息,代码出错的地方在第10行,具体错误是 KeyError: (1, 288)。
这意味着在字典 x 或 WIP 中没有找到键 (1, 288)。
这可能是因为在创建字典时,N 或 T 的值不是预期的值,导致生成的键值范围与实际使用的键值范围不符。
或者是在运行过程中使用了错误的键值,例如在运行时 t = 288 ,但实际上 t 最大值只有几十。
建议检查 N 和 T 的值是否正确,并检查在使用字典 x 和 WIP 时是否使用了正确的键值范围。
你可以在创建变量字典时检查 N 和 T 的值是否正确,并在使用字典时检查键值范围是否正确。
例如,您可以添加以下代码来检查 N 和 T 的值:

assert N > 0, "N should be greater than 0"
assert T > 0, "T should be greater than 0"


并且在使用字典x和WIP时,检查键值是否在正确的范围内,例如:

assert 0 <= i < N, f"i should be within 0 and {N-1}"
assert 0 <= t < T, f"t should be within 0 and {T-1}"


请注意,这只是代码错误的一种可能原因,在这种情况下,这些检查可能不会解决问题。

这个错误是因为 x 字典或 WIP 字典中不存在 (1, 288) 的键。请检查 N 和 T 的取值是否满足 (1, 288) 作为键的条件,以及代码中对字典的其他使用是否正确。

"该回答引用ChatGPT"
可参考下面的解决方案:
这个错误是因为在使用的x[i+1,t+1]和WIP[i,t]的下标可能超出字典的范围,需要保证下标不超过范围。
解决方案是需要检查x和WIP字典中的数据范围是否与下标匹配,确保下标不超出范围。例如,在进行下标判断,仅当i + 1 < N和t + 1 < T时才进行操作,以避免出现这种错误。

参考代码

WIP = LpVariable.dicts("Buffer_Status_", [(i,j) for i in range(N-1) for j in range(T)],
                     lowBound=0, upBound=None, cat='integer')
for i in range(N-1):
    for j in range(T):
        WIP[i, j].upBound = Capacity[i]


如果存在 IndexError ,则可能是 N 和 T 在运行时的值不正确。我们可以打印 N 和 T 的值,确保它们的值符合预期。