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