Bir grafiğin sonraki kısmını bırakın:
A ve B noktaları arasında shortest_path işlevini kullandığımda mavi yolu aldım. Bu neden oluyor?
Bir grafiğin sonraki kısmını bırakın:
A ve B noktaları arasında shortest_path işlevini kullandığımda mavi yolu aldım. Bu neden oluyor?
Yanıtlar:
En kısa_yol (Dijkstra'nın algoritması) pgRouting'de böyle davranır. Aynı kaynak ve hedefe sahip iki kenar varsa, rastgele bir (kesin olarak: ilki, veritabanından çıkan) kullanılır. Bunun için herhangi bir düzeltme bilmiyorum, ancak bazı geçici çözümler var.
Mümkünse, bu kenarlardan birini ikiye bölmelisiniz. Test etmedim, ama bu davranışı düzeltmeli.
Veri kümenizi değiştiremediğiniz durumlar için diğer çözüm. Tablonuza 'shorter_alternative' alanını ekleyin. Örnek sorgu, ihtiyaçlarınıza göre değiştirin. Umarım fikri açıklar:
UPDATE roads t1
SET shorter_alternative = t2.id
FROM roads t2
WHERE
((t2.source = t1.source AND t2.target = t1.target) OR
(t2.source = t1.target AND t2.target = t1.source)) AND
(t2.length < t1.length)
Şimdi, '0.098' kenarı '0.011' kenarı kimliğini içerecektir. Tüm diğer kenarlar shorter_alternative alanında null değerine sahip olacaktır. En kısa_yol sorgusu yaptıktan sonra, döndürülen veri kümesini kontrol edin - herhangi bir satırda short_alternative alan ayarlanmışsa değiştirin.
Sorun zaten bir önceki cevapta açıklanmıştır. Bu, yalnızca kaynak ve hedefi önemseyen "tepe tabanlı" en kısa yol algoritmaları sorunudur.
Sorun izleyicide bir bilet ve algoritma uygulamasını değiştirmek için olası bir çözüm var: https://github.com/pgRouting/pgrouting/issues/34 (Birisi bunu deneyebilir ve bir çekme isteği gönderebilirse iyi olur; - )
Diğer bir olasılık da "paralel yol bağlantılarını" daha önce belirtildiği gibi ayırmaktır. Veya her iki yol bağlantısını da "bilmesi" için kenardan kenara geçen Kayan Yıldız algoritmasını kullanabilirsiniz.
Veya yol ağını maliyete göre sipariş etmeyi deneyebilir ve ardından yalnızca farklı kaynak ve hedef kombinasyonlarını seçebilirsiniz:
SELECT * FROM shortest_path(
'SELECT DISTINCT ON (source, target)
gid as id,
source::integer,
target::integer,
cost::double precision
FROM ways ORDER BY source, target, cost',
true,false
);
Bu, en ucuz rotayı aradığınızı varsayar. Aksi takdirde yapmanız gerekir ORDER BY ... DESC.
Bunun performansı etkileyip etkilemediğini denemeniz gerekir.
Aslında pgRouting için sorunu gideren bir yama oluşturdum: https://github.com/pgRouting/pgrouting/issues/78