Задача: Я хочу вычислить кратчайший путь между исходным и целевым узлами в группе DAG (направленный ациклический граф), используя graph-tool
Python эффективно . Мой DAG имеет отрицательный вес.
Теоретически, это вычислительно «простая» проблема (т. Е. O (V + E) ), сначала вычисляющая топологическую сортировку графа, а затем посещающая и обновляющая родительские узлы и расстояния (например, как обсуждено здесь ).
Как я могу эффективно реализовать это, используя graph-tool
?
Мои неудачные попытки до сих пор:
- ручная реализация теоретически эффективного алгоритма в Python. Однако, поскольку мне приходится перебирать каждую вершину в графе, это становится неприемлемо медленным
- использование функции
shortest_path
из graph-tool
для вызова подпрограммы Dijkstra из Boost Graph Library
будет иметь приемлемое время выполнения, но не полностью использует структуру DAG и в любом случае не работает для отрицательных весов
- использование
shortest_path
для вызова Bellman-Ford
возвращает правильный кратчайший путь, но не использует структуру DAG и является слишком медленным ( O (VE) ).
Эффективный алгоритм кратчайшего пути DAG реализован как dag_shortest_paths
в базовой Boost Graph Library . Есть ли какой-нибудь способ доступа к этой функции через graph-tool
или любой другой способ ее эффективного вычисления с помощью graph-tool
?