Можно ли (быстро) найти только первый цикл в графе networkx? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть целевая сеть, в которой могут быть циклы или нет.Мне нужно их найти и убрать цикличность.Если у меня есть сеть x DiGraph (G), я могу найти все циклы с помощью

cycle_nodes = nx.simple_cycles(G)

, что создает генератор с возвратом циклов.

Однако я не хочу возвращать всециклы а-ля list(cycle_nodes), потому что многие из циклов являются подмножествами друг друга, и исправление одного исправит другие.Вместо этого я хотел бы найти только первый экземпляр цикла.Поскольку cycle_nodes является генератором, я попытался

next(cycle_nodes)

вернуть только первый экземпляр.Однако я обнаружил, что время, необходимое для возврата первого экземпляра, не намного меньше времени, необходимого для возврата всех экземпляров:

list(cycle_nodes) : 58s
next(cycle_nodes) : 44s

Это просто из-за характера моего графа (т.е. первого цикланаходится далеко вдоль порядка поиска), или есть более эффективный способ возврата любого цикла (необязательно должен быть первым)?

Причина, по которой я подозреваю, может быть более быстрым, заключается в том, что когдаЯ запускаю nx.is_directed_acyclic_graph(G), это занимает всего секунду или две и возвращает False, так что он, очевидно, находит хотя бы один цикл всего за секунду или около того.

1 Ответ

0 голосов
/ 15 ноября 2018

Ответ был вроде очевиден. Алгоритм nx.find_cycle () без начального узла вернет первый найденный цикл быстро. У меня сложилось впечатление, что необходимо предоставить начальный узел, RTFM!

...