如何解决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)
关键修改说明
- 约束规则传递:将
rule=constraint1(m)改为rule=constraint1,直接传递函数对象,让Pyomo自行调用生成约束表达式。 - 修复约束逻辑:将
constraint1的return移到for循环外,确保计算所有变量总和后再返回约束条件。 - 修正参数引用:
constraint2改用函数参数R_avg,通过R_avg[0][i]正确索引二维列表数据;同时用生成器表达式简化求和逻辑,代码更简洁。
内容的提问来源于stack exchange,提问作者Krishh
相关产品推荐
相关产品推荐

