Bir haritada en kısa yol

3 Cevap php

Mysql bir normalize komşuluk listesi kullanarak ağırlıklı grafiği tasarladık. Şimdi verilen iki düğüm arasındaki en kısa yolu bulmak gerekir.

Ben php Dijkstra kullanmayı denedi ama (benim için çok zor) bunu uygulamaya yönetmek olamazdı. Ben hissettim, başka bir sorun, ben Dijkstra kullanırsanız Ben büyük bir grafiğin belki de çok verimsiz olabilecek tüm düğümleri, dikkate almak gerekir ki oldu. Yani herkes yukarıdaki soruna ilişkin bir kodu vardır nedir? Biri en az bana bu sorunu çözmenin bir yolunu gösterir eğer iyi olurdu. Şimdi neredeyse bir hafta boyunca burada sıkışmış edilmiştir. Lütfen yardım edin.

3 Cevap

Bu A * algoritması klasik bir durum gibi geliyor, ama Dijkstra uygulamak değil, ben A * implenting göremiyorum.

A* on Wikipedia

edit: bu tahmin için iyi bir yol olduğunu varsayar (ama çok önemlidir sen yapmak değil over-tahmin) hedefe bir düğümden alma maliyeti.

edit2: Eğer komşuluk liste gösterimi ile sorun yaşıyorsanız. Bu haritada her vertex için bir nesne oluşturmak eğer bir bağlantı varsa o zaman bu nesnelere doğrudan bağlantı olduğunu bana oluşur. Düğümlerine onlar bitişik Peki aslında olurdu (sen eğer, ya da referanslar) Her işaretçileri bir listesini içeren nesnelerin bir listesi. Eğer yeni bir düğüm için yolu erişmek istiyorsanız Şimdi, sadece bağlantıları takip edin. Eğer sonsuz döngüleri engellemek için verilen bir tepe için takip ettik yolların bir listesini tutmak için emin olun.

Bildiğim kadarıyla DB şey erişmek için gereken her zaman sorgulamak, zaten bunu yapmak için ihtiyacımız olacak. En iyi umut bu (ikinci büyük olasılıkla olur grafiğinde belirli bir kenarında, ya da grafikte bir vertext için tüm kenarları için bilgi almak istediğinizde yalnızca onu sorgulamak anlamına gelir ... İHTİYACINIZ yalnızca DB sorgulamak için Daha iyi bir yol olabilir) böylece sadece yerine seferde devasa boyutta birden bir süre sonra yavaş I / O çarptı.

İşte PHP bunu uygulamak için nasıl anlamaya yardımcı olabilir Java Dijkstra algoritması okuryazar bir versiyonu vardır.

http://en.literateprograms.org/Dijkstra%27s_algorithm_%28Java%29

Dijkstra algorithm returns shortest paths from given vertex to other vertexes.
You can find its pseudo-code in Wiki.

Ama bir YÖNELİK grapth tüm köşelerden arasındaki en kısa yolu bulur Floyd algoritma gerekir düşünüyorum.

Hem matematiksel karmaşıklığı oldukça yakındır.

Ben her ikisi için Wiki PHP implementation bulabiliriz.