我正在编写一个旅行推销员程序,用于计算所有点之间的距离,并使用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
保存至少一半的工作,随着点数的增加更多。我已经写出了一些替代方法来消除重复的顺序,但不知道如何在代码中表达出来(帮助)。
如果需要,我会发布我在这里想到的几个替代方案。
如果有人可以以伪代码的形式发布你的想法,我怎样才能消除重复的订单。谢谢!
答案 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个点的用处。