Algoritma jalur terpendek k-terbaik mana yang harus saya pertimbangkan?


13

Saya sedang memecahkan masalah optimisasi pencarian grafik. Saya perlu menemukan jalur terpendek asiklik k terbaik melalui grafik tertimbang yang diarahkan.

Saya tahu ada sejumlah algoritma k-best yang tepat dan perkiraan, tetapi sebagian besar penelitian baru-baru ini tampaknya berorientasi pada grafik yang sangat besar, terhubung sangat jarang (misalnya, rute dan arah jalan), dan grafik saya tidak.

Aspek yang membedakan masalah saya:

  • Grafik terdiri dari sekitar 160 simpul.

  • Grafik hampir sepenuhnya terhubung (dua arah, jadi ~ 160 ^ 2 ~ = 25k tepi)

  • k akan cukup kecil (mungkin kurang dari 10)

  • Panjang jalur maksimum mungkin akan dibatasi dan sangat kecil juga (mis. 3-5 tepi)

  • Saya mengatakan 'asiklik' di atas, tetapi hanya untuk mengulangi - solusi tidak harus mencakup siklus. Ini bukan masalah untuk jalur terpendek 1-terbaik, tetapi itu menjadi masalah bagi k-best - misalnya, pertimbangkan rute jalan - jalur terpendek kedua dari A ke B mungkin sama dengan yang terbaik 1, dengan perjalanan cepat di sekitar blok di suatu tempat. Itu mungkin secara matematis optimal, tetapi bukan solusi yang sangat berguna. ;-)

  • Kita mungkin perlu menimbang ulang tepi on the the fly untuk setiap perhitungan. Biaya tepi terdiri dari jumlah tertimbang dari beberapa faktor, dan persyaratan akhir (setiap kali kami mendapatkannya) dapat memungkinkan pengguna untuk menentukan prioritas mereka sendiri dari faktor-faktor pembobotan, mengubah bobot tepi. Ini adalah grafik yang relatif kecil (kita harus dapat merepresentasikannya dalam beberapa ratus KB), jadi mungkin masuk akal untuk mengkloning grafik dalam memori, menerapkan pembobotan ulang, dan kemudian menjalankan pencarian pada grafik yang dikloning. Tetapi jika ada metode yang lebih efektif untuk melakukan pencarian sambil menghitung bobot saat berjalan, saya tertarik.

Saya melihat algoritma yang dijelaskan dalam Santos (algoritma jalur terpendek K), Eppstein 1997 (Menemukan k Jalur Terpendek), dan lainnya. Algoritma Yen menarik, terutama karena implementasi Java yang ada . Saya tidak takut membaca makalah penelitian, tetapi saya pikir layak membuang rincian masalah saya dan meminta petunjuk untuk menghemat waktu membaca.

Dan jika Anda memiliki petunjuk implementasi Java, bahkan lebih baik.


+1, karena saya tertarik dengan saran yang dimiliki orang, dan ini sepertinya jenis pertanyaan yang tepat untuk situs ini dibuat.
KChaloux

Bukankah kondisi asiklik Anda berarti bahwa SETIAP jalur lain dari awal hingga tujuan akan menciptakan siklus dengan jalur pertama? Dan jika keduanya mulai dan tujuan berada di jalan buntu, setiap jalur harus menggunakan kedua tepi ini.
user470365

Mungkin saya tidak jelas. Batasan asiklik hanya berlaku untuk satu jalur - secara alami, setiap 2 jalur berbeda dari A ke B akan membentuk siklus.
AaronD

@ Hard: jadi, yang mana yang Anda gunakan pada akhirnya?
dagnelies

@arnaud: Saya tidak yakin saya sudah menentukan algoritma; Saya akan menambahkan pembaruan ke pertanyaan ini ketika ada. Saya menghilangkan Eppstein karena tidak menjamin solusi asiklik (alias 'sederhana'). Saat ini saya sedang bekerja dengan algoritma Yen, tetapi saya belum sampai ke profil rinci atau optimasi, jadi saya mungkin harus menggantinya dengan yang lain. Saya akan memperbarui dalam satu atau dua minggu ke depan.
AaronD

Jawaban:


2

Untuk sebagian menjawab pertanyaan saya sendiri:

Sejak memposting pertanyaan ini, saya menemukan bahwa kita perlu menangani bobot tepi negatif dan juga positif (batasan untuk jalur asiklik / sederhana / tanpa loop berarti bahwa solusi terbaik ditentukan, sedangkan tanpa batasan itu jalur terpendek melalui grafik dengan negatif- siklus biaya tidak ditentukan).

Algoritma Yen, dan sebagian besar yang saya periksa, bergantung pada serangkaian pencarian 1-terbaik; kebanyakan menggunakan Dijkstra untuk pencarian perantara tersebut. Dijkstra tidak mendukung bobot tepi negatif, tetapi kita dapat menggantikan Bellman-Ford sebagai gantinya (setidaknya dalam Yen; mungkin juga di Lawler atau Eppstein juga). Saya telah mengembangkan modifikasi Bellman-Ford dengan batasan lintasan panjang (pada tepian) dan pemeriksaan siklus eksplisit selama pencarian (menggantikan deteksi siklus pasca-pencarian standar). Kompleksitas komputasinya lebih buruk, tetapi masih bisa digunakan untuk kebutuhan saya. Saya akan mengedit respons ini dan menautkan ke laporan teknologi jika saya mendapat izin untuk mempostingnya.


1

Saya akan mengatakan pertanyaan ini dapat dengan mudah di-Google-kan dan juga merupakan duplikat:

Yang sedang berkata, saya sudah menggunakan dan mengimplementasikan Eppstein dan merekomendasikannya. Saya merasa cukup elegan. Jika saya ingat benar, mungkin juga optimal, dan makalah berikut menjelaskannya dengan sangat baik:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf


Pertama, terima kasih atas rekomendasi Eppstein. Saya akan melihat lebih banyak di sana. Saya berpendapat bahwa ini bukan duplikat yang tepat, juga tidak mudah untuk google; mudah untuk menemukan algoritma k-best, tetapi tidak begitu mudah untuk memilih dengan bijaksana di antara mereka. Saya berharap saya ingin algoritma yang sangat berbeda untuk grafik jutaan simpul yang jarang terhubung daripada yang saya akan lakukan untuk masalah ini. Saya akan lebih peduli tentang kompleksitas dalam k jika saya menginginkan 1000-terbaik, bukan 10-terbaik. Dan, sementara faktor konstan tidak begitu penting ketika menerbitkan makalah, mereka tentu adalah ketika mengirimkan kode produksi.
AaronD

@ Hard: hanya untuk informasi Anda, saya pikir algoritma ini sangat efisien apa pun masalahnya. Mungkin ada kasus khusus di mana pencarian yang didorong heuristik mengalahkannya, tetapi untuk kasus umum, saya pikir itu sangat baik. Kinerja yang tepat mungkin akan lebih tergantung pada seberapa tepatnya Anda mengimplementasikannya, efisiensi struktur data Anda dan bagaimana disesuaikan dengan masalah Anda itu.
dagnelies

@arnaud Hai, apakah mungkin bagi Anda untuk membagikan implementasi eppstein Anda? Saya punya pertanyaan serupa yang diposting di sini: math.stackexchange.com/questions/1661737/…
Tina J
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.