forEdges迭代器在networkit(python)中的使用

2024-05-12 14:09:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我仔细阅读了这些文档,但是我仍然不清楚如何使用G.forEdges(),它被描述为“实验性的边缘迭代器接口”。在

假设我想降低图的密度。我有一个排序的权重列表,我想根据它们的权重移除边,直到图拆分成两个连接的组件。然后我将选择保持图形连接的最小链接数。我会这样做:

cc = components.ConnectedComponents(G).run()
while cc.numberOfComponents()==1:
    for weight in weightlist:
        for (u,v) in G.edges():
            if G.weight(u,v)==weight:
                G=G.removeEdge(u,v)

顺便说一下,我从docs中知道有一个边缘迭代器,它可能以更有效的方式进行迭代。但是从文档中我真的不明白如何正确地使用这个forEdges,而且我在互联网上也找不到一个例子。有什么想法吗?在

或者是一个替代的想法来做我想做的事情:因为它是一个巨大的图(1.25亿个链接),所以即使我在一个集群上工作,迭代也要花很长时间。在


Tags: in文档列表for排序链接组件实验性
1条回答
网友
1楼 · 发布于 2024-05-12 14:09:50

NetworKit迭代器接受一个回调函数,因此如果你想在边(或节点)上迭代,你必须定义一个函数,然后将它作为参数传递给迭代器。您可以找到更多信息here。例如,一个只打印所有边的简单函数是:

# Callback function.
# To iterate over edges it must accept 4 parameters
def myFunction(u, v, weight, edgeId):
    print("Edge from {} to {} has weight {} and id {}".format(u, v, weight, edgeId))

# Using iterator with callback function
G.forEdges(myFunction)

现在,如果您想继续删除权重在权重列表中的边,直到图形拆分为两个连接的组件,您还必须更新图形的连接组件,因为ConnectedComponents不会自动为您执行此操作(这可能也是迭代需要永远进行的原因之一)。为了有效地做到这一点,可以使用DynConnectedComponents类(参见下面的示例)。在本例中,我认为边缘迭代器对您没有太大帮助,所以我建议您继续使用for循环。在

^{pr2}$

这应该会加快一点你的原始代码。但是,它仍然是顺序代码,所以即使你在多核机器上运行它,它也只会使用一个核心。在

相关问题 更多 >