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

