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

如何解决Python中Pyomo模型的'list'对象无'is_expression_type'属性错误

Pyomo模型报错:'list' object has no attribute 'is_expression_type' 解决

核心错误点

  • 约束规则传递错误:创建Constraint时,rule参数需传入函数对象,而非函数调用后的结果。原代码中rule=constraint1(m)和rule=constraint2(m)会直接执行函数,返回的不是Pyomo可识别的表达式对象,导致报错。
  • 约束逻辑错误:constraint1的return语句写在for循环内部,仅计算第一个变量就返回约束,不符合"变量和为100"的需求。
  • 参数引用错误:constraint2误用全局变量R_avg_tolist,且该变量是二维列表,索引方式错误,同时未使用函数传入的R_avg参数。

修正后的完整代码

R_avg_tolist = [[0.00043159478649482775,
  0.00045388639592182584,
  0.0006735271301199177,
  0.00044026758948786,
  0.0037176592984565836]]

Cov_list = [[5.884677519869241e-05,
  5.756542207262417e-05,
  6.017027849080026e-05,
  6.180151597797322e-05,
  -0.0005074353586106837],
 [5.756542207262417e-05,
  6.0380562653096757e-05,
  6.613608499966434e-05,
  6.737370769879904e-05,
  -0.0005362752804115953],
 [6.017027849080026e-05,
  6.613608499966434e-05,
  8.206495000024503e-05,
  8.01694525889321e-05,
  -0.0005958716888916681],
 [6.180151597797322e-05,
  6.737370769879904e-05,
  8.01694525889321e-05,
  0.00010129901491226823,
  -0.000608829853150321],
 [-0.0005074353586106837,
  -0.0005362752804115953,
  -0.0005958716888916681,
  -0.000608829853150321,
  0.007373689071617548]]

import pyomo.environ as pyo

# Optimization Problem
def create_model(rho, R_avg, Cov):
    m = pyo.ConcreteModel()
    m.idx = pyo.Set(initialize=[0,1,2,3,4])
    # 简化变量初始化
    m.x = pyo.Var(m.idx, initialize=0, bounds=(0, None))
    
    def Obj_func(m):
        mult_result = 0
        for i in m.idx:
            a = sum(m.x[j] * Cov[j][i] for j in m.idx)
            mult_result += a * m.x[i]
        return mult_result
    m.OBJ = pyo.Objective(rule=Obj_func)
    
    def constraint1(m):
        sum_x = sum(m.x[i] for i in m.idx)
        return sum_x == 100  
    # 仅传递函数名,不调用
    m.C1 = pyo.Constraint(rule=constraint1)
    
    def constraint2(m):
        # 使用传入的R_avg参数,正确索引二维列表数据
        sum_r = sum(R_avg[0][i] * m.x[i] for i in m.idx)
        return sum_r >= 0.08
    # 仅传递函数名,不调用
    m.C2 = pyo.Constraint(rule=constraint2)
    
    return m

运行代码

rho = 0.0008
model1 = create_model(rho, R_avg_tolist, Cov_list)

solver = pyo.SolverFactory('ipopt')
results = solver.solve(model1, tee=True)

关键修改说明

  1. 约束规则传递:将rule=constraint1(m)改为rule=constraint1,直接传递函数对象,让Pyomo自行调用生成约束表达式。
  2. 修复约束逻辑:将constraint1的return移到for循环外,确保计算所有变量总和后再返回约束条件。
  3. 修正参数引用:constraint2改用函数参数R_avg,通过R_avg[0][i]正确索引二维列表数据;同时用生成器表达式简化求和逻辑,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:01:01