多目标优化示例 Pyomo

Posted

技术标签:

【中文标题】多目标优化示例 Pyomo【英文标题】:Multi-objective optimization example Pyomo 【发布时间】:2018-11-17 11:21:43 【问题描述】:

Pyomo 中多目标优化的任何示例?

我正在尝试最小化 4 个目标(非线性),我想使用 pyomo 和 ipopt。也可以访问 Gurobi。

我想看一个非常简单的例子,我们尝试针对决策变量列表(不仅仅是一个维度,也可能是一个向量)针对两个或多个目标(一个最小化和一个最大化)进行优化。

我拥有的 Pyomo 书 (https://link.springer.com/content/pdf/10.1007%2F978-3-319-58821-6.pdf) 没有提供任何线索。

【问题讨论】:

【参考方案1】:

使用 Pyomo,您必须自己实现它。我现在正在做。最好的方法是增强的 epsilon-constraint 方法。它总是有效的并且总是找到全局帕累托最优。最好的例子在这里: Effective implementation of the epsilon-constraint method in Multi-Objective Mathematical Programming problems, Mavrotas, G, 2009.

编辑:在这里,我在 pyomo 中编写了上面论文中的示例: 它将首先为 f1 最大化,然后为 f2 最大化。然后它会应用正常的 epsilon-constraint 并绘制低效的 Pareto-front,然后它将应用增强的 epsilon-constraint,这最终是要使用的方法!

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);

【讨论】:

非常感谢您的回答。我正在尝试在我的上下文中对其进行调整。真的非常感谢。 感谢您提供此示例! @CordKaldemeyer 不客气 ;-) 那是我写硕士论文的时候。很高兴它帮助了某人!【参考方案2】:

据我所知,虽然 Pyomo 支持多目标模型的表达,但它还没有自动模型转换来为您生成常见的多目标优化公式。

也就是说,您仍然可以自己创建这些公式。看看 epsilon-constraint、1-norm 和 infinity norm 的一些想法。

【讨论】:

非常感谢您的反馈。您是否有您建议的 epsilon 约束、1-范数和无穷大范数的链接?请提供一个或一些。 一个是:Miettinen K. Nonlinear Multiobjective Optimization. Boston, MA: Springer US. 1998.,另一个是:Lightner M, Director S. Multiple criteria optimization and statistical design for electronic circuits. Tech. Rep. DRC-13-4-79, Carnegie Mellon University. 1979.【参考方案3】:

免责声明:我是 pymoo 的主要开发者,这是一个 Python 中的多目标优化框架。

您可能需要考虑 Python 中专注于多目标优化的其他框架。例如,在 pymoo 中,上面提到的相当简单的测试问题的定义或多或少是直截了当的。您可以在下面找到它的实现。设计和目标空间中的结果如下所示:

pymoo 文档齐全,并提供入门指南,演示如何定义您自己的优化问题、获得一组接近最优的解决方案并对其进行分析:https://pymoo.org/getting_started.html

该框架的重点是与多目标优化相关的任何事情,包括可视化和决策制定。

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()

【讨论】:

以上是关于多目标优化示例 Pyomo的主要内容,如果未能解决你的问题,请参考以下文章

多目标多节优化器(MOMVO)解决多目标优化问题

多目标多节优化器(MOMVO)解决多目标优化问题

多目标优化求解基于金鹰算法(MOGEO)的多目标优化求解matlab源码

多目标优化求解基于matlab原子搜索算法求解多目标优化问题含Matlab源码 2148期

多目标优化

多目标优化求解基于matlab粘菌算法MOSMA求解多目标优化问题含Matlab源码 2279期