使用Pulp创建三维决策变量x时出现KeyError(0,0,0)问题求助
问题原因与解决方法
错误根源:
pl.LpVariable.dicts传入多个索引序列时,生成的是三层嵌套字典(x[field][crop][time]),而非以元组(i,j,t)为键的单层字典。你代码里用x[i,j,t]访问,相当于查找键为(i,j,t)的条目,自然触发KeyError。修复步骤:
- 把所有
x[i,j,t]的写法改成x[i][j][t],修正变量访问路径。 - 额外注意:目标函数里的
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
相关产品推荐
相关产品推荐

