用于返回图形类 (DAG) 中所有可能路径的 Python 方法

Python method for returning all possible paths in a graph class (DAG)

提问人:Alvaro Ciudad 提问时间:3/28/2022 更新时间:3/28/2022 访问量:81

问:

我有一个问题,围绕着在有向无环图中找到从源到目的地的所有路径。为此,我创建了两个充当 Node 和 Graph 的自定义类。 Graph 类读取邻近矩阵以创建节点并在字典中添加连接。
在此之后,我希望能够使用递归找到从源到目标的所有可能路径,并使用生成器返回它们,但我在递归调用时遇到了问题,因为它没有正确导航路径。
AllPathUtils 方法不会经过第一个方法调用。这几乎是我的代码,如果你们中的一个人能指出我遗漏的愚蠢错误,我将不胜感激。 在底部,我将留下一些示例输入,以便您可以检查确切的行为。多谢。

class Node:
    def __init__(self, identity):
       self.name = identity

    def get_name(self):
        return self.name

    def __hash__(self):
        return hash(self.get_name())

    def __eq__(self, other):
       return self.get_name() == other.get_name()

    def __ne__(self, other):
        return not self == other

    def __str__(self):
        return f"Node -> {self.get_name()}"

    def __repr__(self):
        return f"Node -> {self.get_name()}"


class Graph:
    def __init__(self, matrix_graph):
        self.graph = {}
        self.V = len(matrix_graph)
        i = 0
        for node in matrix_graph:
            x = Node(i)
            self.graph[x] = []
            j = 0
            for adj in node:
                if matrix_graph[i][j] != 0:
                    self.graph[x].append(Node(j))
                j += 1
            i += 1

    def AllPathsUtil(self, u, d, visited, path):
        visited[u.get_name()] = True
        path.append(u)
        if u == d:
            yield path
        else:
            for i in self.graph[u]:
                if visited[i.get_name()] is False:
                    self.AllPathsUtil(i, d, visited, path)
        path.pop()
        visited[u.get_name()] = False

    def printAllPaths(self, s, d):
        visited = [False] * (self.V)
        path = []
        for el in self.AllPathsUtil(s, d, visited, path):
            print(el)



matrix2 = [[0, 1, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0]]

z = Graph(matrix2)
z.printAllPaths(Node(0), Node(4))
Python 寻路 定向无环图

评论

0赞 mkrieger1 3/28/2022
你说你有一个问题。但问题在哪里?
0赞 Samwise 3/28/2022
您的数据结构内部结构令人困惑和可疑。我建议只迭代图形,打印有关节点的所有信息,看看它是否看起来“正确”。我的怀疑是你正在生成一个空列表,因为 .Graphfor i in self.graph[u]Graph.__init__
0赞 Alvaro Ciudad 3/28/2022
@mkrieger1 AllPathUtils 方法未通过第一个方法调用,则未在行 self 中正确调用递归。AllPathsUtil(i, d, visited, path),我不知道为什么。那么问题来了,为什么?我该如何解决这个问题?
0赞 Alvaro Ciudad 3/28/2022
@Samwise Graph.__init__方法工作正常。我还有其他依赖于此 init 工作的函数,它们可以正常工作。只有这个方法不起作用,如果你在其中打印 i,它会返回正确的 Node,它是下一个递归的输入for i in self.graph[u]
0赞 Mark 3/28/2022
如果你想让它做任何事情,你需要从递归调用中屈服:。AllPathsUtil()yield from self.AllPathsUtil(i, d, visited, path)

答:

1赞 Alvaro Ciudad 3/28/2022 #1

对于任何和我有同样问题的人来说,错误是我需要从递归调用中屈服,否则它将不起作用。 这是有问题的台词:

self.AllPathsUtil(i, d, visited, path)

虽然这是正确的:

yield from self.AllPathsUtil(i, d, visited, path)