Python 使用Networkx运行有向图的随机遍历的更有效方法

Python 使用Networkx运行有向图的随机遍历的更有效方法,python,networkx,graph-traversal,Python,Networkx,Graph Traversal,我试图通过有向networkx图模拟随机遍历。伪代码如下 Create graph G with nodes holding the value true or false. // true -> visited, false -> not visited pick random node N from G save N.successors as templist while true nooptions = false pick random node N f

我试图通过有向networkx图模拟随机遍历。伪代码如下

Create graph G with nodes holding the value true or false. 
// true -> visited, false -> not visited

pick random node N from G
save N.successors as templist
while true
    nooptions = false
    pick random node N from templist
    while N from templist has been visited
        remove N from templist
        pick random node N from templist
        if templist is empty
            nooptions = true
            break
    if nooptions = true 
        break
    save N.successors as templist 
是否有一种更有效的方法将路径标记为已行驶路径,而不是 是否创建临时列表并删除标记为已访问的元素

编辑


该算法的目标是在图中随机选取一个节点。随机选取该节点的后续节点/子节点。如果它是未访问的,则转到那里并将其标记为已访问。重复此操作,直到没有后续对象/子对象或没有未访问的后续对象/子对象

根据图形的大小,您可以使用内置的
所有\u对\u最短路径
功能。您的功能基本上是:

G = nx.DiGraph()
<add some stuff to G>

# Get a random path from the graph
all_paths = nx.all_pairs_shortest_path(G)

# Choose a random source
source = random.choice(all_paths.keys())
# Choose a random target that source can access
target = random.choice(all_paths[source].keys())
# Random path is at
random_path = all_paths[source][target]

目标是什么?选择一个随机节点,然后选择一个它可以访问的随机节点,并提取该路径?我的回答是假设……谢谢你回复@CorleyBrigman。我已经有了从源代码开始的代码,今晚晚些时候我将尝试您的最后一个解决方案!我估计我的节点数量大约在十万个左右。目标是从一个随机节点开始,随机选择一个要访问的节点,直到没有更多的节点可访问为止。同一节点的访问次数不应超过一次。我希望将模拟运行多次(稍后确定),并存储一个节点被访问的次数,因此我认为效率将是一个因素。我只是检查我的假设“从一个随机节点开始,随机选择一个节点”。。。你的意思是,从一个节点开始,选择一个随机的后续节点,然后选择其中一个节点的后续节点,等等。直到你到达一个没有后续节点的节点?是的,直到我到达一个没有后续节点的节点,或者所有后续节点都已标记为已访问。为什么要删除源?在上一个解决方案的bfs_树中,我不一定要选择从一个节点到另一个节点的最短路径。这会允许真正的随机行走吗?另外,如果我的目标是一个随机选择,比如说父母是源,孩子是目标。即使目标可能有更多的孩子,我也只会走一边吗?谢谢你迄今为止的帮助!
bfs_树
包括源和所有可到达的目标。而
有向图的格式是
G.node
是字典。所以
G.node.keys()
是源代码+所有目标的列表。要选择一个随机目标,您可以使用该列表中的
random.choice
,但您不需要源,因此可以将其删除。您是对的,使用最后一个解决方案,您将只获得该随机源和目标之间的最短路径。这样做的好处是,您已经选择了一个随机的源和目标,并且知道它们之间存在某种路径。但是如果你想要一个真正的随机路径,那么你原来的算法是有效的,我会用一个集合而不是一个列表——检查成员资格要便宜得多。您也可以将我的方法用于
所有简单路径
,这将给出所有没有循环的路径-创建一个列表并选择一个随机条目。这将是相当均匀的随机,但可能不是很有效…太好了,非常感谢你的帮助!我将切换到为我的原始算法使用集合。否则,你的算法会非常有效!我只需要一个更均匀的随机游走就可以到达“终点”(不再有接班人或未访问的接班人)
# Get random source from G.node
source = random.choice(G.node)

min_tree = nx.bfs_tree(G, source)
# Accessible nodes are any node in this list, except I need to remove source.

all_accessible = min_tree.node.keys()
all_accessible.remove(source)
target = random.choice(all_accessible.node.keys())

random_path = nx.shortest_path(G, source, target)