线性规划
线性规划问题是再一组线性的约束条件下,求解一个线性目标函数的最大值或最小值的问题
在Matlab中,其标准形式为
m
i
n
f
T
⋅
x
s
.
t
.
{
A
⋅
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
u
b
min f^T\cdot x \\ s.t. \begin{cases} A\cdot x \leq b \\ A_{eq} \cdot x = b_{eq} \\ lb \leq x \leq ub \end{cases}
minfT⋅xs.t.⎩⎪⎨⎪⎧A⋅x≤bAeq⋅x=beqlb≤x≤ub
其中
f
f
f表示价值向量,
b
b
b称为资源向量,
A
A
A是不等限制关系矩阵,
A
e
q
A_{eq}
Aeq表示等于限制关系矩阵,
l
b
,
u
b
lb,ub
lb,ub分别表示
x
x
x的上下限矩阵,
f
,
b
,
b
e
q
,
l
b
,
u
b
f,b,b_{eq},lb,ub
f,b,beq,lb,ub均为列向量,
A
,
A
e
q
A,A_{eq}
A,Aeq均为矩阵
然后就可以调用Matlab中的线性规划函数linprog
Matlab中的linprog
函数共有三种形式
[ x , f v a l ] = l i n p r o g ( f , A , b ) [ x , f v a l ] = l i n p r o g ( f , A , b , A e q , b e q ) [ x , f v a l ] = l i n p r o g ( f , A , b , A e q , b e q , l b , u b ) \left[x,fval\right]=linprog(f,A,b) \\ \left[x,fval\right]=linprog(f,A,b,A_{eq},b_{eq}) \\ \left[x,fval\right]=linprog(f,A,b,A_{eq},b_{eq},lb,ub) [x,fval]=linprog(f,A,b)[x,fval]=linprog(f,A,b,Aeq,beq)[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
示例 : 求解线性规划
m a x z = 2 x 1 + 3 x 2 − 5 x 3 s . t . { x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 max\ z=2x_1+3x_2-5x_3 \\ s.t. \begin{cases} x_1+x_2+x_3=7 \\ 2x_1-5x_2+x_3\geq 10 \\ x_1+3x_2+x_3 \leq 12 \\ x_1,x_2,x_3\geq 0 \end{cases} max z=2x1+3x2−5x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
解:先将问题转化为Matlab中的标准形式便于求解
m i n w = − 2 x 1 − 3 x 2 + 5 x 3 s . t . { [ − 2 5 1 1 3 1 ] ⋅ [ x 1 x 2 x 3 ] ≤ [ − 10 12 ] [ 1 , 1 , 1 ] ⋅ [ x 1 , x 2 , x 3 ] T = 7 [ 0 , 0 , 0 ] T ≤ [ x 1 , x 2 , x 3 ] T min \ w=-2x_1-3x_2+5x_3 \\ s.t. \begin{cases} \left[ \begin{matrix} -2&5&1\\ 1&3&1 \end{matrix} \right] \cdot \left[ \begin{matrix} x_1\\x_2\\x_3\\ \end{matrix} \right] \leq \left[ \begin{matrix} -10\\12 \end{matrix} \right] \\ \left[ \begin{matrix} 1,1,1 \end{matrix} \right] \cdot \left[ \begin{matrix} x_1,x_2,x_3 \end{matrix} \right]^T =7\\ \left[ \begin{matrix} 0,0,0 \end{matrix} \right]^T \leq \left[ \begin{matrix} x_1,x_2,x_3 \end{matrix} \right]^T \end{cases} min w=−2x1−3x2+5x3s.t.⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧[−215311]⋅⎣⎡x1x2x3⎦⎤≤[−1012][1,1,1]⋅[x1,x2,x3]T=7[0,0,0]T≤[x1,x2,x3]T
具体代码如下f=[-2;-3;5] a=[-2,5,-1;1,3,1] b=[-10;12] aeq=[1,1,1] beq=7 lb=[0;0;0] [x,y]=linprog(f,a,b,aeq,beq,lb) x,y=-y
对于一些看起来不能用线性规划解决的问题可以通过一定的转化,将其变为线性规划问题来解决
形如
m
i
n
∣
x
1
∣
+
∣
x
2
∣
+
∣
x
3
∣
+
⋯
+
∣
x
n
∣
s
.
t
.
A
x
≤
b
min \quad |x_1|+|x_2|+|x_3|+\cdots+|x_n| \\ s.t. Ax\leq b
min∣x1∣+∣x2∣+∣x3∣+⋯+∣xn∣s.t.Ax≤b
注意到总可以找到
x
i
=
u
i
−
v
i
,
∣
x
i
∣
=
u
i
+
v
i
x_i=u_i-v_i,|x_i|=u_i+v_i
xi=ui−vi,∣xi∣=ui+vi ,此时只需要取
u
i
=
∣
x
i
∣
+
x
i
2
,
v
i
=
∣
x
i
∣
−
x
i
2
u_i=\frac{|x_i|+x_i}{2},v_i=\frac{|x_i|-x_i}{2}
ui=2∣xi∣+xi,vi=2∣xi∣−xi
记
u
=
[
u
1
,
u
2
,
⋯
,
u
n
]
T
,
v
=
[
v
1
,
v
2
,
⋯
,
v
n
]
T
u=[u_1,u_2,\cdots,u_n]^T,v=[v_1,v_2,\cdots,v_n]^T
u=[u1,u2,⋯,un]T,v=[v1,v2,⋯,vn]T,进而将问题转化为
m
i
n
∑
i
=
1
n
(
u
i
+
v
i
)
s
.
t
.
{
A
(
u
−
v
)
≤
b
⇔
[
A
,
−
A
]
⋅
[
u
v
]
≤
b
u
,
v
≥
0
min\quad \sum_{i=1}^{n}{(u_i+v_i)} \\ s.t. \begin{cases} A(u-v)\leq b \Leftrightarrow[A,-A]\cdot \left[\begin{matrix}u \\v\end{matrix}\right] \leq b \\ u,v \geq 0 \end{cases}
mini=1∑n(ui+vi)s.t.⎩⎨⎧A(u−v)≤b⇔[A,−A]⋅[uv]≤bu,v≥0
示例:求解线性规划
m i n ∣ x 1 ∣ + 2 ∣ x 2 ∣ + 3 ∣ x 3 ∣ + 4 ∣ x 4 ∣ , s . t . { x 1 − x 2 − x 3 + x 4 ≤ − 2 x 1 − x 2 + x 3 − 3 x 4 ≤ − 1 x 1 − x 2 − 2 x 3 + 3 x 4 ≤ − 1 2 min \quad |x_1|+2|x_2|+3|x_3|+4|x_4|, \\ s.t. \begin{cases} x_1-x_2-x_3+x_4\leq -2 \\ x_1-x_2+x_3-3x_4\leq -1 \\ x_1-x_2-2x_3+3x_4\leq -\frac{1}{2} \end{cases} min∣x1∣+2∣x2∣+3∣x3∣+4∣x4∣,s.t.⎩⎪⎨⎪⎧x1−x2−x3+x4≤−2x1−x2+x3−3x4≤−1x1−x2−2x3+3x4≤−21
解:令 x i = u i − v i , ∣ x i ∣ = u i + v i x_i=u_i-v_i,|x_i|=u_i+v_i xi=ui−vi,∣xi∣=ui+vi,并且令 y = [ u , v ] T y=[u,v]^T y=[u,v]T
题目可以转化为
m i n u 1 + 2 u 2 + 3 u 3 + 4 u 4 + v 1 + 2 v 2 + 3 v 3 + 4 v 4 s . t . { ( u 1 − v 1 ) − ( u 2 − v 2 ) − ( u 3 − v 3 ) + ( u 4 − v 4 ) ≤ − 2 ( u 1 − v 1 ) − ( u 2 − v 2 ) + ( u 3 − v 3 ) − 3 ( u 4 − v 4 ) ≤ − 1 ( u 1 − v 1 ) − ( u 2 − v 2 ) − 2 ( u 3 − v 3 ) + 3 ( u 4 − v 4 ) ≤ − 1 2 min\quad u_1+2u_2+3u_3+4u_4+v_1+2v_2+3v_3+4v_4 \\ s.t. \begin{cases} (u_1-v_1)-(u_2-v_2)-(u_3-v_3)+(u_4-v_4)\leq -2 \\ (u_1-v_1)-(u_2-v_2)+(u_3-v_3)-3(u_4-v_4)\leq -1 \\ (u_1-v_1)-(u_2-v_2)-2(u_3-v_3)+3(u_4-v_4)\leq -\frac{1}{2} \end{cases} minu1+2u2+3u3+4u4+v1+2v2+3v3+4v4s.t.⎩⎪⎨⎪⎧(u1−v1)−(u2−v2)−(u3−v3)+(u4−v4)≤−2(u1−v1)−(u2−v2)+(u3−v3)−3(u4−v4)≤−1(u1−v1)−(u2−v2)−2(u3−v3)+3(u4−v4)≤−21
令
f = [ 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 ] T A = [ 1 , − 1 , − 1 , 1 1 , − 1 , 1 , − 3 1 , − 1 , − 2 , 3 ] b = [ − 2 , − 1 , − 1 2 ] T f=[1,2,3,4,1,2,3,4]^T\\ A= \left[\begin{matrix}1,-1,-1,1\\1,-1,1,-3\\1,-1,-2,3\end{matrix}\right]\\ b=[-2,-1,-\frac{1}{2}]^T f=[1,2,3,4,1,2,3,4]TA=⎣⎡1,−1,−1,11,−1,1,−31,−1,−2,3⎦⎤b=[−2,−1,−21]T
调用Matlab中的linprog函数进行线性规划求解,具体代码如下f=[1;2;3;4;1;2;3;4] A=[1,-1,-1,1;1,-1,1,-3;1,-1,-2,3] A=[A,-A] b=[-2;-1;-1/2] lb=[0;0;0;0;0;0;0;0] [uv,F]=linprog(f,A,b,[],[],lb) x=uv(1:4)-uv(5:8) F
下面我们来建立一个评估投资收益和风险的模型,问题描述如下
市场上有 n n n中资产 s i ( i = 1 , 2 , ⋯ , n ) s_i(i=1,2,\cdots,n) si(i=1,2,⋯,n),现在用总数为 M M M( M M M相当大)的资产进行投资。这 n n n种资产在这一时期内购买 s i s_i si的平均收益率为 r i r_i ri,风险损失率为 q i q_i qi,投资约分散,总的风险越少,总体风险用投资 s i s_i si中最大的风险率来衡量。购买 s i s_i si时的需要缴纳的交易费率为 p i p_i pi,当购买不超过定值 u i u_i ui的时候,交易费按照 u i u_i ui计算。同期银行的存款利率为 r 0 ( r 0 = 5 % ) r_0(r_0=5\%) r0(r0=5%)。投资的相关数据如下表所示
s i s_i si r i / % r_i/\% ri/% q i / % q_i/\% qi/% p i / % p_i/\% pi/% u i / 元 u_i/元 ui/元 s 1 s_1 s1 28 2.5 1 103 s 2 s_2 s2 21 1.5 2 198 s 3 s_3 s3 23 5.5 4.5 52 s 4 s_4 s4 25 2.6 6.5 40 给公司设计一种投资方案,使得在给定资金 M M M的情况下,有选择的购买若干种资产或进行银行存款,使得净收益尽可能大,总体风险尽可能小
符号规定和基本假设
-
符号规定
x i x_i xi表示投资 s i s_i si的资金数量
a a a表示总的风险度
Q Q Q表示总体收益
s 0 s_0 s0表示银行存款, x 0 , r 0 , q 0 , p 0 x_0,r_0,q_0,p_0 x0,r0,q0,p0表示银行存款的金额、利率、风险率、费率 ( r 0 = 5 % , q 0 = 0 , p 0 = 0 ) (r_0=5\%,q_0=0,p_0=0) (r0=5%,q0=0,p0=0)
-
基本假设
投资总数 M M M非常大,且可以认为任意的 x i > u i x_i>u_i xi>ui
总体风险度用投资各个资产的最大风险来评估
n + 1 n+1 n+1种资产之间是相互独立的
在投资的这段时间内, r i , p i , q i r_i,p_i,q_i ri,pi,qi 均为定值
模型的分析和建立
-
总体风险用投资 s i s_i si的最大风险来衡量
a = m a x { q i x i ∣ i = 1 , 2 , ⋯ , n } a=max\{q_ix_i|i=1,2,\cdots,n\} a=max{qixi∣i=1,2,⋯,n} -
在总资产 M M M很大的时候,可认为投资任一 s i s_i si的资金都超过 u i u_i ui,所以投资 s i s_i si的收益可以简化为 ( r i − p i ) x i (r_i-p_i)x_i (ri−pi)xi,则总体收益 Q Q Q可以表示为
Q = ∑ i = 0 n ( r i − p i ) x i Q=\sum_{i=0}^{n}(r_i-p_i)x_i Q=i=0∑n(ri−pi)xi -
整个问题可以描述为在总资产 M M M一定的情况下,使得总体收益尽可能大,总体风险度尽可能小的一个多目标规划模型
{ m a x ∑ i = 0 n ( r i − p i ) x i m i n { max 1 ≤ i ≤ n { q i x i } } s . t . { ∑ i = 0 n ( 1 + p i ) x i = M x i ≥ 0 , i = 1 , 2 , ⋯ , n \begin{cases} max\sum\limits_{i=0}^{n}(r_i-p_i)x_i \\ min\{\max\limits_{1\leq i\leq n}\{q_ix_i\}\} \end{cases} \\ s.t. \begin{cases} \sum\limits_{i=0}^{n}(1+p_i)x_i=M\\ x_i\geq 0,i=1,2,\cdots ,n \end{cases} ⎩⎪⎨⎪⎧maxi=0∑n(ri−pi)ximin{1≤i≤nmax{qixi}}s.t.⎩⎨⎧i=0∑n(1+pi)xi=Mxi≥0,i=1,2,⋯,n -
在实际投资中,投资的收益和风险是对立的两个方面,因此要在两者之间进行一定的取舍,所以给两者赋予一定的权重 s s s和 ( 1 − s ) (1-s) (1−s),模型可以更新为
min s ⋅ max 1 ≤ i ≤ n { q i x i } − ( 1 − s ) ⋅ ∑ i = 0 n ( r i − p i ) x i s . t . { ∑ i = 0 n ( 1 + p i ) x i = M x i ≥ 0 , i = 1 , 2 , ⋯ , n \min \quad s\cdot \max\limits_{1 \leq i\leq n}\{q_ix_i\}-(1-s)\cdot \sum\limits_{i=0}^{n}(r_i-p_i)x_i \\ s.t. \begin{cases} \sum\limits_{i=0}^{n}(1+p_i)x_i=M\\ x_i\geq 0,i=1,2,\cdots ,n \end{cases} mins⋅1≤i≤nmax{qixi}−(1−s)⋅i=0∑n(ri−pi)xis.t.⎩⎨⎧i=0∑n(1+pi)xi=Mxi≥0,i=1,2,⋯,n
模型的求解
令 v = max 1 ≤ i ≤ n { q i x i } v=\max\limits_{1\leq i \leq n}\{q_ix_i\} v=1≤i≤nmax{qixi},则可以增加一组不等限制条件 q i x i ≤ v , i = 1 , 2 , ⋯ , n q_ix_i\leq v,i=1,2,\cdots,n qixi≤v,i=1,2,⋯,n
令
r
=
[
0.05
,
0.28
,
0.21
,
0.23
,
0.25
]
,
p
=
[
0
,
0.01
,
0.02
,
0.045
,
0.065
]
,
q
=
[
0
,
0.025
,
0.015
,
0.055
,
0.026
]
r=[0.05,0.28,0.21,0.23,0.25],p=[0,0.01,0.02,0.045,0.065],q=[0,0.025,0.015,0.055,0.026]
r=[0.05,0.28,0.21,0.23,0.25],p=[0,0.01,0.02,0.045,0.065],q=[0,0.025,0.015,0.055,0.026]
y
=
[
v
,
x
0
,
x
1
,
x
2
,
x
3
,
x
4
]
T
f
=
[
s
,
0.05
(
s
−
1
)
,
0.27
(
s
−
1
)
,
0.19
(
s
−
1
)
,
0.185
(
s
−
1
)
,
0.185
(
s
−
1
)
]
T
A
=
[
−
1
0
0
0
0
0
−
1
0
0.01
0
0
0
−
1
0
0
0.02
0
0
−
1
0
0
0
0.045
0
−
1
0
0
0
0
0.065
]
b
=
[
0
,
0
,
0
,
0
,
0
]
T
A
e
q
=
[
1
,
1.01
,
1.02
,
1.045
,
1.065
]
T
l
b
=
[
0
,
0
,
0
,
0
,
0
,
0
]
T
y=[v,x_0,x_1,x_2,x_3,x_4]^T\\ f=[s,0.05(s-1),0.27(s-1),0.19(s-1),0.185(s-1),0.185(s-1)]^T\\ A=\left[\begin{matrix}-1&0&0&0&0&0\\-1&0&0.01&0&0&0\\-1&0&0&0.02&0&0\\-1&0&0&0&0.045&0\\-1&0&0&0&0&0.065\end{matrix}\right]\\ b=[0,0,0,0,0]^T \\ A_{eq}=[1,1.01,1.02,1.045,1.065]^T \\ lb=[0,0,0,0,0,0]^T
y=[v,x0,x1,x2,x3,x4]Tf=[s,0.05(s−1),0.27(s−1),0.19(s−1),0.185(s−1),0.185(s−1)]TA=⎣⎢⎢⎢⎢⎡−1−1−1−1−10000000.01000000.02000000.045000000.065⎦⎥⎥⎥⎥⎤b=[0,0,0,0,0]TAeq=[1,1.01,1.02,1.045,1.065]Tlb=[0,0,0,0,0,0]T
调用Matlab中的linprog
函数进行求解
具体代码如下
s=0
r=[0.05,0.28,0.21,0.23,0.25]
q=[0,0.025,0.015,0.055,0.026]
p=[0,0.01,0.02,0.045,0.065]
A=[ones(5,1),diag(p)]
b=zeros(5,1)
Aeq=[0,ones(1,5)+p]
beq=100
lb=zeros(6,1)
while s<=1
f=[s;0.05*(s-1);0.27*(s-1);0.19*(s-1);0.185*(s-1);0.185*(s-1)]
[x,fval]=linprog(f,A,b,Aeq,beq,lb)
x
a=x(1)
Q=-(f'*x-x(1)*f(1))
subplot(1,2,1)
plot(s,a,'b+')
hold on
subplot(1,2,2)
plot(s,Q,'r*')
hold on
s=s+0.05
end