TSP问题

  货郎担问题,典型NP问题。

  你有n个点(n<=15)一张图,描述各点之间的距离,你从0城市出发,要求,所有点都必须访问到,并且路径距离和最小。

  一般解法是DP,记忆化,和遗传算法。

  POJ 3311 便是这样一个问题,所以我把这个作为了货郎担问题的试验田。注意,这次货郎担可以无限次经过城市,但要保证城市都访问到。

  首先,我们想DP做法,现在你应该清楚,DP其实就是一种优雅的爆搜,我们知道每次爆搜出来的状态都可能会构造出最优解,而如果我们聪明的选择爆搜顺序并且记录下中途所有状态的花费(具体题目不同,但大意如此),便可以优化时间,相应的代价,你必须花费巨大的空间来储存这些状态的花费。DP对思维的要求很大,而对编码能力要求没有数据结构和计算几何大,如何聪明的选择时间复杂度和空间复杂度平衡的算法,便是DP的重点。而解决这个的便是状态的选择和如何聪明简单的转移。前者在我现在的水平段很容易想到,而后者则会有很多决策优化,需要研究和经验的累积。

  我们回到问题。

  我们要求的是什么,从0城市开始,访问完所有的城市再回到0城市,而如何表示城市已经访问呢,显然,我们可以用集合来表示,但Set无法储存过多的信息,并且空间无法承受,也就是说,如何表示集合我们需要解决。我们想到,计算机的二进制其实就可以对应集合中是否存在两个状态,而int是能表示32个二进制的,于是我们用int来压缩城市访问的信息,然后便是状态的选择。我们看到,当前城市和访问过的所有城市可以作为状态,而且很显然当前的最优解可以由前面的构造出来,状态转移方程如下:

    

 

posted @ 2017-04-20 13:31  rsqppp  阅读(137)  评论(0)    收藏  举报