线性规划

线性规划

线性规划的MATLAB解法

MATLAB求解函数如下:

	 [ x, fval] = linprog(c,A,b,Aeq,beq,LB,RB,X0,OPTIONS);

注意使用前需要将目标函数及其约束条件转化为MATLAB标准型:
线性规划函数重载

注意线性规划的标准形式
m i n z , A x ≤ b , A e q x = b e q , l b ≤ x ≤ u b min\quad{z}\quad , {Ax}\leq{b},A_{eq}{x}=b_{eq},lb\leq{x}\leq{ub} minz,AxbAeqx=beqlbxub 许多看起来不是线性规划的问题都可以转成线性规划,例如: m i n z = ∣ x 1 ∣ + ∣ x 2 ∣ + . . . . . . + ∣ x n ∣ min\quad z= |x_1|+ |x_2| +......+|x_n| minz=x1+x2+......+xn 任意一个 x i = u i − v i , ∣ x i ∣ = u i + v i , ∀ u i , v i ≥ 0 x_i =u_i-v_i,|x_i|=u_i + v_i,\quad \forall u_i,v_i\geq0 xi=uivi,xi=ui+vi,ui,vi0,这样我们就可以把原问题转化为一个线性规划问题。

指派问题

 分配 n n n个人干 m m m项工作每个人仅干一项工作,若分配第 i i i个人去干第 j j j项工作,需要花费 c i j c_{ij} cij单位时间,如何分配才能使得所花时间最短?
 该问题可转化为线性规划,只需给出矩阵 C = ( c i j ) C=\left( c_{ij}\right) C=(cij), C C C被称为指派矩阵 引入二进制变量 x i j x_{ij} xij上述问题的数学模型为: m i n ∑ i = 1 n ∑ j = 1 m c i j x i min \quad \sum_{i=1}^{n}\sum_{j=1}^{m}c_{ij}x_i mini=1nj=1mcijxi s . t ∑ j = 1 m x i = 1 i = 1 , 2 , 3... n s.t\quad \sum\limits_{j=1}^{m}x_i=1\quad i=1,2,3...n s.tj=1mxi=1i=1,2,3...n ∑ i = 1 n x i j ≥ 1 j = 1 , 2 , 3... m \quad\quad\quad \sum_{i=1}^{n}x_{ij}\geq1 \quad j=1,2,3...m i=1nxij1j=1,2,3...m x i j = 0 或 1 x_{ij}=0或1 xij=01  对于二维线性规划MATLAB无法直接求解,只能先转化为维线性规划,转化方式为:

  1. 先按分配区域分组, m m m项工作共 m m m组,每组 n n n个人。
  2. 构造价值向量 c m n × 1 c_{mn\times 1} cmn×1
  3. 构造约束矩阵 A A A,其中第 i i i个人的索引为 i : n : e n d i:n:end i:n:end,每一组的索引为 n × ( i − 1 ) + 1 : i × n n\times (i-1)+1:i\times n n×(i1)+1:i×n
  4. 构造自变量约束向量。
  5. 利用*linprog( )*函数求解。
    很多问题都可以看成指派问题的变形只是改变 指派矩阵约束条件

整数规划

 相比线性规划整数规划只是在线性规划的基础上增加整数约束条件求解函数为 intlinprog( )

整数规划的求解

 变量都为整数的时候称为 完全整数规划,变量部分为整数的时候称为混合整数规划 具体理论不再赘述,利用 *** intlinprog( )*** 求解时需要增加一个整数位置变量intcon 来表明那些位置的的变量为整数。

整数规划的转化
相互排斥的约束条件

 有两个相互排斥的约束条件 : 5 x 1 + 4 x 2 ≤ 24 或 7 x 1 + 3 x 2 ≤ 45 5x_1+4x_2\leq24或7x_1+3x_2\leq45 5x1+4x2247x1+3x245可改写为
{ 5 x 1 + 4 x 2 ≤ 24 + M 7 x 1 + 3 x 2 ≤ 45 + ( 1 − y ) M \begin{cases} 5x_1+4x_2\leq24+M \\ 7x_1+3x_2\leq 45+(1-y)M \end{cases} {5x1+4x224+M7x1+3x245+(1y)M其中 M M M是一个足够大的数,保证两个约束总有一个在约束。

蒙特卡洛法

 对于整数的线性规划可以采用 MATLAB 求解器求解,但是对于非线性的整数规划我们没有通用的求解方法可以采用蒙特卡洛法求出一个满意的解。

线性分段函数的转化

 原油购买问题中,原油的售价和和购买量成分段线性函数关系
c ( x ) = { 10 x 0 ≤ x ≤ 500 1000 + 8 x 500 ≤ x ≤ 1000 3000 + 6 x 1000 ≤ x ≤ 1500 c \left(x \right)= \begin{cases} 10x & 0\leq x \leq 500 \\ 1000+8x & 500\leq x \leq 1000 \\ 3000 +6x & 1000\leq x \leq 1500 \end{cases} c(x)=10x1000+8x3000+6x0x500500x10001000x1500下面介绍三种转换方式

  • 解法1:
     购买消费: c ( x ) = 10 x 1 + 8 x 2 + 6 x 3 c(x) =10x_1+8x_2+6x_3 c(x)=10x1+8x2+6x3, 同 时 增 加 约 束 : x 2 ( x 1 − 500 ) = 0 , x 3 ( x 2 − 500 ) = 0 同时增加约束:x_2(x_1-500)=0,x_3(x_2-500)=0 :x2(x1500)=0,x3(x2500)=0。注意因题而异,函数需要连续性。
  • 解法2:
     可以将 c ( x ) 函 数 进 行 分 段 , 分 成 三 个 区 域 b 1 = 0 , b 2 = 500 , b 3 = 1000 , b 4 = 1500 , x 在 不 同 的 区 间 可 以 用 不 同 的 凸 组 合 表 示 , 例 如 x 0 = w 1 b 1 + w 2 b 2 , w 1 + w 2 = 1 , 由 于 c ( x ) 是 线 性 函 数 c ( x 0 ) = w 1 c ( b 1 ) + w 2 c ( b 2 ) c(x)函数进行分段,分成三个区域b_1=0,b_2=500,b_3=1000,b_4=1500,x在不同的区间可以用不同的凸组合表示,例如x_0=w_1b_1+w_2b_2,\quad w_1+w_2=1,由于c(x)是线性函数c(x_0)=w_1c(b_1)+w_2c(b_2) c(x)b1=0,b2=500,b3=1000,b4=1500xx0=w1b1+w2b2,w1+w2=1,c(x)线c(x0)=w1c(b1)+w2c(b2)。可令将付款函数写为 c ( x ) = 5000 w 2 + 9000 w 3 + 12000 w 4 c(x)=5000w_2+9000w_3+12000w_4 c(x)=5000w2+9000w3+12000w4 自变量为 x = w 1 b 1 + w 2 b 2 + w 3 b 3 + w 4 b 4 x=w_1b_1+w_2b_2+w_3b_3+w_4b_4 x=w1b1+w2b2+w3b3+w4b4。加入约束 w 1 ≤ z 1 , w 2 ≤ z 1 + z 2 , w 3 ≤ z 2 + z 3 , w 4 ≤ z 4 w 1 + w 2 + w 3 + w 4 = 1 z 1 + z 2 + z 3 = 1 w_1\leq z_1,w_2\leq z_1+z_2,w_3\leq z_2+z_3,w_4 \leq z_4 \quad w_1+w_2+w_3+w_4=1 \quad z_1+z_2+z_3=1 w1z1,w2z1+z2,w3z2+z3,w4z4w1+w2+w3+w4=1z1+z2+z3=1 ∀ z i ∈ { 0 , 1 } \forall z_i\in\{0,1\} zi{0,1}
  • 解法3:
     引入 0 − 1 0-1 01变量改变约束: { 500 z 2 ≤ x 1 ≤ 500 z 1 500 z 3 ≤ x 2 ≤ 500 z 2 x 3 ≤ 500 z 3 ∀ z i ∈ { 0 , 1 } \begin{cases} 500z_2\leq x_1\leq500z_1\\ 500z_3\leq x_2\leq 500z_2\\ x_3\leq500z_3 \end{cases} \quad \forall z_i \in \{0,1\} 500z2x1500z1500z3x2500z2x3500z3zi{0,1}将原问题转化为整数线性规划。
     对于分段的目标函数 解法二 更有一般性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值