【发布时间】:2017-08-04 20:29:01
【问题描述】:
我有一个Directed Acyclic Graph (DAG),它由层组成,随后的两个层完全是二分的(很像神经网络),如下所示:
我想流式传输 DAG 中的所有路径,以迭代方式,通过一些生成器,以随机顺序。因为,输出不得有序,教科书式的 DFS 方法是毫无疑问的。内存是个问题,所以我不想存储我之前生成的任何路径,除了单独的 DAG,可以根据需要进行修改。
例如,上述 DAG 的期望输出是:
(1, 4, 6, 8)
(3, 4, 5, 8)
(2, 4, 7, 8)
(3, 4, 6, 8)
(1, 4, 5, 8)
(3, 4, 7, 8)
(1, 4, 7, 8)
(2, 4, 6, 8)
(2, 4, 5, 8)
而不是由 DFS 生成的以下内容:
(1, 4, 5, 8)
(1, 4, 6, 8)
(1, 4, 7, 8)
(2, 4, 5, 8)
(2, 4, 6, 8)
(2, 4, 7, 8)
(3, 4, 5, 8)
(3, 4, 6, 8)
(3, 4, 7, 8)
感谢您的帮助。
更新:
我有以下代码
graph = {
1: set([4]),
2: set([4]),
3: set([4]),
4: set([5, 6, 7]),
5: set([8]),
6: set([8]),
7: set([8])
}
def dfs_paths(graph, start, goal):
stack = [(start, [start])]
while stack:
(vertex, path) = stack.pop()
for next in graph[vertex] - set(path):
if next == goal:
yield path + [next]
else:
stack.append((next, path + [next]))
def run_paths():
for start in [1, 2, 3]:
for path in dfs_paths(graph, start, 8):
print path
查找所有路径然后随机流式传输它们对我不起作用,因为我不想存储我将生成的任何路径。
【问题讨论】:
-
当你到达一个节点时,你可以在调用 dfs 之前洗牌
-
你能证明自己任何努力解决这个问题吗?
-
所以你想随机化输出。不能使用
random模块吗? -
@marvel308 洗牌,仍然做 DFS?事情还会有条不紊吗?您能否充实您的评论作为答案?
-
@Ain 那么请展示一下。展示有缺陷的尝试总比没有代码好。
标签: python algorithm data-structures generator graph-algorithm