TSP的Held-Karp算法的时间复杂度


9

当我看完Michael Held和Richard M. Karp的“解决问题的动态编程方法 ”时,我想到了以下问题:为什么他们用于TSP的算法的复杂性是(第199页),我的意思是它们在哪里取因子?如果我理解正确,表示每个城市子集的增加数量。那么,为什么每次添加操作再加上不知道的我操作?我想它以某种方式与取最小值有关,但是计算最小值似乎不需要这么多操作。(k=2n1k(k1)(n1k))+(n1)kk1k

由Held和Karp以及独立的Bellman进行的动态编程算法运行如下:对于每对,这意味着经过的路径,所有元素并终止于计算(S,ci)c1Sci

OPT[S,ci]=min{OPT[S{ci},cj]+d(cj,ci):cjS{ci}},

其中表示城市和之间的距离。然后在纸的公式中表示的大小。d(cj,ci)cjcikS

Answers:


5

附录,澄清项:k(k1)

因此,如果您检查表达式中的项,则可以设想(类推)项是对所有包含 1且在第一位置具有1的二进制字符串的枚举。换句话说,我们让二进制字符串中的每个位置代表对问题中个城市中给定的一个城市是否在我们当时正在考虑的确切子集中的选择。因此,对于5个城市,10101对应于子集{1,3,5}。(n1k)kn

因此,要计算{1,..., }的所有子集,我们只需对大小为2(即大小为二进制字符串包含两个1)的每个二进制子集(即通过二进制字符串进行计数)进行计数,然后大小= 3,然后大小= 4,...然后大小= n。(请注意,size = 1的子集必须仅包含第一个城市,因此计算其局部距离无关紧要,因为与1->子集中的所有其他城市的距离-> 1的距离正好是0。)nn

在具有个城市的每个子集上,我们必须考虑多达候选最优部分路径。具体而言,最佳总路径可能会遍历给定子集并最终到达个城市中的任何一个,但第一个城市除外。然后,对于每个这样的候选子路径,我们计算到该点的最佳行程,这是以前的大小=个子路径中的任何一个的最小值,再加上从该子路径的终端城市到城市的距离。当前候选子路径的终端城市。这给这样的比较,我们必须进行比较。我的项与项之间的差异kk1k1k1(k1)(k2)(k1)(k2)k(k1)在链接的分析中,术语是一个符号上的差异(鉴于我对定义,我将在不同的范围内求和)。但是,至少应说明该术语的二次复杂性。k


多么有趣-几分钟前,我刚刚用C ++完成了此精确算法的编码。(因此,将纯理论的切线原谅到一些实际的讨论中。:)

它花费时间和空间-至少在我的实现中。但是实际上,当您的空间需求快速增长时,它们变得比时间需求更加痛苦。例如,在我的PC(具有4 GB的RAM)上,我可以解决多达24个城市的实例-甚至更多,而且我的内存不足。O(2nn2)O(2nn)

当然,我可能只是一个糟糕的程序员,在实践中您可能会比我做得更好。:)

编辑:您的问题的一个细节上的一些细节:项来自以下事实:在最坏的情况下,您必须计算与先前子集的局部最佳距离(最多个;请注意,在链接到当前分析的分析中,等于。再次,在最坏的情况下,这还需要与大小为子集进行比较,以实现的总和。k(k1)nknO(k)k1O(k2)

另外,如果我的解释不够清楚,这里有一些Vazirani的讲义(PDF)。向下滚动至第188页,讨论TSP,包括对Held-Karp的分析。


哦,当然!我现在想到这个很傻。我将更新我的答案。实际上,我之前曾听过确切的评论,只是在不考虑它的情况下就通过了。是的-写入文件/从文件中读取文件将使您有效地将城市数量任意提高。除非您试图真正解决TSP实例,否则这也不值得担心。我的决定绝对不是出于实际目的。;)
Daniel Apon 2010年

2
是时候实施Bjorklund算法了:)
Suresh Venkat 2010年

@Suresh:好主意!
Daniel Apon 2010年

@Daniel Apon您能否请您弄清楚为什么在计算“部分最佳距离”时需要比较?
Oleksandr Bondarenko 2010年

@Oleksandr:好的,我将其添加到答案的顶部。
Daniel Apon 2010年

0

主要说明

我们计算,它是需要注意的重要店里没有
“最佳路径的距离combination of k cities
,但
“最优路径的距离为combination of k cities ANDend-point city from this combination”。
理解该公式将有助于理解以下公式中前两个乘数的含义。

第一阶段

第一阶段的操作数为:

k>=2(n1k1)choose city combinationof size = k1(k1)choose city to be the lastfrom k1 citiesin chosen combination((n1)(k1))choose citythat is not in chosen combinationto add to path

总和中缺少上标for all k>=2 that is valid for binomial coefficient。因此,最后一个有效且不为空的总和项将是 这意味着我们的总和未捕获最后的选择城市连接到第一个城市。有个城市可以连接第一个城市。所以最后我们将这个术语加到总和上。k=n1

(n1n2)(n2)1
n1

让转换公式形成您提供的形式,该形式也在 Held-Karp Wikipedia页面上

k>=2(n1k1)(k1)((n1)(k1))=k>=2(n1)!(k1)!(nk)!(k1)(nk)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n1k)k(k1)
操纵二项式系数会导致: 因此,第一个操作数相位是
k>=2(n1k)k(k1)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n3)!(k2)!(n3(k2))!(n1)(n2)=(n1)(n2)k>=2(n3k2)=(n1)(n2)2n3
(n1)(n2)2n3+(n1)

第二阶段

第二阶段是在计算距离的同时,通过我们在第一阶段所做的标记来恢复最佳路径。

对于每一个最优路径“为combination of k cities ANDend-point city from this combination”我们已保存了第二个到最后的城市。

回溯最佳路径,我们需要问一些数据结构返回第二个到最后一个城市“为combination of k cities ANDend-point city from this combination”。因此,此数据结构必须类似于
Map<combination of k cities, Map<last city, second-to-last city>>。作为索引,combination of k cities我们可以使用例如binary_string[city id]=1 if city id is in combination。因此,我们需要查看的所有元素combination of k cities以识别组合并为我们的数据结构建立索引。这给了我们第二阶段的操作数:

k>=2n1k=(n)(n1)21

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.