Alle anderen, die dies mit dem Problem des Handlungsreisenden vergleichen, haben Ihre Frage wahrscheinlich nicht sorgfältig gelesen. In TSP besteht das Ziel darin, den kürzesten Zyklus zu finden, der alle Eckpunkte besucht (ein Hamilton-Zyklus) - dies entspricht der Bezeichnung jedes Knotens mit der Bezeichnung "Mustpass".
In Ihrem Fall, vorausgesetzt, Sie haben nur etwa ein Dutzend mit "Mustpass" beschriftet und 12! ist ziemlich klein (479001600), Sie können einfach alle Permutationen nur der 'Mustpass'-Knoten ausprobieren und den kürzesten Pfad von' Start 'bis' Ende 'betrachten, der die' Mustpass'-Knoten in dieser Reihenfolge besucht - es wird einfach die Verkettung der kürzesten Pfade zwischen jeweils zwei aufeinander folgenden Knoten in dieser Liste sein.
Mit anderen Worten, finden Sie zuerst den kürzesten Abstand zwischen jedem Scheitelpunktpaar (Sie können den Dijkstra-Algorithmus oder andere verwenden, aber mit diesen kleinen Zahlen (100 Knoten) wird selbst der am einfachsten zu codierende Floyd-Warshall-Algorithmus rechtzeitig ausgeführt). Sobald Sie dies in einer Tabelle haben, versuchen Sie alle Permutationen Ihrer 'Mustpass'-Knoten und den Rest.
Etwas wie das:
//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
(Natürlich ist das kein echter Code, und wenn Sie den tatsächlichen Pfad möchten, müssen Sie verfolgen, welche Permutation die kürzeste Entfernung ergibt und welche kürzesten Pfade alle Paare sind, aber Sie haben die Idee.)
Es läuft in jeder vernünftigen Sprache in höchstens ein paar Sekunden :)
[Wenn Sie n Knoten und k 'Mustpass'-Knoten haben, beträgt seine Laufzeit O (n 3 ) für den Floyd-Warshall-Teil und O (k! N. ) für den Teil mit allen Permutationen und 100 ^ 3 + (12!) (100) sind praktisch Erdnüsse, es sei denn, Sie haben einige wirklich restriktive Einschränkungen.]