Подтвердить что ты не робот

Все возможные пути от одного node к другому в направленном дереве (igraph)

Я использую привязку python к igraph в представляют собой направленное дерево. Я хотел бы найти все возможные пути от одного node в этом графике к другому. К сожалению, я не мог найти готовую к использованию функцию в igraph, которая выполняет эту задачу?

EDIT

Проблемы с бесконечным числом путей

Граф, о котором я говорю, на самом деле является ориентированным ациклическим графом (DAG) с одним корнем. Он представляет собой однонаправленный каскад событий, которые на разных уровнях каскада могут либо разделиться, либо объединиться. Как я уже сказал, это однонаправленный граф. Также предусмотрено, что график не содержит циклов. Из-за этих двух причин бесконечный список путей невозможен.

Что я пытаюсь сделать?

Моя цель - найти все возможные пути, ведущие от вершины графика (корень) к данному node.

4b9b3361

Ответ 1

Вы ищете все пути между одним node и другим в направленном ациклическом графе (DAG).

Дерево всегда является DAG, но DAG не всегда является деревом. Разница в том, что ветки дерева не допускаются к объединению, только делятся, а ветки DAG могут течь вместе, пока не вводятся никакие циклы.

Ваше решение можно найти как find_all_paths() в "Python Patterns - Реализация графов." Это требует небольшой адаптации для использования с igraph. У меня не установлен igraph, но, используя mocks, это работает:

def adjlist_find_paths(a, n, m, path=[]):
  "Find paths from node index n to m using adjacency list a."
  path = path + [n]
  if n == m:
    return [path]
  paths = []
  for child in a[n]:
    if child not in path:
      child_paths = adjlist_find_paths(a, child, m, path)
      for child_path in child_paths:
        paths.append(child_path)
  return paths

def paths_from_to(graph, source, dest):
  "Find paths in graph from vertex source to vertex dest."
  a = graph.get_adjlist()
  n = source.index
  m = dest.index
  return adjlist_find_paths(a, n, m)

Из документации было неясно, является ли adjlist списком индексов вершин или списком самих объектов вершин. Я предположил, что в списках содержатся индексы, чтобы упростить использование adjlist. В результате возвращенные пути находятся в терминах индексов вершин. Вам нужно будет сопоставить их обратно с объектами вершин, если они вам нужны, или адаптировать код, чтобы добавить вершину, а не ее индекс.