在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益问题。此类问题构成了运筹学的一个重要分支——数学规划,而线性规划则(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表示总体收益;
交易费 = { 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
目标函数 { 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
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');
学习视频数学建模老哥
交易定额是指如果对该资产的投入 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则更小,所以可以作出这样的简化。 ↩︎
当投资越分散,收益就会降低,所以风险收益点向左下方移动。投资分散与收益的关系我只是一个感性的认识,没有进行定性和定量的研究,有错误还请支教。 ↩︎