线性规划建模技巧总结

线性规划问题建模的重要性

大家在对实际问题按照线性规划建模时,有没有因为一些特殊的变量或者约束而束手无策。例如目标函数是个求最大最小值问题,变量带绝对值符号,约束条件只能二选一。这篇文章介绍的建模技巧,让你轻松地将上述棘手难题转换为线性规划问题。

流程图

现实生活中,有很多问题可以描述成优化问题,然后利用运筹优化的知识加以解决。它们通常遵循以下流程:

Created with Raphaël 2.2.0 开始 建立模型 设计算法 简化? 整理数据 评价结果 满意? 结束 yes no yes no

可以看出,比较核心的两个步骤是:建模(modeling)和求解(solve)。

对于现在有很多成熟的软件或者工具包,可以求解线性规划问题。比如,lingo, cplex, gurobi, glpk,lpsolve, scip,matlab optimization toolbox等。

实际问题成千上万万,它们的约束、目标等各不相同。如何对实际问题建模,并将它归结为一个线性规划问题,是应用线性规划求解问题时最重要,往往也是最困难的一步。问题建模是否合理,很大程度上会影响到后续的模型求解过程。

但是,受限于实际问题特征、建模经验、建模技巧等因素,我们在对问题建立初步模型之后,目标函数和约束条件往往包含一些特殊约束或者特殊变量:

含有绝对值。比如,LASSO回归是L1范数回归,目标函数包含绝对值

m i n β 1 N ∑ i = 1 n ( y i − x i ) 2 + λ ∥ β ∥ 1 min_\beta \quad \frac{1}{N} \displaystyle\sum_{i=1}^n(y_i-x_i)^2+\lambda\Vert\beta\Vert_1 minβN1i=1n(yixi)2+λβ1
含有最大(最小)值。比如,风险决策涉及的最小机会损失准则( min-max),也称最小最大后悔准则。

二选一约束。比如,同时生产两种产品A和B,产量分别为x和y,要么采用高负荷生产,满足2x+3y<=100,要么采用低负荷生产,x+y>
其他特殊约束或变量。
对于上述含有特殊约束或者特殊变量的问题,尽管看起来不是线性规划问题,但是通过一些建模技巧,可以将它们转化成线性规划问题。

含有绝对值的建模

比如,有如下规划问题
m i n ∥ X ∥ 1 = ∑ i = 1 n ∣ x i ∣ A X ≤ b min \quad \Vert X\Vert_1= \displaystyle\sum_{i=1}^n\vert x_i\vert \\AX\le b minX1=i=1nxiAXb
为了将其转化为线性规划问题,引入两个新的非负向量u和v,满足以下条件:
{ ∣ x i ∣ = u i + v i x i = u i − v i u i ≥ 0 , v i ≥ 0 \begin{cases} \vert x_i \vert = u_i+v_i \\ x_i=u_i-v_i\\ u_i \ge0,v_i\ge0 \end{cases} xi=ui+vixi=uiviui0,vi0
上述规划问题就转化为如下线性规划问题:
∑ i = 1 n ( u i + v i ) s . t . { A ( u − v ) ≤ b u ≥ 0 , v ≥ 0 \displaystyle\sum_{i=1}^n (u_i+v_i) \\ s.t.\begin{cases} A(u-v)\le b \\ u \ge 0,v\ge 0 \end{cases} i=1n(ui+vi)s.t.{A(uv)bu0,v0

含有最大(最小)值的建模

比如,有如下规划问题:
m i n X m i n Y ( a X + b Y ) \underset{X}{min}\underset{Y}{min}(aX+bY) XminYmin(aX+bY)
为了将其转化为线性规划问题,引入新的变量u,满足以下条件:
u = m a x Y ( a X + b Y ) &ThickSpace; ⟺ &ThickSpace; a X + b Y ≤ u u= {max \atop Y}(aX+bY)\iff aX+bY \le u u=Ymax(aX+bY)aX+bYu
上述规划问题就转化为如下线性规划问题:
s . t .   a X + b Y ≤ u s.t. \space aX+bY \le u s.t. aX+bYu

二选一约束的建模

比如,有如下约束:

该约束实际上是一个二选一约束,为了将其转换为线性约束。引入一个0-1变量z和一个充分大的数M(大M法):
2 x + 3 y ≤ 100   o r   x + y ≤ 50 &ThickSpace; ⟺ &ThickSpace; { 2 x + 3 y ≤ 100 + z M x + y ≤ 50 + ( 1 − z ) M z ∈ { 0 , 1 } 2x+3y \le 100 \space or \space x+y \le 50 \iff \begin{cases} 2x+3y \le 100+zM \\ x+y \le 50+(1-z)M\\ z \in \{0,1\} \end{cases} 2x+3y100 or x+y502x+3y100+zMx+y50+(1z)Mz{0,1}

多选多约束的建模

比如,有如下3个约束,要满足其中2个约束:

该约束实际上是一个3选2约束,为了将其转换为线性约束,引入3个0-1变量z和一个充分大的数M(大M法):
2 x + 3 y ≤ 100   o r   x + y ≤ 50   o r   x + 2 y ≤ 80 2x+3y \le 100 \space or \space x+y \le 50 \space or \space x+2y \le 80 2x+3y100 or x+y50 or x+2y80
&ThickSpace; ⟺ &ThickSpace; { 2 x + 3 y ≤ 100 + z 1 M x + y ≤ 50 + z 2 M x + 2 y ≤ 80 + z 3 M z 1 + z 2 + z 3 = 2 z 1 , z 2 , z 3 ∈ { 0 , 1 } \iff \begin{cases} 2x+3y \le 100 +z_1 M\\ x+y \le 50+z_2M \\ x+2y \le 80+z_3M\\ z_1+z_2+z_3=2\\ z_1,z_2,z_3 \in \{0,1\} \end{cases} 2x+3y100+z1Mx+y50+z2Mx+2y80+z3Mz1+z2+z3=2z1,z2,z3{0,1}

固定成本约束的建模

在库存问题中,通常考虑订货的固定成本和可变成本。就是说,只要订货x>0,就有一个固定成本k,和可变成本cx,它的成本函数就是:
z ( x ) = { 0 , x = 0 c x + k , x &gt; 0 z(x) = \begin{cases} 0,x=0\\ cx+k,x \gt 0 \end{cases} z(x)={0,x=0cx+k,x>0
该约束实际上是一个二选一约束,为了将其转换为线性约束。引入一个0-1变量y和一个充分大的数M(大M法):
z ( x ) = { 0 , x = 0 c x + k , x &gt; 0 &ThickSpace; ⟺ &ThickSpace; z ( x ) = c x + k y    s . t . x ≤ y M z(x) = \begin{cases} 0,x=0\\ cx+k,x \gt 0 \end{cases} \iff z(x)=cx+ky \space \space s.t. x \le yM z(x)={0,x=0cx+k,x>0z(x)=cx+ky  s.t.xyM

分段线性函数的建模

比如,在现实生活中,购买商品的数量越多,它的单价会有折扣。在数学中,它的一个成本或者利润函数就可以表示成如下的分段线性函数:
z = { 3 + 4 x   f o r   0 ≤ x ≤ 2 15 − 2 x   f o r   2 ≤ x ≤ 3 6 + x   f o r   3 ≤ x ≤ 7 z= \begin{cases}3+4x \space for \space 0 \le x \le 2 \\ 15-2x \space for \space 2 \le x \le 3 \\ 6+x \space for \space 3 \le x \le 7 \end{cases} z=3+4x for 0x2152x for 2x36+x for 3x7
对于分段线性函数,可以通过引入SOS2约束(a special order set (SOS) constraint of type 2),将其转换为线性规划。以下是一种比较通用的建模技巧。
设一个n段线性函数 f ( x ) f(x) f(x)的分点为 b 1 ≤ . . . ≤ b n ≤ b n + 1 b_1\le...\le b_n \le b_{n+1} b1...bnbn+1,引入 w k w_k wk x x x f ( x ) f(x) f(x)表示为
x = ∑ k = 1 n + 1 w k b k f ( x k ) = ∑ k = 1 n + 1 w k f ( b k ) x=\sum_{k=1}^{n+1}w_kb_k\\ f(x_k)=\sum_{k=1}^{n+1}w_kf(b_k) x=k=1n+1wkbkf(xk)=k=1n+1wkf(bk)
w k w_k wk和0-1变量 z k z_k zk满足
w 1 ≤ z 1 , w 2 ≤ z 1 + z 2 , . . . w n ≤ z n − 1 + z n , w n + 1 ≤ z n w_1 \le z_1,w_2 \le z_1+z_2,...w_n \le z_{n-1}+z_n,w_{n+1} \le z_n w1z1,w2z1+z2,...wnzn1+zn,wn+1zn
z 1 + z 2 + . . . + z n = 1 , z k = 0 或 1 z_1+z_2+...+z_n=1,z_k=0或1 z1+z2+...+zn=1,zk=01
w 1 + w 2 + . . . + w n + 1 = 1 , w k ≥ 0 ( k = 1 , 2 , . . . , n + 1 ) w_1+w_2+...+w_{n+1}=1,w_k \ge 0(k=1,2,...,n+1) w1+w2+...+wn+1=1,wk0(k=1,2,...,n+1)
事实上,像CPLEX、LP_SOLVE等solver,已经支持直接对分段线性函数建模,不需要建模人员将其进行线性转换。

https://www.360kuai.com/mob/transcoding?url=932d3fbb3daf6942d&cota=4&kuai_so=1&sign=360_e39369d1

参考资料

[1] Special Ordered Sets (SOS)

http://lpsolve.sourceforge.net/5.1/SOS.htm

[2] Modeling piecewise linear functions

http://homepages.rpi.edu/~mitchj/handouts/ piecewise/

[3] Matlab随笔之分段线性函数化为线性规划

https://blog.csdn.net/weixin_34269583/article/details/86014299

[4] Piecewise Linearity in CPLEX

https://www.ibm.com/support/knowledgecenter/SSSA5P_12.6.1/ilog.odms.cplex.h

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 准备数学建模美赛的关键是努力学习数学知识并不断练习应用这些知识解决实际问题。以下是一些建议: 1. 强化数学基础:复习高中数学知识,特别是微积分、线性代数和概率论。 2. 练习数学建模题目:尝试做一些数学建模比赛的历年题目,了解题目的难度和类型。 3. 组队参赛:参加数学建模比赛最好是组队参赛,可以与其他人分享想法和经验。 4. 了解计算机技能:学习使用数学软件,如 Matlab、Mathematica、Maple 等,帮助解决复杂的数学模型。 5. 保持好奇心:对于自己不了解的问题,保持好奇心并不断学习。 希望这些建议能够帮助你更好地准备数学建模美赛。 ### 回答2: 准备数学建模美赛需要以下几个关键步骤: 1. 了解比赛规则和要求:首先要认真阅读并理解比赛规则和要求,包括提交的格式、时间限制、题目类型等。了解比赛的评分标准也非常重要。 2. 学习数学建模的基础知识:掌握数学建模所涉及的基本数学知识,如微积分、线性代数、概率论等。熟悉各种数学模型的构建方法和求解技巧,并了解相关的数学软件工具。 3. 多做练习题和实例:通过做大量的练习题和实例,增加对数学建模问题的熟悉度和灵活性。找到一些经典的数学建模题目进行练习,模拟比赛的时间和环境。 4. 构建逻辑思维和问题解决能力:数学建模比赛不仅仅是计算题,更注重解决实际问题的能力。培养良好的逻辑思维能力,学会从实际问题中提取关键信息和建立数学模型,针对问题制定合适的解决方案。 5. 分工合作,合理安排时间:比赛中通常有多个题目,因此分工合作很重要。团队成员应根据个人擅长的领域来分工,分别负责不同的题目部分。另外,合理安排时间,确保能在规定时间内完成每个题目的建模、求解和分析。 6. 注重实践经验的积累:多参加数学建模比赛或解决实际问题,通过实践积累经验,了解不同类型和难度的题目特点,并总结出一套适合自己的解题方法。 7. 提高英文文献阅读能力:很多数学建模比赛的题目和解决方法都需要阅读英文文献,因此,提高英文文献阅读能力也是很重要的一步。学会快速理解和提取关键信息,并熟悉相关的数学词汇和表达方式。 综上所述,准备数学建模美赛需要学习数学基础知识,多做练习题和实例,提高逻辑思维和问题解决能力,合理分工合作,注重实践经验积累,并提高英文文献阅读能力。通过不断的学习和实践,积极准备数学建模美赛,提高自己的竞争力。 ### 回答3: 准备数学建模美赛可以遵循以下几个步骤: 1. 熟悉比赛规则和评分标准:详细了解比赛的要求、规则,包括论文格式、时间限制等。同时,也要清楚评分标准,明白如何在论文中展示出创新性和实用性。 2. 学习数学建模的基础知识:数学建模是基于数学理论和方法来解决实际问题的,因此需要掌握相关的数学知识和技巧,如微积分、线性代数、概率统计等。 3. 提前准备工具和资料:数学建模可能需要使用一些特定的软件、计算工具或者图书资料,提前准备好并熟悉使用它们是非常重要的。 4. 练习解决实际问题:参加数学建模美赛前,可以通过练习一些实际问题来提升自己的解题能力。可以通过查找以往的数学建模竞赛题目,尝试解答来积累经验。 5. 团队合作与分工:数学建模美赛通常需要组队参赛,团队成员间要建立良好的沟通与合作关系。分工合作,每个人负责自己的专业领域,从而加快解题速度和提高效率。 6. 注意时间管理:数学建模比赛的时间通常是有限的,因此需要掌握好时间管理,合理规划各个环节的时间,确保能够在规定时间内完成论文的撰写和提交。 7. 多参加模拟赛或培训:参加一些数学建模比赛的模拟赛或者培训班,可以接触更多的题目和解题思路,了解评委的评分标准和要求,从而更好地备战数学建模美赛。 8. 理论与实践相结合:数学建模不仅仅是理论,更需要与实际问题相结合。在准备过程中,注重实际问题的分析和实践操作,这样可以更好地理解问题,提出切实可行的解决方案。 希望以上的建议能够帮助你更好地准备数学建模美赛。加油!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值