Kaçmak için patika


61

Bildiğiniz gibi, A noktasından B noktasına giden 2 boyutlu bir ortamda en iyi yolu bulmak için dolaşırken çok sayıda çözüm vardır.

Ancak bir nesne A noktasındayken ve B noktasından olabildiğince hızlı ve uzaklaşmak istediğinde bir yolu nasıl hesaplarım?

Biraz arka plan bilgisi: Oyunum, karo tabanlı olmayan ancak kayan nokta doğruluğuna sahip 2d bir ortam kullanıyor. Hareket vektör tabanlıdır. Yol bulma, oyun dünyasını yürünebilir veya yürümeye elverişli olmayan dikdörtgenlere ayırmak ve köşelerinden bir grafik oluşturmak suretiyle gerçekleştirilir. Zaten Dijkstras algoritması kullanarak çalışan noktalar arasında yol bulma var. Kaçan algoritmanın kullanım durumu, bazı durumlarda oyunumdaki aktörlerin başka bir aktörü tehlike olarak algılaması ve ondan kaçması gerektiğidir.

Önemsiz çözüm, aktörü, “güvenli” bir mesafeye ulaşılıncaya veya aktörün korku ile kaplandığı bir duvara ulaşana kadar, bir vektörü tehditten zıt yönde bir yönde hareket ettirmektir.

Bu yaklaşımla ilgili sorun, oyuncuların kolayca dolaşabilecekleri küçük engeller tarafından engellenmesidir. Duvar boyunca hareket etmek, onları yapabilecekleri tehdide yaklaştırmayacağı sürece, ilk etapta engellerden kaçmaları daha akıllıca olacaktır:

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

Gördüğüm bir diğer sorun harita geometrisindeki çıkmazlarla. Bazı durumlarda, bir varlık onu şimdi daha çabuk alan bir yoldan seçmeli, ancak tuzağa düştüğü bir çıkmaza, ya da ilk başta tehlikeden uzak duramayacağı anlamına gelen başka bir patikaya (veya biraz daha yakın olsa da) ancak diğer taraftan, sonunda onları daha da uzağa götüreceği için çok daha uzun vadeli bir ödülü olurdu. Yani buralardan gitmeyi kısa süreli ödül hızlı bir şekilde buralardan gitmeyi uzun vadeli ödül karşı değer verilmesi gerekir uzak .

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

Bir aktörün çok daha büyük bir tehditten uzaklaşmak için küçük bir tehdide yaklaşmayı kabul etmesi gereken durumlar için başka bir derecelendirme problemi de vardır. Ancak, tüm küçük tehditleri tamamen görmezden gelmek de aptalca olacaktır (bu grafikteki aktör, sağ üstteki küçük tehditlerden kaçınmak için kendi yolundan çıkıyor):

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

Bu problem için herhangi bir standart çözüm var mı?


8
+1 Harika görsellerle harika bir soru. Bu gerçekten soruyu netleştiriyor.
MichaelHouse

Yanıtlar:


24

Bu en iyi çözüm olmayabilir, ancak bu oyun için kaçan bir AI oluşturmak için benim için çalıştı .

Adım 1. Dijkstra algoritmasını A * 'ya dönüştürün . Bu sadece hedefe kalan minimum mesafeyi ölçen bir sezgisel ekleme ekleyerek basit olmalıdır. Bu sezgisel, bir düğümü çizerken şimdiye kadar kat edilen mesafeye eklenir. Yine de bu değişikliği yapmalısınız, çünkü yol bulucunuzu önemli ölçüde artıracaktır.

Adım 2. Hedefine olan mesafeyi tahmin etmek yerine, tehlike (ler) ile arasındaki mesafeyi ölçmek ve bu değeri yok etmek için sezgisel bir varyasyon oluşturun. Bu hiçbir zaman bir hedefe ulaşmayacak (hiçbiri olmadığı için), bu nedenle aramayı belirli bir mesafeye ulaşdıktan sonra veya belirli tüm mesafeler ele alındıktan sonra belirli sayıda tekrarlamadan sonra bir noktada sonlandırmanız gerekir. Bu çözüm etkili bir şekilde verilen sınırlama ile en iyi çıkış yolunu bulan bir yol bulma aracı oluşturur.


1
Sadece 2. aşamadaki sezgisel olarak tehlikeden düz çizgi mesafesi gibi bir şey kullanmanın genel olarak kabul edilebilir bir sezgisel vermeyeceğini unutmayın. Elbette, bu yine de kullanmayı deneyemeyeceğiniz anlamına gelmez, ancak optimal kaçış yolları oluşturmayabilir. Bu "ters A *" için kabul edilebilir bir sezgisel buluşma elde etmek için, her karenin tehlikeden gerçek mesafesini hesaplamak için normal A * / Dijkstra'yı kullanmanız gerektiğini düşünüyorum.
Ilmari Karonen

+1 Bence bu sonuç almak için harcadığınız paranın karşılığını en iyi şekilde alır.
MichaelHouse

33

Oyuncularınızın kaçma konusunda akıllı olmalarını istiyorsanız, sadece düz Dijkstra / A * yol bulma onu kesmeyecektir. Bunun nedeni, bir düşmandan en uygun kaçış yolunu bulmak için aktörün aynı zamanda düşmanın peşinde nasıl hareket edeceğini de düşünmesi gerekir.

Aşağıdaki MS Paint şeması, düşmanla mesafeyi maksimize etmek için yalnızca statik yol bulmanın kullanılmasının, en düşük sonuçlara yol açacağı belirli bir durumu göstermelidir:

P şeklinde bir labirentte düşmandan kaçan bir aktörün şeması

Burada, yeşil nokta kırmızı noktadan kaçıyor ve atılması gereken bir yol için iki seçeneğe sahip. Sağ taraftaki yoldan gitmek, kırmızı noktanın mevcut konumundan çok daha ileri gitmesine izin verecek , ancak sonunda yeşil noktayı çıkmaz bir şekilde tutacaktır. Bunun yerine en uygun strateji, yeşil noktanın daire etrafında koşmaya devam etmesi ve bunun karşısında kırmızı noktadan kalmaya çalışılmasıdır.

Bu tür kaçış stratejilerini doğru bir şekilde bulmak için, minimax araması veya alfa-beta budaması gibi iyileştirmeler gibi bir ters arama algoritmasına ihtiyacınız olacak . Yukarıdaki senaryoya yeterli bir arama derinliği ile uygulanan böyle bir algoritma, çıkmaz yolu sağa götürmenin kaçınılmaz olarak yakalamaya yol açacağını, çemberde kalmanın (yeşil nokta dışına çıkmadığı sürece) kaçınılmaz olarak yakalanmaya yol açacağını doğru şekilde tespit edecektir. kırmızı olanı).

Elbette, her iki türden birden fazla oyuncu varsa, bunların hepsinin kendi stratejilerini planlaması gerekir - ayrı olarak veya eğer oyuncular birlikte çalışıyorsa. Bu çok oyunculu kovalamaca / kaçış stratejileri şaşırtıcı şekilde karmaşık hale gelebilir; örneğin, kaçan bir oyuncu için olası bir strateji düşmanı daha cazip bir hedefe doğru yönlendirerek dikkatini dağıtmaya çalışmaktır. Tabii ki, bu diğer hedefin optimal stratejisini etkileyecektir, vb.

Uygulamada, muhtemelen birçok ajanla gerçek zamanlı olarak çok derin aramalar yapamayacağınız için, sezgisel araştırmalara çok güvenmek zorunda kalacaksınız. Bu sezgisellerin seçimi, aktörünüzün "psikolojisini" - ne kadar akıllı davrandıklarını, farklı stratejilere ne kadar dikkat ettiklerini, ne kadar işbirlikçi veya bağımsız olduklarını vb. Belirleyecektir.


7

Yol bulma hakkınız var, böylece iyi bir yer seçmek için sorunu azaltabilirsiniz.

Harita üzerinde kesinlikle güvenli hedefler varsa (örneğin, tehdidin aktörünüzü takip edemediği durumlardan çıkarsa), yakındaki bir veya daha fazlasını seçin ve hangisinin en düşük yol maliyetine sahip olduğunu bulun.

Kaçan aktörünüzün iyi silahlanmış arkadaşları varsa veya harita, aktörün bağışıklık kazandığı ancak tehdidin olmadığı tehlikeler içeriyorsa, böyle bir arkadaşın veya tehlikenin yakınında açık bir yer seçin ve bunun yolunu bulun.

Eğer kaçan aktörünüz, tehdidin de ilgilenebileceği diğer aktörlerden daha hızlıysa, diğer aktörün yönünde, ancak bunun ötesinde bir nokta seçin ve bu noktaya doğru ilerleyin: "Ayıyı atlatmak zorunda değilim. "Sadece seni aşmak zorundayım."

Kaçma veya tehdidi öldürme ya da rahatsız etme olasılığı olmadan aktörünüz mahkumdur, değil mi? Öyleyse kaçmak için rastgele bir nokta seçin ve oraya gelirseniz ve tehdit hala sizi takip ediyorsa, cehennem: dönüş ve savaş.


7

Uygun bir hedef pozisyon belirleme birçok durumda oldukça zor olabileceğinden, 2D doluluk ızgara haritalarına dayanan aşağıdaki yaklaşım dikkate alınmaya değer olabilir. Genel olarak "değer yinelemesi" olarak adlandırılır ve degrade iniş / çıkış ile birleştirildiğinde, basit ve oldukça verimli (uygulamaya bağlı olarak) yol planlama algoritması verir. Basitliği nedeniyle, mobil robotlarda, özellikle iç mekanlarda gezinen "basit robotlar" için iyi bilinmektedir. Yukarıda belirtildiği gibi, bu yaklaşım, açık bir şekilde bir hedef pozisyonu açıkça belirtmeden bir başlangıç ​​konumundan uzakta bir yol bulmak için bir yol sağlar. Varsa isteğe bağlı olarak bir hedef konum belirtilebileceğini unutmayın. Ayrıca, yaklaşım / algoritma bir genişlik ilk arama oluşturur,

İkili durumda, 2B doluluk ızgara haritası, dolgulu ızgara hücreleri için bir tanedir ve başka bir yerde sıfırdır. Bu doluluk değerinin [0,1] aralığında da sürekli olabileceğine dikkat edin, aşağıdakine geri döneceğim. Belirli bir ızgara-hücresi değeri g i olan V (g i ) .

Temel Sürüm

  1. Bu ızgara hücresinin g 0 başlangıç ​​konumunu içerdiğini varsayalım. V (g 0 ) = 0 olarak ayarlayın ve g 0'ı bir FIFO kuyruğuna koyun .
  2. Bir sonraki ızgara hücresi al g i sırasından.
  3. Tüm komşular için gr j ait g i :
    • Eğer g j meşgul değilse ve daha önce ziyaret edilmediyse:
      • V (g j ) = V (g i ) +1
      • Mark g j ziyaret ettiği.
      • FIFO kuyruğuna g j ekleyin .
  4. Belirli bir mesafe eşiğine henüz ulaşılmadıysa, (2) ile devam edin, aksi halde (5) ile devam edin.
  5. Yol, g 0 dan başlayarak en dik degrade tırmanışı izleyerek elde edilir .

4. Adımla ilgili notlar.

  • Yukarıda verildiği gibi, adım (4.), yukarıda / açıklamada açıklık / kısalık nedenlerinden dolayı ihmal edilen kapsanan mesafenin izlenmesini gerektirir.
  • Bir hedef pozisyon verilirse, hedef pozisyona ulaşır ulaşmaz yineleme durdurulur, yani 3. adımın bir parçası olarak işlenir / ziyaret edilir.
  • Elbette, bütün grid haritasını basitçe işlemek, yani tüm (serbest) grid hücreleri işlenene / ziyaret edilene kadar devam etmek de mümkündür. Sınırlayıcı faktör, açıkça ızgara haritasının çözünürlüğü ile birlikte boyutudur.

Eklentiler ve Ek Yorumlar

V (g j ) = V (g i ) +1 güncelleme denklemi , aşağı veya aşağı ölçekleme V (g j ) ile her türlü ek sezgiselliği uygulamak için bol miktarda alan bırakırveya belirli yol seçeneklerinin değerini azaltmak için ilave bileşen. Çoğu olmasa da, bu tür değişiklikler, ilk, ikili ızgara haritasının bir ön-işlem aşamasını etkili bir şekilde oluşturan [0,1] 'den sürekli değerleri olan bir ızgara haritası kullanılarak güzel ve genel olarak dahil edilebilir. Örneğin, engel sınırları boyunca 1 ila 0 arasında bir geçiş eklemek, "aktör" ün tercihen engellerden uzak durmasına neden olur. Böyle bir ızgara haritası, örneğin ikili versiyondan bulanıklaştırma, ağırlıklandırılmış dilatasyon veya benzeri yöntemlerle üretilebilir. Tehditleri ve düşmanları büyük bulanıklaştırma yarıçapına sahip engeller olarak eklemek, bunlara yaklaşan yolları cezalandırır. Bir de şunun gibi genel harita üzerinde bir difüzyon işlemi kullanabilir:

V (g j ) = (1 / (N + 1)) × [V (g j ) + toplam (V (g i ))]]

burada " toplam ", tüm komşu ızgara hücrelerinin üzerindeki toplamı ifade eder. Örneğin, ikili bir harita oluşturmak yerine, başlangıç ​​(tamsayı) değerleri, tehditlerin büyüklüğü ile orantılı olabilir ve "küçük" tehditler içeren engeller olabilir. Difüzyon işlemini uyguladıktan sonra ızgara değerleri [0,1] olarak ölçeklenmeli / ölçeklenmeli ve engeller, tehditler ve düşmanlar tarafından işgal edilen hücreler 1 olarak ayarlanmalı / zorlanmalıdır. Aksi halde güncelleme denklemindeki ölçeklendirme istediğiniz gibi çalışmaz.

Bu genel şema / yaklaşımda birçok değişiklik var. Engeller vb. Küçük değerlere sahip olabilirken, serbest ızgara hücreleri hedefe bağlı olarak son adımda gradyan inişini gerektirebilecek büyük değerlere sahip olabilir. Her durumda, yaklaşım, IMHO, şaşırtıcı biçimde çok yönlü, uygulanması oldukça kolay ve potansiyel olarak oldukça hızlıdır (ızgara haritası boyutuna / çözünürlüğüne tabi). Son olarak, belirli bir hedef pozisyonu kabul etmeyen birçok yol planlama algoritmasında olduğu gibi, çıkmazlara takılma riski de vardır. Bir dereceye kadar, bu riski azaltmak için son adımdan önce özel işlem sonrası adımları uygulamak mümkün olabilir.

Java-Script'te (?) Bir resim bulunan bir başka kısa açıklama da, çizim tarayıcımda çalışmadı :(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

Planlama ile ilgili daha fazla ayrıntı aşağıdaki kitapta bulunabilir. Değer yinelemesi özellikle Bölüm 2, Bölüm 2.3.1 Optimal Sabit Uzunluk Planları bölümünde tartışılmaktadır.

http://planning.cs.uiuc.edu/

Yardımcı olur umarım, saygılarımla, Derik.


3

Yırtıcı hayvanlara odaklanmaya ne dersiniz? Şimdi Predator'ın pozisyonunda, uygun yoğunlukta 360 derece yeniden deneyelim. Ve sığınak örnekleri alabiliriz. Ve en iyi sığınağı seç.

dava 1

durum 2


0

Hayvan sürüleri için Star Trek Online'da sahip oldukları bir yaklaşım, sadece açık bir yön seçmek ve hayvanlara belli bir mesafeden sonra hızlı bir şekilde üremelerini sağlamak. Ancak bu, size saldırmaktan korkmanız gereken ve gerçek savaş çeteleri için uygun olmayan sürüler için çoğunlukla yüceltilmiş bir yumurtlama animasyonu.

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.