状压dp求解TSP问题

状压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的表示方法即可,请参加下图代码。
状压dp求解TSP问题_第1张图片
遗憾的是,python运算速度过慢,所以本方法(代码)超时了。。。
链接:https://www.nowcoder.com/questionTerminal/3d1adf0f16474c90b27a9954b71d125d?f=discussion
来源:牛客网

你可能感兴趣的:(dp算法,dp算法)