旅行推销员(蛮力)

时间:2013-04-03 10:30:34

标签: brute-force traveling-salesman

我正在编写一个旅行推销员程序,用于计算所有点之间的距离,并使用BRUTE Force方法确定最短距离。这不是作业:)。

我的方法是首先使用std next_permutation函数生成所有可能的点排列。

使用std next_permutation函数将生成输出订单:

(假设有3分)

123

132

213

231

312

321

(如果有4分,则相同)

1234

1243

...

4312

4321

然而由于重复,程序很慢,例如123的距离与321相同(虽然我没有运行两次计算,但我已将每个距离保存到结构中)。让我们以3点的方式取回示例,在消除重复之后,输出现在变为

123

132

213

保存至少一半的工作,随着点数的增加更多。我已经写出了一些替代方法来消除重复的顺序,但不知道如何在代码中表达出来(帮助)。

如果需要,我会发布我在这里想到的几个替代方案。

如果有人可以以伪代码的形式发布你的想法,我怎样才能消除重复的订单。谢谢!

1 个答案:

答案 0 :(得分:1)

由于尚未结束,我会快速提出建议。

你真的应该看一下BFS的修改。通过简单地检查相邻顶点是否已经在路径中来替换标记集合的情况,通过保持包含路径中所有顶点的集合可以使得更快,而不是通过检查路径中的每个顶点之一。

The idea is to have something like this:
1 - Start with the initial path [1]
12 - expand the path [1] to the path [1,2]
13 - expand the path [1] to the path [1,3]
123 - expand the path [1,2] to the path [1,2,3]
132 - expand the path [1,3] to the path [1,3,2]

我只有两个解决方案,而你有三个解决方案。这是因为循环213与循环132相同,正如它所写的那样:2 1-3-2 -1。

以相同的方式修改Depth-First Search也可行。

相对而言,这仍然只是对蛮力的一点点改善。严格来说,该程序将会变得缓慢,因为它是强力的,并且在wikipedia page中指出,并不会超过大约20个点的用处。