Tout le monde la comparant au Problème du voyageur de commerce n'a probablement pas lu votre question attentivement. Dans TSP, l'objectif est de trouver le plus court cycle de visites de tous les sommets (un cycle Hamiltonien) -- il correspond à l'avoir de chaque nœud étiqueté "mustpass'.
Dans votre cas, étant donné que vous avez seulement une douzaine portant la mention "mustpass', et étant donné que 12! est plutôt de petite taille (479001600), vous pouvez simplement essayer de toutes les permutations de la 'mustpass " nœuds", et de regarder le chemin le plus court à partir de "start" à " fin "que les visites de la "mustpass" nœuds " dans l'ordre -- il sera simplement la concaténation des plus courts chemins entre deux nœuds consécutifs dans la liste.
En d'autres termes, tout d'abord trouver la distance la plus courte entre chaque paire de sommets (vous pouvez utiliser l'algorithme de Dijkstra ou autres, mais avec ces petits nombres (100 nœuds), même la plus simple-à-code de Floyd-Warshall algorithme sera exécuté dans le temps). Ensuite, une fois que vous avez cela dans un tableau, essayez toutes les permutations de votre "mustpass " nœuds", et le reste.
Quelque chose comme ceci:
//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
(Bien sûr, ce n'est pas vrai code, et si vous voulez le chemin que vous aurez à garder une trace de la permutation donne la distance la plus courte, et aussi ce que toutes les paires de chemins les plus courts sont, mais vous voyez l'idée).
Il sera exécuté en quelques secondes sur n'importe quel raisonnable de la langue :)
[Si vous avez n nœuds et k 'mustpass " nœuds", son temps d'exécution est O(n3) pour la Floyd-Warshall partie, et O(k!n) pour l'ensemble des permutations de la partie, et 100^3+(12!)(100) est pratiquement arachides, sauf si vous avez vraiment des contraintes restrictives.]