L'algoritmo di Dijsktra si applicava al problema del commesso viaggiatore


13

Sono un principiante (principiante della teoria della complessità computazionale) e ho una domanda.

Diciamo che abbiamo un 'Problema del commesso viaggiatore', la seguente applicazione degli algoritmi di Dijkstra lo risolverà?

Da un punto iniziale calcoliamo la distanza più breve tra due punti. Andiamo al punto. Eliminiamo il punto di origine. Quindi calcoliamo il prossimo punto di distanza più breve dal punto corrente e così via ...

Ad ogni passo riduciamo il grafico mentre spostiamo il successivo punto di distanza più breve disponibile. Fino a quando visiteremo tutti i punti.

Questo risolverà il problema del commesso viaggiatore.


3
Si noti che TSP è NP completo e l'algoritmo di Dijkstra ha un runtime polinomiale. Quello che proponi sarebbe una soluzione quasi banale di P = NP? domanda, quindi è improbabile che il tuo approccio funzioni. Questo tipo di ragionamento è solo una euristica, mente!
Raffaello

Risposte:


24

L'algoritmo di Dijkstra restituisce un albero di percorso più breve, contenente il percorso più breve da un vertice iniziale all'altro vertice, ma non necessariamente i percorsi più brevi tra gli altri vertici o un percorso più breve che visita tutti i vertici.

Ecco un contro esempio in cui l'algoritmo avido che descrivi non funzionerà:

controesempio

a[a,b,c,d,a]a[a,b,d,c,a]a,b,c,dd,a per tornare alla città di partenza.


8

Come è già emerso nelle altre risposte, il tuo suggerimento non risolve efficacemente il Problema del commesso viaggiatore, permettimi di indicare il modo migliore conosciuto nel campo della ricerca euristica (poiché vedo l'algoritmo di Dijkstra in qualche modo correlato a questo campo dell'intelligenza artificiale) .

(u,v)(v,u)

L'approccio migliore (di cui sono a conoscenza) consiste nell'eseguire un algoritmo di ricerca euristica Depth-First Branch and Bound in cui l'euristica è il costo del Minimum Spanning Tree (MST). Dal momento che l'MST può essere calcolato in tempo polinomiale con l' algoritmo di Prim o l' algoritmo di Kruskal , si può prevedere che restituirà soluzioni in un ragionevole lasso di tempo. Per una meravigliosa discussione di questi due algoritmi, ti consiglio vivamente di dare un'occhiata al Manuale di progettazione dell'algoritmo

In effetti, vorrei evidenziare che da quando è stato suggerito questo approccio non sono stati visti molti progressi nel campo per derivare i limiti ottimali di questo problema, quindi lo considero una domanda calda nel campo della ricerca combinatoria.

Spero che sia di aiuto,


2

Non ho idea di come qualcuno qui non abbia notato che l'applicazione dell'algoritmo di Dijkstra sarebbe del tutto superflua in questo caso? È possibile implementare questo avido algoritmo semplicemente selezionando il nodo più vicino, che è noto apriori. L'algoritmo di Dijkstra viene utilizzato per scoprire percorsi, ma ogni volta fai un solo passo. Questo ovviamente non trova la soluzione ottimale per il TSP, ma molti ottimi approcci non la trovano neanche. Tutti i cercatori di soluzioni ottimali per TSP sono molto esigenti dal punto di vista computazionale.


1

La risposta è no, non è un buon modo per risolvere il problema TSP. Un buon esempio di contatore è dove tutti i punti sono su una linea, come il seguente:

--5 ------------------ 3 ----- 1--0 --- 2 ---------- 4

usando l'algoritmo di Dijsktra, renderebbe il povero venditore a partire dal punto 0, prima vai su 1, poi su 2 e poi su 3 ect. che non è l'ottimale.

Spero possa aiutare. Dai un'occhiata al primo capitolo del libro eccellente di Steven S. Skiena intitolato "The Algorithm Design", che spiega questo esempio in modo più dettagliato.

Il problema TSP non sta trovando la via più breve tra due punti, ma nel fare un percorso tra tutti i punti che sono ottimali. Quando hai il percorso ottimale puoi usare Dijsktra per trovare il percorso più breve tra ogni punto del percorso.


2
Dijkstra è un algoritmo di percorso più breve a sorgente singola, ma non "farebbe" iniziare il venditore da 0, né restituirebbe un percorso. Restituisce semplicemente l'albero del percorso più breve, contenente il percorso più breve per ciascun vertice dal vertice di origine specificato.
Joe,

Tradizionalmente, il problema TSP [ en.wikipedia.org/wiki/… ] è "Dato un elenco di città e le loro distanze a coppie, il compito è quello di trovare il percorso più breve possibile che visita ogni città esattamente una volta e ritorna alla città di origine. " Tecnicamente non è possibile soddisfare tali requisiti su un percorso: non è necessario tornare alla città di partenza o ripetere le città.
Joe,

Tuttavia, su un percorso, se rilassiamo uno di questi vincoli, allora il problema è banale.
Joe,

Naturalmente, Dijkstra non avrebbe fatto iniziare il venditore a 0. Ma l'algoritmo proposto nella domanda originale non specificava un vertice iniziale; pertanto, l'algoritmo proposto potrebbe costringere il venditore povero a partire da 0. Quindi questa risposta è corretta.
JeffE,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.