在Pyomo中实现复杂约束时遭遇KeyError错误的求助
在Pyomo中实现复杂约束时遭遇KeyError错误的求助
嘿,我一眼就看出你这个KeyError的问题出在哪了——你在访问Pyomo变量m.x的时候用错了索引类型!
先给你拆解下问题根源:
你定义的model.x是用字符串集合C(比如"C0"、"C1"...)和A(比如"A0"、"A1"...)做索引的,所以m.x的合法索引是类似("C0", "A0")这样的字符串组合。但看你constructAndIterate函数里的循环:
for c, i in enumerate(C): for subA, j in enumerate(A): newTopRight[i,j] = m.x[c,subA]
这里的c和subA是enumerate返回的数字索引(比如0、1、2...),你直接用它们去访问m.x,相当于在尝试调用m.x[0,0],但这个索引根本不存在,自然就触发KeyError了!
给你个最直接的修正方案,调整循环里的索引使用方式:
def constructAndIterate(m): # 初始化numpy数组时用长度确定维度,没问题 newTopRight = np.ndarray((len(C), len(A))) # 用enumerate同时拿到数组的位置索引和Pyomo变量的字符串索引 for row_pos, c_str in enumerate(C): for col_pos, a_str in enumerate(A): # 用字符串索引访问m.x,用数字索引定位numpy数组的位置 newTopRight[row_pos, col_pos] = m.x[c_str, a_str] wNewTop = np.hstack((topLeft, newTopRight)) nW = np.vstack((wNewTop, wBot)) return iterateMatrix(nW)
这样一来,你既正确访问了Pyomo变量,也能把对应的值放到numpy数组的正确位置上。
另外还要给你提个醒:Pyomo是基于符号表达式构建模型的,尽量避免在约束规则里过度依赖numpy的数值操作——如果iterateMatrix函数里有大量数值计算,要确保它能正确处理Pyomo的Var对象(毕竟这些是符号变量,不是普通数值),不然可能还会出现其他奇怪的问题。
最后再检查下你其他约束的索引逻辑:比如c2和c3里用int(c[1:])提取数字是没问题的,因为c是"C0"这类字符串,c[1:]转成数字刚好对应你原矩阵的索引,这个逻辑是对的,和你这里的错误不是一回事。
备注:内容来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

