Numpy Networkx最大独立集再现性

Numpy Networkx最大独立集再现性,numpy,networkx,reproducible-research,Numpy,Networkx,Reproducible Research,如何在Jupyter笔记本(Python3)中获得可复制的结果 为主要随机生成器定义种子似乎是不够的,请参见下面的MWE: import numpy as np import random import os random.seed(0) np.random.seed(0) os.environ['PYTHONHASHSEED']=str(0) 在循环中的每次运行中给出相同的结果 但是,当重新启动内核并再次运行计算单元时,结果会更改为另一个子集。对于您的问题,简短的回答是:在当前的实现中,

如何在Jupyter笔记本(Python3)中获得可复制的结果

为主要随机生成器定义种子似乎是不够的,请参见下面的MWE:

import numpy as np
import random
import os 

random.seed(0)
np.random.seed(0)
os.environ['PYTHONHASHSEED']=str(0)
在循环中的每次运行中给出相同的结果


但是,当重新启动内核并再次运行计算单元时,结果会更改为另一个子集。

对于您的问题,简短的回答是:在当前的实现中,它是不可复制的-如果考虑内核的重新启动

长话短说 您需要使用OrderedSet(请参阅)使用并重新实现函数
最大独立集
,以确保所需的再现性。除OrderedSets外,您还可以通过排序确保强制转换从集合到列表的顺序,请参阅

调试-基于 问题的原因是什么。首先观察,这不是随机发生器。正确实例化并在多次运行中具有相同状态(在开始和结束时-使用
seed.getstate()
检查)。在
最大独立集
中有问题的调用都是
操作。例如,对于mwe:

neighbors = set.union(*[set(G.adj[v]) for v in nodes])
# next line added for simple debugging:
print(nodes, neighbors, G.adj["D"])
# Output 1: ['D', 'A', 'F']
# {'D'} {'E', 'C'} OrderedDict([('C', OrderedDict()), ('E', OrderedDict())])
# ['D', 'F', 'B']
# {'D'} {'C', 'E'} OrderedDict([('C', OrderedDict()), ('E', OrderedDict())])

如您所见,多次运行会导致不同的集合(与顺序有关)。对于其他种子,尤其是可用的节点,
也是如此。因此,通过固定随机数生成器来固定所选列表id并不能确保可再现性,因为列表中元素的排序可能不同。

Hi-什么版本的python和什么版本的
networkx
?python 3.5.3+networkx2.4结果在同一个笔记本运行中是可复制的。但是,当我重新启动内核时,由于Sparky05,结果在第二次运行中会发生变化(见更新的问题)。实际上,通过在源代码中从集合到列表转换时保持顺序,可实现可复制性。
neighbors = set.union(*[set(G.adj[v]) for v in nodes])
# next line added for simple debugging:
print(nodes, neighbors, G.adj["D"])
# Output 1: ['D', 'A', 'F']
# {'D'} {'E', 'C'} OrderedDict([('C', OrderedDict()), ('E', OrderedDict())])
# ['D', 'F', 'B']
# {'D'} {'C', 'E'} OrderedDict([('C', OrderedDict()), ('E', OrderedDict())])