我想编写一个Java程序,以最近的启发式方法解决旅行商问题。该算法的步骤如下所示:
步骤1:从任意随机顶点开始,将其称为当前顶点
第2步:找到一条在当前顶点与未访问顶点之间具有最小距离的边,将其称为V
第3步:现在将当前顶点设置为未访问的顶点V,并将该顶点V标记为已访问
第4步:终止条件,如果所有顶点都至少访问一次
步骤5:转到步骤2
我很难确定哪种数据结构适合解决此问题。如何确定到当前节点的距离最小的节点(步骤2)?优先队列会是一个不错的选择吗?我还可以使用其他哪些数据结构? 如何确定游览中的倒数第二个节点连接到起始节点?我应该使用堆栈吗?我还能用什么?
答案 0 :(得分:0)
要用最佳(最佳)解决方案解决旅行推销员,您将必须在图形中生成所有可能的路径,并找到成本最低(顶点之间的边的最小和)的路径。您正在描述的最近邻居方法接近使用Greedy alrogithms。假设您的图形中有n
个顶点并且每个顶点都已连接,则可以按照以下步骤使用贪婪策略/最近邻居方法解决旅行商问题(假设您有Set
个Vertex
类对象):
Set
的初始未访问顶点。Map
的{{1}},其中键是起始顶点,值是总体路径成本。Map<Vertex, Integer>
,该键是路径的起始顶点,值是Map
,代表路径(List<Vertex>
)。Map<Vertex, List<Vertex>>
中存在)。Set
上,该键是当前的起始顶点(在步骤4中选择)并存储在步骤3中创建的List<Vertex>
中。(注意:在这里,您需要考虑所有不同于在步骤4)选取的顶点的顶点。Map
中。Map
。然后,您可以按值对在步骤2中创建的Set
进行排序,并选择成本最低的条目。然后,您可以获取它的密钥,并从步骤2中通过先前选择的密钥创建的Map
中选择路径,从而获得最低的总体成本。这将是用该算法计算出的最佳路径。