Все возможные пути от одного узла к другому в ориентированном дереве (igraph) - PullRequest
11 голосов
/ 19 октября 2010

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

РЕДАКТИРОВАТЬ

Опасения по бесконечному количеству путей

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

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

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

1 Ответ

13 голосов
/ 20 октября 2010

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

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

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

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)

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

...