Sono ben consapevole della soluzione DP per il problema del commesso viaggiatore; noto anche come algoritmo Held e Karp per TSP.Commesso viaggiatore con Algoritmo Held e Karp
ho implementato con maschera di bit, ed è qualcosa di simile:
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.
}
Questo algoritmo è abbastanza veloce; il calcolo di 15 città è abbastanza veloce. Tuttavia, noto che potrebbe essere ulteriormente migliorato per ospitare circa 20 città.
1) Se la matrice dist è simmetrica, forse possiamo fare uso di questa proprietà per evitare calcoli ripetuti. (ad esempio a-> b-> c-> d-> a == a-> d-> c-> b-> a)
2) Utilizzare entrambi i limiti superiore e inferiore per potare. L'algoritmo di cui sopra è in grado di ottenere la sua prima soluzione ottimale possibile in un tempo molto breve, potrebbe essere in grado di usarlo.
Ho provato a migliorare l'algoritmo in base ai due principi sopra menzionati. Tuttavia, non ho un algoritmo migliore.
Sto tentando inutilmente di migliorare qualcosa di impossibile? Cosa ne pensi?
Penso che questa potrebbe essere una domanda migliore per cs.stackexchange.com. SE è focalizzato sui problemi con la programmazione, che sembra che stia andando bene. – chrylis
Benchmark con più città (qui sono disponibili [più serie di dati con più di 1000 città] (http://www.math.uwaterloo.ca/tsp/world/countries.html)) per eliminare i colli di bottiglia durante il ridimensionamento. –