A * aracılarının diğer aracılardan kaçınmasını nasıl sağlayabilirim?


19

Bir çini haritası üzerinde bir çoklu ajan A * algoritması uyguluyorum. Ajanlar sadece X ve Y eksenlerinde hareket eder. Yolları hesaplarken diğerlerinin nerede olduğunu kontrol ederek aralarındaki çarpışmalardan kaçınırım.

Ajanların aynı döşemeyi farklı yönlerden geçmek zorunda olduğu durumlar dışında iyi çalışır. Bu gibi durumlarda, bir ajanın diğerinin geçmesini beklemesi için en uygun çözüm olacaktır:

Örnek durum

Ayrıca, kuzey koridoru yoksa, yol bulma başarısız olur.

Böyle bir algoritmayı nasıl uygulayabilirim?


2
Cevapları bir "trafik AI" inşa etmek nasıl? burada alakalı.
Anko

Birkaç yorum 1) Ben iki düşman bir şekilde geçerken üst üste gelebilir% 100 Tamam düşünüyor yalnız değilim düşünüyorum. Sadece garip olacak çok gerçekçi bir stil seçerseniz, ancak diğer tarafta bir Zelda ile sorun değil. 2) (* 2, * 2) harita çözünürlüğüne sahip yola izin vermeyi düşünebilirsiniz, böylece iki düşman 1 birim genişliğinde bir yolda geçebilir. 3) Ayrıca haritalarınızı birkaç yol her zaman mevcut olacak şekilde tasarlayabilirsiniz (belki ilginç bir kısıtlama, kim bilir? :-)).
GameAlchemist

Yanıtlar:


18

Yol bulmanın başarısız olmasına izin vererek başlayabilirsiniz. Başarısızlık durumunda, ileride yol bulmayı yeniden denemek için rastgele bir zaman seçin. Bazı düşük seviyeli ağ protokolleri bu şekilde ve oldukça iyi çalışır. Yapmanız gereken, her seferinde bir tane yol oluşturmak ve bir ajanın geçeceği tüm karoları kullandığınız gibi işaretlemektir. Başka yollar başarısız olduğunda, yeniden başlatmak için rastgele zamanlayıcı yeni yol aramalarının yayılmasına ve döngü hatalarının bozulmasına yardımcı olacaktır.

Sorununuzun ikinci kısmı iki yol döndürülerek çözülebilir. İlk yol, bir bloktan başarısız olsa bile düzenli dönüştür. İkinci yol, tüm aracıları tamamen yok sayan bir yoldur. Daha sonra bu iki yoldan elde edilen bilgileri, beklemenin veya uzun yoldan gitmenin daha iyi olup olmayacağına karar vermek için kullanabilirsiniz. Bu kararın buluşsal yöntemi biraz iş gerektirecektir, ancak hiçbir şey denemekten daha iyidir.

Temsilcilerinizin bu gibi tek genişlikli koridorlarla çok fazla bloke edildiği çok kötü durumda, temsilcilerin gerçek yollarının açılmasını hızlı bir şekilde izleyebilecekleri ve açılmalarını bekleyebilecekleri güvenli noktalar eklemeniz gerekebilir (böylece ajan bekleyin ve bir koridoru engelleyin).


19

Sorununuzu çözmek yerine, limonları almanın ve limonata yapmanın bir yolu.

Yıllar önce bir arkadaşım, tam olarak tanımladığınız problemi olan çok iyi bilinen bir FPS üzerinde çalışıyordu: kısıtlanmış bir alanda belirli istenen pozisyonlara sahip bir dizi AI karakteri olurdu ve yol bulma algoritması sürekli olarak onları çarpıyordu. birbirlerine. Özellikle, oyuncu, diyelim ki, düşmanlarla dolu küçük bir odaya bir el bombası atacak ve bölgedeki AI karakterlerinin her biri çıkışlarına koşmaya çalışacak, ancak birbirlerine koşacak ve sonunda durup dönecek, başkasına vurmak, arkasını çevirmek vb. Bu çok gerçekçi değil.

Sıkı hesaplama bütçesi başarısız olduğunda başarılı bir şekilde çalışabilecek daha iyi bir yol bulma algoritması oluşturma girişimleri. Bu nedenle, yol bulma sorununu çözmek yerine, arkadaşım AI'ya çok ucuz bir kontrol ekledi: Eğer bir AI kısa bir süre içinde başka bir AI'ye iki kez çarptıysa, çıkışı bulmaya çalışın ve bunun yerine siper alın. Şimdi olan şey şu ki, PC el bombasını çalıyor ve çıkışlar için bir sürü düşman görüyor. Birbirlerine çarpanlar, arkanı dönüyorlar ve dışarı çıkamayacaklarını fark ettikleri anlaşılıyor, bu yüzden havaya uçmadan hemen önce örüyorlar ve başlarını örtüyorlar. Bu hem gerçekçi görünüyor hem de oyuncu için son derece tatmin edici.

Çarpışma üreten algoritmanızın dezavantajını ve bunu bir avantaj haline getirmenin benzer bir yolu var mı?


1
+1 Bunu beğendim, yıkıcı ve tamamen işlevsel =)
Patrick Hughes

3

Genellikle diğer yerel senaryolar için diğer yol bulma biçimleriyle A * yolunu arttırmayı en iyi şekilde bulurum; birim kaçınma genellikle bunlardan biridir, özellikle aynı anda hareket eden ve böylece dinamik blokerler oluşturan birden fazla ajanın olduğu bir dünyada).

Genellikle bunun için bir kenar takip tekniği işe yarayabilir. Bir yolu izlerken, orijinal yol hesaplamasının bir parçası olmayan bir engelleyici ile karşılaştığınızda, temel olarak bir yön seçersiniz (saat yönünde veya saat yönünün tersine) ve engelleyiciyi bu yönde dolaşarak geçmeye çalışırsınız. Yapamıyorsanız, engelleyicinin kendisini çözmesini beklersiniz (bu bir kilitlenmeye neden olabilir).

Ayrıca birimlerin işbirliği içinde yol alma yeteneğini de uygulayabilirsiniz; yani, bir birim başka bir birimden hafifçe kenara çekilmesini isteyebilir, böylece engelleme birimini "sıkıştırabilir". Bununla birlikte, karo tabanlı hareketle sınırlı olduğunuz karo tabanlı bir oyunda iyi çalışmaz, çünkü örneğiniz gibi tek genişlikli koridorlarda hala kilitlenebilirsiniz. Bu durumda, ünitelerin birbirinden "yer değiştirmesini" istemelerini sağlayabilirsiniz, bu da çoğu zaman çözümle sonuçlanır. Zaman zaman bu birimler arasında sıçramaya yol açar.

"Birim kaçınma", oyunlarda yol bulmayı tartışırken oldukça yaygın bir konudur, bunun için çok fazla isabet vardır. Özellikle Yüce Komutan 2'de kullanılan "akış alanı" yol bulma ile ilgili bu soruyu kontrol etmek isteyebilirsiniz . RTS'ler genellikle bu problemle çok fazla karşılaşırlar ve her türlü ilginç şekilde çözerler.


Bu tam olarak - yol bulmanın A * anlamına geldiğine dair çok yaygın bir algı var gibi görünüyor ve bu öyle değil.
Steven Stadnicki

2

Eğer bir dönüş tabanlı / kene tabanlı hareket sisteminiz varsa, her geçişin ajanı haritanın gelecekte nasıl görüneceğine taşıdığı bir 3D grafik oluşturabilirsiniz. Daha sonra her bir ajanın gelecekte o noktada olacakları karoları talep etmelerini ve erişilemez olarak işaretlemelerini sağlayın. Her ajan daha sonra grafikte geçiş için 3. bir yol olarak bir sonraki keneye "ẅaiting" seçeneğine sahiptir. Bu, sisteminizde daha zor olacak, ancak rastgele beklemekten daha iyi sonuçlar vermelidir. 2 ajanın bt ile iletişim kurmasına izin verirseniz daha iyi olur, eğer biri en kısa yol bu ajandan geçerse "Seni geçmek istiyorum" mesajı gönderir,


İşte o zaman küpü hakkında konuşan bir makale: www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/… ve işte bir uygulama: allseeing-i.com/ASIPathFinder
Rakka Rage

0

A * gibi bir algoritma kullanırken maliyet buluşsal yöntemiyle çalışma konusunda en büyük özgürlüğe sahip olursunuz.

Bu özel durumda, bir aracıyı başka bir ajana yakın alan hareketlerin maliyetini artırmak için sezgisel olarak ayarlayabilirsiniz, orada sorun muhtemelen üst rotayı almaya çalışmakla sonuçlanır ve sonuçta salınan tam zamanlamaya bağlı olarak, birbirleri arasında kapanırken yollar arasında ileri geri hareket eder.

Başka bir olasılık, aracıların amaçlanan rotalarını izlemek ve maliyetleri aracıların amaçlanan diğer yolları boyunca yukarı doğru ayarlamaktır. Bu, temsilcilerin birbirleriyle sınırlı bir ölçüde koordinasyon yapmasını sağlar. Burada asıl mesele, tüm güzergahların engellenip engellenmediği, hangi aracı en son hareket ettirilirse yol bulma başarısız olabilir.

Yalnızca bir yol olduğu durumda, yol bulma başarısız olur veya kilitleninceye kadar birbirlerine ilerlerler.

Bunlardan hiçbiri yeterince iyi değilse, maliyetinizi de hesaplarken zaman izlemeye başlamanız gerekir. İkinci ajanın maliyeti, birinci ajanın netleşmesi için geçen süre artı normal geçiş maliyetidir, bu şekilde ajanınız diğer yolu izlemeye karşı ne zaman bekleyeceğini doğru bir şekilde belirleyebilir.

Zamanlamayı uygun hale getirmek önemli ölçüde daha fazla çaba olabilir, bu nedenle çoğu insan, işler yeterince iyi olana kadar seviye düzenini ve maliyet değerlerini ayarlamaya karar verir.


0

Normalde yol takibi sırasında bu gibi problemleri çözmek için direksiyon davranışlarını kullanmanızı öneririm . Ve yine de, gruplama davranışından ilham almak için bunlara çok şey yapabilirsiniz. Ancak talihsiz basit karo esaslı hareket için gerçekten doğrudan uygulanamaz.

Zaten çoğu durumda çalışan bir çarpışmadan kaçınmanız olduğundan, bu özel duruma odaklanalım. Sanırım bir ajan her hareket etmek istediğinde yol bulmayı tekrar yapıyorsun, yoksa hareketleri sırasında hareket eden başkalarına nasıl tepki verdiklerini göremiyorum. İkincisi, sanırım bu ajanlar birbirlerine dostça davranıyorlar.

Sen bir ajan diğerini bekliyor öneririz ve ben tam olarak bunu tavsiye ederim. Temsilcilere diğerlerinin yollarına erişmek için bir yol verin, kendi yolunuzun diğer yolun parçası olmayan ilk döşemesini arayın ve oraya gidin. Bu teknikle ilgili sorunlar şunlar olabilir:

  1. Diğer temsilcinin etrafında kabul edilebilir başka bir yol olup olmadığına nasıl karar verirsiniz? Etrafında dolaşacak kadar boşluk varsa diğer ajanı beklemek istemezsiniz. Diğer aracıyı değerlendirirken bir yol bulma hatası, düzeltmek istediğiniz durumun açık bir işaretidir, ancak ortaya çıkardığınız örnekte bir yol bulma hatası olmayacaktır. Ancak - biraz hesaplama ile - alternatif A * yolunun size küçük bir daire içinde diğer aracıyı dolaşıp dolaşmayacağına veya kuzey koridoru gibi tamamen farklı bir yol kullanıp kullanmadığına karar verebilirsiniz.

  2. Bir ajanın bir tur / operasyon sırasında ne kadar uzağa gidebileceğini bilmiyorum, ama bu yeterince uzak değilse veya tüm ajanlar paralel hareket ederse, her iki ajan da yolun diğer ucunda beklemeye karar verir. Bu, yolunu serbest bıraktığınız diğer aracıya sinyal göndererek düzeltilebilir.


0

Olası çözümlerden biri, bu tür dar alanlarda birim çarpışmasını devre dışı bırakmak olacaktır.

Örneğin Starcraft oyununda, kristaller madenciliği yapılırken işçiler (SCV'ler, Sondalar, Dronlar) birbirleriyle çarpışmazlar.

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.