author:旭宝ww
DateTime:2020/7/2
一、引言
对于多于一个的目标函数在给定区域上的最优化问题称为多目标规划问题。在多目标规划中,各目标之间是相互冲突的,不一定存在所有目标上都是最优的解。因此多目标问题的解构成一个集合,他们之间不能简单地比较好坏,这样的解称为非支配解(有效解) 或者 Pareto最优解。
注意:多目标规划不同于单目标规划,在数学建模的结果中不应当给出一个最优解,Pareto最优解应当是一组解,以供甲方选择。
二、模型实例
1 一般地,多目标规划的数学模型如下:
m i n F ( x ) = ( f 1 ( x ) , f 2 ( x ) , … , f m ( x ) ) s . t . x ∈ Ω \mathbf{min \quad F(x)=\left (f_1(x),f_2(x),…,f_m(x)\right) }\\ \mathbf{s.t.\quad x\in \Omega} minF(x)=(f1(x),f2(x),…,fm(x))s.t.x∈Ω
其中 x = ( x 1 , x 2 , … , x n ) x=(x_1,x_2,…,x_n) x=(x1,x2,…,xn)所在的空间 Ω \Omega Ω称为问题的决策空间(可行解空间),m维向量 F ( x ) F(x) F(x)所在的空间称为问题的目标空间。
其中 Ω = { x ∈ R n ∣ g i ( x ) ≤ 0 , i = 1 , 2 , … , p } \Omega =\left \{x\in R^{n} |g_i(x)\le 0,i=1,2,…,p \right \} Ω={x∈Rn∣gi(x)≤0,i=1,2,…,p}
2 相关概念
定义1:对最小化问题,一个向量 u = ( u 1 , u 2 , … , u m ) u=(u_1,u_2,…,u_m) u=(u1,u2,…,um)支配另一个向量 v = ( v 1 , v 2 , … , v m ) v=(v_1,v_2,…,v_m) v=(v1,v2,…,vm),当且仅当
{ u i ≤ v i , ∀ i ∈ { 1 , 2 , … , m } ∃ j ∈ { 1 , 2 , … , m } \begin{cases} u_i \le v_i,\forall i \in \left \{ 1,2,…,m \right \} \\ \exists j \in \left \{ 1,2,…,m \right \} \end{cases} {ui≤vi,∀i∈{1,2,…,m}∃j∈{1,2,…,m}
定义2:对于任意两个自变量向量 x 1 , x 2 ∈ Ω x_1,x_2\in \Omega x1,x2∈Ω,如果向量 ( f 1 ( x 1 ) , f 2 ( x 1 ) , … , f m ( x 1 ) ) (f_1(x_1),f_2(x_1),…,f_m(x_1)) (f1(x1),f2(x1),…,fm(x1))支配向量 ( f 1 ( x 2 ) , f 2 ( x 2 ) , … , f m ( x 2 ) ) (f_1(x_2),f_2(x_2),…,f_m(x_2)) (f1(x2),f2(x2),…,fm(x2)),则称 x 1 x_1 x1支配 x 2 x_2 x2。
定义3:如果 Ω \Omega Ω中没有支配 x x x的解,则称 x x x是问题的一个Pareto最优解,Pareto最优解的集合称为Pareto最优解集,Pareto最优解集在目标空间的像集称为Pareto前沿(Pareto Front)。
例如,此图的横坐标为
F
1
(
x
)
F_1(x)
F1(x),纵坐标为
F
2
(
x
)
F_2(x)
F2(x),红色的连线即为该问题的Pareto前沿,H和G两点的自变量
x
x
x都是此问题的解。
三、求解方法
多目标优化问题的算法大体分为传统的数学规划方法和智能优化方法。传统方法只能得到非支配解,故需要重点掌握智能优化方法的MATLAB实现。
3.1传统的数学规划方法
1.主要目标法:确定一个目标为主要目标,确定合适的界限值把次要目标作为约束条件。
{
m
i
n
f
1
(
x
)
s
.
t
.
f
i
(
x
)
≤
a
i
,
i
=
2
,
3
,
…
,
m
x
∈
Ω
\begin{cases} min \quad f_1(x)\\ s.t. \quad f_i(x) \le a_i,i=2,3,…,m\\ \quad\quad x \in \Omega \end{cases}
⎩⎪⎨⎪⎧minf1(x)s.t.fi(x)≤ai,i=2,3,…,mx∈Ω
其中界限值
a
i
≥
min
x
∈
Ω
f
i
(
x
)
,
i
=
2
,
3
,
…
,
m
a_i\ge \min \limits_{x\in \Omega} f_i(x),i=2,3,…,m
ai≥x∈Ωminfi(x),i=2,3,…,m
2.分层序列法:先对m个目标的重要性排序。先求问题:
P
(
1
)
{
m
i
n
f
1
(
x
)
s
.
t
.
x
∈
Ω
P(1)\quad \begin{cases} min \quad f_1(x)\\ s.t.\quad x \in \Omega \end{cases}
P(1){minf1(x)s.t.x∈Ω
的最优解
x
(
1
)
x^{(1)}
x(1)和最优值
f
1
∗
f_1^{*}
f1∗。
再求问题:
P
(
2
)
{
m
i
n
f
2
(
x
)
s
.
t
.
x
∈
Ω
1
=
Ω
⋂
{
x
∣
f
1
(
x
)
≤
f
1
∗
}
P(2)\quad \begin{cases} min \quad f_2(x)\\ s.t.\quad x \in \Omega_1=\Omega \bigcap \left \{ x|f_1(x) \le f_1^* \right \} \end{cases}
P(2){minf2(x)s.t.x∈Ω1=Ω⋂{x∣f1(x)≤f1∗}
的最优解
x
(
2
)
x^{(2)}
x(2)和最优值
f
2
∗
f_2^{*}
f2∗。
如此进行下去,直到求出第
m
m
m个问题:
P
(
m
)
{
m
i
n
f
m
(
x
)
s
.
t
.
x
∈
Ω
m
−
1
=
Ω
m
−
2
⋂
{
x
∣
f
m
−
1
(
x
)
≤
f
m
−
1
∗
}
P(m)\quad \begin{cases} min \quad f_m(x)\\ s.t.\quad x \in \Omega_{m-1}=\Omega_{m-2} \bigcap \left \{ x|f_{m-1}(x) \le f_{m-1}^* \right \} \end{cases}
P(m){minfm(x)s.t.x∈Ωm−1=Ωm−2⋂{x∣fm−1(x)≤fm−1∗}
的最优解
x
(
m
)
x^{(m)}
x(m)和最优值
f
m
∗
f_m^{*}
fm∗。
于是 x ∗ = x ( m ) x^*=x^{(m)} x∗=x(m)就是多目标规划问题的一个非支配解。
3.加权法:对m个目标加以适当的权重,化作单目标规划
{
m
i
n
∑
i
=
1
m
ω
i
f
i
(
x
)
s
.
t
.
x
∈
Ω
\begin{cases} min \sum\limits_{i=1}^{m}\omega_if_i(x)\\ s.t.\quad x \in \Omega \end{cases}
⎩⎨⎧mini=1∑mωifi(x)s.t.x∈Ω
4.MATLAB求解单目标规划问题
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub) %%求解二次规划 x T A x x^TAx xTAx
[x,fval]=fmincon(f,x0,A,b,Aeq,beq,lb,ub,nonlcon) %%求解约束下的多元函数最小值
3.2 智能优化算法(NSGA-Ⅱ)
能力有限,无法理解算法的原理,贴一位大佬的博客:
https://blog.csdn.net/qq_40434430/article/details/82876572
MATLAB中的内置函数gamultiobj() (ga:遗传;multiobj:多目标 )是基于NSGA-Ⅱ改进的一种多目标遗传算法。
gamultiobj适用于求解以下形式的多目标问题:
{
m
i
n
F
(
x
)
s
.
t
.
A
X
≤
b
A
e
q
∗
X
=
b
e
q
l
b
≤
X
≤
u
b
\begin{cases} min \quad F(x)\\ s.t.\quad AX\le b\\ \qquad Aeq*X=beq\\ \qquad lb\le X\le ub \end{cases}
⎩⎪⎪⎪⎨⎪⎪⎪⎧minF(x)s.t.AX≤bAeq∗X=beqlb≤X≤ub
调用格式:
[X,FVAL]=gamultiobj( f, NVARS, A, b, Aeq, beq, lb, ub, nonlcon, options)
%X是Pareto解集
%FVAL是目标函数在Pareto解上的函数值
%f是需要计算的目标函数
%NVARS是变量的个数
%options是绘制Pareto前沿的函数gaoptimset的参数
实例:
{
m
i
n
f
1
(
x
)
=
x
1
4
−
10
x
1
2
+
x
1
x
2
+
x
2
4
−
x
1
2
x
2
2
m
i
n
f
2
(
x
)
=
x
1
4
+
x
1
x
2
+
x
2
4
−
x
1
2
x
2
2
s
.
t
.
−
5
≤
x
1
,
x
2
≤
5
\begin{cases} min\quad f_1(x)=x_1^4-10x_1^2+x_1x_2+x_2^4-x_1^2x_2^2\\ min\quad f_2(x)=x_1^4+x_1x_2+x_2^4-x_1^2x_2^2\\ s.t.\quad -5\le x_1,x_2\le 5 \end{cases}
⎩⎪⎨⎪⎧minf1(x)=x14−10x12+x1x2+x24−x12x22minf2(x)=x14+x1x2+x24−x12x22s.t.−5≤x1,x2≤5
function y=Fun(x)
y(1)=x(1)^4-10*x(1)^2+x(1)*x(2)+x(2)^4-x(1)^2*x(2)^2;
y(2)=x(2)^4-x(1)^2*x(2)^2+x(1)^4+x(1)*x(2);
end
clear;clc;
fitnessfcn=@Fun %%调用函数句柄
nvars=2; %%变量个数
lb=[-5,-5];
ub=[5,5];
A=[];b=[];
Aeq=[];beq=[];
options=gaoptimset('paretoFraction',0.3,'populationsize',100,'generations',200,'stallGenLimit',200,'TolFun',1e-10,'PlotFcns',@gaplotpareto);
%最优个体系数paretoFraction为0.3
%种群大小populationsize为100
%最大进化代数generations为200
%停止代数stallGenLimit为200
%适应度函数偏差TolFun为1e-10
%函数gaplotpareto:绘制Pareto前沿
[x,fval]=gamultiobj(fitnessfcn,nvars,A,b,Aeq,beq,lb,ub,options)
MATLAB运行结果如下: