Описание проблемы:
Цель состоит в том, чтобы извлечь компонент, которому принадлежит определенная вершина, чтобы вычислить ее размер.
Шаги кода:
- Используйте метод 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: объяснение того, как работает алгоритм
Предположим, что следующий граф является основным графом:
Вычисляется Максимальное независимое множество (MIS), и мы получаем следующий график, который я называю components:
Произвольно добавить узел из основного графа таким образом, чтобы этот узел принадлежал основному графу, но не принадлежал компонентам (не часть ИСУ). Пример: добавление узла 10 к компонентам.
Рассчитайте размер компонента, который он образует.
Процесс повторяется со всеми узлами (теми, которые не принадлежат компонентам (MIS).
В конце концов, узел, формирующий наименьший компонент (наименьшего размера), постоянно добавляется к components.
Ваше решение:
- Когда выполняется следующий код (i является вершиной):
cls = components.clusters()
c = cls.membership[i]
Значением переменной c будет следующий список:
Пример: узел (2) принадлежит компоненту 1 (с идентификатором 1).
Почему мне это не помогло:
Следующая строка кода не даст мне правильного результата:
cls = components.clusters()
c = cls.membership[i]
потому что идентификаторы узлов в списке c не совпадают с именами узлов. Пример: cls.membership[i] выдаст ошибку исключения: список вне допустимого диапазона. Вместо правильного результата: 4.
Кроме того, из вашего кода размер в вашем случае рассчитывается следующим образом:
c = components.membership[i]
s = components.membership.count(c)