Извлечь определенный компонент из графика с помощью igraph python

Описание проблемы:

Цель состоит в том, чтобы извлечь компонент, которому принадлежит определенная вершина, чтобы вычислить ее размер.

Шаги кода:

  • Используйте метод 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. Вычисляется Максимальное независимое множество (MIS), и мы получаем следующий график, который я называю components:

    - Компоненты (ИСУ) -

  3. Произвольно добавить узел из основного графа таким образом, чтобы этот узел принадлежал основному графу, но не принадлежал компонентам (не часть ИСУ). Пример: добавление узла 10 к компонентам.

    добавление узла 10 к компонентам

  4. Рассчитайте размер компонента, который он образует.

  5. Процесс повторяется со всеми узлами (теми, которые не принадлежат компонентам (MIS).

  6. В конце концов, узел, формирующий наименьший компонент (наименьшего размера), постоянно добавляется к components.

Ваше решение:

  • Когда выполняется следующий код (i является вершиной):
    cls = components.clusters()
    c = cls.membership[i]

Значением переменной c будет следующий список: c=cls.membership[i]

Пример: узел (2) принадлежит компоненту 1 (с идентификатором 1).

Почему мне это не помогло:

Следующая строка кода не даст мне правильного результата:

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

потому что идентификаторы узлов в списке c не совпадают с именами узлов. Пример: cls.membership[i] выдаст ошибку исключения: список вне допустимого диапазона. Вместо правильного результата: 4.

Кроме того, из вашего кода размер в вашем случае рассчитывается следующим образом:

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

person Imen Z Imanou    schedule 31.05.2020    source источник


Ответы (1)


Вы можете просто получить вершину компонента i, выполнив

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

Затем вы можете получить размер компонента c, используя

s = components.size(c)
person Vincent Traag    schedule 31.05.2020
comment
Я отредактировал свой вопрос, чтобы прокомментировать ваш ответ. Пожалуйста, проверьте это. - person Imen Z Imanou; 02.06.2020