旅行商问题的变化 - 根据约束从许多节点中选择一个好的子路由

时间:2010-08-18 09:11:50

标签: javascript algorithm google-maps traveling-salesman

TLDR版本最重要的问题是,在TSP问题中,不是找到最短的哈密顿循环,找到最佳路径的好方法是什么(我认为访问最多的路径)节点)最多X长度,具有固定的起始点。

完整版:

我对涉及TSP的问题的一些想法感兴趣。 首先,现实世界TSP问题的一个例子就是当你有N个地理位置要访问时,你需要一个最佳路线(或接近最佳)的行车路线来访问所有地方,无论是往返还是A到Z.有一个不错的JS http://www.gebweb.net/optimap/处的实施以及http://code.google.com/p/google-maps-tsp-solver/处提供的JS TSP求解器。

现在考虑你有N = 100 - 1000+个地点。此时,您无法使用任何合理的时间/资源来计算路线,但即使可能对大多数现实世界的场景都没有用。假设您选择一个固定的起点,并根据这一点,从您想要生成最佳子路径的1000多个位置,这适合(相对较小的)最大约束(例如,可以在1天或1周内覆盖的路线)。 如何在近乎实时的情况下解决这个问题? 我的想法很明白:

  1. 从中构建持续时间矩阵 起点(这一步是 即使在几千人也可行 点)并挑选一小部分 最接近的点 初始点。理想情况下这个子集 应该足够大,那个 完全访问它绝对是> 最大约束,但小到足以快速处理,至少有 启发式算法。

  2. 考虑最佳路线 在步骤1中选择的位置。但是 而不是访问所有的路线 从这一点来看,我需要的 满足最大值的最佳路线 约束因此它不应该 访问所有点(可以访问 除了那将是最好的 案件)。我特别不确定 如何解决这个问题最好 一个有效的方式?

  3. 任何链接或想法,尤其是第2点。

    免责声明:当然问题的核心是与语言无关的,我使用JS / Google Maps作为实际应用的示例。

1 个答案:

答案 0 :(得分:1)

好的,这是我在伪代码中的解决方案草图。您需要了解Priority Queues

Define a data structure Route {
  the route taken so far, 
  and can give the score (nodes visited)
  the distance traveled
  and the remaining nodes allowed
  the current location.
}

Define a Priority Queue of Routes which sorts on distance traveled.
Define a SortedSet of Routes which sorts on score called solutions.

Add a Route of Length 0, at the depot to the priority queue.
Loop until the head of the priority queue is greater than MAX
   Route r = take the head of the priority queue.
   for each potential remaining node n in r, 
     (in increasing order of distance from the current location)
      child = a new route of r with n appended
      if child distance < max, append to priority queue, otherwise break
   if no children were appended add r to solutions

这有效地以合理的内存有效方式对解决方案空间进行广度优先搜索。此外,如果它太慢,那么当循环遍历所有子节点时,您可以通过仅取N个最近邻居来加速算法,其中N是可配置的。您可能会错过最佳解决方案,但在大多数情况下它应该是合理的。