一、应用场合:线性规划只能解决一组线性条件约束下,一个目标的最大值或最小值的问题。然而在实际决策中,衡量方案优劣需要考虑多个目标,这时就需要用到多目标规划。
二、基本概念
1.正、负偏差变量
设
f
i
(
i
=
1
,
⋯
 
,
l
)
f_i(i = 1,\cdots,l)
fi(i=1,⋯,l)为第 i 个目标函数,它的正偏差变量
d
i
+
=
m
a
x
{
f
i
−
d
i
0
,
0
}
d_i^+ = max\{ f_i - d_i^0,0\}
di+=max{fi−di0,0} 表示决策值超过目标值的部分,负偏差变量
d
i
−
=
−
m
i
n
{
f
i
−
d
i
0
,
0
}
d_i^- = -min\{ f_i - d_i^0,0\}
di−=−min{fi−di0,0} 表示决策值未达到目标值的部分,这里
d
i
0
d_i^0
di0 表示
f
i
f_i
fi 的目标值。决策值不可能既超过目标值同时又未达到目标值,即恒有
d
i
+
∗
d
i
−
=
0
d_i^+ * d_i^- = 0
di+∗di−=0 。
2.刚性(绝对)约束和目标(柔性)约束
刚性约束是指必须严格满足的等式约束与不等式约束,如线性规划问题的所有约束条件;而目标约束是目标规划特有的,在达到目标值时允许发生正或负偏差,因此在这些约束中加入正、负偏差变量,以表示和目标值的实际差距情况。
3.优先因子(优先等级)与权系数
对于多目标的规划问题,目标之间往往存在主次或轻重缓急之分,因此引入优先因子(第一级)与权系数(第二级)来划分目标之间的优先级。凡要求第一位达到的目标赋予优先因子
P
1
P_1
P1 ,次位为
P
2
P_2
P2 ,以此类推。
4.目标函数
按各目标约束的正、负偏差变量和赋予相应的优先因子而构造。当每一目标值确定后,应尽可能缩小偏离目标值,因此目标规划的目标函数只能是所有偏差变量的加权和。其基本形式有三种:
(1)第 i 个目标要求刚好达到目标值,即正、负偏差变量都要尽可能地小,这时
min
w
i
−
d
i
−
+
w
i
+
d
i
+
\min w_i^-d_i^- + w_i^+d_i^+
minwi−di−+wi+di+ (2)第 i 个目标要求不超过目标值,即允许达不到目标值,就是正偏差变量要尽可能地小,这时
min
w
i
+
d
i
+
\min w_i^+d_i^+
minwi+di+ (3)第 i 个目标要求超过目标值,即超过量不限,但必须是负偏差变量要尽可能小,这时
min
w
i
−
d
i
−
\min w_i^-d_i^-
minwi−di−
三、一般数学模型
设
x
j
(
j
=
1
,
2
,
⋯
 
,
n
)
x_j(j = 1,2,\cdots,n)
xj(j=1,2,⋯,n) 是目标规划的决策变量,共有
m
m
m 个约束是刚性约束,可能是等式约束,也可能是不等式约束。设有
l
l
l 个柔性目标约束,其目标约束的偏差为
d
i
+
,
d
i
−
=
(
i
=
1
,
2
,
⋯
 
,
l
)
d_i^+,d_i^- = (i = 1,2,\cdots,l)
di+,di−=(i=1,2,⋯,l) 。设有
q
q
q 个优先级别,分别为
P
1
,
P
2
,
⋯
 
,
P
q
P_1,P_2,\cdots,P_q
P1,P2,⋯,Pq 。在同一个优先级
P
k
P_k
Pk 中有不同的权重,分别记为
w
k
i
+
,
w
k
i
−
(
i
=
1
,
2
,
⋯
 
,
l
)
w_{ki}^+,w_{ki}^-(i = 1,2,\cdots,l)
wki+,wki−(i=1,2,⋯,l) 。因此目标规划模型的一般数学表达式为:
min
z
=
∑
k
=
1
q
P
k
(
∑
i
=
1
l
w
k
i
−
d
i
−
+
w
k
i
+
d
i
+
)
\min z = \sum_{k = 1}^qP_k\left(\sum_{i = 1}^lw_{ki}^-d_i^-+w_{ki}^+d_i^+\right)
minz=k=1∑qPk(i=1∑lwki−di−+wki+di+)
s
.
t
.
{
∑
j
=
1
n
a
t
j
x
j
≤
(
=
,
≥
)
b
t
,
t = 1,
…
,m
∑
j
=
1
n
c
i
j
x
j
+
d
i
−
−
d
i
+
=
d
i
0
,
i = 1,2,
…
,l
x
j
≥
0
,
j = 1,2,
…
,n
d
i
−
,
d
i
+
≥
0
,
i = 1,2,
…
,l
s.t. \begin{cases} \sum_{j = 1}^na_{tj}x_j \leq ( = ,\geq)b_t,&\text{t = 1,\ldots,m}\\ \sum_{j=1}^nc_{ij}x_j + d_i^- - d_i^+ = d_i^0,& \text{i = 1,2,\ldots,l}\\ x_j \geq 0,&\text{j = 1,2,\ldots,n}\\ d_i^-,d_i^+ \geq 0,&\text{i = 1,2,\ldots,l} \end{cases}
s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧∑j=1natjxj≤(=,≥)bt,∑j=1ncijxj+di−−di+=di0,xj≥0,di−,di+≥0,t = 1,…,mi = 1,2,…,lj = 1,2,…,ni = 1,2,…,l
四、基于MATLAB R2014a的多目标规划解法
1.工具函数
多目标规划可以归结为
min
x
,
γ
γ
,
\min_{x,\gamma}\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.\begin{cases} F(x) - weight * \gamma \leq goal,\\ A * x \leq b,\\ Aeq * x = beq,\\ c(x) \leq 0,\\ ceq(x) = 0,\\ lb \leq x \leq ub。 \end{cases}
s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧F(x)−weight∗γ≤goal,A∗x≤b,Aeq∗x=beq,c(x)≤0,ceq(x)=0,lb≤x≤ub。 式中:
x
、
w
e
i
g
h
t
、
g
o
a
l
、
b
、
b
e
q
、
l
b
和
u
b
x、weight、goal、b、beq、lb 和 ub
x、weight、goal、b、beq、lb和ub 为向量;
A
和
A
e
q
A和Aeq
A和Aeq 为矩阵;
c
(
x
)
,
c
e
q
(
x
)
和
F
(
x
)
c(x),ceq(x)和F(x)
c(x),ceq(x)和F(x) 为向量函数(可为非线性);F(x)为所考虑的目标函数;goal为与达到的目标。故多目标规划的Matlab函数fgoalattain用法为:
[x,fval] = fgoalattain('fun',x0,goal,weight)
[x,fval] = fgoalattain('fun',x0,goal,weight,A,b)
[x,fval] = fgoalattain('fun',x0,goal,weight,A,b,Aeq,beq)
[x,fval] = fgoalattain('fun',x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
其中:fun 为用M文件定义的目标向量函数,x0 为初值,weight 为权重。A 、b定义不等式约束 A ∗ x ≤ b A * x \leq b A∗x≤b ,Aeq 、beq 定义等式约束 A e q ∗ x = b e q Aeq * x = beq Aeq∗x=beq ,nonclon 是用M文件定义的非线性约束 c ( x ) ≤ 0 , c e q ( x ) = 0 c(x) \leq 0,ceq(x) = 0 c(x)≤0,ceq(x)=0 。返回值 fval 是目标向量函数的值。
2.实例
求解多目标线性规划问题
max
Z
1
=
100
x
1
+
90
x
2
+
80
x
3
+
70
x
\max Z_1 = 100x_1 + 90x_2 + 80x_3 + 70x
maxZ1=100x1+90x2+80x3+70x
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.\begin{cases} x_1 + x_2 \geq 30,\\ x_3 + x_4 \geq 30,\\ 3x_1 + 2x_3 \leq 120,\\ 3x_2 + 2x_4 \leq 48,\\ x_i \geq 0,&\text{i = 1,\ldots,4} \end{cases}
s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x1+x2≥30,x3+x4≥30,3x1+2x3≤120,3x2+2x4≤48,xi≥0,i = 1,…,4 编写MATLAB程序如下:
clc,clear
% % 构造约束条件系数矩阵,默认不等式约束条件为<=,若为>=则不等式两边同时乘以-1
a = [-1 -1 0 0
0 0 -1 -1
3 0 2 0
0 3 0 2];
% % 构造目标值矩阵
b = [-30 -30 120 48]';
% % 构造目标系数矩阵,默认目标为min,若为max则写为(-min)
c1 = [-100 -90 -80 -70];
c2 = [0 3 0 2];
fun = @(x)[c1;c2] * x; % 用匿名函数定义目标向量
[x1,g1] = linprog(c1,a,b,[],[],zeros(4,1)) % 求第一个目标函数的目标值
[x2,g2] = linprog(c2,a,b,[],[],zeros(4,1)) % 求第二个目标函数的目标值
g3 = [g1;g2]; % 目标goal的值
[x,fval] = fgoalattain(fun,rand(4,1),g3,abs(g3),a,b,[],[],zeros(4,1))
运行结果如图。需要注意的是,因为在编程时 max 被指定为 -min ,因此计算出来的第一个结果还需要乘以 -1后才是实际目标值。