相信大家对线性规划和整数规划应该不陌生,在开始今天的问题之前我们不妨再来复习一下这两个概念,毕竟温故而知新嘛
线性规划与整数规划
线性规划是这样定义的:
求解线性规划问题的基本方法是单纯形法,后来又有改进单纯形法、对偶单纯形法等。而整数(线性)规划则是在线性规划的基础上增加了整数约束:
整数规划又可以大致分为几类:
- 纯整数规划:所有的决策变量都要求为整数
- 混合整数规划:部分决策变量要求为整数
- 纯0-1整数规划:所有决策变量均要求为0或1
- 混合0-1整数规划:部分决策变量要求为0或1
通过对比可发现,两种规划的不同之处在于整数规划增加了整数约束,在不考虑整数约束的情况下得到的是整数规划的线性松弛模型。整数规划的应用非常广泛,例如背包问题、选址问题、旅行商问题、车辆路径规划问题等等。整数规划问题常见的解法有割平面法和分支定界法,一些求解器也主要运用分支定界法来求解此类问题。
不知道大家平时有没有被老师问过下面的问题:
你觉得线性规划问题和整数规划哪个求解速度更快呀?快多少?
有的小伙伴的表情可能是这样的
但是没关系,今天我们来解个问题试试看不就知道了。既然是要对比这两种规划问题的求解速度,那当然得找一个有线性松弛解的整数规划问题咯。没错,它就是---
带时间窗约束的车辆路径规划问题
按照惯例我们先要介绍一下这个问题,具体可以参考我们之前的这篇文章“干货|十分钟快速掌握CPLEX求解VRPTW数学模型(附Java代码及CPLEX安装流程)”
“
车辆路线问题(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.