状压dp求解TSP问题

本文探讨了如何运用动态规划(DP)解决旅行商问题(TSP)。TSP问题具有最优子结构和重叠子问题,适合用DP求解。文中描述了一个实例,其中小明试图从北京出发,经过多个城市后再返回,目标是找到最低的车费路径。通过定义状态和状态转移函数,建立了问题的数学模型。但由于Python的运算速度限制,实际应用中可能会出现超时问题。
摘要由CSDN通过智能技术生成

状压dp求解TSP问题

尝试过用贪心算法求解TSP问题,但是并不好用,所以就用上了dp算法。

首先TSP问题满足最优化原理:对先前决策所形成的状态而言,其以后的所有决策都构成最优策略。通俗理解就是路径abcdefg是最短路径,则bcdefg必是最短路径。所以可以判断具有最优子结构和重叠子问题时,该问题可以用动态规划求解。

问题描述:
小明目前在做一份毕业旅行的规划。打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的花销。给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。

问题是一个经典的TSP问题,下面分析问题并给出建模:
设每个城市的编号为0,1,…,n;
令S表示城市集合,d(k,S)表示从城市k出发经过S中各城市仅一次,最后回到出发城市0的最少花销;
令c(i,j)表示城市i到城市j的距离,这里每两个城市之间都是互通的。
所以现在的任务就是计算出d(0,G)的值,其中G={1,2,…,n}。

我们先分析一般情况,假设S是城市集合{i1,i2,…,im},下面给出d(k,S)的计算分解:
d(k,S) = min{ d(i1,S-{i1}) + c(k,i1),d(i2,S-{i2}) + c(k,i2),…,d(im,S-{im}) + c(k,im) }
从上式可以看出,d(k,S)的计算离不开d(i,S-{i}),同样d(i,S-{i})的计算离不开d(j,S-{i,j})。所以上式就是本问题的状态转移函数。

已经知道了状态转移函数,下面只需明确S的表示方法即可,请参加下图代码。
在这里插入图片描述
遗憾的是,python运算速度过慢,所以本方法(代码)超时了。。。
链接:https://www.nowcoder.com/questionTerminal/3d1adf0f16474c90b27a9954b71d125d?f=discussion
来源:牛客网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值