epsilon-约束方法

本文介绍了ε-约束方法,一种通过Gurobi等求解工具处理多目标优化问题的技术,相比于加权法,它能更好地逼近帕累托前沿。文章详细解释了ε约束的原理、转化过程以及如何通过网格化分数调整求解精度和时间。
摘要由CSDN通过智能技术生成

ε \varepsilon ε-约束方法(这样GUROBI也能解多目标问题了!)

一般解决多目标优化问题的算法都是NSGA-II算法、MOEA-D算法等多目标智能算法。采用Gurobi精确求解的方法往往难以求出pareto最优解,只能通过对多个目标进行加权的方式求解。今天我们学习一种方法,借助它我们也可以使用Gurobi等求解工具求解多目标优化算法,且其求解效果比加权法更好。
在这里插入图片描述

ε \varepsilon ε-约束方法简介

ε \varepsilon ε-约束方法是一种多目标优化算法。它基于约束优化的思想,通过引入一个参数 ε \varepsilon ε来控制目标函数的权重,从而保证满足约束条件的前提下,寻找到最优解的近似解集。

通过选取一个主目标函数,将其余目标函数转化为约束,从而计算每个子优化目标,得到帕累托解集。

过程

针对一个多目标优化问题:
m i n { f 1 ( x ) , f 2 ( x ) , f 3 ( x ) } h ( x ) = 0 g ( x ) ≤ 0 min \{f_1(x),f_2(x),f_3(x)\} \\ h(x)=0 \\ g(x)\leq 0 min{f1(x),f2(x),f3(x)}h(x)=0g(x)0

使用ε约束算法转化问题为:
m i n f 1 ( x ) f 2 ( x ) ≤ ϵ 2 , ⋯   , f n ( x ) ≤ ϵ n h ( x ) = 0 g ( x ) ≤ 0 min f_1(x) \\ f_2(x)\leq \epsilon_2,\cdots,f_n(x)\leq\epsilon_n \\ h(x) = 0 \\ g(x) \leq 0 minf1(x)f2(x)ϵ2,,fn(x)ϵnh(x)=0g(x)0
其中的每个参数 ϵ 2 , ϵ 3 , ⋯   , ϵ n \epsilon_2,\epsilon_3,\cdots,\epsilon_n ϵ2,ϵ3,,ϵn通过计算payoff矩阵得到。

payoff的计算过程:

  1. 求解出第i个目标函数的最优值 f i ( x i ∗ ) f_i(x_i^*) fi(xi),得到其最优解 x i ∗ x_i^* xi

  2. x i ∗ x_i^* xi代入其他目标函数得到 { f 1 ( x i ∗ ) , f 2 ( x i ∗ ) , ⋯   , f n ( x i ∗ ) } \{f_1(x_i^*),f_2(x_i^*),\cdots,f_n(x_i^*)\} {f1(xi),f2(xi),,fn(xi)}

  3. 对全部目标函数按照上述流程求解,得到payoff table矩阵如下:
    [ f 1 ( x 1 ∗ ) ⋯ f i ( x 1 ∗ ) ⋯ f n ( x 1 ∗ ) ⋮ ⋱ ⋮ f 1 ( x i ∗ ) ⋯ f i ( x i ∗ ) ⋯ f n ( x i ∗ ) ⋮ ⋱ ⋮ f 1 ( x n ∗ ) ⋯ f i ( x n ∗ ) ⋯ f n ( x n ∗ ) ] \begin{bmatrix} f_1(x_1^*) & \cdots & f_i(x_1^*) &\cdots & f_n(x_1^*)\\ \vdots& \ddots &&& \vdots\\ f_1(x_i^*) & \cdots & f_i(x_i^*) &\cdots & f_n(x_i^*)\\ \vdots& \ddots& & & \vdots \\ f_1(x_n^*) & \cdots & f_i(x_n^*) &\cdots & f_n(x_n^*)\\ \end{bmatrix} f1(x1)f1(xi)f1(xn)fi(x1)fi(xi)fi(xn)fn(x1)fn(xi)fn(xn)

该方法本质上与网格搜索法相同。得到了payoff矩阵之后,可以求出每个目标的最优值和最劣值(就是每个目标维度的最大和最小值)。记为最优解(U)和最劣解(SN) f i U = f i ( x i ∗ ) f_i^U = f_i(x_i^*) fiU=fi(xi), f i S N = f i ( x j ∗ ) f_i^{SN} = f_i(x_j^*) fiSN=fi(xj)

选择一个主目标函数 f k ( x ) f_k(x) fk(x)

对于主目标函数外的目标函数 f i ( x ) f_{i}(x) fi(x),设置一个网格化分数$q_{ij}∈{1,2,\cdots,q_i,max} $。

由此计算除了主目标函数外的其余目标函数的ε约束如下:
ϵ i j = f i S N − ( f i S N − f i U ) q i j ⋅ j j = 1 , 2 , . . . , q i , m a x ϵ_{ij}=f_i^{SN}−\frac{(f_i^{SN}−f_i^{U})}{q_{ij}}⋅j \qquad j=1,2,...,q_{i,max} ϵij=fiSNqij(fiSNfiU)jj=1,2,...,qi,max
得到每个优化子问题如下:
m i n f k ( x ) s . t . f 1 ( x ) ≤ ϵ 1 j , f 2 ( x ) ≤ ϵ 1 l , f n ( x ) ≤ ϵ 1 m , h ( x ) = 0 , g ( x ) ≤ 0 min f_k(x)\\ s.t. \qquad f_1(x)\leq \epsilon_{1j},f_2(x)\leq \epsilon_{1l},f_n(x)\leq \epsilon_{1m},h(x)=0,g(x)\leq0 minfk(x)s.t.f1(x)ϵ1j,f2(x)ϵ1l,fn(x)ϵ1m,h(x)=0,g(x)0
其中, j = 1 , 2 , ⋯   , q 1 , m a x ; l = 1 , 2 , ⋯   , q 2 , m a x ; ⋯   ; m = 1 , 2 , ⋯   , q n , m a x ; j=1,2,\cdots,q_{1,max};l=1,2,\cdots,q_{2,max};\cdots;m=1,2,\cdots,q_{n,max}; j=1,2,,q1,max;l=1,2,,q2,max;;m=1,2,,qn,max;

每次求出一个最优解,若在可行域内则加入帕累托解集,若不在可行域内则丢弃。

例子

m i n f 1 ( x ) = x 2 − x 1 m i n f 2 ( x ) = x 1 + x 2 s . t . x 1 2 − 2 x 1 + 1 ≤ x 2 0 ≤ x 1 ≤ 1 0 ≤ x 2 ≤ 1 min \quad f_1(x) = x_2-x_1 \\ min \quad f_2(x) = x_1+x_2 \\ s.t. \qquad x_1^2 - 2x_1 + 1 \leq x_2 \\ 0 \leq x_1 \leq 1 \\ 0 \leq x_2 \leq 1 minf1(x)=x2x1minf2(x)=x1+x2s.t.x122x1+1x20x110x21

使用python+gurobi求解代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/3/3 11:35
# @Author  : TUUG
# @Email   : tr6666666@qq.com
import numpy as np
from matplotlib import pyplot as plt
import gurobipy as gp

def f1(constraint=None):
    model = gp.Model()
    x1 = model.addVar(name="X1",vtype=gp.GRB.CONTINUOUS,lb=0,ub=1)
    x2 = model.addVar(name="X2",vtype=gp.GRB.CONTINUOUS,lb=0,ub=1)
    # 添加约束
    model.addConstr(x1*x1-2*x1+1<=x2)
    if constraint is not None:
        model.addConstr(x1+x2<=constraint)
    # 定义目标函数
    model.setObjective(x2-x1, sense = gp.GRB.MINIMIZE)
    model.update()
    # 求解模型
    model.optimize()
    return x1.x,x2.x
    
def f2():
    # 创建模型
    m2 = gp.Model("f2_optimization")
    # 定义变量
    x1 = m2.addVar(name="X1",vtype=gp.GRB.CONTINUOUS,lb=0,ub=1)
    x2 = m2.addVar(name="X2",vtype=gp.GRB.CONTINUOUS,lb=0,ub=1)
    # 添加约束
    m2.addConstr(x1*x1-2*x1+1<=x2)
    # model.addConstr(x2-x1>=cons)
    # 定义目标函数
    m2.setObjective(x2+x1, sense = gp.GRB.MINIMIZE)
    # 求解模型
    m2.optimize()
    return x1.x,x2.x

f11,f12 = f1()
f21,f22 = f2()
f1_min = f12-f11
f2_max = f11+f12
f2_min = f21+f22
f1_max = f22-f21
print('--------------')
print(f2_min,f2_max)
soultion_pool = []
q_n =10
for q in range(q_n):
    constraint = f2_max-(f2_max-f2_min)/q_n*q
    # constraint = np.linspace(f2_min,f2_max,10)[q]
    f11,f12 = f1(constraint=constraint)
    soultion_pool.append([f12-f11,f11+f12])
print(soultion_pool)

import numpy as np
import matplotlib.pyplot as plt
pareto_front_solutions = np.array(soultion_pool)

# 绘制 Pareto 前沿解
plt.scatter(pareto_front_solutions[:, 0], pareto_front_solutions[:, 1], label='Pareto Front')
plt.xlabel('f1(x)')
plt.ylabel('f2(x)')
plt.title('Pareto Front for Multi-objective Optimization')
plt.legend()
plt.show()

求解结果展示如下
网格化分数取10时:
网格化分数取10时帕累托前沿
网格化分数取20时帕累托前沿:
网格化分数取20时帕累托前沿
网格化分数取100时帕累托前沿:
网格化分数取100时帕累托前沿

可以看到,这个方法有一个很好的性质,就是可以通过增大网格化分数来改善求解结果,使其更接近真实帕累托前沿。如果求解时间过长可以减小网格化分数来缩短求解时间。

参考文献

[1] Ismail-Yahaya A, Messac A. Effective generation of the Pareto frontier using the normal constraint method[C]//40th AIAA Aerospace Sciences Meeting & Exhibit. 2002: 178.
[2] Fan Z, Li W, Cai X, et al. An improved epsilon constraint-handling method in MOEA/D for CMOPs with large infeasible regions[J]. Soft Computing, 2019, 23: 12491-12510.
[3] Yang Z, Cai X, Fan Z. Epsilon constrained method for constrained multi-objective optimization problems: some preliminary results[C]//Proceedings of the companion publication of the 2014 annual conference on genetic and evolutionary computation. 2014: 1181-1186.
[4] 【多目标规划问题求解】ε-约束算法_约束法多目标规划问题求解-CSDN博客

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TUUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值