数学建模预备知识——线性规划

线性规划

线性规划问题是再一组线性的约束条件下,求解一个线性目标函数的最大值或最小值的问题

在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} minfTxs.t.AxbAeqx=beqlbxub
其中 f f f表示价值向量, b b b称为资源向量, A A A是不等限制关系矩阵, A e q A_{eq} Aeq表示等于限制关系矩阵, l b , u b lb,ub lbub分别表示 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+3x25x3s.t.x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30
解:

先将问题转化为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=2x13x2+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 minx1+x2+x3++xns.t.Axb
注意到总可以找到 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=uivi,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=2xi+xi,vi=2xixi

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=1n(ui+vi)s.t.A(uv)b[A,A][uv]bu,v0

示例:求解线性规划
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} minx1+2x2+3x3+4x4,s.t.x1x2x3+x42x1x2+x33x41x1x22x3+3x421
解:

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=uivi,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.(u1v1)(u2v2)(u3v3)+(u4v4)2(u1v1)(u2v2)+(u3v3)3(u4v4)1(u1v1)(u2v2)2(u3v3)+3(u4v4)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,3b=[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 s1282.51103
s 2 s_2 s2211.52198
s 3 s_3 s3235.54.552
s 4 s_4 s4252.66.540

给公司设计一种投资方案,使得在给定资金 M M M的情况下,有选择的购买若干种资产或进行银行存款,使得净收益尽可能大,总体风险尽可能小

符号规定和基本假设
  1. 符号规定

    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)

  2. 基本假设

    投资总数 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 均为定值

模型的分析和建立
  1. 总体风险用投资 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{qixii=1,2,,n}

  2. 在总资产 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 (ripi)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=0n(ripi)xi

  3. 整个问题可以描述为在总资产 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=0n(ripi)ximin{1inmax{qixi}}s.t.i=0n(1+pi)xi=Mxi0,i=1,2,,n

  4. 在实际投资中,投资的收益和风险是对立的两个方面,因此要在两者之间进行一定的取舍,所以给两者赋予一定的权重 s s s ( 1 − s ) (1-s) (1s),模型可以更新为
    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} mins1inmax{qixi}(1s)i=0n(ripi)xis.t.i=0n(1+pi)xi=Mxi0,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=1inmax{qixi},则可以增加一组不等限制条件 q i x i ≤ v , i = 1 , 2 , ⋯   , n q_ix_i\leq v,i=1,2,\cdots,n qixiv,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(s1),0.27(s1),0.19(s1),0.185(s1),0.185(s1)]TA=111110000000.01000000.02000000.045000000.065b=[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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值