Używam biblioteki wykresów doładowania, aby wykonać połączenie z dijkstra_shortest_paths
. Mam jednak coś specjalnego w tym, że weight_map
jest w rzeczywistości funktorem. Dlatego za każdym razem, gdy biblioteka doładowań wymaga wagi krawędzi, mój funktor jest nazywany, wykonuje skomplikowane obliczenia i dostarcza wynik do zwiększenia.Ujemne sprawdzanie masy krawędzi w dijkstra_shortest_paths boostu
Niestety w dijkstra_shortest_paths.hpp
metoda struct dijkstra_bfs_visitor
„s examine_edge
ma get
wezwanie do weightmap, tylko w celu sprawdzenia, czy zwrócona wartość jest ujemna. Jestem w pełni świadomy, że nie mogę użyć algorytmu Dijkstry z wartościami ujemnymi i jestem pewien, że mój funktor zwraca tylko wartości dodatnie. Jednak to sprawdzenie powoduje, że mój funktor jest wywoływany dwa razy dla każdej krawędzi. Ponieważ wykonuje skomplikowane obliczenia, chciałbym uniknąć wykonywania go dwa razy (wyniki nie zmieniają się między połączeniami. Każda krawędź dostaje takie samo oczekiwanie podczas uruchomienia dijkstra_shortest_paths
).
Do tej pory ręcznie sprawdzam krawędź przekazywaną funktorowi, a w przypadku duplikatu zwracam poprzedni zapamiętany wynik. To oczywiście jest bardziej rozwiązaniem niż rozwiązaniem.
Próbowałem przekazać mojego gościa, który nadpisał examine_edge
, jednak nadal stosowana jest oryginalna metoda zdefiniowana przez kryterium doładowania dijkstra_bfs_visitor
.
Czy ktoś wie, czy jest lepszy sposób radzenia sobie z tą sytuacją i jakoś uniknąć kontroli wagi krawędzi ujemnej?
Jeśli jest to kosztowne, buforowanie tego obliczania wagi krawędzi wydaje się dobrym pomysłem. poza tym ... może możesz dostarczyć funktora kombajnu, który zawsze zwraca wartość false? – fearlesstost
Oczywiście już to zrobiłem. Po prostu nie podoba mi się, że funktor jest wywoływany dwa razy bez powodu. Funktor kombajnu powinien zwrócić wartość odległości, więc co masz na myśli mówiąc o zwracaniu fałszu? – Frank
Czy możesz wywodzić się z 'struct DijkstraVisitorConcept' i przeciążać własną funkcję' void constraints() ', w której możesz całkowicie usunąć sprawdzanie' examine_edge() '. –