私は、巡回セールスマンの問題に対する DP ソリューションをよく知っています。TSP の Held and Karp アルゴリズムとも呼ばれます。
ビットマスクで実装しましたが、次のようになります。
int TSP(int pos, int bitmask) {
if (bitmask == (1<<(K+1))-1)
return dist[pos][0]; // Completing the round trip
if (memo[pos][bitmask] != -1)
return memo[pos][bitmask];
int answer = INF;
for (int i = 0; i <= K; i++) {
if (i != pos && (bitmask & (1 << i)) == 0)
answer = Math.min(answer, dist[pos][i] + TSP(i, bitmask | (1 << i)));
}
return memo[pos][bitmask] = answer; // Storing the best dist for the set of traveled cities and untraveled ones.
}
このアルゴリズムは非常に高速です。15 都市の計算は比較的高速です。ただし、約 20 の都市に対応できるようにさらに改善できる可能性があることに気付きました。
1) dist 行列が対称である場合、おそらくこのプロパティを利用して計算の繰り返しを防ぐことができます。(例 a->b->c->d->a == a->d->c->b->a)
2) プルーニングに上限と下限の両方を使用する。上記のアルゴリズムは、非常に短い時間で最初の可能な最適解を得ることができ、それを使用できる可能性があります。
前述の 2 つの原則に基づいて、アルゴリズムの改善を試みました。ただし、より良いアルゴリズムは得られません。
不可能なことを改善しようとして無駄な試みをしているのでしょうか? どう思いますか?