これを巡回セールスマン問題と比較している他の誰もがおそらくあなたの質問を注意深く読んでいません。TSPの目的は、すべての頂点を訪問する最短のサイクル(ハミルトン閉路)を見つけることです。これは、「mustpass」というラベルの付いたすべてのノードを持つことに対応します。
あなたの場合、「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)は、実際に制限的な制約がない限り、実質的にピーナッツです。]