java 整数规划_线性规划与整数规划求解速度对比
文章发表于微信公众号【数据魔术师】:线性规划&整数规划求解速度PK线性规划&整数规划求解速度PKmp.weixin.qq.com
相信大家对线性规划和整数规划应该不陌生,在开始今天的问题之前我们不妨再来复习一下这两个概念,毕竟温故而知新嘛
线性规划与整数规划
线性规划是这样定义的:
求解线性规划问题的基本方法是单纯形法,后来又有改进单纯形法、对偶单纯形法等。而整数(线性)规划则是在线性规划的基础上增加了整数约束:
整数规划又可以大致分为几类:纯整数规划:所有的决策变量都要求为整数
混合整数规划:部分决策变量要求为整数
纯0-1整数规划:所有决策变量均要求为0或1
混合0-1整数规划:部分决策变量要求为0或1
通过对比可发现,两种规划的不同之处在于整数规划增加了整数约束,在不考虑整数约束的情况下得到的是整数规划的线性松弛模型。整数规划的应用非常广泛,例如背包问题、选址问题、旅行商问题、车辆路径规划问题等等。整数规划问题常见的解法有割平面法和分支定界法,一些求解器也主要运用分支定界法来求解此类问题。
不知道大家平时有没有被老师问过下面的问题:
你觉得线性规划问题和整数规划哪个求解速度更快呀?快多少?
有的小伙伴的表情可能是这样的
但是没关系,今天我们来解个问题试试看不就知道了。既然是要对比这两种规划问题的求解速度,那当然得找一个有线性松弛解的整数规划问题咯。没错,它就是---
带时间窗约束的车辆路径规划问题车辆路线问题(VRP)最早是由Dantzig和Ramser于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小、耗费时间最少等目的。
时间窗就是一种约束,车辆除了要满足VRP问题的限制之外,还必须满足需求点的时间窗约束(例如服务只能在早上八点到十点之间开始),而需求点的时间窗限制可以分为两种,一种是硬时间窗(Hard Time Window ),硬时间窗要求车辆必须要在时间窗内开始服务客户,早到必须等待,而迟到则拒收;另一种是软时间窗(Soft Time Window ),不一定要在时间窗内开始服务,但是在时间窗之外开始服务的话会受到处罚,以处罚替代等待与拒收是软时间窗与硬时间窗最大的不同。
问题模型如下:
这个问题模型本身是带有整数规划的,求解的方法在上面也有一些介绍。我们可以借助求解器例如CPLEX来帮助我们完成这个过程。然后我们再用相同的算例来求解这个模型的线性松弛解作为对比。小编是在Eclipse上用JAVA语言调用的接口。具体的操作说明可以参考上述的推文也可以在参考官网https://www.ibm.com/support/knowledgecenter/zh/SSSA5P_12.7.0/ilog.odms.cplex.help/CPLEX/homepages/usrmancplex.html
算例使用的是solomon的算例(C101、扩展算例C1_2_5),在C101中分别取前10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95、100个点;在C1_2_5中分别取前10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95、100、105个点进入模型求解,在得到最优解的条件下,记录求解的时间。
计算结果
算例C101的求解结果如下
算例C1_2_5的求解结果如下:
首先说明一下求解所花费的时间会因使用的计算机的性能而异。显然在两个算例中的结果都是线性规划的求解速度要比整数规划的求解速度要快,随着节点的增加这种差距更加的明显。这里解释一下为什么算例C1_2_5的图中的整数规划部分的数据只有一半,因为再往上所需要的求解时间就很长了,在经过一段漫长的等待后小编发现虚拟内存的页面文件已经超过了十个G。计算机在较低的内存下运行时,如果需要更多的内存,windows操作系统会使用硬盘空间来模拟内存,也就是我们常说的虚拟内存。小编的电脑内存较小(4G),平时敲代码和学习或者玩游戏的时候一般虚拟内存会在两三个G左右。从这个搜索过程中付出的空间代价可以感受一下这个问题的复杂度。此外不同的实例也可能会有不一样的复杂度,在C101中我们可以在几分钟内完成一百个点的求解,但是在C1_2_5中到四十个点之后的求解时间就不是数十分钟能够解决的了。而且在C1_2_5中105个点求解花费的时间才跟求解四十个点花费的时间相当
从上述求解实例看整数规划的求解速度会比线性规划慢,具体慢多少跟问题本身是有关系的,以这两个算例为例,它们的客户分布情况是有点不一样的。
算例C101的客户分布是这样的:
而算例C1_2_5的客户分布则是这样的:
直观地看第二个算例的客户点的分布确实相较于第一个算例的分布要分散一些,这样在解的搜索上可能就不占优势了。这样以后被老师问到这个问题的时候你就可以直接告诉老师线性规划的求解速度比整数规划的求解速度快了。
当然如果老师又问你:
为什么线性规划的求解速度比整数规划的求解速度快呢?
那我们当然是接着来探讨一下为什么。小编认为可以从复杂度的角度来看这个问题。根据复杂度理论,线性规划问题是P问题,而整数规划问题是NP-Hard问题。即整数规划问题要比线性规划问题复杂,自然在求解速度上就要慢咯。
P问题是指能够在多项式时间内解决的问题,NP问题指能够在多项式时间内验证答案正确与否的问题。如果求解时间在多项式时间内以说是求解时间
多项式相信大家并不陌生,形如
的式子就称为关于n的k次多项式,我们在考虑复杂度的时候只需要考虑最高次数项即可,因为这个最高次数项才是“主要矛盾”。只要指数项与n无关(即是一个确定的常数),这时候就可以说是在多项式时间内。我们平时用来解线性规划问题单纯形法在最坏的情况下是指数时间复杂度(Exponential Time Complexity)(Klee-Minty,1997)。但是后来又有学者提出了最坏情况下仅为多项式时间的算法,比如椭球法和内点法。但是一般的应用中使用内点法和使用单纯形法的效率是差不多的(Gondzio, Jacek; Terlaky, Tamás ,1996),对于一些特定结构的问题,可能会出现其中一种方法比另一种方法好的情况(Illés, Tibor; Terlaky, Tamás , 2002)。
至于NP-Hard问题呢这里又涉及一个归约的概念,这里小编就不展开了这方面的资料有很多,通俗地说它的形式就是如果可以在多项式时间内把问题A中的一个实例转化为问题B中的一个实例,然后通过解决问题B间接解决问题A,那么就认为问题B不容易于问题A。如果所有的NP问题都能归约到一个问题X,就说这个问题X是NP-hard问题,如果你进一步又发现诶这个问题X也是NP的,这时候我们就称问题X是NP-Complete问题。再进一步如果我们能在多项式时间内解决一个NP-Complete问题,那么所有此类NP问题都能在多项式时间内解决!
咳咳好像扯远了,证明整数规划是NP-Hard的证明在许多地方例如一些算法书都可以找到,有兴趣的小伙伴可以去探索一下。总之希望通过这篇文章能够帮助大家回答是不是和为什么这两个问题,下次受到灵魂拷问的时候可以不用挠头从而保护自己的头发。
参考
[1] Harvey J.GreenBerg. Klee-Minty Polytope Shows Exponential Time Complexity of Simplex Method. https://glossary.informs.org/notes/Klee-Minty.pdf
[2] Gondzio,Jacek; Terlaky, Tamás (1996)"3 A computational view of interior point methods". Oxford Lecture Series inMathematics and its Applications. 4.New York: Oxford University Press. pp.103–144.
[3] Illés, Tibor; Terlaky, Tamás (2002). "Pivot versus interior point methods: Pros and cons". European Journal of Operational Research. 140 (2): 170.
[4] Alexander Schrijver: "Theory of Linear and Integer Programming". John Wiley and Sons. 1998.
扫一扫,获取更多模型与代码,欢迎交流分享
java 整数规划_线性规划与整数规划求解速度对比相关推荐
- java青蛙_跳青蛙的求解Java实现
今天好朋友给我发了一个跳青蛙的智力题: 让左右两边的青蛙交换位置. 要求: 1:用鼠标点青蛙头部,它会向前跳: 2:它最多只能跳过一个青蛙: 3:按红色箭头,游戏复原. 4:此题肯定有解,不要怀疑. ...
- matlab 线性规划求最大值,MATLAB求解线性规划(含整数规划和01规划)问题.pdf
MATLAB求解线性规划(含整数规划和01规划)问题 MATLAB 求解线性规划(含整数规划和0-1 规划)问题 线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约 束的,变量范围为有 ...
- 线性规划和整数规划求解(lingo\matlab)
注意点 1.Lingo 默认所有变量不为负数,故应先进行定义域自由化. 2.Lingo 只有三种关系运算符:"=".">="以及"<=&q ...
- 数学建模线性规划(整数规划)
线性规划(整数规划) 文章目录 线性规划(整数规划) 概述 数学模型 分类 与松弛线性规划的联系 模型求解方法 分枝定界法 求解步骤 求解细节 对分支定界法的理解 割平面法 求解步骤 0-1变量的使用 ...
- 整数规划问题建模技巧与求解方法总结
1 概念 规划中的变量(部分或全部)限制为整数时,称为整数规划. 若在线性规划模型中,变量限制为整数,则称为整数线性规划. 整数线性规划模型大致可分为两类: (1)变量全限制为整数时,称纯(完全)整数 ...
- 混合整数规划MIP/线性规划LP+python(cplex库)实现 附代码
文章目录 相关知识点 LP线性规划问题 MIP混合整数规划 MIP的Python实现(docplex库) MIP的Python实现(ortool库) 喜欢的话请关注我们的微信公众号~<你好世界炼 ...
- 混合整数规划MIP/线性规划LP+python(ortool库)实现 附代码
文章目录 相关知识点 LP线性规划问题 MIP混合整数规划 MIP的Python实现(Ortool库) assert MIP的Python实现(docplex库) 喜欢的话请关注我们的微信公众号~&l ...
- 数学建模整理-线性规划、整数规划、非线性规划
数学建模整理 线性规划 整数规划 整数规划特点 求解方法分类 (1)分枝定界法 (2) 割平面法 (3) 隐枚举法("0-1"整数规划) (4) 匈牙利法 (5) 蒙特卡洛法(随机 ...
- 第一周:线性规划、整数规划、非线性规划、二次规划
线性规划函数:linprog() 线性规划的标准形式 线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号.为了避免这种形式多样性带来的不方便,matlab规 ...
最新文章
- 在EXCEL中怎么将多个CSV文件合并成一个文件
- WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(下)
- C#开发中关于加密解密字符串的使用方法
- 输入的命令集锦(补充)
- jquery selector 使用方法
- PHP unset()函数销毁变量 但没有实现释放内存
- js比较运算符==与===的区别
- HDOJ-1257 最少拦截系统
- Linux系统中的load average
- 17张图带你解析红黑树的原理!保证你能看懂!
- 你们身边成功的生意人有哪些特质
- gcc/g++参数详解
- python打印当前时间
- DDOS入门介绍(一):DDOS简介
- 物联网现状及未来发展趋势
- 关于基金知识的一些整理
- WPF类型引用无法找到名为“xxx”的类型解决方法
- 技术人的七大必备特质
- linux 备份信息查看器,linux 全新的备份神器 Duplicity
- 深入理解JavaScript箭头函数