一、多目标规划
1.1 多目标规划的定义
多目标规划(Multi-Objective Programming,MOP) 是数学优化中的一类问题。与单目标规划不同,多目标规划有多个目标函数需要优化,这些目标函数通常是相互矛盾的。多目标规划的目标是通过找到一组解,使得各个目标函数在约束条件下都能取得最优值。
1.2 多目标规划的数学模型
对于多个目标函数的情况,向量目标函数表示为
F
(
x
)
=
(
f
1
(
x
)
,
f
2
(
x
)
,
⋯
,
f
m
(
x
)
)
T
F\left( \boldsymbol{x} \right) =\left( f_1\left( \boldsymbol{x} \right) ,f_2\left( \boldsymbol{x} \right) ,\cdots ,f_m\left( \boldsymbol{x} \right) \right) ^T
F(x)=(f1(x),f2(x),⋯,fm(x))T
带有多个约束条件和有界约束的多目标规划的一般形式为
min
F
(
x
)
\min F\left( \boldsymbol{x} \right)
minF(x)
s
.
t
.
{
g
i
(
x
)
⩽
0
,
i
=
1
,
⋯
,
q
h
j
(
x
)
=
0
,
j
=
1
,
⋯
,
p
l
b
⩽
x
⩽
u
b
s.t.\left\{ \begin{array}{c} g_i\left( x \right) \leqslant 0, i=1,\cdots ,q\\ h_j\left( x \right) =0, j=1,\cdots ,p\\ lb\leqslant x\leqslant ub\\ \end{array} \right.
s.t.⎩⎨⎧gi(x)⩽0,i=1,⋯,qhj(x)=0,j=1,⋯,plb⩽x⩽ub
1.3 多目标规划的求解
求解多目标规划的方法通常有:化多目标为单目标、序贯法、NSGA—II等,本文主要介绍最普遍常用的一种方法——把多目标加权合成单目标。此时,多目标规划化成单目标规划的数学模型的形式如下:
min
x
,
γ
γ
\underset{\boldsymbol{x},\gamma}{\min}\,\,\gamma
x,γminγ
s
.
t
.
{
F
(
x
)
−
w
e
i
g
h
t
⋅
γ
⩽
g
o
a
l
A
⋅
x
⩽
b
A
e
q
⋅
x
=
b
e
q
c
(
x
)
⩽
0
c
e
q
(
x
)
=
0
l
b
⩽
x
⩽
u
b
s.t.\left\{ \begin{array}{c} F\left( \boldsymbol{x} \right) -\boldsymbol{weight}\cdot \gamma \leqslant \boldsymbol{goal}\\ A\cdot \boldsymbol{x}\leqslant b\\ Aeq\cdot \boldsymbol{x}=beq\\ c\left( \boldsymbol{x} \right) \leqslant 0\\ ceq\left( \boldsymbol{x} \right) =0\\ lb\leqslant \boldsymbol{x}\leqslant ub\\ \end{array} \right.
s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧F(x)−weight⋅γ⩽goalA⋅x⩽bAeq⋅x=beqc(x)⩽0ceq(x)=0lb⩽x⩽ub
其中:
F
(
x
)
F(\boldsymbol{x})
F(x)为目标函数向量;
w
e
i
g
h
t
\boldsymbol{weight}
weight为各目标相对重要程度的权向量;
g
o
a
l
\boldsymbol{goal}
goal为各个单目标函数值构成的向量。
MATLAB中求解该模型的命令为
[x,fval]=fgoalattain('fun',x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlicon)
其中:nonlicon为定义的非线性约束函数。
二、案例分析
利用MALTAB求解如下多目标线性规划问题:
max
Z
1
=
100
x
1
+
90
x
2
+
80
x
3
+
70
x
4
\max Z_1=100x_1+90x_2+80x_3+70x_4
maxZ1=100x1+90x2+80x3+70x4
min
Z
2
=
3
x
2
+
2
x
4
\min Z_2=3x_2+2x_4
minZ2=3x2+2x4
s
.
t
.
{
x
1
+
x
2
⩾
30
x
3
+
x
4
⩾
30
3
x
1
+
2
x
3
⩽
120
3
x
2
+
2
x
4
⩽
48
x
i
⩾
0
,
i
=
1
,
⋯
,
4
s.t.\left\{ \begin{array}{c} x_1+x_2\geqslant 30\\ x_3+x_4\geqslant 30\\ 3x_1+2x_3\leqslant 120\\ 3x_2+2x_4\leqslant 48\\ x_i\geqslant 0,i=1,\cdots ,4\\ \end{array} \right.
s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x1+x2⩾30x3+x4⩾303x1+2x3⩽1203x2+2x4⩽48xi⩾0,i=1,⋯,4
MATLAB代码:
clc,clear
A=[-1 -1 0 0
0 0 -1 -1
3 0 2 0
0 3 0 2];
b=[-30 -30 120 48];
c1=[-100 -90 -80 -70];
c2=[0 3 0 2];
%求第一个目标函数值
[x1,g1]=linprog(c1,A,b,[],[],zeros(4,1))
disp("第一个目标函数的最优值:"+(-g1))
%求第二个目标函数值
[x2,g2]=linprog(c2,A,b,[],[],zeros(4,1))
disp("第一个目标函数的最优值:"+(g2))
g3=[g1;g2];%目标goal的值
fun=@(x) [c1;c2]*x;
weight=[1,1];%设置两个目标同样重要
[x,fval]=fgoalattain(fun,rand(4,1),g3,weight,A,b,[],[],zeros(4,1))
求解结果:
在约束条件下,只考虑第一个目标函数时,最优解如下:
在约束条件下,只考虑第二个目标函数时,最优解如下:
若考虑两个目标同样重要,则求得多目标规划的最优解和最优值分别为: