Bir ağdaki en uzun yolu bulmak için en uygun algoritma var mı?


13

Geniş bir doğrusal ağlar setim var ve her ağın ağ boyunca birbirinden en uzak olan iki ucunu bulmak istiyorum (aşağıdaki resimde D'den K'ya). Bu sorunun kaba kuvveti çözümü, her bir kaynak çifti için ağ boyunca en kısa yolu hesaplamaktır, ancak binlerce ucu olan yüzlerce ağım var, bu nedenle her olası yolu hesaplamak oldukça ağır.

Kaba kuvvet kullanmadan bunu hesaplamak için en uygun yol var mı? Bazı noktaları bazı akıllı kurallara göre hariç tutabilir miyim?

Kırmızı yolu verimli bir şekilde nasıl bulabilirim?

DÜZENLEME: Sorumu açıklığa kavuşturmak için @Alex Tereshenkov tarafından belirtilen en uzun yolun bir resmini ekledim. Siyah yol, en uzun yol algoritmasının sonucudur (herhangi bir köşeyi tekrarlamadan en uzun yol). Benim durumumda, ağa harflerden herhangi birini girdiğinizi ve olabildiğince hızlı bir şekilde başka bir harfe gitmeniz gerektiğini hayal edin. Hangi iki harfi birleştirmek en zor? resim açıklamasını buraya girin


deli boya skillz!
Adam

Yanıtlar:


6

Bence ağınızın Grafik Çapını arıyor olabilirsiniz . Stackexchange'te bu konuyu anlatan birkaç soru var, örneğin:

Algoritmaların çoğu önce "tüm çiftler en kısa yolları" hesaplamayı ve bunlardan en uzununu seçmeyi önerir , ancak Koushik Narayanan'ın daha uygun olabilecek alternatif bir yaklaşım öneren (kontrol etmedim) bir blog yazısı buldum. her tepe noktasını yineler ve en uzak çiftini bulur:

V1 köşesinden yolu, V1 ile tepe noktasından biri arasındaki en kısa yol ve diğer tepe noktaları arasındaki en kısa yoldan daha uzun olacak şekilde hesaplayabiliriz. Algoritma için bu gönderiye bakın . Daha sonra, her tepe noktasını yineleyebilir ve her köşe ile kök olarak en uzun yolu bulabiliriz. En uzun yolun listesine sahip olduktan sonra, maksimum değere sahip olanı bulabilir ve geri verebiliriz.


teşekkürler, grafik çapı tam olarak aradığım şeydi ve benim durumumda sözde çaplı buluşsal yöntem çalışıyor. Orada yeni kelimeler öğrendim!
radouxju

7

Wikipedia sayfasına göre En uzun yol sorunu , bu sorun

... NP zordur, yani P = NP olmadıkça keyfi grafikler için polinom zamanda çözülemez . Yaklaşık olarak zor olduğunu gösteren daha sert sertlik sonuçları da bilinmektedir. Bununla birlikte, programlama problemlerinde kritik yolu bulmada önemli uygulamaları olan yönlendirilmiş asiklik grafikler için doğrusal bir zaman çözümüne sahiptir.

Birlikte çalışıyorsanız (veya grafiğinizi DAG olarak temsil edebilirseniz ), networkxPython paketi bunu hesaplamanıza izin verir. İşlevi arayın dag_longest_path.

Bir şeyi kaçırmadıkça, grafik düğümleri arasındaki uzunluğu hesaplamanız ve bunları maalesef sadece doğrusal zamanda çalışacak şekilde sıralamanız gerekecektir , bunun için etkili bir algoritma yoktur .


cevap için teşekkürler, zaten bilgi nedeniyle + 1. Bununla birlikte, bir ağdaki en kısa yolun en uzununu arıyorum (benim örneğimde, B veya H'ye doğru sapma yok). Bu nedenle çözümünüz, tam olarak aradığım şey değil, "kaba kuvvet" in muhtemelen tek çözüm olduğunu ima etse bile.
radouxju

@radouxju, ah anlıyorum. Bakalım gen bunu fark edip etmeyecek, grafikler konusunda çok deneyime sahip, belki de bazı parlak fikirleri var.
Alex Tereshenkov
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.