动态规划+状态压缩
class TSP:
"""
旅行商问题
动态规划+状态压缩
"""
def solution(self, distance_matrix):
"""
# 示例距离矩阵
distance_matrix = [
[0, 10, 15, 20],
[10, 0, 35, 25],
[15, 35, 0, 30],
[20, 25, 30, 0]
]
:param distance_matrix:
:return:
"""
n = len(distance_matrix)
# dp[mask][i] 表示经过了mask中的城市,并且以i城市结尾的最短路径长度
dp = [[float('inf') for _ in range(n)] for _ in range(1 << n)]
# 初始化,从0城市出发
dp[1][0] = 0
# 遍历所有的状态
for mask in range(1, 1 << n):
for u in range(n):
# 当前状态下,如果城市u还没被访问,则跳过
if mask & (1 << u) == 0:
continue
# 更新dp[mask][v],尝试从不同的城市 u 转移过来,转移路径 u -> v
for v in range(n):
# 这里要保证在当前状态下 v 已被访问,且u和v是不同城市
if mask & (1 << v) and u != v:
# mask ^ (1 << v) 这里相当于来到城市 v 的前一个状态
dp[mask][v] = min(dp[mask][v], dp[mask ^ (1 << v)][u] + distance_matrix[u][v])
# 因为最终还要回到起点,即0号城市,所以还需要寻找回到起点的最短距离
all_visited = (1 << n) - 1
return min(dp[all_visited][i] + distance_matrix[i][0] for i in range(n))