You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:40:10