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

使用Pulp创建三维决策变量x时出现KeyError(0,0,0)问题求助

问题原因与解决方法
  • 错误根源:pl.LpVariable.dicts传入多个索引序列时,生成的是三层嵌套字典(x[field][crop][time]),而非以元组(i,j,t)为键的单层字典。你代码里用x[i,j,t]访问,相当于查找键为(i,j,t)的条目,自然触发KeyError。

  • 修复步骤:

    1. 把所有x[i,j,t]的写法改成x[i][j][t],修正变量访问路径。
    2. 额外注意:目标函数里的min(D[j], pl.lpSum(...))不能直接用Python内置的min函数——Pulp无法将这个非线性表达式转化为线性规划模型。需要用线性化处理,比如引入辅助变量并添加约束,示例如下:
      # 为每个j、t引入辅助变量z[j][t],表示取D[j]和总产量的较小值
      z = pl.LpVariable.dicts("z", (crops, times), lowBound=0)
      # 添加约束限制z的取值范围
      for j in crops:
          for t in times:
              pb += z[j][t] <= D[j]
              pb += z[j][t] <= pl.lpSum(x[i][j][t] * Y[i,j] for i in fields)
      
  • 完整修正后的核心代码:

    pb = pl.LpProblem("Maximize Cost", pl.LpMaximize)
    x = pl.LpVariable.dicts("x", (fields, crops , times), cat=pl.LpBinary)
    # 处理min逻辑的辅助变量与约束
    z = pl.LpVariable.dicts("z", (crops, times), lowBound=0)
    for j in crops:
        for t in times:
            pb += z[j][t] <= D[j]
            pb += z[j][t] <= pl.lpSum(x[i][j][t] * Y[i,j] for i in fields)
    # 修正后的目标函数
    pb += pl.lpSum(
        P[j] * z[j][t] - pl.lpSum(C[i][j][t] * x[i][j][t] for i in fields)
        for j in crops
        for t in times
    )
    

内容的提问来源于stack exchange,提问作者user27238111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:22:14