线性规划(非整数型)

线性规划模型建立与案例(非整数型)

线性规划概述

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济效益问题。此类问题构成了运筹学的一个重要分支——数学规划,而线性规划则(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+x210x1+x28x27x1,x20(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=1ncjxj
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=1naijxj=bixj0i=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+3x20(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=0x30(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. AxbAeqx=beqlbxub

求解线性规划的命令
[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为价值向量,也是线性目标函数中各决策变量的系数,Ab对应的是线性不等式约束,Aeqbeq对应的是线性不等式约束,lbub分别对应的是决策向量的上界向量和下界向量。参数按照对应顺序输入,一些约束条件不存在,则只需在对应位置输入空矩阵[]即可。如不存在等式约束且其他类型约束都有,则只需在Aeqbeq对应位置替换为空矩阵[]即可,如下所示:

[X,fval]=linprog(c,A,b,[],[],lb,ub)
注意事项

MATLAB标准型是求目标函数的最小值,若是实际问题为求目标函数的最大值,则只需对目标函数加一个负号,即令 y = − z y=-z y=z就可以将最大值转变为最小值,当然转换的方式多种多样,也不一定必须是添加负号。此外,不等式约束 A x ≤ b \text Ax \le \text b Axb小于等于。在使用MATLAB求解一般线性规划时一定要先进行转换。

例2 求解下列线性规划问题
max ⁡ z = 2 x 1 + 3 x 2 − 5 x 3 \max\quad z=2x_1+3x_2-5x_3 maxz=2x1+3x25x3

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=72x15x2+x310x1+3x2+x312x1,x2,x30

求解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=2x13x2+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=72x1+5x2x310x1+3x2+x312x1,x2,x30

可以转换为线性规划的问题

例3 规划问题为:
min ⁡ ∣ x 1 ∣ + ∣ x 2 ∣ + ⋯ + ∣ x n ∣ \min\quad |x_1|+|x_2|+\cdots+|x_n| minx1+x2++xn
s.t. A x ≤ b \text{s.t.}\quad \text Ax\le\text b s.t.Axb

其中 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 xuv>0,满足 x = u − v , ∣ x ∣ = u + v x=u-v,|x|=u+v x=uv,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=2xx.
然后记 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=1n(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(uv)bu,v0

建模实战

问题描述

市场上有 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 s1282.51103
s 2 \text s_2 s2211.52198
s 3 \text s_3 s3235.54.552
s 4 \text s_4 s4252.66.540

试给该公司设计一种投资组合方案,即用给定资金 M \text M M,有选择地购买若干种资产或存银行生息,使净收益尽可能大,使总体风险尽可能小。

符号规定

  1. 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指存入银行;

  2. 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

  3. 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

  4. 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

  5. a a a表示投资风险度;

  6. 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>uixiui

  • 购买的投资净收益可以简化为 ( r i − p i ) x i (\text r_\text i-\text p_\text i)x_\text i (ripi)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=0n(ripi)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=0n(1+pi)xi=Mxi0,i=0,1,,n

  • 在实际投资中,投资者承受风险的程度不一样,若给定风险一个界限 a a a,使最大的一个风险 q i x i M ≤ a \frac{\text q_\text ix_\text i}{\text M}\le a Mqixia,可找到相应的投资方案。这样把多目标规划变成一个目标的线性规划。
模型建立
模型一 固定风险水平,优化收益

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=0n(ripi)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. Mqixia,i=0n(1+pi)xi=Mxi0,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=0n(ripi)xiki=0n(1+pi)xi=Mxi0,i=1,2,,n

模型三 均衡考虑风险和收益

投资者在权衡资产风险和预期收益两方面时,希望选择一个令自己满意的投资组合。因此对风险、收益分别赋予权重 s ( 0 < s ≤ 1 ) \text s(0<\text s\le 1) s(0<s1) ( 1 − s ) (1-\text s) (1s) 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}}(1s)i=0n(ripi)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=0n(1+pi)xi=Mxi0,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.05x00.27x10.19x20.185x30.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.025x1a0.015x2a0.055x3a0.026x4ax0+1.01x1+1.02x2+1.045x3+1.065x4=1x1,x2,x3,x40

由于 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

学习视频数学建模老哥


  1. 交易定额是指如果对该资产的投入 s i ≤ u i \text s_{\text i}\leq \text u_\text i siui,则按照投入 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 siui,则正常计算交易费即可, 即交易费 = s i p i 即交易费=\text s_{\text i}\text p_{\text i} 即交易费=sipi↩︎

  2. 投资总额进行了归一化处理,则对于每个资产 s i \text s_\text i si的投资 x i x_\text i xi也进行了归一化,就是对该资产的投资占总资产的比例。 ↩︎

  3. 因为风险是指所有投资项目中风险的最大值,即 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就越小。 ↩︎

  4. 因为题目所给的定值 u i ( 单位 / 元 ) \text u_{\text i}(单位/元) ui(单位/)相对总资产 M \text M M很少,而 p i u i \text p_\text i\text u_\text i piui则更小,所以可以作出这样的简化。 ↩︎

  5. 当投资越分散,收益就会降低,所以风险收益点向左下方移动。投资分散与收益的关系我只是一个感性的认识,没有进行定性和定量的研究,有错误还请支教。 ↩︎

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值