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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:39:29