【问题标题】:Extract a certain component from a graph using igraph python使用 igraph python 从图中提取某个组件
【发布时间】:2020-09-19 02:00:30
【问题描述】:

问题描述:

目的是提取某个顶点所属的组件,以计算其大小。

代码步骤:

  • 使用igraph方法clusters()获取图中所有连通分量(c.c)的列表。
  • 然后,遍历 c.c 列表,同时每次检查某个节点是否属于它。
  • 找到后,我计算它的大小。

代码如下:

def sizeofcomponent(clusters, vertex):
    for i in range(len(clusters)):
        if str(vertex) in clusters.subgraphs()[i].vs["name"]:
            return(len(clusters.subgraphs()[i].vs["name"]))

问题是这段代码将用于非常大图,这种处理方式大大降低了我的代码速度。有什么办法可以改善吗?


EDIT 01:算法工作原理的解释

  1. 假设下图是主图

  2. 计算Maximal Independent Set (MIS),我们得到以下图表,我称之为components

  3. 主图随机添加一个节点,该节点属于主图但不属于组件 (不是 MIS 的一部分)。 示例: 将节点 10 添加到组件。

  4. 计算它形成的组件的大小。

  5. 对所有节点(不属于组件 (MIS) 的节点)重复该过程。

  6. 最后,形成最小组件(最小尺寸)的节点是永久添加到组件的节点。

您的解决方案:

  • 执行以下代码时(i 为顶点):
    cls = components.clusters()
    c = cls.membership[i]

变量 c 的值将是以下列表:

示例:节点 (2) 属于组件 1(id 为 1)。

为什么它对我不起作用:

以下代码行不会给我正确的结果:

    cls = components.clusters()
    c = cls.membership[i]

因为列表 c 中节点的 id 与节点的 name 不匹配。示例:cls.membership[i] 会给出异常错误:列表超出范围。而不是正确的结果是:4.

此外,根据您的代码,在您的情况下,大小是按以下方式计算的:

    c = components.membership[i]
    s = components.membership.count(c)

【问题讨论】:

    标签: python python-3.x igraph connected-components


    【解决方案1】:

    你可以简单的通过做得到i所属的组件顶点

    components = G.clusters()
    c = components.membership[i]
    

    然后您可以使用 c 获取组件的大小

    s = components.size(c)
    

    【讨论】:

    • 我已编辑我的问题以评论您的回答。请检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多