一、应用场合:线性规划只能解决一组线性条件约束下,一个目标的最大值或最小值的问题。然而在实际决策中,衡量方案优劣需要考虑多个目标,这时就需要用到多目标规划。
二、基本概念
1.正、负偏差变量
设 fi(i=1,⋯ ,l)f_i(i = 1,\cdots,l)fi(i=1,⋯,l)为第 i 个目标函数,它的正偏差变量 di+=max{fi−di0,0}d_i^+ = max\{ f_i - d_i^0,0\}di+=max{fi−di0,0} 表示决策值超过目标值的部分,负偏差变量 di−=−min{fi−di0,0}d_i^- = -min\{ f_i - d_i^0,0\}di−=−min{fi−di0,0} 表示决策值未达到目标值的部分,这里 di0d_i^0di0 表示 fif_ifi 的目标值。决策值不可能既超过目标值同时又未达到目标值,即恒有 di+∗di−=0d_i^+ * d_i^- = 0di+∗di−=0 。
2.刚性(绝对)约束和目标(柔性)约束
刚性约束是指必须严格满足的等式约束与不等式约束,如线性规划问题的所有约束条件;而目标约束是目标规划特有的,在达到目标值时允许发生正或负偏差,因此在这些约束中加入正、负偏差变量,以表示和目标值的实际差距情况。
3.优先因子(优先等级)与权系数
对于多目标的规划问题,目标之间往往存在主次或轻重缓急之分,因此引入优先因子(第一级)与权系数(第二级)来划分目标之间的优先级。凡要求第一位达到的目标赋予优先因子 P1P_1P1 ,次位为 P2P_2P2 ,以此类推。
4.目标函数
按各目标约束的正、负偏差变量和赋予相应的优先因子而构造。当每一目标值确定后,应尽可能缩小偏离目标值,因此目标规划的目标函数只能是所有偏差变量的加权和。其基本形式有三种:
(1)第 i 个目标要求刚好达到目标值,即正、负偏差变量都要尽可能地小,这时 minwi−di−+wi+di+\min w_i^-d_i^- + w_i^+d_i^+minwi−di−+wi+di+ (2)第 i 个目标要求不超过目标值,即允许达不到目标值,就是正偏差变量要尽可能地小,这时 minwi+di+\min w_i^+d_i^+minwi+di+ (3)第 i 个目标要求超过目标值,即超过量不限,但必须是负偏差变量要尽可能小,这时 minwi−di−\min w_i^-d_i^-minwi−di−
三、一般数学模型
设 xj(j=1,2,⋯ ,n)x_j(j = 1,2,\cdots,n)xj(j=1,2,⋯,n) 是目标规划的决策变量,共有 mmm 个约束是刚性约束,可能是等式约束,也可能是不等式约束。设有 lll 个柔性目标约束,其目标约束的偏差为 di+,di−=(i=1,2,⋯ ,l)d_i^+,d_i^- = (i = 1,2,\cdots,l)di+,di−=(i=1,2,⋯,l) 。设有 qqq 个优先级别,分别为 P1,P2,⋯ ,PqP_1,P_2,\cdots,P_qP1,P2,⋯,Pq 。在同一个优先级 PkP_kPk 中有不同的权重,分别记为 wki+,wki−(i=1,2,⋯ ,l)w_{ki}^+,w_{ki}^-(i = 1,2,\cdots,l)wki+,wki−(i=1,2,⋯,l) 。因此目标规划模型的一般数学表达式为:minz=∑k=1qPk(∑i=1lwki−di−+wki+di+)\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=1natjxj≤(=,≥)bt,t = 1,…,m∑j=1ncijxj+di−−di+=di0,i = 1,2,…,lxj≥0,j = 1,2,…,ndi−,di+≥0,i = 1,2,…,ls.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.工具函数
多目标规划可以归结为minx,γγ,\min_{x,\gamma}\gamma,x,γminγ, s.t.{F(x)−weight∗γ≤goal,A∗x≤b,Aeq∗x=beq,c(x)≤0,ceq(x)=0,lb≤x≤ub。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、weight、goal、b、beq、lb和ubx、weight、goal、b、beq、lb 和 ubx、weight、goal、b、beq、lb和ub 为向量;A和AeqA和AeqA和Aeq 为矩阵;c(x),ceq(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≤bA * x \leq bA∗x≤b ,Aeq 、beq 定义等式约束 Aeq∗x=beqAeq * x = beqAeq∗x=beq ,nonclon 是用M文件定义的非线性约束 c(x)≤0,ceq(x)=0c(x) \leq 0,ceq(x) = 0c(x)≤0,ceq(x)=0 。返回值 fval 是目标向量函数的值。
2.实例
求解多目标线性规划问题
maxZ1=100x1+90x2+80x3+70x\max Z_1 = 100x_1 + 90x_2 + 80x_3 + 70xmaxZ1=100x1+90x2+80x3+70x minZ2=3x2+2x4\min Z_2 = 3x_2 + 2x_4minZ2=3x2+2x4 s.t.{x1+x2≥30,x3+x4≥30,3x1+2x3≤120,3x2+2x4≤48,xi≥0,i = 1,…,4s.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后才是实际目标值。