有没有关于在Pyomo中进行多目标优化的例子?
我正在尝试最小化4个非线性目标,我想使用pyomo和ipopt。同时也可以使用Gurobi。
我想看到一个非常简单的例子,其中我们尝试为一组决策变量(不只是一个维度,而是可能是一个向量)优化两个或更多目标(一个最小化和一个最大化)。
我拥有的Pyomo书籍(https://link.springer.com/content/pdf/10.1007%2F978-3-319-58821-6.pdf)没有提供任何线索。
使用Pyomo需要自己实现。我现在正在做这件事。最好的方法是增强的epsilon约束方法。它始终是有效的,并且始终可以找到全局帕累托最优解。最好的例子在这里:Effective implementation of the epsilon-constraint method in Multi-Objective Mathematical Programming problems, Mavrotas, G, 2009
。
编辑:在这里,我用Pyomo编写了上面论文中的示例:首先对f1进行最大化,然后对f2进行最大化。接下来将应用正常的epsilon-constraint并绘制低效的帕累托前沿,然后将应用增强的epsilon约束条件,这最终是应该采用的方法!
from pyomo.environ import *
import matplotlib.pyplot as plt
# max f1 = X1 <br>
# max f2 = 3 X1 + 4 X2 <br>
# st X1 <= 20 <br>
# X2 <= 40 <br>
# 5 X1 + 4 X2 <= 200 <br>
model = ConcreteModel()
model.X1 = Var(within=NonNegativeReals)
model.X2 = Var(within=NonNegativeReals)
model.C1 = Constraint(expr = model.X1 <= 20)
model.C2 = Constraint(expr = model.X2 <= 40)
model.C3 = Constraint(expr = 5 * model.X1 + 4 * model.X2 <= 200)
model.f1 = Var()
model.f2 = Var()
model.C_f1 = Constraint(expr= model.f1 == model.X1)
model.C_f2 = Constraint(expr= model.f2 == 3 * model.X1 + 4 * model.X2)
model.O_f1 = Objective(expr= model.f1 , sense=maximize)
model.O_f2 = Objective(expr= model.f2 , sense=maximize)
model.O_f2.deactivate()
solver = SolverFactory('cplex')
solver.solve(model);
print( '( X1 , X2 ) = ( ' + str(value(model.X1)) + ' , ' + str(value(model.X2)) + ' )')
print( 'f1 = ' + str(value(model.f1)) )
print( 'f2 = ' + str(value(model.f2)) )
f2_min = value(model.f2)
# ## max f2
model.O_f2.activate()
model.O_f1.deactivate()
solver = SolverFactory('cplex')
solver.solve(model);
print( '( X1 , X2 ) = ( ' + str(value(model.X1)) + ' , ' + str(value(model.X2)) + ' )')
print( 'f1 = ' + str(value(model.f1)) )
print( 'f2 = ' + str(value(model.f2)) )
f2_max = value(model.f2)
# ## apply normal $\epsilon$-Constraint
model.O_f1.activate()
model.O_f2.deactivate()
model.e = Param(initialize=0, mutable=True)
model.C_epsilon = Constraint(expr = model.f2 == model.e)
solver.solve(model);
print('Each iteration will keep f2 lower than some values between f2_min and f2_max, so [' + str(f2_min) + ', ' + str(f2_max) + ']')
n = 4
step = int((f2_max - f2_min) / n)
steps = list(range(int(f2_min),int(f2_max),step)) + [f2_max]
x1_l = []
x2_l = []
for i in steps:
model.e = i
solver.solve(model);
x1_l.append(value(model.X1))
x2_l.append(value(model.X2))
plt.plot(x1_l,x2_l,'o-.');
plt.title('inefficient Pareto-front');
plt.grid(True);
# ## apply augmented $\epsilon$-Constraint
# max f2 + delta*epsilon <br>
# s.t. f2 - s = e
model.del_component(model.O_f1)
model.del_component(model.O_f2)
model.del_component(model.C_epsilon)
model.delta = Param(initialize=0.00001)
model.s = Var(within=NonNegativeReals)
model.O_f1 = Objective(expr = model.f1 + model.delta * model.s, sense=maximize)
model.C_e = Constraint(expr = model.f2 - model.s == model.e)
x1_l = []
x2_l = []
for i in range(160,190,6):
model.e = i
solver.solve(model);
x1_l.append(value(model.X1))
x2_l.append(value(model.X2))
plt.plot(x1_l,x2_l,'o-.');
plt.title('efficient Pareto-front');
plt.grid(True);
import matplotlib.pyplot as plt
import numpy as np
from pymoo.algorithms.nsga2 import NSGA2
from pymoo.model.problem import Problem
from pymoo.optimize import minimize
from pymoo.visualization.scatter import Scatter
class MyProblem(Problem):
def __init__(self):
"""
max f1 = X1 <br>
max f2 = 3 X1 + 4 X2 <br>
st X1 <= 20 <br>
X2 <= 40 <br>
5 X1 + 4 X2 <= 200 <br>
"""
super().__init__(n_var=2,
n_obj=2,
n_constr=1,
xl=np.array([0, 0]),
xu=np.array([20, 40]))
def _evaluate(self, x, out, *args, **kwargs):
# define both objectives
f1 = x[:, 0]
f2 = 3 * x[:, 0] + 4 * x[:, 1]
# we have to negate the objectives because by default we assume minimization
f1, f2 = -f1, -f2
# define the constraint as a less or equal to zero constraint
g1 = 5 * x[:, 0] + 4 * x[:, 1] - 200
out["F"] = np.column_stack([f1, f2])
out["G"] = g1
problem = MyProblem()
algorithm = NSGA2()
res = minimize(problem,
algorithm,
('n_gen', 200),
seed=1,
verbose=True)
print(res.X)
print(res.F)
fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12, 6))
Scatter(fig=fig, ax=ax1, title="Design Space").add(res.X, color="blue").do()
Scatter(fig=fig, ax=ax2, title="Objective Space").add(res.F, color="red").do()
plt.show()
Miettinen K. 非线性多目标优化。波士顿,马萨诸塞州:Springer US. 1998年。
另一个是:
Lightner M, Director S. 多准则优化和电子电路的统计设计。技术报告DRC-13-4-79,卡内基梅隆大学。1979年。
- Qi Chen