Параметрическое транзитивное замыкание неориентированного графа в сети X - PullRequest
0 голосов
/ 06 апреля 2019

Я делаю неориентированный граф из существующих ребер.

G = nx.Graph()
edge_list = [(1,2),(2,3), (3,4), (4,5),(5,6)]
G.add_edges_from(edge_list)

Теперь я хочу выполнить транзитивное закрытие, которое параметризовано уровнем k, так что k=1 означает, что будут добавлены следующие новые ребра.

new_edge_list = [(1,3),(2,4),(3,5),(4,6)]
G.add_edges_from(new_edge_list)

Хотя k=2 означает, что будут добавлены следующие новые ребра.

new_edge_list = [(1,3),(1,4),(2,4),(2,5),(3,5), (3,6),(4,6)]
G.add_edges_from(new_edge_list)

Это, по сути, означает, что когда мы продолжаем увеличивать значение k, график G в конечном итоге станет кликой (то есть транзитивным замыканием). Однако я хочу получить транзитивное замыкание на определенном уровне k. Я могу получить полное транзитивное замыкание, используя этот ответ . Но я борюсь с определенным уровнем транзитивного закрытия. Я могу добиться транзитного закрытия k=1 с помощью представления смежности , но его нельзя масштабировать для k=2. Небольшая помощь будет оценена.

P.S .: Хорошо, если симметричные ребра также создаются как [(1,3),(3,1)] во время параметрического транзитивного замыкания.

1 Ответ

1 голос
/ 06 апреля 2019

Если у вас есть рабочий алгоритм для случая k = 1 и что упомянутые вами проблемы масштабирования не появляются в результате роста самого графа при добавлении дополнительных ребер, то вы можете просто использовать этот алгоритм рекурсивно, так какрезультат применения его к выводу k = 1-case будет вашим k = 2 -case.

...