私は旅行セールスマンの問題に対するDPソリューションを十分に認識しています。 TSPのHeld and Karpアルゴリズムとも呼ばれます。保留と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の都市に適応するように改善されることに気づいた。 distの行列が対称である場合
1)、おそらく我々は繰り返し計算を防ぐために、この性質を利用することができます。 (例えばA-> B-> C-> D-> == A-> D-> C-> B-> A)
2)上部及び整理する下界の両方の使用。上記のアルゴリズムは、非常に短時間で最初の可能な最適解を得ることができ、それを使用できるかもしれません。
私は上記の2つの原則に基づいたアルゴリズムを改善しようとしています。しかし、私はより良いアルゴリズムを得ることはできません。
私は不可能な何かを向上させることで、無益な試みを行っていますか?どう思いますか?
これはcs.stackexchange.comにとってより良い質問かもしれません。 SEはプログラミング上の問題に集中しています。これはうまくやっているようです。 – chrylis
スケールアップするときにボトルネックを洗い流すために、より多くの都市(1000以上の都市を持ついくつかのデータセットがあります)(http://www.math.uwaterloo.ca/tsp/world/countries.html)のベンチマーク。 –