Percorso più breve non intersecante per un grafico incorporato in un piano euclideo (2D)


14

Quale algoritmo useresti per trovare il percorso più breve di un grafico, che è incorporato in un piano euclideo, in modo tale che il percorso non dovrebbe contenere autointersezioni (nell'incorporamento)?

Ad esempio, nel grafico seguente, si desidera passare da . Normalmente, un algoritmo come l'algoritmo di Dijkstra produrrebbe una sequenza come:(0,0)(-3,2)

[(0,0)3(0,3)2(1,2)4(-3,2)]=7+2.

Grafico completo:

inserisci qui la descrizione dell'immagine

Percorso più breve:

inserisci qui la descrizione dell'immagine

Percorso più breve non intersecante:

inserisci qui la descrizione dell'immagine

Tuttavia, questo percorso si interseca sul piano euclideo, quindi voglio un algoritmo che mi dia la sequenza non intersecante più breve, in questo caso:

[(0,0)3(0,3)3(0,6)5(-3,2)]=11.

Questo percorso è più lungo del percorso più breve, ma è il percorso più breve non intersecante.

Esiste un algoritmo (efficiente) che può fare questo?

Fonti TikZ


2
Bel problema! (+1). Puoi dire qualcosa sull'applicazione o sul contesto in cui si presenta questo problema? Sono incuriosito. (PS su una nota separata: la via ovvia per uscire da questo enigma è vedere se è possibile introdurre un nuovo vertice per ogni punto di intersezione, cioè ogni punto in cui un bordo può intersecare un altro bordo. Tuttavia mi rendo conto che per alcune / molte applicazioni questo potrebbe non essere possibile.)
DW

2
@DW, sono io a riformulare il problema dell'asino / pony in fiamme di Babibu ; l'applicazione è il suo algoritmo euristico TSP euclideo, non sono esattamente sicuro di come intende usarlo, ma immagino che voglia sapere se riesce a trovare un percorso tra due punti, quando ne ha già visitati molti altri (il tour ottimale di Euclidean TSP lo farà essere non intersecanti). E sì, se puoi introdurre nuovi nodi, sarebbe fantastico, ma la domanda è se non puoi (e spesso non puoi introdurre nuove città per il TSP euclideo).
Realz Slaw,

1
Vorrei provare a convertire il problema dell'esistenza del percorso in 3SAT. Fare un modo per incrociare due segnali senza attraversare due percorsi sembra la sfida più grande.
John Dvorak,

1
Sì. Intendevo risolvere SAT attraverso questo.
John Dvorak,

2
n

Risposte:


11

È NP-completo anche decidere se esiste un percorso.

È chiaramente possibile verificare che un determinato percorso sia un percorso valido nel grafico dato. Quindi il problema della lunghezza limitata è in NP, così come il suo sottoinsieme, il problema di qualunque percorso.

Ora, per dimostrare la durezza NP del problema di qualunque percorso (e quindi del problema della lunghezza limitata), riduciamo il SAT-CNF a questo problema:


La struttura globale è una griglia di pezzi di filo collegati da una colonna di pezzi di clausola. La formula logica è soddisfacente se esiste un percorso non intersecante attraverso il grafico.

È impossibile attraversare due tratti del percorso, ma è necessario incrociare due fili logici. Piuttosto, il flusso del percorso è dato rigorosamente: un punto filo è dato da due nodi. La sequenza dei punti del filo attraverso cui passa il percorso è forzata dalla riduzione. La logica è rappresentata dal nodo scelto. È possibile scegliere qualsiasi percorso purché attraversi tutti i punti del filo.

In questo diagramma, il percorso è rappresentato dalla curva rossa e il flusso logico è rappresentato dai fili neri:

griglia di fili a sinistra, colonna di pezzi di clausola a destra.

Ora costruiamo ogni componente.


Il cablaggio utilizza tre tessere: l'incrocio, il punto di diramazione e il filo verticale. Cominciamo con il più difficile:

L'idea di base dietro l'incrocio è preparare un percorso per ogni coppia di punti di filo e piegare abbastanza i possibili percorsi in modo che tutte le coppie tranne quelle che codificano la stessa logica (percorsi compatibili) si incrociano. Naturalmente non possiamo semplicemente dire che due bordi paralleli si intersecano, ma possiamo introdurre nodi di ordine 2 aggiuntivi per far intersecare due percorsi.

Supponendo che i percorsi provengano da nord a ovest e da sud a est, possiamo: raccogliere ogni percorso da nord con il suo percorso compatibile da est su una linea (alcuni percorsi incompatibili si incrociano); incrociare ciascuna coppia tra loro invertendo l'ordine delle coppie; distribuire i percorsi ai loro punti finali sud e ovest. Questo è meglio spiegato da un diagramma. Qui, ogni coppia di nodi rappresenta un punto filo. I percorsi con lo stesso codice colore (con la stessa logica) non si intersecano, i percorsi con un codice colore diverso fanno:

rappresentazione grafica di quanto sopra

Il punto di diramazione e il filo verticale funzionano allo stesso modo, ma ci sono meno percorsi per correlare:

qui sono sufficienti due coppie di percorsi.  Il filo è essenzialmente un punto di diramazione con il ramo distrutto

¬UN¬B

inserisci qui la descrizione dell'immagine

È possibile generalizzare questa riduzione per codificare un albero arbitrario di porte AND e OR ramificando il filo di lettura in modo diverso. In particolare, SAT-CNF e SAT-DNF sono entrambi possibili per ridurre al problema del percorso non intersecante nel modo sopra descritto.


Caspita, uomo ben fatto. Non l'ho ancora recensito, ma il lavoro che hai inserito è fantastico.
Realz Slaw,

OK, voglio solo riassumere la mia comprensione: usando il primo gadget, si possono incrociare due coppie di percorsi letterali e mantenere i percorsi utilizzati. Pertanto, non ci si deve preoccupare della planarità per definire i percorsi (come fa il gadget xor in PlanarCircuitSat per i circuiti). Quindi, utilizzando il gadget finale, è possibile creare clausole logiche arbitrarie (non doversi più preoccupare della planarità). È corretto?
Realz Slaw,

Questo sembra corretto ma devi garantire due cose per un layout generale: Che tu sia in grado di alimentare tutti i gadget con un percorso NIP (questo dovrebbe essere sempre possibile - se un percorso si blocca al centro, puoi introdurre wire-gadget a riunire le estremità solitarie del percorso) e che tutti i percorsi nel filo di lettura si incrociano in modo tale che non sia possibile invertire il filo all'interno del filo (mi sembra che sia garantito se non ci sono clausole vere ( non attraversare alcun valore letterale) e se tutte le clausole si trovano all'esterno del circuito (sulla stessa faccia l'inizio e la fine sono)).
John Dvorak,

assicurarsi che tutti i percorsi nel filo di lettura si incrociano è facile - se vuoi essere sicuro, basta diramare n percorsi, quindi attraversarli tutti immediatamente. Penso che questo non sia mai necessario, tuttavia.
John Dvorak,

1
Ho usato OpenOffice Draw per la struttura globale e [yEd] (www.yworks.com/products/yed) per il resto. Devo modificarlo in (con <sub>)?
John Dvorak,

-1

il problema sembra risalire a Turan nel 1944. sembra un buon sondaggio di teoria e algoritmi, il numero di grafici incrociati: teoria e calcolo di Mutzel. Wikipedia ha alcune informazioni sotto l' incrocio del numero di grafici


1
Forse è meglio come commento?
Juho,

risponde scientificamente alla domanda di base "quale algoritmo
useresti

1
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
John Dvorak,

Jan cita un riferimento dal meta stackexchange. mentre questa è un'idea valida, il ruolo delle citazioni in scienza / matematica è diverso rispetto a un sito di suggerimenti per la programmazione .... [è vero che al momento il riferimento non è disponibile per me per una risposta più dettagliata] .. comunque è del tutto possibile qualcosa come jans construction, sebbene utile / utile, è già nella letteratura e nella scienza, fa parte del processo standard / migliori pratiche per [tentare di] localizzarlo ....
vzn
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.