来自Wikipedia的定义
The travelling salesman problem (also called the travelling salesperson problem or TSP) asks the following question: "Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to the origin city?"
最近试图用神经网络指导动态规划解决TSP,反正先不管神经网络用在哪,先把dp写好,然后美丽的马正气又开始全网搜罗代码整理整理就用了呢。。。为了节省我的时间,下面只解释几个重点部分,dp的基本流程可以参考Reference中的链接。
我用0, 1, ..., N - 1来给N个城市编号,比较绕的是以下这一组对应关系:
城市编号从1到N当然也是可以的吧,但是像正气姐姐这么懒惰的当然是没去研究啦。就按0到N-1这么编号,解释一下这几组对应关系
- 前两行是十进制和对应的二进制位之间的关系,比如二进制数1对应的是十进制数
,二进制数10对应十进制数
,二进制数11对应十进制数
。
- 它们与移位运算的关系是二进制数1对应十进制数
,使用移位运算1<<0可以得到相同的数值,十进制数与移位的对应关系是:幂次即需要移位的个数,比如1<<(k-1)即十进制
。
- 以上三行对应关系与城市编号无关,而最后一行的城市编号是自己规定的,也可以定义成其他的,我这里用二进制的最末位的0或1表示城市1是否存在在集合中,而城市0永远不会出现在集合中,所以这里有1到N-1共N-1个城市需要每个城市用二进制的一位进行标记。
上图是从Reference链接中复制过来的,表格画出了dp[i][j]的情况,其中“索引”一行是j的十进制数值,下面一行集合即该数值所表示的集合,比如j为0时其二进制中每一位均为0,即所有城市均不在其所表示的集合中