NetworkX:图的修改与恢复

2 投票
1 回答
572 浏览
提问于 2025-04-18 14:58

我有一个多重图,里面有很多节点和边。我随机删除了一些节点,然后计算删除后图的全球效率(GE)。

我想一次性删除一批节点,每次都测试一下全球效率,并生成一个文件,记录删除的节点数量和相应的全球效率,比如:

5% removed GE: 1
10% removed GE: 0.4
15% removed GE: 0.34
...

实际上,我希望在每次删除节点之前,把图恢复到原来的状态。这是因为节点的删除是随机的。所以,当我删除了5%的节点并测试了全球效率后,我希望图恢复,然后再随机删除10%的节点,这可能会包含之前删除的那5%。

我的尝试:

我试着创建一个全局变量来保存我的原始图。

MG = nx.multigraph # load MG with the nodes and edges
global originalgraph 
originalgraph = MG

# conduct removal of 5% using MG
# . . .
# . . .


MG = originalgraph

# conduct removal of 10% using MG
# . . .

结果:

第一次操作很成功,删除了5%的节点。第二次操作似乎没有把多重图恢复到原来的状态。

有没有办法全局保存一个NetworkX图?

1 个回答

0

把图存储在一个共同的地方,叫做 original_graph,然后使用 deepcopy() 来创建一个原始图的副本,这样就可以在副本上进行进一步的测试,而不会影响到原始图。

original_graph = nx.multigraph # load MG with the nodes and edges
global original_graph # <--- I do not know why you need this unless you are accessing the original_graph from inside a function.
MG = original_graph.deepcopy()

# conduct removal of 5% using MG
# . . .
# . . .


MG = original_graph.deepcopy()

# conduct removal of 10% using MG
# . . .
# . . .

你之前的方法有个问题,就是 MGoriginal_graph 都指向了同一个图对象。所以当你对图进行修改时,实际上是修改了唯一的那个图对象,这样就无法回到未修改的状态,因为只有一个图对象,而多个变量都在指向它。

现在,当你使用 deepcopy() 的时候,你实际上是创建了一个和 original_graph 指向的图对象一模一样的副本,并把这个新创建的对象的引用赋值给 MG,然后你可以在这个副本上进行操作。接着,如果你再执行一次 deepcopy(),就可以再创建一个 original_graph 的副本,并把它的引用存储在 MG 中,这样就可以进行更多的测试,而不会修改 original_graph 的内容。

希望这对你有帮助。

撰写回答