Python线性规划代码出现KeyError: (1,5)错误求助
PuLP运输问题KeyError: (1,5)排查解决
KeyError: (1,5)说明代码尝试访问键为(1,5)的元素,但该键不存在于你定义的变量集合、数据字典或索引范围内。以下是具体排查方向:
1. 检查供应/需求点的索引集合
确认你定义的供应点列表(如suppliers = [1,2,...])和需求点列表(如demands = [1,2,...])是否包含1和5:
- 如果需求点最大编号是4,那么
(1,5)这个供应-需求组合不在预定义的有效范围内,后续代码调用该组合时会报错。 - 如果确实需要需求点5,需将其加入需求点集合,并补充对应的数据(供应/需求/成本)。
2. 核对运输变量的定义逻辑
查看创建PuLP变量的代码,比如:
x = LpVariable.dicts("运输量", [(i,j) for i in suppliers for j in demands], lowBound=0)
这里的列表推导式必须覆盖所有后续代码中用到的(i,j)组合。如果后续代码用到了(1,5),但该组合不在推导式生成的列表里,就会触发KeyError。
3. 验证数据字典的完整性
如果你通过字典存储成本、供应或需求数据(如cost[(i,j)]),需确认字典中存在(1,5)这个键。若缺失该键,访问时会直接报错。
4. 排查约束条件的循环逻辑
检查添加约束的循环代码,是否不小心生成了超出范围的索引。例如:
# 错误示例:循环j包含了未定义的需求点5 for i in suppliers: prob += lpSum(x[(i,j)] for j in [1,2,3,4,5]) <= supply[i]
修正时需保证循环的索引范围与预定义的供应/需求点集合一致。
示例修正代码
如果确实需要新增需求点5,需同步更新所有相关定义:
from pulp import LpProblem, LpMinimize, LpVariable, lpSum # 修正供应/需求点集合,加入需求点5 suppliers = [1, 2, 3] demands = [1, 2, 3, 4, 5] # 确保数据字典包含所有有效组合 supply = {1: 100, 2: 150, 3: 200} demand = {1: 80, 2: 70, 3: 60, 4: 90, 5: 50} cost = { (1,1):5, (1,2):6, (1,3):7, (1,4):8, (1,5):9, (2,1):4, (2,2):5, (2,3):6, (2,4):7, (2,5):8, (3,1):3, (3,2):4, (3,3):5, (3,4):6, (3,5):7 } # 创建运输变量,覆盖所有(i,j)组合 x = LpVariable.dicts("运输量", [(i,j) for i in suppliers for j in demands], lowBound=0) prob = LpProblem("运输问题", LpMinimize) # 目标函数 prob += lpSum(cost[(i,j)] * x[(i,j)] for i in suppliers for j in demands) # 供应约束 for i in suppliers: prob += lpSum(x[(i,j)] for j in demands) <= supply[i] # 需求约束 for j in demands: prob += lpSum(x[(i,j)] for i in suppliers) >= demand[j] prob.solve()
内容的提问来源于stack exchange,提问作者Sơn Hoàng
相关产品推荐
相关产品推荐

