Engeller hareket ederken bile A * etkili midir?


30

Ben sadece yol bulma hakkında bir şeyler öğrenmeye başladım ve A * algoritmasına bakmaya başladım ve asıl endişem, gördüğüm bütün örneklerin etrafında hesapladığı statik engelleri göstermesi.

Hareketli engellerim varsa, örneğin, diğer karakterleri söyleyin, karakterin kendi yolunu bulması gerektiği gibi hareket edin, algoritmayı her kareyi çalıştırmak zorunda kalacağımı farz ediyorum, ancak oldukça pahalı olacağından endişeleniyorum donanımın her hareketli oyuncu için her kareyi işlemesi için.

Öyleyse, A * yine de engeller hareket ederken kullanılabilecek kadar verimli mi, yoksa hareketli engelleri daha anlamlı bir şekilde ele alan başka bir yol bulma yöntemi var mı?

Yanıtlar:


27

Hareketli engelleri olan bir yolu yeniden hesaplamanız gerektiğinde A * 'dan çok daha hızlı olan birden fazla algoritma vardır. Buraya bakınız "Basit Yeniden Hesaplamalar".

Ancak, bunların hiçbiri için kullanıma hazır bir çözüm bulamayacaksınız, bu nedenle, vakaların% 99'unda bir oyun için fazla mazeret görüyorlar. Varolan, tamamen optimize edilmiş bir A * çözümü kullanarak ve oyunlarda yol bulmayı hızlandırmak için yaygın olarak kullanılan püf noktalarını kullanarak zamanınızı harcayacaksınız:

  • En iyi yolu yalnızca nadir aralıklarla yeniden hesaplama
  • En iyi yolları birden fazla birim arasında paylaşma ( örnek )
  • Hiyerarşik bir grafik oluşturmak, böylece yolun yalnızca bir kısmını yeniden hesaplamanız gerekir

etc. You can find more info about these tricks and more all over this site, or on Amit's A* pages


10

Yes. A* is still the way to go in almost every case. It's your node cost calculation that becomes dynamic and therefore more complex to calculate and track.

If you already know where the moving obstacles will be in the future your A* can take the temporality of obstacles into account in the cost function.

Örn: Bu düğüme 4 tikle ulaşılır, kene # 3'ten kene # 6'ya kadar kullanılır, bu nedenle bu düğümdeki seyahat maliyeti 6 - 4 = +2 kenedir. Bu hala en iyi yol olabilir.

Engelin hareket yönü de dikkate alınmalıdır.

Önceden bilmiyorsanız, hiçbir engel kabul edemez ve engellere ulaşıldığında yolu yeniden hesaplayabilirsiniz, ancak kilitlenmeler ve livelocks hakkında bir şeyler yapmanız gerekecektir. (Aynı şey, engellerin nerede olacağını tahmin edebiliyorsanız ancak bunun kendi içinde bir kilitlenme / livelock kaçınma türü olduğunu ve bunun amacınız için yeterince iyi olabileceğini öngörürseniz geçerlidir.)

Bir kilitlenme, ikisi de diğerinin hareket etmesini beklediğinde ve hiçbiri hareket etmediğinde olur.

Bir livelock, her ikisinin ( veya daha fazlasının <- dikkate alınması önemlidir) diğerinden aynı yönde kaçınması ve ilerleme göstermeden ileri geri gitmesidir.

Solving livelocks can become very complex and that depends entirely on your game's collision rules and mechanics (e.g.: should they fight and destroy the obstacle?).

It often comes back to having your moving objects schedule node/path reservations (don't forget cancellations when they change path or die) so other moving objects can plan ahead.

Once you have this information you can also plan interceptions.


19
Aman Tanrım, "livelock" - her zaman koridorlarda yapmak zorunda kaldığım korkunç sol-sağ kaçma olayını tarif ettiniz.
Ethan The Brave

2
Basit bir canlı / kilitlenme çözümü, mevcut seçenekler arasında rastgele seçim yapmaktır (örneğin,% 50 hareket etme şansı ve% 50 sola gitme şansı). Her oyuncu rastgele seçtiği sürece, kilit çözülecek sıfır olmayan bir şans var.
Draco18s

@Draco18s And exponentially increase the size of your flailing back and forth until one gives way (I may have just described how Ethernet collisions are resolved!)
Cort Ammon - Reinstate Monica

I suppose they could play Rock Paper Scissors or a friendly game of Petri Dish Prisoner's Dilemma instead. ;P
Draco18s
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.