Mam duży zestaw sieci liniowych i chciałbym znaleźć dwa końce każdej sieci, które są najbardziej od siebie oddalone wzdłuż sieci (na poniższym obrazku byłoby to od D do K). Rozwiązaniem tego problemu dla brutalnej siły jest obliczenie najkrótszej ścieżki w sieci dla każdej pary pochodzenia, ale mam setki sieci z tysiącami końców, więc obliczenie każdej możliwej ścieżki jest dość ciężkie.
Czy istnieje optymalny sposób na obliczenie tego bez użycia brutalnej siły? Czy mogę wykluczyć niektóre punkty na podstawie sprytnych zasad?
EDYCJA: Dodałem ilustrację najdłuższej ścieżki wspomnianej przez @Alex Tereshenkov w celu wyjaśnienia mojego pytania. Czarna ścieżka jest wynikiem algorytmu najdłuższej ścieżki (najdłuższa ścieżka bez powtarzania wierzchołków). W moim przypadku wyobraź sobie, że wchodzisz do sieci z dowolnej litery i musisz jechać do innej litery tak szybko, jak to możliwe. Które dwie litery są najtrudniejsze do połączenia?
Odpowiedzi:
Myślę, że możesz szukać średnicy wykresu swojej sieci. Istnieje kilka pytań dotyczących stackexchange, które wspominają ten temat, np .:
Większość algorytmów sugeruje najpierw obliczenie „wszystkich par najkrótszych ścieżek” i wybranie najdłuższej z nich, ale znalazłem post na blogu autorstwa Koushika Narayanana, który sugeruje alternatywne podejście, które może być bardziej optymalne (nie sprawdziłem), które iteruje po każdym wierzchołku i znajduje najodleglejszą parę:
źródło
Według strony Wikipedii Problem najdłuższej ścieżki , ten problem
Jeśli pracujesz z (lub możesz przedstawić swój wykres jako DAG ),
networkx
pakiet Python pozwoli ci go obliczyć. Poszukaj funkcjidag_longest_path
.Jeśli czegoś mi nie brakuje, musisz obliczyć długość między węzłami wykresu i posortować je, co niestety będzie działało tylko w czasie liniowym , czyli nie ma na to wydajnego algorytmu.
źródło