解题思路主要有两部分:
第一部分:i为当前节点(城市),S为还没有遍历的节点(城市集合),
表示从第i个节点起,经历S集合中所有的点,到达终点的最短路径长度。因此有:
第二部分,回溯,找到最优的路径,需要将S集合一一对应一个数字(类似于编码,一般用二进制),不如
,然后比如从节点i等于0开始,未经历集合为
,而下一步最优的节点 j 等于2,那么
,回溯时只用从
向后推即可,例如
,代码如下:
# tsp问题
class Solution:
def __init__(self,X,start_node):
self.X = X #距离矩阵
self.start_node = start_node #开始的节点
self.array = [[0]*(2**len(self.X)) for i in range(len(self.X))] #记录处于x节点,未经历M个节点时,矩阵储存x的下一步是M中哪个节点