旅行商问题(状压DP)

旅行商问题

动态规划+状态压缩

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))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP_wendi

谢谢您的支持。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值