Hangi k-en iyi en kısa yol algoritmalarını düşünmeliyim?


13

Bir grafik arama optimizasyonu sorununu çözüyorum. Yönlendirilmiş ağırlıklı bir grafikle k en iyi asiklik en kısa yolları bulmam gerekiyor.

Bir dizi kesin ve yaklaşık k-en iyi algoritma olduğunu biliyorum, ancak son araştırmaların çoğu çok büyük, çok seyrek bağlantılı grafiklere (örneğin yol güzergahı ve yönler) yönelik görünüyor ve benim grafiğim de öyle değil.

Sorunumun ayırt edici yönleri:

  • Grafik yaklaşık 160 köşeden oluşur.

  • Grafik neredeyse tamamen bağlı (çift yönlü, bu yüzden ~ 160 ^ 2 ~ = 25k kenarlar)

  • k oldukça küçük olacaktır (muhtemelen 10'dan az)

  • Maksimum yol uzunluğu muhtemelen sınırlanmış ve çok küçük olacaktır (örneğin 3-5 kenar)

  • Yukarıda 'asiklik' dedim, ama sadece tekrarlamak için - çözümler döngüleri içermemelidir. Bu, en iyi 1 en kısa yol için bir sorun değildir, ancak k-best için bir sorun haline gelir - örneğin, bir yol güzergahını düşünün - A'dan B'ye 2. en kısa yol, 1-en iyi ile aynı olabilir. bir yerde bir blok etrafında hızlı bir yolculuk. Bu matematiksel olarak optimal olabilir, ancak çok yararlı bir çözüm değildir. ;-)

  • Her hesaplama için anında kenarları yeniden ağırlıklandırmamız gerekebilir. Bir kenar maliyeti birkaç faktörün ağırlıklı toplamından oluşur ve nihai gereksinimler (ne zaman elde edersek) bir kullanıcının kenar ağırlıklarını değiştirerek bu ağırlıklandırma faktörlerini kendi önceliklendirmesini belirlemesine izin verebilir. Bu nispeten küçük bir grafiktir (birkaç yüz KB olarak gösterebilmeliyiz), bu nedenle grafiği bellekteki klonlamak, yeniden ağırlığı uygulamak ve ardından klonlanmış grafik üzerinde arama yapmak makul olabilir. Ancak, ağırlığı anında hesaplarken aramayı gerçekleştirmenin daha etkili bir yöntemi varsa, ilgileniyorum.

Santos (K en kısa yol algoritmaları), Eppstein 1997 (k En Kısa Yolları Bulma) ve diğerlerinde açıklanan algoritmalara bakıyorum. Yen'in algoritması, öncelikle mevcut Java uygulaması nedeniyle ilgi çekicidir . Araştırma makalelerini okumaktan korkmuyorum, ama sorunumun ayrıntılarını atmaya ve işaretçilerden biraz okuma süresi kazanmaya değer olduğunu düşündüm.

Ve Java uygulamalarına işaretçileriniz varsa, daha da iyi.


+1, çünkü insanların önerileriyle ilgileniyorum ve bu, bu sitenin yapıldığı kesin soru türü gibi görünüyor.
KChaloux

Döngüsel durumunuz, başlangıçtan hedefe herhangi bir yolun ilk yolla döngü oluşturacağı anlamına gelmiyor mu? Hem başlangıç ​​hem de hedef kör sokakta bulunuyorsa, her yolun bu iki kenarı kullanması gerekir.
user470365

Belki net değildim. Asiklik kısıtlaması sadece tek bir yol için geçerlidir - doğal olarak, A'dan B'ye herhangi 2 farklı yol bir döngü oluşturur.
AaronD

@AaronD: peki, sonunda hangisini kullandın?
dagnelies

@arnaud: Henüz bir algoritmaya yerleştiğimden emin değilim; Sahip olduğumda bu soruya bir güncelleme ekleyeceğim. Eppstein'ı ortadan kaldırdım çünkü asiklik ('basit') çözümleri garanti etmiyor. Şu anda Yen'in algoritmasıyla çalışıyorum, ancak henüz ayrıntılı profil oluşturma veya optimizasyona ulaşmadım, bu yüzden başka bir tane ile değiştirmek zorunda kalabilirim. Önümüzdeki bir iki hafta içinde güncelleme yapacağım.
AaronD

Yanıtlar:


2

Kendi sorumu kısmen cevaplamak için:

Bu soruyu gönderdikten sonra, negatif kenar ağırlıklarının yanı sıra pozitif olmamız gerektiğini keşfettim (döngüsel / basit / döngüsüz yollarla sınırlama en iyi çözümün tanımlandığı anlamına gelirken, bu sınırlama olmadan maliyet döngüleri tanımlanmamıştır).

Yen'in algoritması ve incelediğim diğerlerinin çoğu, en iyi 1 aramaya dayanıyor; çoğu bu ara aramalar için Dijkstra kullanır. Dijkstra negatif kenar ağırlıklarını desteklemez, ancak yerine Bellman-Ford'un yerine geçebiliriz (en azından Yen'de; muhtemelen Lawler veya Eppstein'da da). Bir yol uzunluğu sınırlaması (kenarlarda) ve arama sırasında açık çevrim kontrolü (standart arama sonrası çevrim tespiti yerine) ile Bellman-Ford'da bir değişiklik geliştirdim. Hesaplama karmaşıklığı daha kötü, ama yine de gereksinimlerim için izlenebilir. Bu yanıtı düzenleyeceğim ve göndermek için izin alırsam bir teknik raporla bağlantı kuracağım.


1

Bu soru kolayca googled ve aynı zamanda bir kopya olduğunu söyleyebilirim:

Bununla birlikte, zaten Eppstein'ı kullandım ve uyguladım ve tavsiye ettim. Oldukça zarif buldum. Doğru hatırlıyorsam, bu da optimal olabilir ve aşağıdaki makale bunu çok güzel açıklar:

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


İlk olarak, Eppstein'ın tavsiyesi için teşekkürler. Oraya daha fazla bakacağım. Bunun tam bir kopya olmadığını ya da google'ın kolay olmadığını iddia ediyorum; k-en iyi algoritmayı bulmak kolaydır, ancak aralarında mantıklı bir seçim yapmak o kadar kolay değildir. Milyonlarca köşenin seyrek bağlı bir grafiği için bu problem için yapacağımdan çok farklı bir algoritma isteyeceğimi umuyorum. 10-en iyi yerine 1000-en iyi isteseydim, k'deki karmaşıklık hakkında çok daha fazla önem veririm. Ayrıca, gazeteleri yayınlarken sabit faktörler o kadar önemli olmasa da, kesinlikle üretim kodu gönderirken de önemlidir.
AaronD

@AaronD: sadece bilginiz için, algoritma ne olursa olsun çok verimli olduğunu düşünüyorum. Belki de sezgisel güdümlü aramaların onu dövdüğü özel durumlar vardır, ancak genel durum için bence çok iyi. Kesin performans muhtemelen onu tam olarak nasıl uyguladığınıza, veri yapılarınızın verimliliğine ve sorununuza ne kadar uyarlandığına bağlı olacaktır.
2013 dagnelies

@arnaud Merhaba, eppstein uygulamanızı paylaşmanız mümkün mü? Benzer bir sorum var burada gönderildi: math.stackexchange.com/questions/1661737/…
Tina J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.