-1

我正在编写一个旅行商程序,它是计算所有点之间的距离,并使用 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

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

如果需要,我将在此处发布我想出的几个替代方案。

如果有人可以以伪代码的形式发布您的想法,我该如何消除重复的订单。谢谢!

4

1 回答 1

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。

以相同的方式修改深度优先搜索也可以。

相对而言,这仍然只是对蛮力的轻微改进。严格来说,该程序会很慢,因为它是蛮力的,并且不会超过 20 点,如维基百科页面中所述。

于 2013-04-09T01:29:51.527 回答