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

Pyomo建模报错:No objectives defined for input model 问题求解

问题解决:Pyomo报错"No objectives defined for input model"

核心错误原因

你创建目标函数时误用了model.Objective,正确的做法是使用Pyomo模块的pyo.Objective类来定义目标函数,否则目标函数不会被正确注册到模型中,导致求解器识别不到目标。

修正后的完整代码

import pyomo.environ as pyo

model = pyo.ConcreteModel()
model.i = pyo.Set(initialize=[1,2,3])
model.j = pyo.Set(initialize=[1,2])

data_d = {1:50 , 2:50 , 3:100}
model.d = pyo.Param(model.i , initialize=data_d)
data_d_p = {1:200 , 2:250 , 3:150}
model.d_p = pyo.Param(model.i , initialize=data_d_p)

# 注:当前变量为整数类型,若需求解线性规划(LP),请将domain改为pyo.NonNegativeReals
model.X = pyo.Var(model.i , model.j , domain=pyo.NonNegativeIntegers, initialize=0) 
model.Y = pyo.Var(model.i , model.j , domain=pyo.NonNegativeIntegers, initialize=0)

# 修正目标函数创建方式
model.obj = pyo.Objective(
    expr = (model.X[1,1] + model.Y[1,1]) + 2 * (model.X[1,2] + model.Y[1,2]) + 
           2 * (model.X[2,1] + model.Y[2,1]) + (model.X[2,2] + model.Y[2,2]) + 
           (model.X[3,1] + model.Y[3,1]) + (model.X[3,2] + model.Y[3,2]),
    sense = pyo.minimize
)

def xi_constraint_rule(m, i):
    return sum(m.X[i,j] for j in m.j) == m.d[i]

def yi_constraint_rule(m, i):
    return sum(m.Y[i,j] for j in m.j) == m.d_p[i]

def xj_constraint_rule(m, j):
    x_total = sum(m.X[i,j] for i in m.i)
    y_total = sum(m.Y[i,j] for i in m.i)
    return x_total >= 0.25 * (x_total + y_total)

def total_constraint_rule(m, j):
    total = sum(m.X[i,j] + m.Y[i,j] for i in m.i)
    return (total >= 300, total <= 500)

# 改用IndexedConstraint替代ConstraintList,代码更简洁高效
model.first_const = pyo.Constraint(model.i, rule=xi_constraint_rule)
model.second_const = pyo.Constraint(model.i, rule=yi_constraint_rule)
model.third_const = pyo.Constraint(model.j, rule=xj_constraint_rule)
model.fourth_fifth_const = pyo.Constraint(model.j, rule=total_constraint_rule)

# 添加求解逻辑
solver = pyo.SolverFactory('glpk')  # glpk支持整数规划与线性规划,也可替换为cbc等求解器
result = solver.solve(model)

# 输出求解结果
print("求解状态:", result.solver.status)
print("求解终止原因:", result.solver.termination_condition)
model.display()

其他优化说明

  • 约束定义优化:用IndexedConstraint替代ConstraintList,避免循环添加约束,代码更简洁且Pyomo处理效率更高。
  • 参数引用优化:直接使用m.d[i]而非pyo.value(m.d[i]),保留参数的符号化引用,符合Pyomo建模规范。
  • 约束合并:将第四、第五个约束合并为一个规则,减少重复代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:00:38