选择哪个节点作为最近邻居算法的起始节点

时间:2013-04-22 00:55:49

标签: algorithm nearest-neighbor traveling-salesman approximation

http://en.wikipedia.org/wiki/Nearest_neighbour_algorithm

我正在使用最近邻算法来解决旅行商问题。它非常快,但不准确。我在某处读到了我可以做的两项改进。第一个是从一个随机点开始,而是从每个节点开始运行最近邻居算法。 (因此,如果有N个节点,则最近邻居运行N次)然后比较并选择总距离最小的路径。这个apear要精确得多。但它太慢了。

另一种方法是选择一个特殊的方法而不是随机选择起始节点。然后仍然只运行一次最近的邻居以获得结果。这不会像上面的方法那样准确,但肯定要快得多,因为算法只运行一次。但不幸的是,我不记得我在哪里阅读那篇文章以及选择这个起始节点的标准。

我猜我应该获得每个节点与其他节点之间的总距离,然后应该选择具有最大值的节点作为起始节点。 (在我看来,这是选择一个距离图“最远”的节点,同时也避免选择靠近图形中心的节点)我认为这样我得到的路线应该非常接近最佳最短路径。

我在想什么?

编辑:我正在处理具有欧几里德距离的度量标准TSP。

2 个答案:

答案 0 :(得分:1)

听起来你应该只运行K-NN算法,其中有几个起始节点说O(log N),这只会花费O(K * N * log(N))。选择最佳游览,然后使用游览改进启发式,2 opt或2.5 opt,限制移动次数或仅限时间限制。

这应该可以实现时间与准确度的最佳平衡,除非您开始考虑基于k-opt or v-opt的算法。虽然,听起来你没有时间陪他们。

答案 1 :(得分:0)

每次做最近邻居时,也可以缓存。如果你做一个K最近邻居会更好。这就是它的工作方式:

  1. 对于每个节点,找到K最近邻居。将其存储在缓存中。
  2. 每当您需要执行最近邻居时,请先检查缓存。否则执行最近邻居并将其添加到缓存中。