Wszyscy inni porównujący to do Problemu komiwojażera prawdopodobnie nie przeczytali uważnie twojego pytania. W TSP celem jest znalezienie najkrótszego cyklu, który odwiedza wszystkie wierzchołki (cykl Hamiltona) - odpowiada to oznaczeniu każdego węzła jako „mustpass”.
W twoim przypadku, biorąc pod uwagę, że masz tylko kilkanaście oznaczonych jako „mustpass” i biorąc pod uwagę, że 12! jest raczej mały (479001600), możesz po prostu wypróbować wszystkie permutacje tylko węzłów „mustpass” i spojrzeć na najkrótszą ścieżkę od „początku” do „końca”, która odwiedza węzły „mustpass” w tej kolejności - po prostu być konkatenacją najkrótszych ścieżek między każdymi dwoma kolejnymi węzłami na tej liście.
Innymi słowy, najpierw znajdź najkrótszą odległość między każdą parą wierzchołków (możesz użyć algorytmu Dijkstry lub innego, ale przy tych małych liczbach (100 węzłów) nawet najprostszy do zakodowania algorytm Floyda-Warshalla zadziała w czasie). Następnie, gdy już masz to w tabeli, wypróbuj wszystkie permutacje węzłów „mustpass” i resztę.
Coś takiego:
//Precomputation: Find all pairs shortest paths, e.g. using Floyd-Warshall
n = number of nodes
for i=1 to n: for j=1 to n: d[i][j]=INF
for k=1 to n:
for i=1 to n:
for j=1 to n:
d[i][j] = min(d[i][j], d[i][k] + d[k][j])
//That *really* gives the shortest distance between every pair of nodes! :-)
//Now try all permutations
shortest = INF
for each permutation a[1],a[2],...a[k] of the 'mustpass' nodes:
shortest = min(shortest, d['start'][a[1]]+d[a[1]][a[2]]+...+d[a[k]]['end'])
print shortest
(Oczywiście to nie jest prawdziwy kod, a jeśli chcesz rzeczywistą ścieżkę, musisz śledzić, która permutacja daje najkrótszą odległość, a także jakie są najkrótsze ścieżki wszystkich par, ale masz pomysł).
Będzie działać najwyżej przez kilka sekund w dowolnym rozsądnym języku :)
[Jeśli masz n węzłów i k węzłów 'mustpass', jego czas wykonania wynosi O (n 3 ) dla części Floyd-Warshall i O (k! N ) dla wszystkich permutacji, a 100 ^ 3 + (12!) (100) to praktycznie orzeszki ziemne, chyba że masz naprawdę restrykcyjne ograniczenia.]