📌目标规划
目标规划(Goal Programming):考虑多个目标
求解思路:
- 加权系数法:为每一目标赋予一个权系数(体现目标之间的重要程度),将多目标转化为单目标问题
- 优先等级法:将各目标按其重要程度不同的有先等级,转化为单目标模型
目标规划无最优解的概念,只有满意解
数学概念:
-
正负偏差变量( f i ( i = 1 , … , l ) f_i~~~(i=1,\dots,l) fi (i=1,…,l)为第i个目标函数, d i 0 d_i^0 di0为 f i f_i fi的目标值)
- 正偏差变量:
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 + = 0 d_i^+=0 di+=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 di−=0)
- d i + × d i − = 0 d_i^+\times d_i^-=0 di+×di−=0 (不可能已超过又未达到)
- 正偏差变量:
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}
-
绝对约束和目标约束
- 绝对约束:必须严格满足的不等式和等式约束(不满足则无可行解(线性规划))硬约束
- 目标约束:可以在约束中加入正负偏移差,在达到目标时允许偏移软约束
- 这里的正负偏移就相当于松弛变量:将不等式化为等式
-
优先因子(优先等级)权系数
- 优先因子:
P
1
,
P
2
…
,
P
k
≫
P
k
+
1
,
k
=
1
,
2
…
,
q
−
1
P_1,P_2\dots,P_k\gg P_{k+1},k=1,2\dots,q-1
P1,P2…,Pk≫Pk+1,k=1,2…,q−1 表示
P
k
比
P
k
+
1
P_k比P_{k+1}
Pk比Pk+1 有更大的优先权
- 当两个目标有相同的优先因子时:可以用 w j w_j wj 权系数来区别
- 优先因子:
P
1
,
P
2
…
,
P
k
≫
P
k
+
1
,
k
=
1
,
2
…
,
q
−
1
P_1,P_2\dots,P_k\gg P_{k+1},k=1,2\dots,q-1
P1,P2…,Pk≫Pk+1,k=1,2…,q−1 表示
P
k
比
P
k
+
1
P_k比P_{k+1}
Pk比Pk+1 有更大的优先权
-
目标规划的目标函数:
- 目标函数(准则函数):按目标约束的正负偏差变量和赋予的优先因子构造,要尽可能缩小偏离目标值,即偏差变量的加权和最小
- 第 i i i个目标要求恰好达到目标值: m i n w i − d i − + w i + d i + min~~w_i^-d_i^-+w_i^+d_i^+ min wi−di−+wi+di+
- 第 i i i个目标不超过目标值: m i n w i + d i + min~~w_i^+d_i^+ min wi+di+ 正偏差变量尽可能小
- 第 i i i个目标超过目标值: m i n w i − d i − min~~w_i^-d_i^- min wi−di− 负偏差变量尽可能小
- 目标函数(准则函数):按目标约束的正负偏差变量和赋予的优先因子构造,要尽可能缩小偏离目标值,即偏差变量的加权和最小
-
目标规划的数学模型:
x j , j = 1 , 2 , … n x_j,j=1,2,\dots 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\dots,l) di+,di−(i=1,2…,l))
q q q个优先级别 P 1 , P 2 , … , P q P_1,P_2,\dots,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,\dots,l wki+,wki−,i=1,2,…,l
m i n z = ∑ k = 1 q P k ( ∑ i = 1 l w k i − d i − + w k i + d i + ) s . t . { ∑ j = 1 n a t j x j ≤ ( = , ≥ ) b t , t = 1 , 2 … , 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 min~~z=\sum_{k=1}^qP_k\left(\sum_{i=1}^lw_{ki}^-d_i^-+w_{ki}^+d_i^+\right)\\s.t. \left\{ \begin{aligned} & \sum_{j=1}^na_{tj}x_j\le(=,\ge)b_t,t=1,2\dots,m \\ & \sum_{j=1}^nc_{ij}x_j+d_i^--d_i^+=d_i^0,i=1,2,\dots,l\\ &x_j\ge0,j=1,2,\dots,n\\ &d_i^-,d_i^+\ge0,i=1,2,\dots,l \end{aligned} \right. min z=k=1∑qPk(i=1∑lwki−di−+wki+di+)s.t.⎩ ⎨ ⎧j=1∑natjxj≤(=,≥)bt,t=1,2…,mj=1∑ncijxj+di−−di+=di0,i=1,2,…,lxj≥0,j=1,2,…,ndi−,di+≥0,i=1,2,…,l
建立目标规划模型时,要确定目标值,优先等级,权系数(层次分析法,专家评定法,…)
求解目标规划的序贯算法
m
i
n
z
=
∑
k
=
1
l
(
w
k
i
−
d
i
−
+
w
k
i
+
d
i
+
)
s
.
t
.
{
∑
j
=
1
n
a
t
j
x
j
≤
(
=
,
≥
)
b
t
,
t
=
1
,
2
…
,
m
∑
j
=
1
n
c
i
j
x
j
+
d
i
−
−
d
i
+
=
d
i
0
,
i
=
1
,
2
,
…
,
l
∑
i
=
1
l
(
w
s
i
−
d
i
−
+
w
s
i
+
d
i
+
)
≤
z
s
∗
,
s
=
1
,
2
,
…
,
k
−
1
x
j
≥
0
,
j
=
1
,
2
,
…
,
n
d
i
−
,
d
i
+
≥
0
,
i
=
1
,
2
,
…
,
l
min~~z=\sum_{k=1}^l\left(w_{ki}^-d_i^-+w_{ki}^+d_i^+\right)\\s.t. \left\{ \begin{aligned} & \sum_{j=1}^na_{tj}x_j\le(=,\ge)b_t,t=1,2\dots,m \\ & \sum_{j=1}^nc_{ij}x_j+d_i^--d_i^+=d_i^0,i=1,2,\dots,l\\ &\sum_{i=1}^l(w_{si}^-d_i^-+w_{si}^+d_i^+)\le z_s^*,s=1,2,\dots,k-1\\ &x_j\ge0,j=1,2,\dots,n\\ &d_i^-,d_i^+\ge0,i=1,2,\dots,l \end{aligned} \right.
min z=k=1∑l(wki−di−+wki+di+)s.t.⎩
⎨
⎧j=1∑natjxj≤(=,≥)bt,t=1,2…,mj=1∑ncijxj+di−−di+=di0,i=1,2,…,li=1∑l(wsi−di−+wsi+di+)≤zs∗,s=1,2,…,k−1xj≥0,j=1,2,…,ndi−,di+≥0,i=1,2,…,l
∑
i
=
1
l
(
w
s
i
−
d
i
−
+
w
s
i
+
d
i
+
)
\sum_{i=1}^l(w_{si}^-d_i^-+w_{si}^+d_i^+)
∑i=1l(wsi−di−+wsi+di+) 代表第s个目标(求和为同一优先因子的不同目标的正负偏差加权系数和)
≤
g
o
a
l
(
s
)
\le goal(s)
≤goal(s)
依据优先因子 P q P_q Pq,逐步求解将 z i ∗ , i = 1 , 2 … l z_i^*,i=1,2\dots l zi∗,i=1,2…l 作为约束条件,直到 i = q i=q i=q 时, z q ∗ z_q^* zq∗ 对应的解即为满意解
i=1时,只是空约束(目标函数和约束等价)无需再确定优先因子
LNGO求解时:
- 每次求解出一个 g o a l goal goal 就将当前目标的正负偏差值作为下一目标求解的等式约束(刚性)
- 直到最后一个目标求解出来的 x ∗ x^* x∗ 才是满意解
model:
sets:
level/1..q/:p,z,goal;#q为优先因子的个数:即目标的个数
variable/1..j/:x;#决策变量个数j
h_con_num/1..m/b;#m刚性约束 ,b为刚性约束不等式右边向量
s_con_num/1..l/:g,dplus,dminus;#l为柔性约束个数,g为等式右边的向量,d+,d-为相应正负偏移量
h_matrix(h_con_num,variable):A#刚性约束矩阵m*j
s_matrix(s_con_num,variable):C#柔性约束矩阵l*j
obj(level,s_con_num)/k i,..,..,../:wplus,wmins#每一目标下的正负权重向量,...为Pk(..d(i1)-,..d(i2)+)即由k和括号内d的下标配对,相当于构造稀疏矩阵,只在其中的个别元素赋值
endsets
data:
ctr=?;#待键入
goal=??0#问号的个数=目标数-1
b=...;
g=...;
a=...;#a,c只是关于决策变量的系数矩阵
c=...;wplus=..;wminus=...;
enddata
min=@sum(level:p*z);
@for(level(i)|i#ne#ctr:p(i)=0);
@for(level(i)|z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)*dminus(j)));#构造目标
@for(h_con_num(i):@sum(variable(j):A(i,j)*x(j))<b(j))#刚性约束
@for(s_con_num(i):@sum(variable(j):C(i,j)*x(j))+dminus(i)-dplus(i))=g(i)); #目标约束
@for(level(i)|i#lt#@size(level):@bnd(0,z(i),goal(i)));
end
- 上述为大致的通用程序:可根据约束条件的不同修改
- 也可以直接设置P避免序贯算法( P k P_k Pk 可以按数量级递减)
matlab 求解多目标规划
- 先求解各目标下的最优值
- 根据最优值求解多目标的满意解
多目标规划模型(matlab):
m
i
n
x
,
y
γ
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
\mathop{min}\limits_{~~~~~~~~x,y}~\gamma\\s.t. \left\{ \begin{aligned} &F(x)-weight \cdot \gamma\le goal\\ &A\cdot x\le b\\ &Aeq\cdot x=beq\\ &c(x)\le0\\ &ceq(x)\le0\\ &lb\le x\le ub \end{aligned} \right.
x,ymin γs.t.⎩
⎨
⎧F(x)−weight⋅γ≤goalA⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)≤0lb≤x≤ub
x
,
w
e
i
g
h
t
,
g
o
a
l
x,weight,goal
x,weight,goal 为向量,
F
(
x
)
F(x)
F(x)为向量函数,其中
g
o
a
l
goal
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’ 为目标向量函数 F ( x ) F(x) F(x)
- nonlcon 为非线性约束函数
- x0 为初始点
- weight :权重(可以设置为各个目标值的绝对值)