Я использую библиотеку графа ускорения, чтобы вызвать dijkstra_shortest_paths
. Однако у меня есть кое-что особенное: weight_map
на самом деле является функтором. Следовательно, каждый раз, когда библиотеке boost требуется вес ребра, вызывается мой функтор, он выполняет сложные вычисления и возвращает результат обратно в boost.
К сожалению, в dijkstra_shortest_paths.hpp
структура Метод dijkstra_bfs_visitor
explore_edge
имеет вызов get
к карте весов только для проверки, является ли возвращаемое значение отрицательным. Я полностью осознаю, что не могу использовать алгоритм Дейкстры с отрицательными значениями, и уверен, что мой функтор возвращает только положительные значения. Однако эта проверка приводит к тому, что мой функтор вызывается дважды для каждого ребра. Поскольку он выполняет сложное вычисление, я бы хотел избежать его повторения (результаты не меняются между вызовами .. каждое ребро получает одинаковое ожидание во время выполнения dijkstra_shortest_paths
).
Пока что, Я вручную проверяю ребро, переданное функтору, и в случае повторного вызова возвращаю предыдущий запомненный результат. Очевидно, что это скорее обходной путь, чем решение.
Я попытался передать своего собственного посетителя, который перезаписывает explore_edge
, однако исходный метод, определенный dijkstra_bfs_visitor
от boost, все еще применяется.
Кто-нибудь знает, есть ли лучший способ справиться с этой ситуацией и как-то избежать проверки веса отрицательного ребра?