Yol bulma algoritmaları?


24

Bu soruyu ilk önce yığın taşması üzerine gönderdim, fakat orada kimse video oyunlarıyla ilgilenmiyor ...

Her tür oyunlarda kullanılan bazı yol bulma algoritmaları nelerdir? (Her halükarda karakterlerin taşındığı her türden) Dijkstralar çok mu kullanılıyor? Aslında, bir yerlere ulaşmak için atılacak adımları izlemiyor gibi değil mi? Doğru anlıyorsam, sadece hangi nesnenin en yakın olduğunu belirler. Hiçbir şey kodlamak istemiyorum; sadece biraz araştırma yapıyorum, eğer sahte kod veya başka bir şey yapıştırırsanız, bu iyi olurdu (Java ve C ++ 'ı anlayabilirim). Temel olarak, genel olarak yol bulmaya hızlı bir bakış için bakıyorum.

A * 'nın 2D oyunlarda kullanılacak algoritma gibi olduğunu biliyorum. Bu harika ve hepsi, peki ya ızgara tabanlı olmayan 2D oyunlar? İmparatorluk Çağı veya Link'in Uyanışı gibi şeyler. Gezinecek farklı kareler yok, ne yapıyorlar?

3D oyunlar ne yapar? Bu konuyu okudum http://www.ai-blog.net/archives/000152.html , konu hakkında çok büyük bir otorite olduğunu duydum, yol bulma yapılır. Eğer A * kullandıkları şeyse, 3D ortamda böyle bir şey nasıl yapılır? Spline'lar köşeleri yuvarlamak için tam olarak nasıl çalışır?


2
SE'nin soru cevap formatı için bu sorunun çok açık olduğunu düşünüyorum. SSS
John McDonald,

1
Bahsettiğiniz oyunların haritayı A * için bir ya da başka şekilde düğümlere bölmesi gerekir. Süreç aşağı Yani kırılma kareler ızgaralar dahil etmek gerekmez ve it.Check bu vid yapmak için birçok yol vardır youtube.com/watch?v=nGC_kBCoHYc , iyi bir oyun oyuncular konum ne söyleyemem böylece yapar Aslında perde arkasında yapıyorum.
XiaoChuan Yu,

1
Burada çok fazla soru var, bu yüzden gerçekten bir cevap yazamıyorum, ancak Dijkstra'nın bir yol döndürdüğünü ve çoğu yol bulma algoritmasının çok amaçlı olduğunu not edeceğim. Dünyanızı (2B veya 3B) bağlı bir grafiğe dönüştürür ve üzerinde bir yol bulma algoritması çalıştırırsınız.
Gregory Avery-Weir

Sadece referans için: Stack Overflow'da soruyu cevapladım .
Julian,

1
Bağırmama izin ver. Bu soru SO’da 4 oy, burada GDSE’de 4 yakın oyla karşılaştı . Yardım edemem ama bu sitedeki moderatörlerin aşırı saldırgan olduklarını hissediyorum. Tabii, bu sorunun SSS’de belirtilen kurallara nasıl ters gittiğini görebiliyorum ancak alıntı yapmaktan kaçınmak için bu kuralların uygulandığını belirtin diminishing the usefulness of our site. Bu soru zaten 3 kez lehte oldu; bu, bazı kullanıcılar için faydalı olduğunu kanıtladı. Bu yüzden yardım edemem ama onu kapatmak ve nihayetinde kaldırılması riskini almak için oy vermenin çok daha fazla üretken olduğunu hissediyorum.
David Gouveia

Yanıtlar:


62

Bir seferde çok fazla soru var, bu yüzden somut bir cevap vermek zor ancak bu konulardan birkaçını tartışmak zor. Cevabı ikiye böleceğim ve elimden geldiğince ele almaya çalışacağım. Bu listelerin hiçbirinin eksiksiz olduğunu iddia etmiyorum , ancak hatırlayabildiğim farklı yöntemlerden bazıları.


Bölüm 1 - Yol Bulma Algoritmaları

Yeni başlayanlar için yol bulmayı uygulamanın birçok yolu vardır , ancak hepsi en kısa yolu döndürmez, verimli veya hatta güvenilir değildir. Örneğin:

  • "İleriye bakmayan" ve her seferinde bir adım atmayan ilkel yöntemler:

    • Rastgele geri adım atma - Hedef yönünde her seferinde bir adım atın. Bir engelle karşılaşırsanız, biraz rastgele bir yöne geri adım atıp sonra tekrar deneyerek, onun etrafında çalışmayı deneyin. Hiç güvenilir değil ve çok sayıda durumda sıkışıp kalacaksınız.

    • Engel izleme - Rasgele geri adım atmaya benzer, ancak rastgele geri adım atmak yerine, başka bir yaklaşım, bir çarpışma bulunduğunda nesnenin etrafında izlemeye başlar, sanki sağ ele duvara yapışmış ve dokunmak zorunda kalmışsınız. Bir kez çarpışma olmazsa kalenin yönünde ilerlemeye devam edin. Bir kez daha birçok durumda sıkışıp kalabilirsiniz.

  • Tüm yolu bir kerede bulmak için ileriye dönük yöntemler:

    • Genişlik İlk Arama - Bir seferde her bir çocuk katmanını ziyaret ederek basit grafik geçişi, yol bulunduğunda dur. Grafik ağırlıksızsa (yani her bitişik düğüm arasındaki mesafe her zaman aynıdır), çok verimli olmasa da en kısa yolu bulur. Ağırlıklandırılmış grafikler için en kısa yolu döndürmeyebilir, ancak varsa bir tane bulur.

    • Derinlik İlk Arama - Bir grafiği geçmek için başka bir yol, ancak onu katman katman almak yerine, algoritma önce grafiği derinlemesine aramaya çalışır. Bu yöntem, aramanın derinliği sınırlı değilse, özellikle bir yığın taşmasına neden olabilecek bir özyinelemeli uygulama kullanırken, bu nedenle bir yığını kullanarak yinelemeli olarak uygulamak daha güvenli olduğunda, problemleri olabilir.

    • En İyi İlk Arama - Genişlik İlk Aramaya benzer, ancak önce en umut verici komşuyu seçen bir buluşsal yöntem kullanır. Döndürülen yol en kısa olmayabilir, ancak ilk aramaya göre kaçmak daha hızlıdır. A *, bir En İyi İlk Arama türüdür.

    • Dijkstra Metodu - Baştan itibaren ziyaret edilen her düğüme kadar toplam maliyeti takip eder ve grafiği geçmek için en iyi sırayı belirlemek için kullanır. Ağırlıklı grafiklerle çalışır ve en kısa yolu döndürür, ancak çok fazla arama gerektirebilir.

    • C * - Dijkstra'ya benzer fakat aynı zamanda en iyi kararı almak için her bir düğümün hedefe ne kadar yakın olacağını tahmin etmek için bir sezgisel kullanır. Bu sezgisel özellik nedeniyle A *, ağırlıklı grafikteki en kısa yolu çok daha zamanında bulur.

  • Daha sonra, A * (veya genel olarak yol bulma optimizasyonları) gibi bazı koşullara daha hızlı veya daha adapte olmasını sağlayan varyasyonlar vardır (örneğin ilgili cevaba ve cstheory'deki kapsamlı listeye bakınız. ):

    • LPA * - A * 'ya benzer, ancak grafikte küçük bir değişiklik yapıldığında en iyi yolu daha hızlı bir şekilde yeniden hesaplayabilir
    • D * Lite - LPA * 'ya dayanarak aynı şeyi yapar, ancak “başlangıç ​​noktasının” grafik değişiklikleri yapılırken bitişe doğru hareket eden bir birim olduğunu varsayar.
    • HPA * (Hiyerarşik) - Aramayı hızlandırmak için farklı soyutlama seviyelerinde birkaç katman kullanır. Örneğin, daha yüksek seviyeli bir katman odalara kolayca bağlanabilirken, daha düşük seviyeli bir katman engellerden kaçınmaya özen gösterir.
    • IDA * (Yinelemeli Derinleştirme) - Yinelemeli derinleştirmeyi kullanarak normal A * ile karşılaştırıldığında bellek kullanımını azaltır.
    • SMA * (Basitleştirilmiş Hafıza Sınırlı) - Aramayı yapmak için yalnızca mevcut hafızayı kullanır.
    • Zıplama Noktası Araması - Eric'ten bahseden yorumlarda kredi! Tekdüze maliyetli ızgara haritalarında yol bağlantısını hızlandırır ( bağlantı ).

Bölüm 2 - Arama Alanı Temsili

Ve nihayet bu soruyu ele almak için:

A * 'nın 2D oyunlarda kullanılacak algoritma gibi olduğunu biliyorum. Bu harika ve hepsi, peki ya ızgara tabanlı olmayan 2D oyunlar?

Burada iki büyük yanılgı! Aslında:

  1. A *, oyunun 2D mi yoksa 3D mi olduğunu önemsemez ve her iki durumda da eşit derecede uygundur.
  2. A * , herhangi bir grafik gösterimi altında çalışır , bu yüzden dünyanın bir ızgara olup olmaması umrunda değil.

Öyleyse, dünyanın bir ızgaraya ihtiyacı yoksa, başka hangi yollarla onu temsil edebilirsiniz? Aşağıda, yol bulma için dünya alanını bölme yöntemlerine kısa bir genel bakış ve bu çalışmaların çoğu hem 2D hem de 3D için çalışıyor:

  • Dikdörtgen ızgara - Izgaradaki her hücre grafikte bir düğüm olan ve engelsiz iki düğüm arasındaki bağlantı bir kenardır.

    görüntü tanımını buraya girin

  • Quadtree - Boşlukları bölmenin başka bir yolu, fakat normal büyüklükteki hücrelerin ızgaralarına bölünmek yerine, dördüncülük halinde bölün ve sonra bunları tekrar tekrar dördüncü olarak bölün. Üçüncü bir boyut eklemek, bir oktree yapar .

    görüntü tanımını buraya girin

  • Dışbükey çokgenler - Yürülebilen alanın birbirine bağlı dışbükey çokgenlerin bir ağına bölünmesi. Her çokgen bir düğüm haline gelir ve paylaşılan kenarlar grafiğin kenarlarıdır. Bunlar örneğin üçgenler olabilir ve bazen seviye varlıkları yaratırken bir sanatçının yarattığı bir ağ bile olabilir. Genellikle bir gezinme ağı olarak adlandırılır . Bu bağlantıya bakınız . İşte çok popüler bir gezinme ağı inşaat araç takımı: Recast .

    görüntü tanımını buraya girin

  • Görünürlük noktaları - En yaygın yol, engelin dışbükey köşelerinin hemen dışına bir düğüm yerleştirmek ve ardından birbirlerini görebilecek düğüm çiftlerini birbirine bağlamaktır . Bu bağlantıyı kontrol et . Düğümlerin köşeleri olması gerekmez ve haritadaki tasarımcı tarafından manuel olarak yerleştirilebilir. Bu durumda, sistem sıklıkla bir yol noktası grafiği olarak adlandırılır .

    görüntü tanımını buraya girin


1
İki bağlantı: 1) Mikko Mononen , Killzone 3'te yol bulma çalışması yaptı ve hem MIT lisansı altında hem de MIT lisansı altında kullanılan Recast (denizci üreticisi) ve Detour'un (yol bulma araç seti) gelişim sürecini belgeleyen çok hoş bir blogu var. içinde Reckoning: Amalur Kingdoms . 2) Atlama noktası araştırması , bence ızgara tabanlı yol bulma konusundaki en yeni gelişmelerden biri.
Eric
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.