使用igraph python从图形中提取特定组件

使用igraph python从图形中提取特定组件,python,python-3.x,igraph,connected-components,Python,Python 3.x,Igraph,Connected Components,问题描述: 目标是提取某个顶点所属的组件,以计算其大小 守则的步骤: 使用该方法获取图形中所有连接组件(c.c)的列表 然后,在每次检查某个节点是否属于c.c列表时,迭代该列表 当它被发现时,我计算它的大小 代码如下: def sizeofcomponent(clusters, vertex): for i in range(len(clusters)): if str(vertex) in clusters.subgraphs()[i].vs["name"]:

问题描述:

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

守则的步骤:

  • 使用该方法获取图形中所有连接组件(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"]))
问题是,这段代码将用于非常大的图形,而这种方法大大降低了代码的速度。有什么办法可以改进吗


编辑01:算法工作原理说明

  • 假设以下图形是主图形

  • 计算(MIS)后,我们得到下面的图表,我称之为组件

  • 从主图表中随机添加一个节点,该节点属于主图表,但不属于组件(不属于MIS)。示例:将节点10添加到组件

  • 计算它形成的组件的大小

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

  • 最后,形成最小组件(最小大小)的节点是永久添加到组件中的节点

  • 您的解决方案:

    • 执行以下代码时(i为顶点):
    变量c值如下所示:

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

    为什么它对我不起作用:

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

        cls = components.clusters()
        c = cls.membership[i]
    
    因为列表c中节点的ID与节点的名称不匹配。例如:cls.membership[i]将给出异常错误:列表超出范围。而不是正确的结果:4

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


    只需执行以下操作即可获得组件顶点
    i
    所属

    components=G.clusters()
    c=组成部分。成员资格[i]
    
    然后,您可以使用

    s=组件大小(c)
    
    我已编辑了我的问题以对您的答案进行评论。请查看。
        cls = components.clusters()
        c = cls.membership[i]
    
        c = components.membership[i]
        s = components.membership.count(c)