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

使用Pyomo模型实现函数优化时报错f1未初始化问题求助

错误原因

  • 优化问题无有界解:仅设置了变量为非负实数,未配置变量上界约束,线性目标函数在最大化方向上无界,求解器返回无界解,f1/f2没有有效计算值,读取时触发未初始化报错。
  • 模型定义逻辑异常:在循环内部反复给同一个ConcreteModel对象覆盖赋值变量、约束、目标,Pyomo内部组件关联关系紊乱,多次迭代后模型逻辑出错。
  • 缺少求解结果校验:未判断求解器返回的状态是否为最优可行解,直接读取变量值,遇到无界、不可行等异常求解结果时必然报错。

修复后可运行代码

from pyomo.environ import *
import numpy as np
import random
import matplotlib.pyplot as plt

st1 = []
st2 = []
rows = 10
n = []
# 变量上界,可根据实际需求调整
VAR_UB = 20

for i in range(rows):
    rn = random.randint(1,10)
    n.append(rn)
    print(f"随机初始值: {rn}")
    # 每次循环新建模型,避免组件冲突
    model = ConcreteModel()
    # 定义变量时添加上界,保证解有界
    model.x1 = Var(within=NonNegativeReals, bounds=(0, VAR_UB), initialize=rn)
    model.x2 = Var(within=NonNegativeReals, bounds=(0, VAR_UB), initialize=rn)
    model.x3 = Var(within=NonNegativeReals, bounds=(0, VAR_UB), initialize=rn)
    model.x4 = Var(within=NonNegativeReals, bounds=(0, VAR_UB), initialize=rn)

    model.f1 = Var()
    model.f2 = Var()
    model.C_f1 = Constraint(expr= model.f1 == 2 * model.x1 - model.x2 + 4 * model.x3 + model.x4)
    model.C_f2 = Constraint(expr= model.f2 == -3 * model.x1 + model.x2 + 2 * model.x3 - 2 * model.x4)
    model.O_f1 = Objective(expr= model.f1, sense=maximize)
    model.O_f2 = Objective(expr= model.f2, sense=maximize)

    # 优化第一个目标
    model.O_f1.activate()
    model.O_f2.deactivate()
    solver = SolverFactory('glpk')
    res = solver.solve(model)
    # 校验求解结果为最优解再读值
    if (res.solver.status == SolverStatus.ok) and (res.solver.termination_condition == TerminationCondition.optimal):
        print(f'优化f1最优解: ( x1 , x2 , x3 , x4 ) = ( {value(model.x1):.2f} , {value(model.x2):.2f} , {value(model.x3):.2f} , {value(model.x4):.2f} )')
        st1.append(value(model.f1))
        st2.append(value(model.f2))
    else:
        print("优化f1无有效可行解")

    # 优化第二个目标
    model.O_f2.activate()
    model.O_f1.deactivate()
    res = solver.solve(model)
    if (res.solver.status == SolverStatus.ok) and (res.solver.termination_condition == TerminationCondition.optimal):
        print(f'优化f2最优解: ( x1 , x2 , x3 , x4 ) = ( {value(model.x1):.2f} , {value(model.x2):.2f} , {value(model.x3):.2f} , {value(model.x4):.2f} )')
        st1.append(value(model.f1))
        st2.append(value(model.f2))
    else:
        print("优化f2无有效可行解")

print("随机初始值列表:", n)
print("目标A值列表:", st1)
print("目标B值列表:", st2)

plt.scatter(st1, st2)
plt.xlabel('Objective A')
plt.ylabel('Objective B')
plt.show()

补充说明

如果需要做真正的多目标优化(获取帕累托最优前沿),当前轮流单独优化两个目标的逻辑只能得到两个极端解,可改用ε-约束法、加权和法等多目标求解逻辑得到完整的帕累托前沿,用于后续绘图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:39:05