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.