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
相关产品推荐
相关产品推荐

