Pyomo优化模型如何跳过目标函数缺失索引组件避免KeyError
Pyomo跳过不存在索引的实现方案
方案1:直接遍历惩罚字典的有效索引(最优)
你的Penalty_Nu本身仅存储了需要计算惩罚的索引组合,直接遍历该字典的键值对求和即可,无需遍历全量维度,不会触发不存在索引的报错,同时能大幅减少求和计算量:
def obj_function(model): return sum(penalty * model.x[n, s, d] for (n, s, d), penalty in Penalty_Nu.items()) model.ObjFunction = Objective(rule=obj_function, sense=minimize)
方案2:使用字典get方法设置默认返回值
如果需要保留遍历全维度的写法,可通过字典的get方法指定索引不存在时返回0,自动跳过无惩罚项的组合:
def obj_function(model): return sum( sum(Penalty_Nu.get((n, s, d), 0) * model.x[n, s, d] for d in model.D) for s in model.S for n in model.N ) model.ObjFunction = Objective(rule=obj_function, sense=minimize)
方案3:封装为带默认值的Pyomo Param组件
将Penalty_Nu转换为Pyomo原生的参数组件,设置默认值为0,调用不存在的索引时会自动返回0,无需修改求和逻辑:
# 先定义带默认值的惩罚参数 model.Penalty_Nu = Param(model.N, model.S, model.D, default=0, initialize=Penalty_Nu) def obj_function(model): return sum( sum(model.Penalty_Nu[n, s, d] * model.x[n, s, d] for d in model.D) for s in model.S for n in model.N ) model.ObjFunction = Objective(rule=obj_function, sense=minimize)
内容的提问来源于stack exchange,提问作者Katsu
相关产品推荐
相关产品推荐

