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

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

鲍永春
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条边。 我能用什么最好的算法来找到最短的路径。请不要混淆这是一个旅行推销员的问题。它不需要覆盖所有节点,只需要覆盖给定的节点集。

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

  • 我需要帮助在一个未加权无向图中找到两个节点之间的所有最短路径。 我能够使用BFS找到一条最短路径,但到目前为止,我还不知道如何找到并打印出所有路径。 知道我可以使用的算法/伪代码吗?