【学界/编码】分枝定界求解旅行商问题

【学界/编码】分枝定界求解旅行商问题

作者:贺兴(hexing15@gmail.com)为华中科技大学管理学院本科三年级学生,汪文宇(wangwenyu0928@gmail.com)为华中科技大学管理学院本科四年级学生,指导老师:秦虎(professor.qin@qq.com)为华中科技大学教授。

『运筹OR帷幄』责任编辑: @王源 (东北大学系统工程博士生)

原文是由以上三位作者在微信公众号“数据魔术师”原创首发,通过『运筹OR帷幄』责任编辑整理修改。同时『运筹OR帷幄』审稿专家@李宝香 (Eindhoven University of Technology 博士,现任 Singapore Management University Research Scientist) 也提出了修改建议,并且扩展和补充了一部分内容,形成了本篇文章。

欢迎原链接转发,付费转载请前往 @留德华叫兽 的主页获取信息,盗版必究。
敬请关注和扩散本专栏及同名公众号,会邀请全球知名学者陆续发布运筹学、人工智能中优化理论等相关干货、知乎Live及行业动态:
『运筹OR帷幄』大数据人工智能时代的运筹学


原文于2017-12-11刊载于微信公众号“数据魔术师”。链接如下:运筹学教学|分支定界求解旅行商问题


0.前言

以下先对本文涉及的运筹学问题进行简单介绍:

旅行商(Travelling Salesman Problem,TSP)问题:给定一系列城市和每对城市之间的距离,求解从起点(depot)出发访问每一座城市一次并回到起点的最短回路,建模一般包含三个constraints:

1) 所有节点的度(degree)均为二

2) 没有subtour

3) 变量为0-1整数

对应图论问题:找到最小的哈密尔顿圈(Hamiltonian cycle)

生成树 (Spanning Tree)问题:从一张图分离出一棵树,包含图上所有点

最小生成树(minimum spanning tree MSS)问题: 找到最小权值的1-Tree

1-Tree问题:生成树+两条与depot点相连的边,有且仅包含一个圈(cycle)

最小权值(minimum Weight)1-Tree问题:找到最小权值的1-Tree

最小权值(minimum Weight)1-Tree算法:假设包含以下五个城市:(1, 2, 3, 4, 5), 先找到包含(2, 3, 4, 5)的最小生成树+ 两条包含1的权值之和最小的边


1.分支定界算法简介

分枝定界算法的基本思路如下:

假设有最小化的整数规划问题A,它相应的线性松弛(LP relaxation)规划问题为B。从解问题B开始,若其最优解不符合A的整数条件,那么B的最优目标函数值必是A的最优目标函数值 z* 的下界,记作 Z ;而 A 的任意可行解的目标函数值将是 z* 的一个上界 z 。分枝定界法就是将 A 的可行域分成子区域的方法,逐步增大 Z 和减小z ,最终求到 z* 。

通常,把全部可行解空间反复地分割为越来越小的子集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称为定界。在每次分枝后,凡是界限超出已知可行解集目标值(即上界)的那些子集不再进一步分枝,这样,许多子集可不予考虑,这称为剪枝。这就是分枝定界法的主要思路。

分支定界法的上界一般是通过search tree或heuristic,记录下并更新global可行解来得到的。

分支定界法的下界,是以原问题为基础,减少部分constraints然后求解简化版原问题的解决方法,如减少0-1 constraint, 把原问题变成LP问题,减少每个点的度都必须为2的constraint把原问题变成最小权值1-Tree问题。本文的代码部分使用了两种解下界的方法:简化为分配问题,简化为最小权值1-Tree问题,分配问题有很多精确算法可解,精确解可以确定是原问题的lower bound。一般采取greedy heuristic方法求解(这里我们并没用证明greedy求解的也是正确的lower bound)。假设我们能够算出最优解则可以作为lower bound,branch部分是将现有一棵1-tree是一个TSP的可行解的充要条件是1-tree中所有节点的度(degree)均为2。这样分枝的方法也就有了,即寻找1-tree中所有度大于等于3的节点,枚举并依次删除这个节点所有的边,以此branch,每个删除的边作为branch-and-bound tree上的一个node,依次求解每个subproblem的最小权值1-tree,举例说明:如果某个节点A的度等于3(连接点B, C, D),则可以分出三个branches,每个branch关联的新node分别为移除了边AB,AC,AD的新的最小权值1-tree问题。

关于分支定界算法的详细介绍也可以见公众号往期文章【学界】混合整数规划/离散优化的精确算法--分支定界法及优化求解器


2.分支定界算法求解TSP

求解TSP通常采用的定界方法是用分配问题定界或者是1-tree来定界。分配问题的匈牙利算法,在此便不再赘述,关于1-tree我们在这里简单介绍一下,更加详细的介绍将会在文末的网盘链接中。

在一个图G(V,E)中,节点集合V = {1...n},我们定义{2...n}节点组成的子图的生成树以及两条与1节点的边组成的新图为1-tree。如下图:

TSP的可行解是1-tree的一种,因此最小权值1-tree (minimum weight 1-tree)可以作为TSP的一个下界,因此可以利用这个性质来作为定界的标准。

最小权值1-tree的很容易求得,只需要求解子图{2...n}的最小生成树再加上两条与1节点相连的最短的边即可。

最小生成树(minimum spanning tree MSS)问题: 找到最小权值的1-Tree。所以重点是求最小生成树问题,生成树问题通常由四种贪婪算法(greedy algorithm)解决:Kruskal's算法,Prim's 算法,Borůvka's算法,Edmonds'算法,本文重点介绍Kruskal's算法。

原理:

1) 一个单独的点,作为一棵最小生成子树 MSS 。

2) 两棵 MSS 连接成一棵 MSS ,以两棵 MSS 之间权重最小的边进行连接,显然是最好的。

3) 三棵 MSS 连接成一棵 MSS ,先连接其中两棵权值最小的 MSS ,再连接第三棵,显然是比较好的。

4) 以此类推,N棵MSS连接成MSS,先连接其中N-1棵权值最小的MSS,再连接第N棵,结果总是比较好。

所以算法如下:

1)图上每一个点,各自是一棵最小生成子树MSS。

2)图上所有边,依照权重大小,由小到大排序。

3)遍历图上所有边,找到权值最小的边并入MSS:

i )两端点分别位于两棵MSS,用这条边连结两棵MSS,合并成一棵MSS。 这条边是最小生成树上的边。

ii)两端点皆位于同一棵MSS,也就是产生了环: 舍弃这条边。

详见wikipedia
(en.wikipedia.org/wiki/K), 动图很好的解释了这个算法。

一棵1-tree是一个TSP的可行解的充要条件是1-tree中所有节点的度(degree)均为2。这样分枝的方法也就有了,即寻找1-tree中所有度大于等于3的节点,枚举并依次删除这个节点所有的边,依次求解最小权值1-tree,直到找到可行的TSP解。如下图所示:

上面就是关于使用分枝定界算法求解TSP的基本思路,如果读者有什么不懂的地方,可以参考如下文末给出的链接,其中有一份详细介绍上述算法的PPT,相信一定能解决你的问题!

在本文的代码中,求解分配问题采用的是匈牙利算法,用system调用Hungary.exe来求解并利用get_circle函数来判断环路。1-tree的求解采用的是kruscal算法,也就是里面的kruscal函数。之后用degree_c函数来检查节点的度。分枝定界搜索过程是采用递归的方法实现的,递归的两个函数分别为branch_and_bound_hungary 和branch_and_bround_one。


3.分支定界算法求解TSP代码实现

又到了看代码的季节了,想要下载文字版的代码请移步全文链接,或者打开下面的网址:paste.ubuntu.com/261599

输入:

(第一行整数代表城市数目n,接下来第i(i = 1,2,...,n)行每行n个数分别表示城市i到其他城市的距离,极大的正数使用99999)

5

99999 132 217 164 58

132 99999 290 201 79

217 290 99999 113 303

164 201 113 99999 196

58 79 303 196 99999

输出:

ans = 668(表示最小路径长度)

P.S.输出有很多行,只需要关注最后一行(有last_ans的一行)即可,输出中还有一个文件名,路径方案被保存在这个文件中。使用匈牙利算法定界时还需要一个编译好的匈牙利算法的exe文件。具体的使用说明在下面的网盘链接中给出。

pan.baidu.com/s/1c1SnoF 密码:4w32


在此感谢『运筹OR帷幄』审稿人对本文提出了宝贵的意见。

『运筹OR帷幄』审稿人 @李宝香 (Eindhoven University of Technology 博士,现任 Singapore Management University Research Scientist,研究方向:运筹学,MIP混合整数规划。

以上『运筹OR帷幄』专栏所有文章都会同步发送至 留德华叫兽的头条主页, 以及同名微信公众号,目前预计受众10w +


如果你是运筹学/人工智能硕博或在读,请在下图的公众号后台留言:“加微信群”。系统会自动辨认你的关键字,并提示您进一步的加群要求和步骤,邀请您进全球运筹或AI学者群(群内学界、业界大佬云集)。

同时我们有:【运筹学|优化爱好者】【供应链|物流】【人工智能】【数据科学|分析】千人QQ群,想入群的小伙伴可以关注下方公众号点击“加入社区”按钮,获得入群传送门。

学术界|工业界招聘、征稿等信息免费发布,请见下图:

编辑于 2019-12-02

文章被以下专栏收录