Dobrze zdaję sobie sprawę z rozwiązania DP dla problemu komiwojażera; znany również jako algorytm wstrzymany i Karp dla TSP.Podróżujący sprzedawca z algorytmem wstrzymującym i karpowym
I wprowadziły go maskę bitową, i to jest coś takiego:
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.
}
Algorytm ten jest bardzo szybki; obliczenie 15 miast jest stosunkowo szybkie. Zauważam jednak, że można go jeszcze poprawić, aby pomieścić około 20 miast.
1) Jeśli macierz dystansowa jest symetryczna, być może będziemy mogli wykorzystać tę właściwość, aby zapobiec powtarzającym się obliczeniom. (np. a-> b-> c-> d-> a == a-> d-> c-> b-> a)
2) Używanie górnej i dolnej granicy do przycinania. Powyższy algorytm jest w stanie uzyskać pierwsze możliwe optymalne rozwiązanie w bardzo krótkim czasie, może być w stanie go użyć.
Próbowałem poprawić algorytm w oparciu o wyżej wymienione dwie zasady. Jednak nie mam lepszego algorytmu.
Czy podejmuję daremne próby udoskonalenia czegoś niemożliwego? Co myślisz?
Myślę, że to może być lepsze pytanie dla cs.stackexchange.com. SE koncentruje się na problemach z programowaniem, które wydaje się być w porządku. – chrylis
Benchmark z większą liczbą miast ([kilka zestawów danych z ponad 1000 miastami] (http://www.math.uwaterloo.ca/tsp/world/countries.html)) w celu usunięcia wąskich gardeł podczas skalowania. –