1 概念

规划中的变量(部分或全部)限制为整数时,称为整数规划
若在线性规划模型中,变量限制为整数,则称为整数线性规划
整数线性规划模型大致可分为两类:
(1)变量全限制为整数时,称纯(完全)整数规划
(2)变量部分限制为整数的,称混合整数规划

2 建模技巧

我在前面的几篇博客中反复强调过,建立模型的过程是整个数学建模的重点、难点、核心,而求解的过程相对的就不是那么重要(并不是不重要),毕竟市面上有很多的开源和商业版求解器供我们求解特定数学模型。我们的主要任务就是将问题建模成这些特定类型的数学模型(比如线性规划、整数规划、二次规划等等)。在这个过程中,建模技巧至关重要。如决策变量的定义、约束条件变换等不合理将直接导致问题无法求解、或者降低求解速度。
整数规划的应用来源于两种方式:直接的和转化的。
直接的,一般比较简单,直接定义整数决策变量,建立约束条件即可。典型的问题是投资决策

2.1 投资决策类问题建模

问题
在一个三年的规划周期内,有五个项目可供选择,下表给出了每个项目可以带来的预期收益以及每年的支出(单位:百万元)

请问,在这个三年规划周期内应该选哪些项目?
建模过程
这个问题可以转化成对每个项目选择为“是/否”的决策,引入二值变量 x j x_j xj​,则有:
x = { 1 if  选 择 项 目 j 0 if  不 选 择 项 目 j x = \begin{cases} 1 &\text{if } 选择项目j \\ 0 &\text{if } 不选择项目j \end{cases} x={10​if 选择项目jif 不选择项目j​
那么整数规划模型为:
m a x z = 20 x 1 + 40 x 2 + 20 x 3 + 15 x 4 + 30 x 5 s . t . 5 x 1 + 4 x 2 + 3 x 3 + 7 x 4 + 8 x 5 ⩽ 25 x 1 + 7 x 2 + 9 x 3 + 4 x 4 + 6 x 5 ⩽ 25 8 x 1 + 10 x 2 + 2 x 3 + x 4 + 10 x 5 ⩽ 25 x 1 , x 2 , x 3 , x 4 , x 5 = ( 0 , 1 ) \begin{aligned} &max \ \ z=20x_1+40x_2+20x_3+15x_4+30x_5 \\ &s.t. \\ &\ \ \ \ 5x_1+4x_2+3x_3+7x_4+8x_5\leqslant 25 \\ &\ \ \ \ x_1+7x_2+9x_3+4x_4+6x_5\leqslant 25 \\ &\ \ \ \ 8x_1+10x_2+2x_3+x_4+10x_5\leqslant 25 \\ &\ \ \ \ x_1,x_2,x_3,x_4,x_5=(0,1) \end{aligned} ​max  z=20x1​+40x2​+20x3​+15x4​+30x5​s.t.    5x1​+4x2​+3x3​+7x4​+8x5​⩽25    x1​+7x2​+9x3​+4x4​+6x5​⩽25    8x1​+10x2​+2x3​+x4​+10x5​⩽25    x1​,x2​,x3​,x4​,x5​=(0,1)​

2.2 集合覆盖问题建模

在这一类问题中,会有许多服务装置为一些设备提供互相重叠的服务,其目标就是确定安装数量最好的装置来覆盖每一个设备满足服务需求。比如选址问题:几个污水处理厂可以建在不同地点,为不同的城市服务,当一个城市得到不同的污水处理厂的服务时就产生了重叠服务。
案例
现代电网中使用无线接收器读取用户的读表仪器数据,生成电费账单。现在有8个接收器安放点,可服务于10个用户,每一个安放点可服务的用户信息如下:

接收器 1 2 3 4 5 6 7 8
读表仪器 1,2,3 2,3,9 5,6,7 7,9,10 3,6,8 1,4,7,9 4,5,9 1,4,8

如何设置最少数量的接收器服务于这10个读表仪器(对应10个用户)?
建模过程
(1)决策变量:
x i = { 1 if  选 择 接 收 器 i 0 if  不 选 择 接 收 器 i x_i = \begin{cases} 1 &\text{if } 选择接收器i \\ 0 &\text{if } 不选择接收器i \end{cases} xi​={10​if 选择接收器iif 不选择接收器i​
(2)约束条件:
每一个读表仪器至少被一个接收器服务。

(3)建立整数规划模型:
m i n z = ∑ i = 1 8 x i s . t . x 1 + x 4 + x 8 ≥ 1 x 1 + x 2 ≥ 1 x 1 + x 2 + x 5 ≥ 1 x 6 + x 7 + x 8 ≥ 1 x 3 + x 7 ≥ 1 x 3 + x 5 ≥ 1 x 3 + x 4 + x 6 ≥ 1 x 5 + x 8 ≥ 1 x 6 + x 7 ≥ 1 x i = ( 0 , 1 ) , i = ( 1 , 2 , . . , 8 ) \begin{aligned} &min \ \ z=\sum_{i=1}^{8}x_i \\ &s.t. \\ &\ \ \ \ x_1+x_4+x_8&\geq 1 \\ &\ \ \ \ x_1+x_2&\geq 1 \\ &\ \ \ \ x_1+x_2+x_5&\geq 1 \\ &\ \ \ \ x_6+x_7+x_8&\geq 1 \\ &\ \ \ \ x_3+x_7&\geq 1 \\ &\ \ \ \ x_3+x_5&\geq 1 \\ &\ \ \ \ x_3+x_4+x_6&\geq 1 \\ &\ \ \ \ x_5+x_8&\geq 1 \\ &\ \ \ \ x_6+x_7&\geq 1 \\ &\ \ \ \ x_i=(0,1), i=(1,2,..,8) \end{aligned} ​min  z=i=1∑8​xi​s.t.    x1​+x4​+x8​    x1​+x2​    x1​+x2​+x5​    x6​+x7​+x8​    x3​+x7​    x3​+x5​    x3​+x4​+x6​    x5​+x8​    x6​+x7​    xi​=(0,1),i=(1,2,..,8)​≥1≥1≥1≥1≥1≥1≥1≥1≥1​

2.3 固定费用问题建模

固定费用问题通常包含两种费用形式:一种活动启动即会产生的固定费用,另一种是活动启动后产生的可变费用,这种可变费用与活动开展情况有关。

例如,在生产某种产品之前需要购买一台机器,这台机器的费用是固定费用,与生产多少产品无关,同时,一旦买了机器,劳动力和原材料所耗费用就与生产产品的数量成正比总费用函数可以表示为:
C ( x ) = { F + c x if  x > 0 0 if  x ⩽ 0 C(x)= \begin{cases} F+cx &\text{if } x>0 \\ 0 &\text{if } x\leqslant 0 \end{cases} C(x)={F+cx0​if x>0if x⩽0​
其中,F是固定费用,c是单位变动费用,x是产品的数量。
这种分段函数在x=0处不存在连续点,解析方法难以处理,通常可以引入0-1二值变量类处理这类问题。
过程如下:
定义0-1二值决策变量y,设x的足够大的上界为M,取 ε \varepsilon ε为极小的正数,则x、w之间的关系可描述为:
w = { 1 if  x > 0 0 if  x ⩽ 0 w= \begin{cases} 1 &\text{if } x>0 \\ 0 &\text{if } x\leqslant 0 \end{cases} w={10​if x>0if x⩽0​
数学关系等价为如下约束条件:
x ⩽ M w , x ⩾ ε − M ( 1 − w ) , w = ( 0 , 1 ) . \begin{aligned} x &\leqslant Mw,\\ x &\geqslant \varepsilon-M(1-w),\\ w&=(0,1). \end{aligned} xxw​⩽Mw,⩾ε−M(1−w),=(0,1).​
总费用函数的分段表示可转化为:
C ( x ) = F w + c x s . t . = { x ⩽ M w , − x ⩽ M ( 1 − w ) − ε , w = ( 0 , 1 ) . \begin{aligned} C(x)=Fw+cx \\ s.t.=\begin{cases} x&\leqslant Mw ,\\ -x&\leqslant M(1-w)-\varepsilon, \\ w&=(0,1). \end{cases} \end{aligned} C(x)=Fw+cxs.t.=⎩⎪⎨⎪⎧​x−xw​⩽Mw,⩽M(1−w)−ε,=(0,1).​​

2.4 “or”和“if-then”约束条件的变换技巧

我们知道经典的几类数学模型的约束条件是并列关系,但实践中根据约束建立数学关系时常出现“or”关系和“if-then”关系。我们以例子来说明约束条件变换方法。
案例
Jobco 公司需要在一台机器上进行三项加工,下表给出了每项工作的处理以及应交工日期c 将第一项工作开始处理时的日期定为0,应交工日期从0 算起。

工作处理时间(天数) 应交工日期(天) 延期处罚(元/天)
1 5 25
2 20 22
3 15 35

这个问题的目标是求使得延期处罚最少的工序处理方案。
(1)定义决策变量
x j = 工作j 的开始日期(按天计算,从0 开始计算) y i j = { 1 若工作i在工作j之前处理 0 若工作i在工作j之后处理 \begin{aligned} x_j&= \text{工作j 的开始日期(按天计算,从0 开始计算)} \\ y_{ij}&=\begin{cases} 1 &\text{若工作i在工作j之前处理}\\ 0 &\text{若工作i在工作j之后处理} \\ \end{cases} \end{aligned} xj​yij​​=工作j 的开始日期(按天计算,从0 开始计算)={10​若工作i在工作j之前处理若工作i在工作j之后处理​​
(2)建立合适形式的数学约束条件
约束条件有两个。
第一个约束:一台机器同时只能处理一项工作,所以三项工作任意两项之间都不能有时间交叉。
假设工作 i i i和工作 j j j 的处理时间分别为 p i p_i pi​和 p j p_j pj​,为了保证这两项工作不会同时需要处理,必须满足以下条件(取决于工作 i i i是在工作 j j j 之前处理还是在其之后处理):
x i ⩾ x j + p j or   x j ⩾ x i + p i x_i \geqslant x_j+p_j \ \ \text{or} \ \ x_j \geqslant x_i+p_i xi​⩾xj​+pj​  or  xj​⩾xi​+pi​
对于足够大的数M,“or”约束可以用下面“and”的约束代替:
M y i j + ( x i − x j ) ⩾ p j a n d M ( 1 − y i j ) + ( x j − x i ) ⩾ p i M{y_{ij}}+(x_i-x_j)\geqslant p_j \ \ and \ \ M(1-y_{ij})+(x_j-x_i)\geqslant p_i Myij​+(xi​−xj​)⩾pj​  and  M(1−yij​)+(xj​−xi​)⩾pi​
核心思路:这个约束转换是怎么来的呢?我们知道0-1二值决策变量在模型中只能取值0或者1,这恰好是“or”的关系,另外我们还知道使一个条件失去约束作用的方法就是将有限的上界(下界)扩展为无穷上界(下界)。利用这个两个已知事实即可使“or”约束中只有一个起作用。如果 y i j = 0 y_{ij}= 0 yij​=0,那么第一个约束起作用,而第二个约束是多余的(因为左端项包含充分大的数M,所以一定会大于 p i p_i pi​);如果 y i j = 1 y_{ij}= 1 yij​=1,那么第一个约束是多余的,此时第二个约束起作用。

第二个约束条件:给定工作j的应交工日期是 d j d_j dj​,若 x j + p j > d j x_j+p_j>d_j xj​+pj​>dj​,这项工作就会产生延期 s j + s_j^+ sj+​天,若 x j + p j < d j x_j+p_j<d_j xj​+pj​<dj​,这项工作提前 s j − s_j^- sj−​天完成。这几个日期应满足的关系:
x j + p j + s j − − s j + = d j s j − , s j + ⩾ 0 \begin{aligned} x_j+p_j+s_j^- -s_j^+&=d_j \\ s_j^- ,s_j^+&\geqslant 0 \end{aligned} xj​+pj​+sj−​−sj+​sj−​,sj+​​=dj​⩾0​
(3)建立目标函数
目标是使得延期处罚最少。
m i n z = 25 s 1 + + 22 s 2 + + 35 s 3 + min \ z=25s_1^++22s_2^++35s_3^+ min z=25s1+​+22s2+​+35s3+​

(4)写出完整数学模型
m i n z = 25 s 1 + + 22 s 2 + + 35 s 3 + s . t . \begin{aligned} min \ &z=25s_1^++22s_2^++35s_3^+ \\ s.t. \end{aligned} min s.t.​z=25s1+​+22s2+​+35s3+​

M y 1 , 2 + x 1 − x 2 ⩾ 20 − M y 1 , 2 + x 2 − x 1 ⩾ 5 − M M y 1 , 3 + x 1 − x 3 ⩾ 15 − M y 1 , 3 + x 3 − x 1 ⩾ 5 − M M y 2 , 3 + x 2 − x 3 ⩾ 15 − M y 2 , 3 + x 3 − x 2 ⩾ 20 − M x 1 + s 1 − − s 1 + = 5 − 1 x 2 + s 2 − − s 2 + = 20 − 2 x 3 + s 3 − − s 3 + = 15 − 3 x 1 , x 2 , x 3 , s 1 − , s 1 + , s 2 − , s 2 + , s 3 − , s 3 + ⩾ 0 y 1 , 2 , y 1 , 3 , y 2 , 3 = ( 0 , 1 ) \begin{aligned} M{y_{1,2}}+x_1-x_2&\geqslant 20 \\ -My_{1,2}+x_2-x_1&\geqslant 5-M \\ M{y_{1,3}}+x_1-x_3&\geqslant 15 \\ -My_{1,3}+x_3-x_1&\geqslant 5-M \\ M{y_{2,3}}+x_2-x_3&\geqslant 15 \\ -My_{2,3}+x_3-x_2&\geqslant 20-M \\ x_1+s_1^--s_1^+&=5-1 \\ x_2+s_2^--s_2^+&=20-2 \\ x_3+s_3^--s_3^+&=15-3 \\ x_1,x_2,x_3,s_1^-,s_1^+,s_2^-,s_2^+,s_3^-,s_3^+ \geqslant 0 \\ y_{1,2},y_{1,3},y_{2,3}=(0,1) \end{aligned} My1,2​+x1​−x2​−My1,2​+x2​−x1​My1,3​+x1​−x3​−My1,3​+x3​−x1​My2,3​+x2​−x3​−My2,3​+x3​−x2​x1​+s1−​−s1+​x2​+s2−​−s2+​x3​+s3−​−s3+​x1​,x2​,x3​,s1−​,s1+​,s2−​,s2+​,s3−​,s3+​⩾0y1,2​,y1,3​,y2,3​=(0,1)​⩾20⩾5−M⩾15⩾5−M⩾15⩾20−M=5−1=20−2=15−3​

这是一个混合整数线性规划模型。

3 求解方法

注意:目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。

根据整数规划不同的情形可以采用不同的算法,大致如下:

(1)分枝定界法—可求纯或混合整数线性规划。
(2)割平面法—可求纯或混合整数线性规划。
(3)隐枚举法—求解“0-1”整数规划:
①过滤隐枚举法;
②分枝隐枚举法。
(4)匈牙利法—解决指派问题(“0-1”规划特殊情形)。
(5)蒙特卡洛法(随机取样法)—求解各种类型规划。

4 参考资料

[1].《运筹学导论(基础篇)》;
[2].《数学建模算法与程序》,司守奎;
[3].《matlab数学建模经典案例实战》。

整数规划问题建模技巧与求解方法总结相关推荐

  1. 蹦极模型matlab仿真,科学网—蹦极的数学建模及其龙格-库塔法求解方法 - 赵也非的博文...

    论文: 蹦极的数学建模及其龙格-库塔法求解方法 在"华东师范大学首届研究生数学建模竞赛"中,获得二等奖. 发表日期: 2007年5月 摘要: 本文通过参照题中给出的数据,对蹦极者在 ...

  2. 数学建模专栏 | 第五篇:MATLAB优化模型求解方法(上):标准模型

    最优化赛题是数学建模大赛中最常见的问题类型之一.一般说来,凡是寻求最大.最小.最远.最近.最经济.最丰富.最高效.最耗时的目标,都可以划入优化问题的范畴.MATLAB 优化工具箱和全局优化工具箱对多个 ...

  3. 【数学建模】12 线性规划模型的求解方法

    目录 1 图解法 2 MATLAB函数求解方法 3 Lingo法 4 课后习题 1 图解法 (1)有线性规划模型 • 目标函数 • 约束条件 在二元的约束条件画出来是直线,三元的约束条件画出来是一个平 ...

  4. 数学建模中常用的方法

    数学建模中常用的方法:类比法.二分法.差分法.变分法.图论法.层次分析法.数据拟合法.回归分析法.数学规划(线性规划,非线性规划,整数规划,动态规划,目标规划).机理分析.排队方法.对策方法.决策方法 ...

  5. 外点罚函数法的MATLAB实现,一、非线性规划问题的几种求解方法1罚函数法(外点法).ppt...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp微积分 一.非线性规划问题的几种求解方法1罚函数法(外点法). ...

  6. 3小时快速入门数学建模竞赛-建模技巧2:追根溯源,站在巨人的肩膀上

    我们要检索哪些信息?和怎样获得快速.准确的信息?这两个问题. 首先回答第一个问题,我们需要检索哪些信息?我们从我们需要求解的内容入手,请看思维导图和系统框图,我们需要求解35年寿命期内的发电总量.经济 ...

  7. 优化求解器 | Gurobi的MVar类:矩阵建模利器、求解对偶问题的备选方案 (附详细案例+代码)

    优化求解器 | Gurobi的MVar类:矩阵建模利器.求解对偶问题的备选方案 优化求解器的建模方式:以gurobi为例 Gurobi的MVar(矩阵形式变量对象) 一个线性规划的例子:Wyndor玻 ...

  8. 图论 —— 网络流 —— 基本概念与建模技巧

    [基本概念] 1.网络流 给定一个有向图 G=(V,E),在这个图中: 有唯一的一个源点 S(入度为 0,出发点) 有唯一的一个汇点 T(出度为 0,结束点) 图中的每条弧(u,v)都有一非负容量 c ...

  9. 【强化学习】表格型求解方法总结:基于表格型方法(Tabular Methods)的规划(Planning)和学习(Learning)

    前言: 本次笔记对<强化学习(第二版)>第八章进行概括性描述.同时,也对本书的第一部分(共三部分)表格型求解方法进行了系统性阐述. 以下概括都是基于我个人的理解,可能有误,欢迎交流:pip ...

最新文章

  1. 华为魔术手机拆机图解_华为P40 Pro上手体验
  2. nginx以unix-domain-socket方式连接fastcgi(php)
  3. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
  4. python django model定义
  5. Qt Scene graph画线
  6. Error:java: 无效的标记 -version 编译错误的解决办法
  7. 3招seo技巧让你把关键词做进百度前三
  8. 作为面向事务的客户服务器协议,湖南大学《计算机网络》实验报告.doc
  9. 【英语学习】【医学】Unit 05 The Digestive System
  10. 重置User Profile
  11. NLP系列(2)_用朴素贝叶斯进行文本分类(上)
  12. 银魂中的HTML网址来自哪个星球,银魂中的这些设定,你都知道哪些呢?
  13. IE8打开网页慢速度优化
  14. matlab股票分析系统,matlab股票预测系统,matlab股票决策
  15. 服务器上面显示横杠,系统开机左上角显示一横杠一直闪没法系统
  16. 大学本科毕业论文查重有什么要求?
  17. 黑马程序员高薪就业学习方法揭秘
  18. 前端面试——走楼梯问题
  19. 软件设计师-11.知识产权与标准化
  20. 基于sklearn的人工神经网络

热门文章

  1. java 代码实现身份证合法性校验(全国所有地方)
  2. [Expression Blend 4] [SketchFlow系列] Chapter 2 瞭解SketchFlow Map (中)
  3. gsview for linux,Linux常用网络操作命令telnet
  4. Android bytes与KB、MB、GB单位转换
  5. Android 新特性 看这篇就够了
  6. sql截取字段中一部分值
  7. 如何往github开源项目提交代码
  8. 项目开发合作协议合同范本
  9. natapp九折邀请码
  10. 航电oj:IP Address