当前位置: 首页 > 知识库问答 >
问题:

在访问每个节点的有向加权图中查找最短路径,且不限制重新访问节点和边

鲍永春
2023-03-14

我正在使用NetworkX Python库。对我试图解决的问题的更广泛的描述在这里。

我想找到1)至少访问每个节点一次的有效路径和2)基于边权重的至少访问每个节点一次的最短路径。

这听起来像是旅行推销员问题的一个变种。另一个值得注意的是,图几乎是无向的——大多数节点是双向连接的,只有少数几个节点是双向连接的(

我研究了NetworkX算法,但似乎没有一个能满足这个问题。

用于生成图形的代码为:

    def generate_graph(self):
        ind = (12, 0)
        self.ball = ind
        locs = [ind]
        while len(locs):
            next_loc = locs.pop()
            if not self.nodes[next_loc]:
                self.nodes[next_loc] = AmazeGameLocation(next_loc)
                self.paths.add_node(self.nodes[next_loc])

            moves = [("U", (-1, 0)), ("D", (1, 0)), ("L", (0, -1)), ("R", (0, 1))]
            for move in moves:
                next_move_loc = add_tuples(move[1], next_loc)
                if self.is_move_possible(next_move_loc):
                    next_attempt = add_tuples(move[1], next_move_loc)
                    weight = 1
                    while self.is_move_possible(next_attempt):
                        next_move_loc = next_attempt
                        next_attempt = add_tuples(move[1], next_move_loc)
                        weight += 1
                    if not self.nodes[next_move_loc]:
                        self.nodes[next_move_loc] = AmazeGameLocation(next_move_loc)
                        self.paths.add_node(self.nodes[next_move_loc])
                        locs.append(next_move_loc)
                    self.paths.add_edge(self.nodes[next_loc], self.nodes[next_move_loc], weight=weight)
                    self.nodes[next_loc].dirs[move[0]] = self.nodes[next_move_loc]

这里有一个示例图。

有关此图表和问题的更多信息,请访问我的GitHub。

共有1个答案

祁俊拔
2023-03-14

我想找到1)至少访问每个节点一次的有效路径和2)基于边权重的至少访问每个节点一次的最短路径。

对于1):这非常简单,例如,您可以尝试找到图形的生成树。然后,您可以通过遍历生成树来构建访问图中所有顶点的路径。

对于2):让G成为您的图形,然后您可以构建GG的“度量完成”,这意味着G'的顶点是G的顶点,对于任何一对顶点u,v,在G'中都有一条边u,v,使用G中从uv的最短路径的权重进行加权
那么您所要做的就是在G'上求解TSP,以获得您在G上寻找的解决方案。

 类似资料:
  • 我有一个加权和无向图,有顶点。其中两个顶点是和。 我需要找到最短的路径,从开始,在结束,并通过G的所有顶点(以任何顺序)。 如何做到这一点? 这不是旅行推销员问题:我不需要访问每个顶点一次,也不想回到第一个顶点。

  • 本文向大家介绍访问C ++中所有节点的最短路径,包括了访问C ++中所有节点的最短路径的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个带有N个节点的无向连通图,这些节点被标记为0、1、2,...,N-1。图的长度将为N,并且仅当节点i和j连接时,j才与列表graph [i]中的i不完全相同。我们必须找到访问每个节点的最短路径的长度。我们可以在任何节点处开始和停止,可以多次访问节点,并且可以

  • 我有一张室内地图上的无向位置图。当给定一组顶点时,我要找到覆盖所有这些顶点的最短路径。图形包含52个顶点和150-250条边。 我能用什么最好的算法来找到最短的路径。请不要混淆这是一个旅行推销员的问题。它不需要覆盖所有节点,只需要覆盖给定的节点集。

  • 给定一个有向图,什么是只访问图的每个顶点一次的算法。这和哈密顿循环不同,我不要求路径在同一个顶点开始和结束。 回溯算法脑海中浮现的一种算法是回溯,使用递归实现,在每一步中,您都会探索所有可能的连接/路径,并保留一个布尔访问数组,以确保没有顶点被多次访问。当向后回溯时,该布尔值将设置为false(回溯中的关键步骤)。基本情况是比较访问的顶点数,并查看它是否与图中的节点数匹配,在这种情况下,它将返回t

  • 我有一个有向加权图G,其中权重是过渡的持续时间。 我使用DFS编写了两个顶点之间的所有路径搜索算法,并进行了修改:搜索将继续,直到路径的总权重(其各部分的权重之和)小于某个值。 我的代码在小图中工作,但在大图中(| V |=1800,| E |=50870)它会冻结。