2009-10-02 49 views
8

Problema: ho una vasta collezione di punti. Ciascuno di questi punti ha una lista con riferimenti ad altri punti con la distanza tra loro già calcolata e memorizzata. Devo determinare il percorso più breve che inizia da un'origine e passa attraverso un numero specifico di punti verso qualsiasi destinazione.Ottimizzazione dell'algoritmo: percorso più breve tra più punti

Es: Sono in vacanza e resto in una città specifica. Sto facendo un viaggio di ONE WAY per vedere QUALSIASI quattro città e voglio viaggiare la minima distanza possibile. Non posso visitare la stessa città più di una volta.

Soluzione corrente: In questo momento sto solo iterando su ogni possibilità manualmente e memorizzando il percorso più breve. Funziona ma sembra inefficiente. Inoltre, questo problema verrà espanso per includere la ricerca da più punti di origine a più punti di destinazione, quindi penso che potrebbe esplodere lo spazio di ricerca.

Qual è il modo migliore per cercare il percorso più breve?

+0

È un grafico direzionale o bidirezionale? Non posso dirlo –

+2

Alcune delle risposte qui (TSP, Floyd-Warshall, Breadth-First, Branch e Bound) derivano da interpretazioni incoerenti e contraddittorie di questa domanda, quindi sono propenso a pensare che la domanda qui non sia formulata molto bene . – Juliet

+0

Lasciatemi brevemente riformulare: un esempio è che sto facendo una vacanza e sto in una città. Voglio vedere QUALSIASI QUATTRO città partendo dalla mia e voglio viaggiare la minima distanza possibile. Non posso visitare la stessa città più di una volta. –

risposta

7

Rispondendo al post aggiornato, la soluzione di controllo di ogni possibilità è ottimale (almeno, nessuno ha scoperto algoritmi migliori finora). Sì, è un venditore ambulante, la cui essenza non tocca tutte le città, ma tocca ogni città una volta. Se non si desidera cercare la migliore soluzione possibile, potrebbe essere utile utilizzare l'euristica che funziona più rapidamente, ma consentire una discrepanza limitata dalla soluzione ideale.


Per answerers futuri: Floyd-Warshall algorithm e tutto Floyd-come variazioni sono inapplicabili qui.

+5

Fun fact: O (N^5)> O (N!) fino a N = 8 :) – Juliet

+0

Grazie. L'ho ottimizzato un po 'trovando la soluzione immediata di trovare i percorsi individuali più corti fino in fondo, poi salire di un livello e cercare, quindi salire di un altro livello (ecc.) Immagino che sia una prima ricerca approfondita? –

+0

Questo può essere chiamato depth-first * traversal *, non a * search *.* Cerca * mira a visitare ogni * nodo *, mentre il tuo algoritmo punta a visitare ogni * percorso * ed è quindi più costoso. –

0

Questo suona come un commesso viaggiatore? Una soluzione è utilizzare una tecnica di ottimizzazione come un algoritmo evolutivo. Attualmente stai facendo una ricerca esaustiva, che diventerà molto lenta molto rapidamente. Ma penso che questo sia più o meno un problema di commesso viaggiatore e sia stato affrontato per diversi decenni se non secoli, e quindi ci sono diverse possibili vie di attacco. Google è tuo amico.

+1

non è TSP visto che puoi passare nello stesso punto più di una volta. –

+0

Pensavo che il TSP fosse coinvolto sapendo ogni punto che doveva essere toccato? Nel mio caso non ci sono punti specifici che devono essere inclusi, solo tutti i punti che seguono il percorso più breve da un'origine: –

+1

@Shay: ci sono molti gusti di TSP, compresi quelli che consentono a un utente di visitare lo stesso vertice più volte – Juliet

2

In generale si dovrebbe le severe varianti cattive ... Credo che si dovrebbe usare alcune varianti del metodo Branch_and_bound http://en.wikipedia.org/wiki/Branch_and_bound

+0

++ Sì. Questo è un problema di ottimizzazione della ricerca ad albero, quindi si applica il branch-and-bound: può essere fatto sia in ampiezza che in profondità. –

2

In entrambi i bredth prima ricerca come norheim.se detto o Dijkstra's algorithm sarebbe il mio suggerimento pure.

-1

Sembra che i bordi del grafico siano bidirezionali. In questo caso, l'algoritmo che stai cercando è Dijkstra's algorithm.

0

Forse questo è ciò che il manifesto originale intende "iterando attraverso ogni possibilità manualmente e memorizzando il percorso più breve", ma ho pensato che mi piacerebbe rendere esplicita quella che sembra essere una soluzione di base.

Supponiamo che tu abbia già un algoritmo a due punti di percorso più breve - questo ha soluzioni classiche per vari tipi di grafici. Si supponga che tutte le distanze siano non negative e d (A-> B-> C) = d (A-> B) + d (B-> C).

Gli elementi essenziali sono che il percorso inizia S passa attraverso una delle città intermedie "ABCD" e termina con E:

esempio SabcdE, SacbdE, ecc ...

Con solo 4 città intermedie, si elencano tutte e 24 le permutazioni. Per ogni permutazione usa il tuo algoritmo a due punti più breve per calcolare il percorso dalla testa alla coda e la sua distanza totale.

Quindi, dato il punto di partenza e di arrivo, ci sono 12 possibilità di collegamento a una di abcd e per ogni due possibilità per l'interno. Hai già calcolato queste distanze, quindi aggiungi la distanza da S alla testa e la coda a E. Scegli il minimo. Quindi, una volta che hai precalcolato le distanze intermedie per un insieme fisso di città interne, devi fare 12 problemi con il percorso più breve in due punti per ogni coppia di punti iniziali e finali.

Questo ovviamente peggiora scarsamente con il numero crescente di città intermedie. Non è chiaro per me che potrebbe fare meglio a meno che non impongano maggiori restrizioni sulla struttura del grafico (è questo in uno spazio fisico di Euclidenan? Disuguaglianza del triangolo?).

Il mio esempio di riflessione: supponiamo che tutte le distanze intermedie tra le città siano O (1). Senza alcuna restrizione sul grafico, la distanza da S a qualsiasi città intermedia potrebbe essere 1000 tranne che per uno è 1. Lo stesso per la coda. Quindi puoi costringere la prima città a essere visitata per essere qualsiasi cosa. Ora, abbassa uno strato, prendi la prima città come "punto di partenza". Applica lo stesso argomento: puoi fare in modo che il percorso migliore vada in una delle seguenti città manipolando le distanze nel grafico.

Quindi sembra che la complessità non possa essere aiutata senza ulteriori presupposti.

1

Questa è la situazione molto comune e in tempo reale in cui ognuno può rientrare. L'interfaccia utente di Google Map fornisce il percorso nello stesso ordine, si aggiunge all'elenco di destinazione. non ti dà il percorso ottimale anche se la loro API di Google Maps fornisce la soluzione.

L'API di Google Maps fornisce la soluzione per questo. Nella richiesta di scoprire il percorso devi fornire il flag 'optimizeWaypoints: true'. La richiesta sembrerà così.

var request = { 
      origin: start, 
      destination: end, 
      waypoints: waypts, 
      optimizeWaypoints: true, 
      travelMode: google.maps.TravelMode.DRIVING 
     }; 

e si può vedere tutto il codice del programma di utilità nella sorgente di visualizzazione come completa utility è sviluppato in JavaScript e HTML.

Spero che possa essere d'aiuto.

+0

Il tuo sito web non è disponibile, così come il link – sam

Problemi correlati