Appendice al seguito, che chiarisce i termini k ( k - 1 ) :
Quindi, se si esaminano i termini nell'espressione, si può immaginare (come analogia) il termine è un'enumerazione di tutte le stringhe binarie contenenti 1 che hanno un 1 in prima posizione. In altre parole, lasciamo che ogni posizione nella stringa binaria rappresenti la scelta se una data delle città del problema si trova nel sottoinsieme esatto che stiamo considerando al momento. Pertanto, per 5 città, 10101 corrisponde al sottoinsieme {1,3,5}. kn( n - 1K)Kn
Pertanto, per calcolare tutti i sottoinsiemi di {1, ..., }, contiamo semplicemente attraverso ogni sottoinsieme binario (ovvero contiamo attraverso stringhe binarie) di dimensione = 2 (ovvero stringhe binarie di dimensione che contengono due 1), quindi size = 3, quindi size = 4, ... quindi size = n. (Notare che la dimensione = 1 sottoinsieme deve contenere solo la prima città, quindi è irrilevante calcolare la sua distanza parziale, poiché la distanza da 1 -> tutte le altre città nel sottoinsieme -> 1 è esattamente 0.)nnn
In ogni sottoinsieme con città, dobbiamo considerare fino a percorsi parziali ottimali per i candidati. In particolare, il percorso ottimale e totale potrebbe concepibilmente attraversare il sottoinsieme dato e finire su una qualsiasi delle città , esclusa la prima città. Quindi, per ciascuno di questi sotto-percorsi candidati, calcoliamo il tour ottimale fino a quel punto come il minimo di uno dei precedenti sotto-percorsi size = più la distanza dalla città terminale per quel sotto-percorso verso il città terminale per l'attuale sotto-percorso candidato. Questo dà a paragoni che dobbiamo fare. La discrepanza tra il mio termine e il terminek - 1 k - 1 k - 1 ( k - 1 ) ( k - 2 ) ( k - 1 ) ( k - 2 ) k ( k - 1 )kk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)il termine nell'analisi collegata è una differenza notazionale (vorrei sommare su un intervallo diverso, data la mia definizione di rispetto a loro). Per lo meno, tuttavia, dovrebbe illustrare la complessità dell'ordine di secondo grado di quel termine.k
È interessante - ho appena finito di codificare questo esatto algoritmo in C ++ pochi minuti fa. (Quindi perdona la tangente della pura teoria in una piccola discussione pratica. :))
Costa tempo e spazio - almeno sotto la mia implementazione. In pratica, tuttavia, quando i requisiti di spazio crescono così velocemente, diventano molto più dolorosi dei requisiti di tempo. Ad esempio, sul mio PC (con 4 GB di RAM), posso risolvere istanze con un massimo di 24 città, non più di così, e ho esaurito la memoria.O ( 2 n n )O(2nn2)O(2nn)
Certo, potrei solo essere un cattivo programmatore e potresti essere in grado di fare meglio di me in pratica. :)
Modifica: un po 'più specifici su un dettaglio della tua domanda: il termine deriva dal fatto che devi, nel peggiore dei casi, calcolare la distanza parziale, ottimale dai sottoinsiemi precedenti (ci sono al massimo di essi; nota che è sommato su nell'analisi che hai collegato) a quello corrente. Ciò richiede, sempre nel peggiore dei casi, confronti con sottoinsiemi di dimensione per un totale di .n k n O ( k ) k - 1 O ( k 2 )k(k−1)nknO(k)k−1O(k2)
Inoltre, se la mia spiegazione non fosse abbastanza chiara, ecco alcune belle note di lezione di Vazirani ( PDF ). Scorri verso il basso fino a P. 188 per una discussione su TSP, inclusa un'analisi di Held-Karp.