У меня есть DAG, который выглядит следующим образом: Пример DAG
Я хочу извлечь все пути, состоящие из 4 узлов в этом графе.
Мой ожидаемый результат должен выглядеть так:
N1 -> N2 -> N3 -> N4
N1 -> N2 -> N3 -> N5
N1 -> N3 -> N4 -> N5
N2 -> N3 -> N4 -> N5
Моя текущая попытка выглядит так
def path_finder(n1):
paths = []
if DAG.has_node(n1):
for n2 in DAG.successors(n1):
for n3 in DAG.successors(n2):
for n4 in DAG.successors(n3):
paths.append([n1, n2, n3, n4])
return paths
Я вызываю эту функцию для каждого узла. DAG
— это глобальная переменная, точнее, это объект networkx
(DAG = networkx.DiGraph()
). Эта наивная функция ужасно медленная. Есть ли более эффективная стратегия для этого?
Я просмотрел вопрос 20262712, но был решен самостоятельно автор вопроса довольно неясным образом.
Спасибо
ОБНОВИТЬ:
Так как я не мог получить какой-либо удовлетворительный алгоритм для решения этой проблемы, я в конечном итоге распараллелил задание, используя свою наивную функцию в качестве работника, выгружая все данные в очередь. Я использовал pool.imap_unordered
для запуска рабочей функции и агрегировал результаты из очереди. Это все еще медленно (занимает пару часов для 5 миллионов узлов). Я также должен предоставить данные о средней степени узлов, с которыми я имею дело, потому что это повлияет на скорость работы моих рабочих процессов. Но я пока оставлю это.
paths.append([n1, n2, n3, n4])
. Если это так, вы мало что сможете с этим поделать. - person Joel   schedule 27.08.2016