Hedef geçilmez olduğunda A * 'nın daha hızlı bitmesini nasıl sağlayabilirim?


31

A * ("A star") yol bulma algoritmasını kullanan basit bir karo tabanlı 2D oyun yapıyorum. Tamamen doğru çalışıyorum ama aramada performans problemim var. Basitçe söylemek gerekirse, geçilmez bir döşemeye tıkladığımda, algoritma görünüşte geçmez döşemeye giden bir rota bulmak için haritanın tümünden geçer - yanında dursam bile.

Bunu nasıl aşabilirim? Sanırım ekran alanına giden yolu azaltabilirim, ama belki burada bariz bir şeyleri özlüyorum?


2
Hangi döşemelerin geçilmez olduğunu biliyor musunuz, yoksa sadece AStar algoritmasının sonucu olarak mı biliyorsunuz?
user000user

Gezinme grafiğinizi nasıl saklıyorsunuz?
Anko

Gezilen düğümleri listelerde saklıyorsanız, hızı artırmak için ikili yığınlar kullanmak isteyebilirsiniz.
ChrisC

Çok yavaşsa, önereceğim bir dizi optimizasyon var - yoksa aramalardan tamamen kaçınmaya mı çalışıyorsunuz?
Steven

1
Bu soru muhtemelen Bilgisayar Bilimleri için daha uygun olurdu .
Raphael

Yanıtlar:


45

Tamamen başarısız yollarla sonuçlanan aramalardan kaçınmaya ilişkin bazı fikirler:

Ada Kimliği

A * aramalarını daha hızlı bir şekilde bitirmenin en ucuz yollarından biri hiç arama yapmamaktır. Alanlar tüm ajanlar tarafından gerçekten geçilmezse, sel her alanı yükte (veya boru hattında) benzersiz bir Ada Kimliği ile doldurun . Yol bulmayı yaparken , yolun orijininin Ada Kimliği’nin Ada kimliği hedef. Eşleşmiyorlarsa, aramanın hiçbir anlamı yoktur - iki nokta birbiriyle bağlantısı olmayan adalardadır. Bu, yalnızca tüm ajanlar için gerçekten geçilemez düğümler varsa yardımcı olur.

Sınırı üst sınır

Aranabilecek maksimum düğüm sayısının üst sınırını sınırlarım. Bu, geçilmez aramaların sonsuza dek yayınlanmamasına yardımcı olur, ancak çok uzun süren bazı fena aramaların kaybedilmesi anlamına gelir. Bu sayının ayarlanması gerekiyor ve gerçekten çözülmiyor ve sorunu , ancak uzun aramalarla ilişkili maliyetleri azaltır.

Eğer bulduğunuz şey çok uzun sürüyorsa, aşağıdaki teknikler kullanışlıdır:

Asenkron ve Limit Yinelemeleri Yap

Arama, her bir karede ayrı bir iş parçacığında ya da bir bitte yayınlansın, böylece oyun aramayı beklemiyor. Karakterin çizilme kafası veya damgalama ayaklarının animasyonunu veya aramanın bitmesini beklerken uygun olanı gösterin. Bunu etkili bir şekilde yapmak için, araştırmanın durumunu ayrı bir nesne olarak tutacağım ve birden fazla devletin var olmasına izin vereceğim. Bir yol istendiğinde, bir serbest durum nesnesini alın ve onu aktif durum nesnelerinin kuyruğuna ekleyin. Yol bulma güncellemenizde, etkin öğeyi sıranın önünden çekin ve A * işlemini tamamlayana kadar ya da B. bazı yineleme sınırlarının çalışmasına kadar çalıştırın. Tamamlandıysa, durum nesnesini serbest durum nesneleri listesine geri yerleştirin. Tamamlanmadıysa, 'aktif aramaların' sonuna koyun ve bir sonrakine geçin.

Doğru Veri Yapıları Seçin

Doğru veri yapılarını kullandığınızdan emin olun. İşte StateObject'imin çalışması. Tüm düğümlerim performans nedenlerinden dolayı sonlu bir sayıya - 1024 ya da 2048 - diyelim. Düğümlerin tahsisini hızlandıran bir düğüm havuzu kullanıyorum ve aynı zamanda u16'lar olan veri yapılarımda işaretçiler yerine indeksler depolamamı sağlıyor (ya da bazı oyunlarda yaptığım 255 maksimum düğümüm varsa u8). Yol bulucum için, işaretçileri Node nesnelerine depolayarak, açık liste için bir öncelik sırası kullanıyorum. İkili öbek olarak uygulanır ve kayan nokta değerlerini tam sayılar olarak sıralarım, çünkü platformum her zaman pozitifdir ve platformumda yavaş kayan nokta karşılaştırılır. Kapalı haritam için ziyaret ettiğim düğümleri takip etmek için bir karma tablo kullanıyorum. Önbellek boyutlarından tasarruf etmek için Düğümleri değil, Düğümleri saklar.

Önbellek Yapabilecekleriniz

Bir düğümü ilk ziyaret edip hedefe olan mesafeyi hesapladığınızda, Durum Nesnesinde depolanan düğümde önbellekleyin. Düğümü tekrar ziyaret ederseniz, tekrar hesaplamak yerine önbelleğe alınmış sonucu kullanın. Benim durumumda, tekrar ziyaret edilen düğümler üzerinde karekök yapmamaya yardımcı olur. Önceden hesaplayabileceğiniz ve önbellekleyebileceğiniz başka değerler de vardır.

Araştırabileceğiniz diğer alanlar: iki taraftan da aramak için iki yönlü yol bulma kullanın. Bunu yapmadım ama başkalarının da belirttiği gibi, bunun yardımcı olabileceğini, ancak bunun uyarıları olmadığını söyledi. Listemde denenecek diğer şey, hiyerarşik yol bulma veya kümelenme yolu bulma. HavokAI belgelerinde ilginç bir açıklama var Burada , burada açıklanan HPA * uygulamalarından farklı olan kümeleme kavramlarını açıklar .

İyi şanslar ve ne bulduğunuzu bize bildirin.


Farklı kuralları olan, ancak çok fazla olmayan farklı ajanlar varsa, bu yine de her bir ajan sınıfı için bir ID vektörü kullanılarak oldukça verimli bir şekilde genelleştirilebilir.
MSalters

4
+1 Sorunun muhtemel engellenmiş alanlar olduğunu (sadece geçilmez karolar değil) ve bu tür bir sorunun erken yükleme süresi hesaplamalarıyla daha kolay çözülebileceğini kabul etmek için.
Slipp D. Thompson

Her bir bölgeye sel doldurma veya BFS.
Wolfdawn

Ada kimlikleri statik olmak zorunda değildir. İki ayrı adaya katılmaya ihtiyaç duyulması halinde uygun olacak basit bir algoritma vardır, ancak daha sonra bir adayı bölemez. Bu slaytlardaki sayfa 8 - 20, belirli bir algoritmayı açıklar: cs.columbia.edu/~bert/courses/3137/Lecture22.pdf
kasperd

@ kasperd elbette ada kimliklerini yeniden hesaplanmasını, çalışma zamanında birleştirilmesini engelleyen bir şey yok. Mesele şu ki, ada kimlikleri, astar aramasız hızlı bir şekilde iki düğüm arasında bir yol olup olmadığını onaylamanıza izin veriyor.
Steven

26

AStar, eksiksiz bir planlama algoritmasıdır, yani düğüme giden bir yol varsa, AStar'ın onu bulması garanti edilir. Sonuç olarak, bu gerekir hedef düğümün erişilemez olduğuna karar vermeden önce başlangıç ​​düğümünden çıkan her yolu kontrol . Çok fazla düğümünüz olduğunda bu çok istenmeyen bir durumdur.

Bunu hafifletmenin yolları:

  • Eğer biliyorsanız önsel bir düğüm ulaşılamaz olduğu (örneğin hiçbir komşuları vardır ya da işaretlenmiş UnPassable, geri dönüşü) No Pathhiç Astar uğramadan.

  • Sınırlama sonlandırılmadan önce AStar'ın genişleyeceği düğüm sayısını sınırlayın. Açık seti kontrol edin. Çok büyürse, sonlandırın ve geri dönün No Path. Ancak, bu AStar'ın bütünlüğünü sınırlayacaktır; bu yüzden sadece maksimum uzunluktaki yolları planlayabilir.

  • Sınırlayın zaman Astar bir yol bulmaya sürer. Süresi bitiyorsa, çıkın ve geri dönün No Path. Bu, önceki strateji gibi bütünlüğü sınırlar, ancak bilgisayarın hızıyla ölçeklenir. Birçok oyun için bunun istenmediğini unutmayın, çünkü daha hızlı veya daha yavaş bilgisayarlara sahip olan oyuncular oyunu farklı deneyimler.


13
CPU hızına bağlı olarak oyun mekaniğinizi değiştirmenin (evet, rota bulma oyun tamircisidir) kötü bir fikir olabileceğini, çünkü oyunu oldukça tahmin edilemez hale getirebileceğini ve bazı durumlarda bile oynanamayacağını belirtmek isterim. bilgisayarlarda bundan 10 yıl sonra. Bu yüzden, açık kümeyi CPU zamanından ziyade sınırlayarak A * 'yı sınırlamayı tercih ederim.
Philipp

@Philipp. Bunu yansıtacak şekilde cevap değiştirildi.
mklingen

1
Belirli bir grafik için iki düğüm arasındaki maksimum mesafeyi (makul derecede verimli, O (düğümler)) belirleyebileceğinizi unutmayın. Bu, en uzun yol problemidir ve size kontrol edilecek düğüm sayısı için doğru bir üst sınır sağlar.
MSalters

2
@ MSalters Bunu O (n) da nasıl yapıyorsunuz? Ve 'makul derecede verimli' nedir? Bu sadece düğüm çiftleri içinse, sadece işi kopyalamakla kalmıyor musunuz?
Steven

Wikipedia'ya göre, en uzun yol sorunu maalesef NP-zor.
Ocak'ta 15:15

21
  1. Hedef düğümden aynı döngü içinde aynı anda hem de ters sırada ikili A * araması yapın ve çözülemeyen bulunur bulunmaz her iki aramayı da iptal edin

Hedefin çevresinde yalnızca 6 kare erişilebilirse ve orijinli 1002 kare erişilebilir varsa, arama 6 (ikili) yinelemede duracaktır.

Bir arama diğerinin ziyaret ettiği düğümleri bulur bulmaz, arama kapsamını diğerinin ziyaret ettiği düğümlerle sınırlayabilir ve daha hızlı bitirebilirsiniz.


2
Sezgisel görüşün bu şartlar altında kabul edilebilir kaldığını doğrulamak da dahil olmak üzere, ifadenizin ima ettiğinden çok yönlü bir A-star araması yapmanın daha fazlası vardır. (Bağlantılar: homepages.dcc.ufmg.br/~chaimo/public/ENIA11.pdf )
Pieter Geerkens

4
@StephaneHockenhull: Arazi haritasına asimetrik maliyetlerle iki yönlü bir A- * uyguladıktan sonra, sizi temin ederim ki akademik falanı görmezden gelmek hatalı yol seçimi ve yanlış maliyet hesaplamaları ile sonuçlanacaktır.
Pieter Geerkens

1
@MooingDuck: Toplam düğüm sayısı değişmez ve her bir düğüm hala bir kez ziyaret edilir, bu nedenle haritaların tam olarak ikiye bölünmesi en kötü durum tek yönlü A- * ile aynıdır.
Pieter Geerkens

1
@ PieterGeerkens: Klasik A * 'da, düğümlerin sadece yarısına ulaşılabilir ve böylece ziyaret edilir. Harita tam olarak ikiye bölünmüşse, o zaman çift yönlü aradığınızda, her düğüme (neredeyse) dokunun. Kesinlikle bir kenar da olsa
Mooing Duck

1
@ MoooDuck: Yanlış konuştum; en kötü durumlar farklı grafiklerdir, ancak aynı davranışa sahiptirler - tek yönlü için en kötü durum tüm düğümlerin ziyaret edilmesini gerektiren tamamen yalıtılmış bir hedef düğümdür.
Pieter Geerkens

12

Sorun varsayalım, hedef ulaşılamaz. Ve gezinti ağının dinamik olmadığı. Bunu yapmanın en kolay yolu, çok daha seyrek bir navigasyon grafiğine sahip olmaktır (tam geçişin göreceli olarak hızlı olmasına yetecek kadar seyrek) ve yalnızca ayrıntılı bir grafik varsa, ek mümkün olduğunda kullanın.


6
Bu iyi. Döşemeleri "bölgelere" göre gruplayarak ve ilk olarak döşemenizin bulunduğu bölgenin diğer döşemenin bulunduğu bölgeye bağlanıp bağlanmadığını kontrol ederek negatifleri çok daha hızlı bir şekilde atabilirsiniz.
Konerak

2
Doğru - genellikle HPA * altına düşüyor *
Steven

@Steven Teşekkürler, böyle bir yaklaşım düşünen ilk kişi olmadığımdan, ne dendiğini bilmediğimden emindim. Mevcut araştırmalardan yararlanmayı çok daha kolaylaştırır.
ClassicThunder

3

Farklı özelliklere sahip çoklu algoritmalar kullanın

A * bazı ince özelliklere sahiptir. Özellikle, varsa, her zaman en kısa yolu bulur. Ne yazık ki, bazı kötü özellikler de buldunuz. Bu durumda, hiçbir çözüm bulunmadığını kabul etmeden önce tüm olası yolları ayrıntılı olarak araştırması gerekir.

A * 'da keşfettiğiniz "kusur", topolojiden habersiz olmasıdır. İki boyutlu bir dünyaya sahip olabilirsin, ama bunu bilmiyor. Bildiği kadarıyla, dünyanızın en köşesinde, dünyanın hemen altında hedefine getiren bir merdiven.

Topolojinin farkında olan ikinci bir algoritma oluşturmayı düşünün. İlk geçiş olarak, dünyayı her 10 veya 100 alanda bir "düğüm" ile doldurup ardından bu düğümler arasındaki bağlantı grafiğini koruyabilirsiniz. Bu algoritma, başlangıç ​​ve bitişe yakın erişilebilir düğümler bularak yolunu bulur, ardından eğer varsa grafik üzerinde aralarında bir yol bulmaya çalışır.

Bunu yapmanın kolay bir yolu, her döşemeyi bir düğüme atamaktır. Her döşemeye yalnızca bir düğüm atamanız gerektiğini göstermek önemlidir (grafikte bağlı olmayan iki düğüme asla erişemezsiniz). Daha sonra grafik kenarları, farklı düğümlere bitişik iki kiremitin herhangi bir yerinde olduğu gibi tanımlanır.

Bu grafiğin bir dezavantajı var: optimum yolu bulamıyor. Bu sadece bulur bir yol . Ancak, size şimdi A * 'nın en uygun yolu bulabileceğini göstermiştir.

Ayrıca, A * işlevini yapmak için gereken hafife almaları geliştirmek için bir sezgisel görüş sağlar, çünkü artık manzaralarınız hakkında daha fazla şey biliyorsunuz. İlerlemek için geri adım atmanız gerektiğine karar vermeden önce çıkmaz bir yeri tam olarak keşfetme olasılığınız daha düşüktür.


Google Haritalar’a benzer algoritmaların benzer (daha gelişmiş) bir şekilde çalıştığına inanmak için nedenlerim var.
Cort Ammon - Monica

Yanlış. A * kabul edilebilir sezgisel seçimi ile topolojinin çok farkındadır.
MSalters

Re Google, önceki işimde Google Haritalar’ın performansını analiz ettik ve bunun A * olamayacağını gördük. Harita önişlemesine dayanan ArcFlags veya diğer benzer algoritmaları kullandıklarına inanıyoruz.
MSalters

@ MSalters: Bu çizmek için ilginç bir çizgi. A * 'nın topolojiden habersiz olduğunu, çünkü yalnızca kendisini en yakın komşularla ilgilendirdiğini düşünüyorum. Kabul edilebilir sezgisel yazılımı üreten algoritmanın A * 'dan ziyade topolojiden haberdar olduğunu söylemenin daha adil olacağını savunuyorum. Elmasın olduğu bir durumu düşünün. A *, pırlantanın diğer tarafını denemek için yedekleme yapmadan önce biraz yol alır. A * 'ya bildirmenin hiçbir yolu yoktur, bu daldan gelen sadece "çıkış", buluşsal bir ziyaretçiden (hesaplamalı) buluşsal yöntemle yapılır.
Cort Ammon - Monica

1
Google Haritalar için konuşamıyorum, ancak Bing Map, az sayıdaki simge noktasından ve her düğümden (ve bu noktalardan) önceden hesaplanan mesafelerle, Noktalar ve Üçgen Eşitsizliği ile Paralel İki Yönlü A-Yıldızını kullanıyor.
Pieter Geerkens

2

Yukarıdaki cevaplara ek olarak bazı fikirler:

  1. A * aramasının önbellek sonuçları. Yol verilerini A hücresinden B hücresine kaydedin ve mümkünse yeniden kullanın. Bu statik haritalarda daha uygulanabilir ve dinamik haritalarla daha fazla iş yapmanız gerekecek.

  2. Her hücrenin komşularını önbelleğe alın. Bir * uygulamasının her bir düğümü genişletmesi ve komşularını arama yapmak için açık kümeye eklemesi gerekir. Bu komşular önbellek yerine her seferinde hesaplanırsa, aramayı önemli ölçüde yavaşlatabilir. Zaten yapmadıysanız, A * için bir öncelik sırası kullanın.


1

Haritanız statikse, ayrı bölümlerin her birinin kendi kodları olabilir ve A * 'yı çalıştırmadan önce bunu kontrol edebilirsiniz. Bu harita oluşturulduktan sonra yapılabilir veya haritada kodlanabilir.

Geçilmez karoların bir bayrağı olmalıdır ve bunun gibi bir karoya giderken A * çalıştırmamayı ya da erişilebilir bir karo seçmeyi tercih edebilirsiniz.

Sık sık değişen dinamik haritalarınız varsa, hemen hemen hiç şansınız kalmaz. Kararınızı vermeden önce algoritmanızı durdurmanız ya da bölümleri kontrol etmenin sık sık kapatılmasını sağlamanız gerekir.


Bu tam olarak cevabımda alan kimliği ile önerdiğim şeydi.
Steven

Haritanız dinamik ancak sık değişmiyorsa, kullanılan CPU / zaman miktarını da azaltabilirsiniz. Yani, kilitli bir kapı kilitlendiğinde veya kilitlendiğinde alan kimliklerini yeniden hesaplayabilirsiniz. Bu genellikle oyuncunun hareketlerine cevap olarak gerçekleştiğinden, en azından bir zindanın kilitli alanlarını dışlarsınız.
uliwitness

1

A * 'nın daha hızlı bir şekilde bir düğümün geçilmez olduğu sonucuna varmasını nasıl sağlayabilirim?

Profilinizi Node.IsPassable() fonksiyonu, en yavaş bölümden saptamayla, onları hızlandırmak.

Bir düğümün geçirilebilir olup olmadığına karar verirken, en muhtemel durumları en üste koyun, böylece çoğu zaman daha karanlık olasılıkları kontrol etmek için rahatsız etmeden fonksiyon hemen geri döner.

Ancak bu, tek bir düğümü kontrol etmeyi hızlandırmak içindir. Düğümleri sorgulamak için ne kadar zaman harcandığını görmek için profil oluşturabilirsiniz, ancak sizin sorununuz gibi sesler çok fazla düğümün kontrol edilmesidir.

geçilmez bir döşemeye tıkladığımda, algoritma görünüşte geçilmez döşemeye giden bir rota bulmak için haritanın tümünden geçer.

Hedef döşemenin kendisi geçilmez ise, algoritma hiç döşemeyi kontrol etmemelidir. Yol bulma işlemine başlamadan önce, hedef döşemesini sorgulayıp sorgulamaması gerekir, eğer mümkün değilse kontrol edin.

Hedefin kendisinin pasif olduğunu, ancak geçilmez karolarla çevrelenmiş olduğunu, yani yol bulunmadığını kastediyorsanız, A * 'nın tüm haritayı kontrol etmesi normaldir. Başka yolu olmadığını nasıl bilebilirdi?

İkinci durum söz konusuysa, iki yönlü bir arama yaparak hızlandırabilirsiniz - bu şekilde hedeften başlayan arama, yolun olmadığını hızlıca bulabilir ve aramayı durdurabilir. Bu örneğe bakın , hedefi duvarlarla çevreleyin ve çift yönlü ile tek yönlü yönleri karşılaştırın.


0

Geriye doğru yol bulma işlemini yapın.

Yalnızca haritanızda erişilemez çinilerin büyük sürekli alanları yoksa, bu işe yarar. Ulaşılabilir haritanın tamamını aramak yerine, yol bulma yalnızca ekteki ulaşılamayan alanı arar.



1
@ MoooDuck Bağlandığınız ulaşılamaz fayans demek istiyorsun. Bu hemen hemen her türlü mantıklı harita tasarımı ile çalışan bir çözümdür ve uygulanması çok kolaydır. A * uygulamasının tüm karoları ziyaret etmenin gerçekte bir problem olduğu kadar yavaş olabileceği gibi, kesin problemi daha iyi bilmeden hiçbir meraklısı önermeyeceğim.
aaaaaaaaaaaa

0

Müzikçaların bağlı olduğu alanlar (telsiz vb. Değil) ve erişilemeyen alanlar genellikle çok iyi bağlanmamışsa, ulaşmak istediğiniz düğümden başlayarak A * 'yı kolayca yapabilirsiniz. Bu şekilde, hedefe giden herhangi bir olası rotayı hala bulabilirsiniz ve A * ulaşılamayan bölgeleri hızlı bir şekilde aramayı durduracaktır.


Mesele normal A * 'dan daha hızlı olmaktı.
Heckel

0

when I click an impassable tile, the algorithm apparently goes through the entire map to find a route to the impassable tile — even if I'm standing next to it.

Other answers are great, but I have to point at the obvious - You should not run the pathfinding to an impassable tile at all.

Bu algodan erken bir çıkış olmalı:

if not IsPassable(A) or not IsPasable(B) then
    return('NoWayExists');

0

Grafikte iki düğüm arasındaki en uzun mesafeyi kontrol etmek için:

(tüm kenarların aynı ağırlığa sahip olduğu varsayılarak)

  1. BFS'yi herhangi bir köşeden çalıştırın v .
  2. Uzaktaki bir köşe seçmek için sonuçları kullanın v, onu arayacağım d.
  3. 'Den BFS'yi çalıştırın u.
  4. En uzaktaki tepe noktasını bulun u, biz buna ad verelim w.
  5. Arasındaki mesafe uve wgrafikte uzun mesafedir.

Kanıt:

                D1                            D2
(v)---------------------------r_1-----------------------------(u)
                               |
                            R  | (note it might be that r1=r2)
                D3             |              D4
(x)---------------------------r_2-----------------------------(y)
  • Arasındaki mesafeyi düşünelim yve xbüyüktür!
  • Sonra buna göre D2 + R < D3
  • Sonra D2 < R + D3
  • Sonra arasındaki mesafe vve xdaha büyüktür vve u?
  • O zaman uilk aşamada seçilemezdi.

Prof için kredi. Shlomi Rubinstein

Ağırlıklı kenarlar kullanıyorsanız, en uzak tepe noktasını bulmak için BFS yerine Dijkstra'yı çalıştırarak polinom zamanında aynı şeyi başarabilirsiniz.

Lütfen bunun bağlı bir grafik olduğunu farz ediyorum. Ben de yönlendirilmemiş olduğunu farz ediyorum.


A *, basit bir 2d döşeme tabanlı oyun için pek kullanışlı değil çünkü doğru anlarsam, yaratıkların 4 yöne hareket ettiğini varsayarsak, BFS aynı sonuçları elde eder. Yaratıklar 8 yöne hareket edebilse bile, hedefe daha yakın düğümleri tercih eden tembel BFS aynı sonuçları almaya devam edecektir. A *, BFS kullanılarak hesaplanmasından daha pahalı olan bir değişiklik Dijkstra'dır.

BFS = O (| V |) sözde O (| V | + | E |) ama gerçekten yukarıdan aşağıya bir harita söz konusu değil. A * = O (| V | log | V |)

Sadece 32 x 32 karolu bir haritamız varsa, BFS en fazla 1024'e mal olacak ve gerçek bir A * size büyük bir 10.000'e mal olabilir. Bu, 0,5 saniye ile 5 saniye arasındaki farktır, muhtemelen önbelleği hesaba katarsanız daha fazla. Bu yüzden A * 'nın istenen hedefe daha yakın karoları tercih eden tembel bir BFS gibi davrandığından emin olun.

A * navigasyon haritaları için faydalıdır, karar alma sürecinde kenarların maliyeti önemlidir. Basit bir karo tabanlı oyunlarda, kenarların maliyeti muhtemelen önemli bir husus değildir. Varsa olay (farklı döşemelerin maliyeti farklıdır), karakteri yavaşlatan döşemelerin içinden geçen yolları erteleyen ve cezalandıran değiştirilmiş bir BFS sürümünü çalıştırabilirsiniz.

Yani evet BFS> A * çoğu durumda çini geldiğinde.


I'm not sure I understand this part "If we have a map with just 32 x 32 tiles, BFS will cost at most 1024 and a true A* could cost you a whopping 10,000" Can you explain how did you come to the 10k number please?
Kromster says support Monica

What exactly do you mean by "lazy BFS that prefers nodes closer to the target"? Do you mean Dijkstra, plain BFS, or one with a heuristic (well you've recreated A* here, or how do you select the next best node out of an open set)? That log|V| in A*'s complexity really comes from maintaining that open-set, or the size of the fringe, and for grid maps it's extremely small - about log(sqrt(|V|)) using your notation. The log|V| only shows up in hyper-connected graphs. This is an example where naive application of worst-case complexity gives an incorrect conclusion.
congusbongus

@congusbongus This is exactly what I mean. Do not use a vanilla implementation of A*
wolfdawn

@KromStern Assuming you use the vanilla implementation of A* for a tile based game, you get V * logV complexity, V being the number of tiles, for a grid of 32 by 32 it's 1024. logV, being well approximately the number of bits needed to represent 1024 which is 10. So you end up running for a longer time needlessly. Of course, if you specialize the implementation to take advantage of the fact you are running on a grid of tiles, you overcome this limitation which is exactly what I was referring to
wolfdawn
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.