これを巡回セールスマン問題と比較している人は、おそらくあなたの質問を注意深く読んでいないでしょう。TSP の目的は、すべての頂点を訪れる最短のサイクル(ハミルトン サイクル)を見つけることです。これは、すべてのノードに「mustpass」というラベルを付けることに対応します。
あなたの場合、「必須」とラベル付けされたのは約 12 個だけで、その 12 個を考えると! かなり小さい (479001600) 場合は、単に「mustpass」ノードのみのすべての順列を試して、「mustpass」ノードをその順序で訪問する「start」から「end」までの最短パスを調べることができます。そのリスト内のすべての 2 つの連続するノード間の最短パスの連結になります。
つまり、最初に頂点の各ペア間の最短距離を見つけます (ダイクストラのアルゴリズムなどを使用できますが、これらの小さな数 (100 ノード) では、コード化が最も簡単なFloyd-Warshall アルゴリズムでも時間内に実行されます)。次に、これを表にまとめたら、「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」ノードがある場合、その実行時間はFloyd-Warshall 部分のO(n 3 ) であり、O(k!n ) すべての順列部分の場合、100^3+(12!)(100) は、本当に制限的な制約がない限り、実際にはピーナッツです。]