优化 | 浅谈旅行商(TSP)的七种整数规划模型

作者:彭澜

纽约州立大学水牛城分校工业工程系在读博士生,研究方向:车辆路径规划问题(VRP)

旅行商问题(TSP)是运筹学领域最知名的问题之一。本文将从整数规划模型建模的角度,介绍七种不同的建模方式,给大家提供对TSP的不同视角。

引言

本文将讨论“茴”字的六种写法,啊不对,旅行商问题的五类共七种建模模型。首先是两个最经典的模型,即DFJ模型和MTZ模型,这两个模型相信了解运筹学的朋友都有所接触,本文仅作少量拓展介绍。接下来的两类模型分别是基于货物流和最短路的模型,在国内现行的教材和中文材料中介绍较少,借此文也给大家提供一些思路。最后一个模型是分配问题模型,讨论了同样是解决TSP,采取最糟糕的建模方式的情况下模型能有多糟糕,也算是一个很有意思的角度。

Dantzig-Fulkerson-Johnson模型

首先我们来介绍TSP发展历史上的第一个基于割平面法的,也是最重要的模型——Dantzig-Fulkerson-Johnson(DFJ)模型。一看名字就知道,这三位都是运筹学巨擘:G. Dantzig是单纯形法的发明者,R. Fulkerson和L. Ford Jr. 共同发明了最大流网络问题中的经典的Ford-Fulkerson算法, S. M. Johnson是Ford-Johnson排序算法的发明者之一,该排序算法在提出后的20年内一直是排序算法中已知需要进行排序次数最少的。DFJ模型自1954年提出以来,一直都在TSP和VRP(车辆路径规划问题)的研究中占据核心的地位,其子回路消除约束也启发了各类TSP或VRP拓展模型。

对于DFJ模型,我们定义决策变量为0-1变量xij:

模型的目标函数可以写作

DFJ模型只有三组约束条件,如下

 其中,约束(3)和约束(4)是流平衡约束,意味着对于每一个顾客(或仓库站点),都会从上一个顾客处出发去访问该顾客,也会从该顾客处出发去访问下一个顾客。但是如果只有这两组约束,我们只能保证每个顾客都连接到其他顾客处,无法保证所有的顾客都连接在同一条回路上,也就是无法避免下图所示的情形:

我们将这种无法覆盖所有顾客的回路称作子回路(subtour),约束(5)的目的就是消除所有的这种子回路,从而保证全局只有一条回路且该回路覆盖了所有节点。约束(5)的内容是,对于所有节点的集合V的所有子集合,如果这个子集合S不是只有一个节点或者包含了所有节点的特殊情形,那么,必须要有一条边从子集合S外出发,进入子集合S,且有另一条边从子集合S出发,到达子集合外的节点上。这样一来,所有的节点就都必须连接在同一条回路上,形成TSP的完整回路。

另一种对约束(5)等价的描述方式如下:

约束(6)的意思是,同样地,对于这些子集合,子集合内的节点之间的连边必须小于|S|-1,这样在子集合内就无法形成回路(对于n个节点,形成回路至少要n条边)。

由于子集合S是节点集合V的子集,而这种子集的数量是指数规模的,也就是说,在有n个顾客的算例中,DFJ模型的约束数量是级别的,决策变量的个数是级别的。这就使得直接使用DFJ模型,罗列出所有的约束条件后进行求解不具有可行性,因此,通常我们会使用Lazy约束来进行求解。

所谓的Lazy约束其实是指在模型建立的时候不添加这组子回路约束,每次求解得到可行解(这里的可行解是指没有添加子回路约束的情况下的可行解,对于TSP本身不一定是可行解)后验证得到的解,如果解中存在子回路,那么就将子回路对应的约束添加进模型中,继续/重新对模型进行求解。这样一来,在绝大多数情况下,我们就不需要涉及到所有子回路约束,而只需要添加相对之下非常少量的约束就能进行求解。

目前运筹学领域常用的求解器(包括Gurobi,CPLEX等)都提供了callback功能,也就是在求解的过程中,一旦搜索到一个整数解,就调用callback函数,添加约束。由于求解采用的是割平面法,添加约束后依然可以继续进行,所以模型求解不需要停下来。另一种实现方法相对简单,就是不使用callback功能,采用一个大的for loop,同样是先不添加任何子回路约束,然后在for loop中每次求解完成后判断是否产生了子回环,如果产生,那么添加对应的约束,重新求解整个模型,直至求得的解不包括子回路为止。有趣的是,后者虽然看上去一定比前者的效率低,但实际上并不一定,在一些少数情况下也有可能采用第二种方法的DFJ反而运算速度更快些。本文的最后我们将对比两种方法的运算效率(分别记作DFJ_Lazy和DFJ_PlainLoop)。

 Miller-Tucker-Zemlin模型

在DFJ模型中,虽然得到的可行域非常紧凑,但子回路约束的个数是指数增长的,学界为了替代这组约束进行了诸多尝试。著名的Miller-Tucker-Zemlin(MTZ&

  • 29
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值