Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 改进的最短路径算法-顶点有点_Algorithm_Graph_Graph Algorithm - Fatal编程技术网

Algorithm 改进的最短路径算法-顶点有点

Algorithm 改进的最短路径算法-顶点有点,algorithm,graph,graph-algorithm,Algorithm,Graph,Graph Algorithm,现在我有一个无向图。每条边表示顶点之间的距离。每个顶点都包含一个数字(让我们称它们为点)。我试图在使用最小距离的同时获得最大点数。我对我能走的最大距离有一个限制,因此我不需要到达每个顶点。我可以从任何顶点开始,在任何顶点结束(我不需要返回原点) 现在我在想,通过动态规划是可能的,但我不完全确定如何设置这个问题 对于如何设置它/使用正确算法的任何帮助,我们将不胜感激 我认为一个好的方法是在图上建立一个最小生成树。之后,您可以选择一个根节点(我猜选择是它自己的算法/启发式)并遍历树。然而,这可能不是

现在我有一个无向图。每条边表示顶点之间的距离。每个顶点都包含一个数字(让我们称它们为点)。我试图在使用最小距离的同时获得最大点数。我对我能走的最大距离有一个限制,因此我不需要到达每个顶点。我可以从任何顶点开始,在任何顶点结束(我不需要返回原点)

现在我在想,通过动态规划是可能的,但我不完全确定如何设置这个问题


对于如何设置它/使用正确算法的任何帮助,我们将不胜感激

我认为一个好的方法是在图上建立一个最小生成树。之后,您可以选择一个根节点(我猜选择是它自己的算法/启发式)并遍历树。然而,这可能不是最优解,因为我认为这个问题是NP完全问题。 或者,您可以尝试搜索TSP(旅行商问题)的求解算法,并提取一条提供最多点的路径。

使用,您可以迭代点,并对第一个点连接的每个点执行相同的函数,依此类推

pts = [[(1,8), (2,5), (3,6)...]...] //each sublist of points needs to be sorted by the second index in each value contained
paths = []
def Branch(history, distance):
  for index, dist in pts[history[-1]][1:tree_branches_per_iteration]: //make the shorter distances go first
    if not index in history: //check for repetition
      new_distance = distance + dist
      if new_distance > limit: //check for distance limit
        paths.append((history + [index], new_distance))
      else:
        Branch(history + [index], new_distance)
    else:
      paths.append((history, distance))

Branch([0], 0)
此函数调用自身,在所有可能的方向上组装点链(不要两次到达同一点),并在两次到达同一点或达到距离限制时终止

这些距离基本上是由从每个坐标到每个坐标的所有距离的矩阵生成的


这种方法使用贪婪的推销员。

因此,在经历了这段经历之后,我发现您应该研究蚁群算法,并将其应用于旅行推销员问题。您也可以使用一种改进的贪婪算法方法,该方法从一个随机点开始,并根据提供最佳点的位置,基于随机边模具选择下一个位置。然后,您可以进一步修改算法以存储以前的结果,并进行迭代以获得更好的结果。

是否可以使用递归函数建立通过这些顶点的路径列表,然后比较它们?或者,由于你的分数太多,这是不可行的?还有,这是什么语言,或者这是一个普遍的问题?@bcdan这是java语言。我们有大约600点需要考虑,每个点没有特定的点。该点可以指向图表上的600个点中的任意一个。我只想最大化点和最小距离。我真的想不出一个算法除了蛮力强迫它。按你的方式递归执行意味着我必须检查每一个可能的点,这将使运行时间O(n*n!)。@DanGoldstein591 Ok。我理解。我会在上面加一些东西