提问人:Alvaro Ciudad 提问时间:3/28/2022 更新时间:3/28/2022 访问量:81
用于返回图形类 (DAG) 中所有可能路径的 Python 方法
Python method for returning all possible paths in a graph class (DAG)
问:
我有一个问题,围绕着在有向无环图中找到从源到目的地的所有路径。为此,我创建了两个充当 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))
答:
1赞
Alvaro Ciudad
3/28/2022
#1
对于任何和我有同样问题的人来说,错误是我需要从递归调用中屈服,否则它将不起作用。 这是有问题的台词:
self.AllPathsUtil(i, d, visited, path)
虽然这是正确的:
yield from self.AllPathsUtil(i, d, visited, path)
评论
Graph
for i in self.graph[u]
Graph.__init__
for i in self.graph[u]
AllPathsUtil()
yield from self.AllPathsUtil(i, d, visited, path)