java 整数规划_线性规划与整数规划求解速度对比

java 整数规划_线性规划与整数规划求解速度对比文章发表于微信公众号【数据魔术师】:线性规划&整数规划求解速度PK线性规划&整数规划求解速度PK​mp.weixin.qq.com相信大家对线性规划和整数规划应该不陌生,在开始今天的问题之前我们不妨再来复习一下这两个概念,毕竟温故而知新嘛线性规划与整数规划线性规划是这样定义的:求解线性规划问题的基本方法是单纯形法,后来又有改进单纯形法、对偶单纯形法等。而整数(线性)规划则是在线性规…

大家好,又见面了,我是你们的朋友全栈君。

文章发表于微信公众号【数据魔术师】:线性规划&整数规划求解速度PK线性规划&整数规划求解速度PK​mp.weixin.qq.comd1c4ccd651363995fdc681b53bfff365.png

相信大家对线性规划和整数规划应该不陌生,在开始今天的问题之前我们不妨再来复习一下这两个概念,毕竟温故而知新嘛

线性规划与整数规划

线性规划是这样定义的:

求解线性规划问题的基本方法是单纯形法,后来又有改进单纯形法、对偶单纯形法等。而整数(线性)规划则是在线性规划的基础上增加了整数约束:

整数规划又可以大致分为几类:纯整数规划:所有的决策变量都要求为整数

混合整数规划:部分决策变量要求为整数

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

扫一扫,获取更多模型与代码,欢迎交流分享

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158138.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Vue的电商后台管理系统(2)

    基于Vue的电商后台管理系统(2)电商后台管理系统2前言上期已经实现该系统的登陆界面、路由、登录、退出及导航守卫功能,本期将继续完善该系统的以下功能:从后端获取后台列表数据并渲染到前端页面、用户列表的展示、修改、删除和添加。后台页面布局本系统后台将采用ElementUI中的Container布局容器。基本结构如下:代码框架:<el-container><el-header>Header</el-header><el-container><el-a

    2022年6月11日
    31
  • 什么是多线程,什么是高并发?[通俗易懂]

    什么是多线程,什么是高并发?[通俗易懂]高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则 高并发≠多线程多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发状态的实现。高并发是一

    2022年8月3日
    7
  • layui弹框传值_LAYUI弹出层详解

    layui弹框传值_LAYUI弹出层详解还是一步步展示把首先,layer可以独立使用,也可以通过Layui模块化使用。我个人一直是用的模块化的所以下面素有的都是基于模块化的。引入好相关文件就可以开始啦今天放图片把试着学一下放图片1.最简单的弹层,这个弹层的效果其实就是一个加了特效和样式的alert();代码如下:layui.use(“layer”,function(){varlayer=layui.layer;la…

    2022年6月1日
    88
  • Python numpy.transpose 详解「建议收藏」

    Python numpy.transpose 详解「建议收藏」前言看Python代码时,碰见numpy.transpose用于高维数组时挺让人费解,通过一番画图分析和代码验证,发现transpose用法还是很简单的。正文Numpy文档numpy.transpose中做了些解释,transpose作用是改变序列,下面是一些文档Examples:代码1:x=np.arange(4).reshape((2,2))输出1:#x为:array(

    2022年5月5日
    50
  • 转置卷积详解

    转置卷积详解转置卷积详解  前面文章对卷积做了讲解,感觉既然重新整理,就将系列概念整体做个梳理,也算是将自己知道的所有东西拿来献丑把。  转置卷积(TransposedConvolution)是后来的叫法,一开始大家都是称逆卷积/反卷积(Deconvolution),这个概念是在图像分割任务中被提出来的,图像分割需要逐像素的操作,对每一个像素做一个分割,将其归类到不同的物体当中。  这个任务大家很自然…

    2022年6月21日
    40
  • PyCharm激活码永久有效PyCharm2020.2.3激活码教程-持续更新,一步到位[通俗易懂]

    PyCharm激活码永久有效PyCharm2020.2.3激活码教程-持续更新,一步到位[通俗易懂]PyCharm激活码永久有效2020.2.3激活码教程-Windows版永久激活-持续更新,Idea激活码2020.2.3成功激活

    2022年6月19日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号