Jalur tidak berpotongan terpendek untuk grafik yang tertanam di bidang euclidean (2D)

14

Algoritme apa yang akan Anda gunakan untuk menemukan jalur terpendek dari grafik, yang tertanam dalam bidang euclidean, sehingga jalur tersebut tidak boleh mengandung persimpangan-sendiri (dalam penyematan)?

Misalnya, dalam grafik di bawah ini, Anda ingin beralih dari . Biasanya, algoritma seperti algoritma Dijkstra akan menghasilkan urutan seperti:(0,0)(-3,2)

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

Grafik lengkap:

masukkan deskripsi gambar di sini

Jalur terpendek:

masukkan deskripsi gambar di sini

Jalur non-berpotongan terpendek:

masukkan deskripsi gambar di sini

Namun, jalur ini memotong dirinya pada bidang euclidean, oleh karena itu saya ingin algoritma yang akan memberi saya urutan non-berpotongan terpendek, dalam hal ini:

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

Jalur ini lebih panjang dari jalur terpendek, tetapi merupakan jalur non-berpotongan terpendek.

Apakah ada algoritma (efisien) yang dapat melakukan ini?

Sumber TikZ

Realz Slaw
sumber
2
Masalah bagus! (+1). Bisakah Anda mengatakan sesuatu tentang aplikasi atau konteks di mana masalah ini muncul? Saya tertarik. (PS Pada catatan terpisah: Jalan keluar yang jelas dari teka-teki ini adalah untuk melihat apakah Anda dapat memperkenalkan titik baru untuk setiap titik persimpangan, yaitu, setiap titik di mana satu sisi dapat memotong sisi lain. Namun saya menyadari bahwa untuk beberapa / banyak aplikasi ini mungkin tidak mungkin.)
DW
2
@DW, ini saya merumuskan kembali masalah keledai / kuda poni yang dibakar Babibu ; aplikasi ini adalah algoritma heuristik Euclidean TSP-nya, saya tidak yakin bagaimana dia bermaksud menggunakannya, tapi saya membayangkan dia ingin tahu apakah dia dapat menemukan jalur antara dua titik, ketika dia sudah mengunjungi beberapa titik lainnya (tur optimal Euclidean TSP akan tidak berpotongan). Dan ya, jika Anda bisa memperkenalkan node baru, itu akan bagus, tetapi pertanyaannya adalah jika Anda tidak bisa (dan Anda tidak bisa memperkenalkan kota baru untuk TSP Euclidean).
Realz Slaw
1
Biarkan saya mencoba untuk mengubah masalah keberadaan jalur ke 3SAT. Membuat jalan untuk melewati dua sinyal tanpa melewati dua jalur tampaknya merupakan tantangan terbesar.
John Dvorak
1
Ya. Saya bermaksud memecahkan SAT melalui ini.
John Dvorak
2
n

Jawaban:

11

Ini NP-complete untuk bahkan memutuskan apakah ada jalur.

Jelas dimungkinkan untuk memverifikasi setiap jalur yang diberikan adalah jalur yang valid dalam grafik yang diberikan. Jadi masalah panjang-terikat adalah dalam NP, dan begitu juga subsetnya, masalah any-path.

Sekarang, untuk membuktikan NP-hardness dari masalah any-path (dan dengan demikian dari masalah panjang-terikat), mari kita kurangi SAT-CNF untuk masalah ini:


Struktur global adalah kisi-kisi potongan kawat yang disatukan oleh kolom potongan klausa. Rumus logika memuaskan jika ada jalur non-berpotongan melalui grafik.

Tidak mungkin untuk melewati dua bagian dari jalan, tetapi perlu untuk melewati dua kabel logika. Alih-alih, alur jalur diberikan secara ketat: titik kawat diberikan oleh dua simpul. Urutan titik kawat yang dilalui jalur dipaksa oleh reduksi. Logika diwakili oleh simpul mana yang dipilih. Setiap jalur dapat dipilih selama melewati semua titik kawat.

Dalam diagram ini, jalan diwakili oleh kurva merah dan aliran logika diwakili oleh kabel hitam:

grid kabel di sebelah kiri, kolom potongan klausa di sebelah kanan.

Sekarang mari kita membangun setiap komponen.


Pengkabelan menggunakan tiga ubin: persimpangan, titik cabang, dan kabel vertikal. Mari kita mulai dengan yang paling sulit:

Ide dasar di balik persimpangan adalah untuk menyiapkan jalur untuk setiap pasangan titik kawat dan menekuk jalur yang mungkin sehingga semua pasangan kecuali mereka yang menyandikan logika yang sama (jalur yang kompatibel) saling bersilangan. Tentu saja kita tidak bisa hanya mengatakan dua tepi paralel berpotongan, tetapi kita dapat memperkenalkan node pesanan-2 tambahan untuk membuat dua jalur berpotongan.

Seandainya jalur datang dari utara ke barat dan dari selatan ke timur, kita dapat: mengumpulkan setiap jalur dari utara dengan jalurnya yang kompatibel dari timur pada sebuah garis (beberapa jalur yang tidak kompatibel akan saling bersilangan); silangkan setiap pasangan dengan satu sama lain dengan membalik urutan pasangan; mendistribusikan jalur ke titik akhir selatan dan barat. Ini paling baik dijelaskan dengan diagram. Di sini, setiap pasangan node mewakili titik kawat. Jalur dengan kode warna yang sama (membawa logika yang sama) tidak berpotongan, jalur yang kode warna berbeda lakukan:

penggambaran grafis di atas

Titik cabang dan kabel vertikal bekerja sama, tetapi ada lebih sedikit jalur untuk dikorelasikan:

dua pasang jalur sudah cukup di sini.  Kawat pada dasarnya adalah titik cabang dengan cabang hancur

¬SEBUAH¬B

masukkan deskripsi gambar di sini

Dimungkinkan untuk menggeneralisasi reduksi ini untuk menyandikan pohon gerbang AND dan OR yang sewenang-wenang dengan cara mencabangkan kabel pembacaan dengan cara yang berbeda. Secara khusus, SAT-CNF dan SAT-DNF keduanya mungkin untuk mengurangi masalah jalur non-berpotongan dengan cara yang dijelaskan di atas.

John Dvorak
sumber
Wow, pria baik-baik saja. Saya belum memeriksanya, tapi pekerjaan yang Anda lakukan luar biasa.
Realz Slaw
OK, saya hanya ingin meringkas pemahaman saya: menggunakan gadget pertama, seseorang dapat melewati dua pasangan jalur-literal dan mempertahankan jalur yang digunakan. Oleh karena itu, kita tidak perlu khawatir tentang planaritas untuk meletakkan jalan (seperti gadget xor di PlanarCircuitSat lakukan untuk sirkuit). Kemudian menggunakan gadget terakhir, orang dapat membuat klausa logis sewenang-wenang (tidak perlu lagi khawatir tentang planaritas). Apakah ini benar?
Realz Slaw
Ini tampaknya benar tetapi Anda harus memastikan dua hal untuk tata letak umum: Bahwa Anda dapat memberi daya semua gadget dengan jalur NIP (ini harus selalu dimungkinkan - jika jalur menjadi macet di tengah, Anda dapat memperkenalkan kawat-gadget ke menyatukan ujung-ujung jalan bersama-sama) dan bahwa semua jalur di kawat baca saling bersilangan sedemikian rupa sehingga tidak mungkin untuk membalikkan dalam kawat (menurut saya itu dijamin jika tidak ada klausa yang benar ( tidak melintasi literal apa pun) dan jika semua klausa berada di luar sirkuit (pada wajah yang sama awal dan akhir adalah)).
John Dvorak
memastikan bahwa semua jalur dalam kabel pembacaan saling berseberangan adalah mudah - jika Anda ingin memastikan, cukup percabangkan n jalur, maka segera lintas semuanya. Saya pikir ini tidak pernah diperlukan.
John Dvorak
1
Saya menggunakan OpenOffice Draw untuk struktur global, dan [yEd] (www.yworks.com/products/yed) untuk sisanya. Haruskah saya mengeditnya di dalam (dengan <sub>)?
John Dvorak
-1

masalahnya tampaknya berasal dari Turan 1944. ini tampak seperti survei teori dan algoritma yang bagus, Crossing Number of Graphs: Theory and Computation by Mutzel. wikipedia memiliki beberapa info dengan jumlah grafik yang banyak

vzn
sumber
1
Mungkin ini lebih baik sebagai komentar?
Juho
secara ilmiah menjawab pertanyaan dasar "algoritma apa yang akan Anda gunakan"
vzn
1
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
John Dvorak
jan mengutip referensi dari stackexchange meta. sementara itu ide yang valid, peran kutipan dalam sains / matematika berbeda dari situs tips pemrograman .... [memang wasit tidak tersedia untuk saya saat ini untuk jawaban yang lebih rinci] .. pokoknya sangat mungkin sesuatu seperti konstruksi jans, walaupun bermanfaat / berharga, sudah ada dalam literatur dan sains, bagian dari proses standar / praktik terbaik untuk [berupaya] menemukannya ...
vzn