线性规划模型建立与案例(非整数型)
线性规划概述
在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益问题。此类问题构成了运筹学的一个重要分支——数学规划,而线性规划则(Linear Programming 简记LP)是数学规划的一个重要分支。
线性规划相关概念和特点
例1 某机床厂生产甲、乙两种机床,每台销售后的利润分别为4千元与3千元。生产甲机床需要A、B机器加工,加工时间分别为每台2小时和1小时;生产乙机床需用A、B、C三种机器加工,加工时间为每台各1小时。若每天课用于加工的机器时数分别为A机器10小时、B机器8小时和C机器7小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?
模型建立:设该机床厂生产
x
1
x_1
x1台甲机床和
x
2
x_2
x2台乙机床时,总利润
z
z
z最大,则
x
1
,
x
2
x_1,x_2
x1,x2应该满足
max
z
=
x
1
+
x
2
(1)
\max\quad z=x_1+x_2\tag1\\ \\
maxz=x1+x2(1)
{
2
x
1
+
x
2
≤
10
x
1
+
x
2
≤
8
x
2
≤
7
x
1
,
x
2
≥
0
(2)
\tag2 \begin{cases} \begin{aligned} 2x_1+x_2\leq 10\\ x_1+x_2\leq 8\\ x_2\leq7\\ x_1,x_2\geq 0 \end{aligned} \end{cases}
⎩
⎨
⎧2x1+x2≤10x1+x2≤8x2≤7x1,x2≥0(2)
变量 x 1 , x 2 x_1,x_2 x1,x2称之为决策变量, ( 1 ) (1) (1)式被称为目标函数, ( 2 ) (2) (2)式中的几个不等式是问题的约束条件,记为 s.t. \text{s.t.} s.t.(即subject to)
线性的含义
线性是指目标函数和约束条件均是线性函数,这类问题被称为线性规划问题。或者说线性规划问题是指在一组线性约束的条件下,求一线性目标函数的最大值或最小值的问题。
数学标准型
max
z
=
∑
j
=
1
n
c
j
x
j
\max\quad z=\sum_{\text j=1}^\text nc_\text j\,x_\text j\\
maxz=j=1∑ncjxj
s
.
t
.
{
∑
j
=
1
n
a
ij
x
j
=
b
i
i
=
1
,
2
,
⋯
,
m
x
j
≥
0
j
=
1
,
2
,
⋯
,
n
s.t.\quad \; \begin{cases} \sum\limits_{\rm j=1}^{\text n}a_{\text {ij}}\,x_{\text j}=b_{\text i}&\text i=1,2,\cdots,\text m\\ x_\text j\geq0&\text j=1,2,\cdots,\text n \end{cases}
s.t.⎩
⎨
⎧j=1∑naijxj=bixj≥0i=1,2,⋯,mj=1,2,⋯,n
关于数学标准型的一些理解:在数学标准式中没有不等式约束,编者认为这是因为可以通过引入松弛变量
x
x
x(非决策变量)使不等式约束变为等式约束,如
(
3
)
(3)
(3)式是一个没有引入松弛变量的不等式约束,
(
4
)
(4)
(4)式是引入松弛变量
x
3
x_3
x3后的约束条件,两者是完全等价的。还有一点就是决策变量
x
j
x_\text j
xj的下界都是0且都没有上界,编者认为这并不具备普遍性,有其他解释的读者可以在评论区告诉编者:happy:。
x
1
+
3
x
2
≤
0
(3)
x_1+3x_2\leq0\tag3
x1+3x2≤0(3)
{ x 1 + 3 x 2 + x 3 = 0 x 3 ≥ 0 (4) \begin{cases}\tag4 \begin{aligned} x_1+3x_2+x_3=0\\ x_3\geq0 \end{aligned} \end{cases} {x1+3x2+x3=0x3≥0(4)
可行解、可行域和最优解
满足约束条件的 x = [ x 1 , x 2 , ⋯ , x n ] T x=[x_1,x_2,\cdots,x_n]^T x=[x1,x2,⋯,xn]T的解称为线性规划问题的可行解,所有可行解构成的集合称为可行域,记为R。而使目标函数达到最大值或最小值的可行解叫做最优解。
使用MATLAB
求解模型
线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号,也可以是大于号。为了避免这种形式带来的不变,MATLAB
中规定线性规划求解的标准型。
MATLAB
标准型
min x c T x \min\limits_x\quad \text c^\text Tx xmincTx
s.t. { A x ≤ b Aeq ⋅ x = beq lb ≤ x ≤ ub \text{s.t.}\quad \begin{cases} \begin{aligned} \text Ax\le\text b\\ \text{Aeq}\cdot x=\text{beq}\\ \text{lb}\le x\le \text{ub} \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧Ax≤bAeq⋅x=beqlb≤x≤ub
求解线性规划的命令
[x,fval]=linprog(c,A,B)
[X,fval]=linprog(c,A,b,Aeq,beq)
[X,fval]=linprog(c,A,b,Aeq,beq,lb,ub)
其中x
返回的是决策变量的取值,fval
返回的是目标函数的最优值,c
为价值向量,也是线性目标函数中各决策变量的系数,A
,b
对应的是线性不等式约束,Aeq
,beq
对应的是线性不等式约束,lb
和ub
分别对应的是决策向量的上界向量和下界向量。参数按照对应顺序输入,一些约束条件不存在,则只需在对应位置输入空矩阵[]
即可。如不存在等式约束且其他类型约束都有,则只需在Aeq
和beq
对应位置替换为空矩阵[]
即可,如下所示:
[X,fval]=linprog(c,A,b,[],[],lb,ub)
注意事项
MATLAB
标准型是求目标函数的最小值,若是实际问题为求目标函数的最大值,则只需对目标函数加一个负号,即令
y
=
−
z
y=-z
y=−z就可以将最大值转变为最小值,当然转换的方式多种多样,也不一定必须是添加负号。此外,不等式约束
A
x
≤
b
\text Ax \le \text b
Ax≤b是小于等于。在使用MATLAB
求解一般线性规划时一定要先进行转换。
例2 求解下列线性规划问题
max
z
=
2
x
1
+
3
x
2
−
5
x
3
\max\quad z=2x_1+3x_2-5x_3
maxz=2x1+3x2−5x3
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 \text {s.t.}\quad \begin{cases} \begin{aligned} x_1+x_2+x_3=7\\ 2x_1-5x_2+x_3\ge10\\ x_1+3x_2+x_3\le12\\ x_1,x_2,x_3\ge0 \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧x1+x2+x3=72x1−5x2+x3≥10x1+3x2+x3≤12x1,x2,x3≥0
求解MATLAB
程序如下:
c=[-2;-3;5];
A=[-2,5,-1;1,3,1];
b=[-10;12];
Aeq=[1,1,1];
beq=7;
lb=zeros(3,1);
[X,fval]=linprog(c,A,b,Aeq,beq,lb)
x,z=-fval
在使用MATLAB
求解时,我们需要先将所给约束条件转换为MATLAB
求解的标准型。
min
y
=
−
z
=
−
2
x
1
−
3
x
2
+
5
x
3
\min\quad y=-z=-2x_1-3x_2+5x_3
miny=−z=−2x1−3x2+5x3
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 \text {s.t.}\quad \begin{cases} \begin{aligned} x_1+x_2+x_3=7\\ -2x_1+5x_2-x_3\le-10\\ x_1+3x_2+x_3\le12\\ x_1,x_2,x_3\ge0 \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧x1+x2+x3=7−2x1+5x2−x3≤−10x1+3x2+x3≤12x1,x2,x3≥0
可以转换为线性规划的问题
例3 规划问题为:
min
∣
x
1
∣
+
∣
x
2
∣
+
⋯
+
∣
x
n
∣
\min\quad |x_1|+|x_2|+\cdots+|x_n|
min∣x1∣+∣x2∣+⋯+∣xn∣
s.t.
A
x
≤
b
\text{s.t.}\quad \text Ax\le\text b
s.t.Ax≤b
其中 x = [ x 1 , x 2 , ⋯ , x n ] T x=[x_1,x_2,\cdots,x_n]^{\text T} x=[x1,x2,⋯,xn]T, A A A和 b \text b b为相应维数的矩阵和向量。
要把上面的问题变换成线性规划问题,只需注意到事实:
∀
x
,
∃
u
,
v
>
0
\forall x,\exists\, u,v>0
∀x,∃u,v>0,满足
x
=
u
−
v
,
∣
x
∣
=
u
+
v
x=u-v,|x|=u+v
x=u−v,∣x∣=u+v,由此可以根据解得
u
=
x
+
∣
x
∣
2
,
v
=
∣
x
∣
−
x
2
u=\frac{x+|x|}2,v=\frac{|x|-x}2
u=2x+∣x∣,v=2∣x∣−x.
然后记
u
=
[
u
1
,
u
2
,
⋯
,
u
n
]
T
,
v
=
[
v
1
,
v
2
,
⋯
,
v
n
]
T
u=[u_1,u_2,\cdots,u_n]^{\text T},v=[v_1,v_2,\cdots,v_n]^{\text T}
u=[u1,u2,⋯,un]T,v=[v1,v2,⋯,vn]T,从而我们就可以把上面的问题变为下式:
min
∑
i
=
1
n
(
u
i
+
v
i
)
\min\quad \sum_{\text i=1}^n(u_i+v_i)
mini=1∑n(ui+vi)
s.t. { A ( u − v ) ≤ b u , v ≥ 0 \text{s.t.}\quad \begin{cases} \begin{aligned} \text A(u-v)\le \text b\\ u,v\ge0 \end{aligned} \end{cases} s.t.{A(u−v)≤bu,v≥0
建模实战
问题描述
市场上有 n \text n n种资产 s i ( i = 1 , 2 , ⋯ , n ) \text s_{\text i}\ (\text i=1,2,\cdots,n) si (i=1,2,⋯,n)可以选择,现用数额为 M \text M M的相当大的资金作为一个时期的投资。这 n \text n n种资产在这一时期内购买 s i \text s_{\text i} si的平均收益率为 r i \text r_{\text i} ri,风险损失率为 q i \text q_{\text i} qi,投资越分散,总的风险越少,总体风险可用投资的 s i \text s_{\text i} si中最大的一个风险来度量。
购买 s i \text s_{\text i} si是要付交易费,费率为 p i \text p_{\text i} pi,当购买额不超过给定值 u i \text u_{\text i} ui元时,交易费按购买 u i \text u_{\text i} ui计算。另外,假定同期银行存款利率是 r 0 \text r_0 r0,既无交易费又无风险( r 0 = 5 % \text r_0=5\% r0=5%)
已知 n = 4 \text{n}=4 n=4时相关数据如下表:
s i \text s_{\text i} si | r i % \text r_{\text i}\% ri% | q i % \text q_{\text i}\% qi% | p i % \text p_{\text i}\% pi% | u i \text u_{\text i} ui |
---|---|---|---|---|
s 1 \text s_1 s1 | 28 | 2.5 | 1 | 103 |
s 2 \text s_2 s2 | 21 | 1.5 | 2 | 198 |
s 3 \text s_3 s3 | 23 | 5.5 | 4.5 | 52 |
s 4 \text s_4 s4 | 25 | 2.6 | 6.5 | 40 |
试给该公司设计一种投资组合方案,即用给定资金 M \text M M,有选择地购买若干种资产或存银行生息,使净收益尽可能大,使总体风险尽可能小。
符号规定
-
s i \text s_{\text i} si表示第 i \text i i种投资项目,如股票,债券等, i = 0 , 1 , ⋯ , n \text i=0,1,\cdots,n i=0,1,⋯,n,其中 s 0 \text s_0 s0指存入银行;
-
r i \text r_{\text i} ri, p i \text p_{\text i} pi, q i \text q_{\text i} qi分别表示 s i \text s_{\text i} si的平均收益率,交易费率,风险损失率, i = 0 , 1 , ⋯ , n \text i=0,1,\cdots,n i=0,1,⋯,n,其中 p 0 = 0 \text p_0=0 p0=0, q 0 = 0 \text q_0=0 q0=0;
-
u i \text u_{\text i} ui1表示 s i \text s_{\text i} si的交易定额, i = 0 , 1 , ⋯ , n \text i=0,1,\cdots,n i=0,1,⋯,n;
-
x i x_{\text i} xi表示投资项目 s i \text s_{\text i} si的资金, i = 0 , 1 , ⋯ , n \text i=0,1,\cdots,n i=0,1,⋯,n;
-
a a a表示投资风险度;
-
Q \text Q Q表示总体收益;
基本假设
- 投资数额 M \text M M相当大,为了便于计算,假设 M = 1 \text M=1 M=12;
- 总体风险用投资项目 s i \text s_{\text i} si中最大的一个风险来度量;
- 投资越分散,总的风险越小3;
- 各种自然 s i \text s_{\text i} si的投资是相互独立的;
- 在投资的这一时期内, r i \text r_{\text i} ri, p i \text p_{\text i} pi, q i \text q_{\text i} qi为定值,不受意外因素的影响;
- 净收益和总体风险只受 r i \text r_{\text i} ri, p i \text p_{\text i} pi, q i \text q_{\text i} qi影响,不受其他因素干扰。
模型建立与分析
模型分析
- 总体风险用所投资的 s i \text s_{\text i} si中最大的一个风险来衡量,即 风险 = max { q i x i ∣ i = 1 , 2 , ⋯ , n } 风险=\max\ \{\text q_\text ix_\text i\ |\,\text i=1,2,\cdots,n\} 风险=max {qixi ∣i=1,2,⋯,n};
- 购买 s i \text s_{\text i} si所付交易费是一个分段函数,即:
交易费 = { p i x i , x i > u i p i u i , x i ≤ u i 交易费= \begin{cases} \text p_\text ix_\text i,&x_\text i>\text u_\text i\\ \text p_\text i\text u_\text i,&x_\text i\le\text u_\text i\\ \end{cases} 交易费={pixi,piui,xi>uixi≤ui
- 购买的投资净收益可以简化为 ( r i − p i ) x i (\text r_\text i-\text p_\text i)x_\text i (ri−pi)xi4。
- 要使净收益尽可能大,总体风险尽可能小,这是一个多目标规划模型。
目标函数 { max ∑ i = 0 n ( r i − p i ) x i min max { q i x i ∣ i = 1 , 2 , ⋯ , n } 目标函数\ \begin{cases} \begin{aligned} \max\quad \sum_{\text i=0}^\text n(\text r_\text i-\text p_\text i)x_\text i\\ \min \;\max\ \{\text q_\text ix_\text i\ |\ \text i=1,2,\cdots,n\} \end{aligned} \end{cases} 目标函数 ⎩ ⎨ ⎧maxi=0∑n(ri−pi)ximinmax {qixi ∣ i=1,2,⋯,n}
s.t. { ∑ i = 0 n ( 1 + p i ) x i = M x i ≥ 0 , i = 0 , 1 , ⋯ , n \text {s.t.}\quad \begin{cases} \begin{aligned} \sum_{\text i=0}^\text n(1+\text p_\text i)x_\text i=\text M\\ x_\text i\ge0,\quad i=0,1,\cdots,n \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧i=0∑n(1+pi)xi=Mxi≥0,i=0,1,⋯,n
- 在实际投资中,投资者承受风险的程度不一样,若给定风险一个界限 a a a,使最大的一个风险 q i x i M ≤ a \frac{\text q_\text ix_\text i}{\text M}\le a Mqixi≤a,可找到相应的投资方案。这样把多目标规划变成一个目标的线性规划。
模型建立
模型一 固定风险水平,优化收益
max ∑ i = 0 n ( r i − p i ) x i \max\,\sum_{\text i=0}^\text n(\text r_\text i-\text p_\text i)x_\text i maxi=0∑n(ri−pi)xi
s.t. { q i x i M ≤ a , i = 1 , 2 , ⋯ , n ∑ i = 0 n ( 1 + p i ) x i = M x i ≥ 0 , i = 1 , 2 , ⋯ , n \text{s.t.}\quad \begin{cases} \frac{\text q_\text ix_\text i}{\text M}\le a,&\text i=1,2,\cdots,n\\ \sum\limits_{\text i=0}^\text n(1+\text p_\text i)x_\text i=\text M\\ x_\text i\ge0,&\text i=1,2,\cdots,n \end{cases} s.t.⎩ ⎨ ⎧Mqixi≤a,i=0∑n(1+pi)xi=Mxi≥0,i=1,2,⋯,ni=1,2,⋯,n
模型二 固定盈利水平,使风险最小化
min max { q i x i ∣ i = 1 , 2 , ⋯ , n } \min \;\max\ \{\text q_\text ix_\text i\ |\ \text i=1,2,\cdots,n\} minmax {qixi ∣ i=1,2,⋯,n}
s.t. { ∑ i = 0 n ( r i − p i ) x i ≥ k ∑ i = 0 n ( 1 + p i ) x i = M x i ≥ 0 , i = 1 , 2 , ⋯ , n \text{s.t.}\quad \begin{cases} \sum\limits_{\text i=0}^\text n(\text r_\text i-\text p_\text i)x_\text i\ge \text k\\ \sum\limits_{\text i=0}^\text n(1+\text p_\text i)x_\text i=\text M\\ x_\text i\ge0,&\text i=1,2,\cdots,n \end{cases} s.t.⎩ ⎨ ⎧i=0∑n(ri−pi)xi≥ki=0∑n(1+pi)xi=Mxi≥0,i=1,2,⋯,n
模型三 均衡考虑风险和收益
投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资组合。因此对风险、收益分别赋予权重
s
(
0
<
s
≤
1
)
\text s(0<\text s\le 1)
s(0<s≤1)和
(
1
−
s
)
(1-\text s)
(1−s),
s
\text s
s称为投资偏好系数。
min
s
{
max
{
q
i
x
i
∣
i
=
1
,
2
,
⋯
,
n
}
}
−
(
1
−
s
)
∑
i
=
0
n
(
r
i
−
p
i
)
x
i
\min\quad \text s\{\max\{\text q_\text ix_\text i\ |\ \text i=1,2,\cdots,n\}\}-(1-\text s)\sum\limits_{\text i=0}^\text n(\text r_\text i-\text p_\text i)x_\text i
mins{max{qixi ∣ i=1,2,⋯,n}}−(1−s)i=0∑n(ri−pi)xi
s.t. { ∑ i = 0 n ( 1 + p i ) x i = M x i ≥ 0 , i = 1 , 2 , ⋯ , n \text{s.t.}\quad \begin{cases} \sum\limits_{\text i=0}^\text n(1+\text p_\text i)x_\text i=\text M\\ x_\text i\ge0,&\text i=1,2,\cdots,n \end{cases} s.t.⎩ ⎨ ⎧i=0∑n(1+pi)xi=Mxi≥0,i=1,2,⋯,n
模型一求解
min f = − 0.05 x 0 − 0.27 x 1 − 0.19 x 2 − 0.185 x 3 − 0.185 x 4 \min\quad f=-0.05x_0-0.27x_1-0.19x_2-0.185x_3-0.185x_4 minf=−0.05x0−0.27x1−0.19x2−0.185x3−0.185x4
s.t. { 0.025 x 1 ≤ a 0.015 x 2 ≤ a 0.055 x 3 ≤ a 0.026 x 4 ≤ a x 0 + 1.01 x 1 + 1.02 x 2 + 1.045 x 3 + 1.065 x 4 = 1 x 1 , x 2 , x 3 , x 4 ≥ 0 \text{s.t.}\quad \begin{cases} \begin{aligned} 0.025x_1\leq a\\ 0.015x_2\leq a\\ 0.055x_3\leq a\\ 0.026x_4\leq a\\ x_0+1.01x_1+1.02x_2+1.045x_3+1.065x_4=1\\ x_1,x_2,x_3,x_4\ge0 \end{aligned} \end{cases} s.t.⎩ ⎨ ⎧0.025x1≤a0.015x2≤a0.055x3≤a0.026x4≤ax0+1.01x1+1.02x2+1.045x3+1.065x4=1x1,x2,x3,x4≥0
由于 a a a是任意给定的风险度,不同的投资者有不同的风险度,显然最优解是与 a a a有关的,我们从 a = 0 a=0 a=0开始,以步长 Δ a = 0.001 \Delta a=0.001 Δa=0.001进行循环搜索,编程如下:
a=0;hold on
while a<0.05
c=[-0.05,-0.27,-0.19,-0.185,-0.185];
A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];
b=a*ones(4,1);
Aeq=[1,1.01,1.02,1.045,1.065];
beq=1;
lb=zeros(5,1);
[x,Q]=linprog(c,A,b,Aeq,beq,lb);
Q=-Q;
plot(a,Q,'*K');
a=a+0.001;
end
xlabel('a');
ylabel('Q');
结果分析
风险收益图
- 风险越大,收益也越大
- 当投资分散时,投资者承担的风险越小,投资者承担的风险越小5,这与题意一致。冒险的投资者会出现集中投资的情况,保守的投资者则尽量分散投资。
- 在 a = 0.006 a=0.006 a=0.006附近会有一个转折点在这一点左边,风险增加很少时;利润增长很快。在这一点的右边风险增加很大时,利润增长的很缓慢,所以对于风险和收益没有特殊偏好的投资者来说,应该选择曲线的转折点作为最优投资组合,大概是 a = 0.6 % , Q = 20 % a=0.6\%,\text Q=20\% a=0.6%,Q=20%,所对应的投资方案为 风险度 a = 0.006 ,收益Q = 0.2019 , x 0 = 0 , x 1 = 0.24 , x 2 = 0.4 , x 3 = 0.1901 , x 4 = 0.2212 风险度a=0.006,收益\text Q=0.2019,x_0=0,x_1=0.24,x_2=0.4,x_3=0.1901,x_4=0.2212 风险度a=0.006,收益Q=0.2019,x0=0,x1=0.24,x2=0.4,x3=0.1901,x4=0.2212。
学习视频数学建模老哥
交易定额是指如果对该资产的投入 s i ≤ u i \text s_{\text i}\leq \text u_\text i si≤ui,则按照投入 u i \text u_{\text i} ui来计算交易费, 即交易费 = u i p i 即交易费=\text u_{\text i}\text p_{\text i} 即交易费=uipi;若对该资产的投入 s i ≥ u i \text s_{\text i}\geq \text u_\text i si≥ui,则正常计算交易费即可, 即交易费 = s i p i 即交易费=\text s_{\text i}\text p_{\text i} 即交易费=sipi。 ↩︎
投资总额进行了归一化处理,则对于每个资产 s i \text s_\text i si的投资 x i x_\text i xi也进行了归一化,就是对该资产的投资占总资产的比例。 ↩︎
因为风险是指所有投资项目中风险的最大值,即 max { x 1 p 1 , x 2 p 2 , ⋯ , x n p n } \max\ \{x_1\text p_1,x_2\text p_2,\cdots,x_\text n\text p_\text n\} max {x1p1,x2p2,⋯,xnpn},当投资越分散时,则平均对每个资产的投资 x i x_\text i xi就越小,所以风险 x i p i x_\text i\text p_{\text i} xipi就越小。 ↩︎
因为题目所给的定值 u i ( 单位 / 元 ) \text u_{\text i}(单位/元) ui(单位/元)相对总资产 M \text M M很少,而 p i u i \text p_\text i\text u_\text i piui则更小,所以可以作出这样的简化。 ↩︎
当投资越分散,收益就会降低,所以风险收益点向左下方移动。投资分散与收益的关系我只是一个感性的认识,没有进行定性和定量的研究,有错误还请支教。 ↩︎