【问题标题】:All unique paths in a directed acyclic graph, in randomized order, via Python generator?通过Python生成器以随机顺序排列的有向无环图中的所有唯一路径?
【发布时间】: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


【解决方案1】:

请注意,您自相矛盾:您希望输出“严格无序”,但您没有序列的状态或记忆。这根本不可能通过信息论来实现。但是,如果您的目标只是进行“洗牌”——一个不经意的观察者不会将其识别为预先确定的顺序的不同顺序,那么您就有机会了。

首先,确定您的选择点和尺寸。例如,您上面的选择是 [1, 2, 3] x [5, 6, 7]。这为您提供了 3*3 = 9 条生成路径。让我们在最后添加第三个选项,即 [T, F]。这给出了 3*3*2 = 18 条路径。

现在,使用您最喜欢的“完美序列生成器”为您创建一个简单的函数。我假设允许 RNG 进程中的 something 调用以前的值或种子。为简单起见,让我们使用一个平凡的线性序列f(n) = f(n-1) + 5 (mod 18)。这将给出序列0 5 10 15 2 7 12 17 ...

现在让您的路径生成器在每次迭代时调用此函数。只需将返回的“随机”数转换为给定基本序列中的数字——在本例中为 3|3|2。让我们看一下值 7,从左到右进行转换,按顺序使用基数:

7 divmod 3 => mod 1, quotient 2
2 divmod 3 => mod 2, quotient 0
0 divmod 2 => mod 0

因此,您从三个选择数组中选择包含元素 1、2、0 的路径。结果路径是(选择的节点以粗体):

2 4 6 8 T

清楚吗?它解决了你的问题吗?

【讨论】:

  • 这并不比在任何给定层随机选择一个顶点更好,这是我目前的策略。
  • 但是,我想你是对的。如果不真正存储以前的路径,就无法随机枚举所有路径。
  • @Ain 正是信息论的问题:如果你无法存储信息来告诉你是否已经随机选择了这个解决方案,那么你就被卡住了。我能建议的最好的答案是这个答案,其中 RNG 的固有状态(最新的种子值)体现了伪随机序列中的一个位置——该序列将在重复之前用尽所有组合。您解码该单个整数以获得特定组合。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2012-03-14
  • 2012-12-29
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多