Усі інші, які порівнюють це із проблемою «Подорожній продавець», ймовірно, не уважно прочитали ваше запитання. У TSP метою є знайти найкоротший цикл, який відвідує всі вершини (гамільтонівський цикл) - це відповідає наявності кожного вузла з позначкою "mustpass".
У вашому випадку, враховуючи, що у вас є лише близько десятка позначених як "mustpass", а зважаючи на те, що 12! досить невеликий (479001600), ви можете просто спробувати всі перестановки лише вузлів 'mustpass' і подивитися на найкоротший шлях від 'початку' до 'кінця', який відвідує вузли 'mustpass' у такому порядку - це просто бути об’єднанням найкоротших шляхів між кожними двома послідовними вузлами в цьому списку.
Іншими словами, спочатку знайдіть найкоротшу відстань між кожною парою вершин (ви можете використовувати алгоритм Дейкстри або інші, але з цими малими числами (100 вузлів) навіть найпростіший в коді алгоритм Флойда-Варшалла буде працювати вчасно). Потім, як тільки ви отримаєте це в таблиці, спробуйте всі перестановки ваших вузлів 'mustpass', а решта.
Щось на зразок цього:
//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
(Звичайно, це не справжній код, і якщо ви хочете дійсний шлях, вам доведеться відстежувати, яка перестановка дає найменшу відстань, а також те, які є всі пари найкоротшими шляхами, але ви розумієте.)
Він працюватиме щонайбільше за кілька секунд на будь-якій розумній мові :)
[Якщо у вас n вузлів і k 'mustpass' вузлів, час його роботи становить O (n 3 ) для частини Флойда-Варшалла та O (k! N ) для всієї частини перестановок, і 100 ^ 3 + (12!) (100) - це практично арахіс, якщо у вас немає дійсно обмежувальних обмежень.]