2011-01-24 18 views
5

Ho una serie di coordinate grafiche e ho bisogno di trovare il percorso unidirezionale più breve attraverso tutte. Non ho un inizio/fine predeterminato, ma ogni punto deve essere toccato una sola volta e NON è necessario ritornare all'origine ottimale.Percorso più corto a una via attraverso più nodi

Ho provato un paio di approcci TSP, ma sembrano tutti basati sul ritorno all'origine alla fine che dà risultati terribilmente inefficienti in questo caso.

Esempio

1, 13
3, 0
3, 7
2, 21
2, 11
3, 12
1, 19
3, 6

risolverebbe a

3, 0
3, 6
3, 7
3, 12
2, 11
1, 13
1, 19
2, 21

Note:

Sì ho provato la ricerca funzione, c'è una domanda sostanzialmente identica Algorithm: shortest path between all points tuttavia l'unica vera risposta è un TSP, che ancora una volta, circuito chiuso è inefficiente per questo.

Non ha bisogno di essere accurato al 100%, ho già un metodo di permutazioni, ma il suo troppo lento, ho bisogno di gestire almeno ~ 25-30 punti, stabilendosi con una buona approssimazione funziona per me

Grazie in anticipo.

Modifica per chiarire, TSP tende a risolvere come in img # 1, il mio risultato desiderato è img # 2
img 3 è il campione sopra risolto tramite un TSP e img # 4 è desiderato (x coordinate spostato indietro - .5 per visibilità)
enter image description here enter image description here enter image description here enter image description here
Coppia più buona misura # 1 = TSP, # 2 = desiderata,
enter image description here enter image description here
Fondamentalmente voglio più breve collegamento in catena di punti, utilizzando il punto di inizio e di fine più efficiente

+0

Com'è collegato a PHP? Hai codice da mostrare, ad es. strutture che rappresentano nodi e grafici? – rik

+0

Beh, immagino che non sia direttamente correlato al php se non a una soluzione php come quella che mi piacerebbe terminare (supponendo che php possa gestire l'elaborazione in un tempo ragionevole), ma un algoritmo o qualche commento decente il codice in una lingua principale (C++, java, ruby, ecc.) sarebbe sufficiente –

+0

Il pattern nella grafica dice che non si desidera il percorso _changing directions_. Che ne dici di aumentare i costi dei collegamenti con (x2, y2) <(x1, y1)? Sarebbe bias algoritmi TSP standard verso soluzioni che iniziano vicino a sinistra in alto, e finiscono vicino in basso a destra. – Apalala

risposta

3

Questa è un'istanza di all-pairs shortest path problem con tutti i bordi con peso = 1. Troverai soluzioni comuni come l'algoritmo Dijkstra o A-star nella pagina collegata.
Un approccio ingenuo è quello di iterare sui nodi e trovare il percorso più breve per ogni altro nodo.

$paths = array(); 
foreach ($nodes as $start) { 
    foreach ($nodes as $end) { 
     if ($start !== $end) { 
      $path[$start][$end] = findShortestPath($graph, $start, $end); 
     } 
    } 
} 

In un approccio più sofisticato findShortestPath avrebbero ricordato sottotracciati di piste precedenti (o utilizzare $paths a tal fine) per ottenere prestazioni migliori.

+2

Sono abbastanza sicuro che i percorsi più brevi di tutte le coppie non funzioneranno; che ti dà la distanza a tutto ciò che è nel grafico ma non ti dirà in quale ordine visitarli per minimizzare il costo del viaggio. – templatetypedef

+0

@templatetypedef: "Il problema del percorso più breve di tutte le coppie, in cui dobbiamo trovare i percorsi più brevi tra ogni coppia di vertici v, v 'nel grafico" (da Wikipedia) fornisce i _paths_ non solo le loro lunghezze. – rik

+0

@ rik- corretto, ma non penso che sia la domanda che viene posta. Anche se disponi dei percorsi più brevi tra tutti i punti, in quale ordine devi visitare i punti in modo che vengano visitati una volta sola e il costo totale del percorso sia ridotto al minimo? Non vedo come ottenere tali informazioni dalla risposta APSP. – templatetypedef

3

Dato che non ti interessa trovare un circuito chiuso, tutto ciò che ti serve è un singolo percorso: puoi apportare una piccola modifica ai punti che devi evitare il costo di un circuito chiuso. Per fare ciò, aggiungi un nuovo punto, chiamalo v, che definisci essere alla distanza 0 da tutti gli altri punti. Ora, trova una soluzione TSP per questo grafico. Ad un certo punto, entrerai e poi uscirai v. Se esegui il ciclo e poi rimuovi i bordi dentro e fuori da v da esso, avrai un percorso che visita ogni nodo esattamente una volta senza cicli.

Questo richiede ancora di risolvere o approssimare TSP, ma elimina l'enorme sovraccarico di ritorno al punto di partenza.

+0

hmm che ha un senso, darò un passaggio al mattino, ~ 4:00 qui haha. –

0

ci sono molti algoritmi che cercano il percorso chiuso più corto in un grafico. Penso che non sia troppo difficile adattare uno degli algoritmi che risolvono quel problema (a.k.a come travelling salesman problem) ai tuoi bisogni (il percorso dovrebbe essere un modo hamiltoniano non un ciclo hamiltoniano). Alcune delle soluzioni ben note per il problema del venditore sono l'algoritmo di Dijkstra e l'algoritmo di Prim.

+0

dijkstra's e prim fanno alberi, non sentieri, giusto? – Jayen

Problemi correlati