Todos los demás que comparan esto con el problema del vendedor ambulante probablemente no hayan leído su pregunta con atención. En TSP, el objetivo es encontrar el ciclo más corto que visita todos los vértices (un ciclo hamiltoniano); corresponde a tener cada nodo etiquetado como 'mustpass'.
En su caso, dado que solo tiene alrededor de una docena etiquetada como 'mustpass', ¡y dado que 12! es bastante pequeño (479001600), simplemente puede probar todas las permutaciones de solo los nodos 'mustpass', y mirar la ruta más corta desde 'start' a 'end' que visita los nodos 'mustpass' en ese orden; simplemente ser la concatenación de las rutas más cortas entre cada dos nodos consecutivos en esa lista.
En otras palabras, primero encuentre la distancia más corta entre cada par de vértices (puede usar el algoritmo de Dijkstra u otros, pero con esos números pequeños (100 nodos), incluso el algoritmo Floyd-Warshall más simple de codificar se ejecutará a tiempo). Luego, una vez que tenga esto en una tabla, pruebe todas las permutaciones de sus nodos 'mustpass' y el resto.
Algo como esto:
//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
(Por supuesto, ese no es un código real, y si desea la ruta real, tendrá que realizar un seguimiento de qué permutación proporciona la distancia más corta, y también cuáles son las rutas más cortas de todos los pares, pero ya entiende la idea).
Se ejecutará como máximo en unos pocos segundos en cualquier lenguaje razonable :)
[Si tiene n nodos y k nodos 'mustpass', su tiempo de ejecución es O (n 3 ) para la parte Floyd-Warshall, y O (k! N ) para la parte de todas las permutaciones, y 100 ^ 3 + (¡12!) (100) son prácticamente cacahuetes a menos que tenga algunas restricciones realmente restrictivas.]