Java中的旅行商问题的近东Neuighbor启发式方法

时间:2019-05-08 18:18:04

标签: java data-structures graph-algorithm nearest-neighbor traveling-salesman

我想编写一个Java程序,以最近的启发式方法解决旅行商问题。该算法的步骤如下所示:

步骤1:从任意随机顶点开始,将其称为当前顶点

第2步:找到一条在当前顶点与未访问顶点之间具有最小距离的边,将其称为V

第3步:现在将当前顶点设置为未访问的顶点V,并将该顶点V标记为已访问

第4步:终止条件,如果所有顶点都至少访问一次

步骤5:转到步骤2

我很难确定哪种数据结构适合解决此问题。如何确定到当前节点的距离最小的节点(步骤2)?优先队列会是一个不错的选择吗?我还可以使用其他哪些数据结构? 如何确定游览中的倒数第二个节点连接到起始节点?我应该使用堆栈吗?我还能用什么?

1 个答案:

答案 0 :(得分:0)

要用最佳(最佳)解决方案解决旅行推销员,您将必须在图形中生成所有可能的路径,并找到成本最低(顶点之间的边的最小和)的路径。您正在描述的最近邻居方法接近使用Greedy alrogithms。假设您的图形中有n个顶点并且每个顶点都已连接,则可以按照以下步骤使用贪婪策略/最近邻居方法解决旅行商问题(假设您有SetVertex类对象):

  1. 创建一个Set的初始未访问顶点。
  2. 创建一个类似于Map的{​​{1}},其中键是起始顶点,值是总体路径成本。
  3. 使用键创建Map<Vertex, Integer>,该键是路径的起始顶点,值是Map,代表路径(List<Vertex>)。
  4. 选择一个之前未选择的随机顶点(在步骤1的Map<Vertex, List<Vertex>>中存在)。
  5. 选择最接近在步骤4中选择的顶点的顶点(您将必须检查所有未访问的顶点的边成本,并选择至少一个顶点)。将顶点添加到与键相关联的Set上,该键是当前的起始顶点(在步骤4中选择)并存储在步骤3中创建的List<Vertex>中。(注意:在这里,您需要考虑所有不同于在步骤4)选取的顶点的顶点。
  6. 增加与当前凝视顶点相关联的路径成本值,该值是在步骤4中选择的,并存储在步骤2中创建的Map中。
  7. 通过检查与当前最后一个顶点最近的边来重复步骤5-6,直到没有顶点可访问为止(您将必须访问从在步骤4中选择的顶点开始的所有顶点)。
  8. 删除在步骤4中选择的起始顶点,其形式为在步骤1中创建的Map
  9. 重复步骤4-8,直到在步骤4中没有要拾取的顶点为止。

然后,您可以按值对在步骤2中创建的Set进行排序,并选择成本最低的条目。然后,您可以获取它的密钥,并从步骤2中通过先前选择的密钥创建的Map中选择路径,从​​而获得最低的总体成本。这将是用该算法计算出的最佳路径。