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

标签 python graph network-analysis networkit

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

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

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 亿个链接),即使我在集群上工作,迭代也将永远进行。

最佳答案

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 循环。

from networkit import *

# Efficiently updates connected components after edge updates
cc = components.DynConnectedComponents(G).run()

# Removes edges with weight equals to w until components split
def removeEdges(w):
    for (u, v) in G.edges():
        if G.weight(u, v) == weight:
            G.removeEdge(u, v)
            # Updating connected components
            event = dynamic.GraphEvent(dynamic.GraphEvent.EDGE_REMOVAL, u, v, weight)
            cc.update(event)
            if cc.numberOfComponents() > 1:
                # Components did split
                return True
    # Components did not split
    return False

if cc.numberOfComponents() == 1:
    for weight in weights:
        if removeEdges(weight):
            break

这应该会加快您的原始代码的速度。但是,它仍然是顺序代码,因此即使您在多核机器上运行它,它也只会使用一个内核。

关于python - forEdges迭代器在networkit中的使用(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49319722/

相关文章:

python - Redis PubSub 未重新连接

使用动态编程进行字符串操作

r - 在 R 中测试图形平面性

r - 提取有关 tidygraph 中特定节点的邻域/子图

python - 如何将变量分配给 json 响应?

python - Django Rest-Framework 查询数据库

python - 富 Web 客户端与瘦 Web 客户端

algorithm - 在具有相同顶点和边数的加权无向图中找到具有最大成本的简单路径问题是NP完全问题吗?

Python图表-更改轴标记颜色和图例边框颜色