Bölge devriye planlaması


14

Temsilcilerin kara için savaştığı bir oyun / simülasyon geliştiriyorum. Aşağıdaki resimde gösterilen durum var:

Yeşil ve kırmızı kiremitli, benzer renkte "yaratıklar" alanı

Bu yaratıklar etrafta dolaşıyor ve özgür olmaları halinde üzerine bastıkları toprak parçalarını işgal ediyorlar. Bunu daha ilginç hale getirmek için, "devriye gezme" davranışını tanıtmak istiyorum, öyle ki ajanlar aslında onu almak isteyebilecek davetsiz misafirlerden devriye gezmek için topraklarında dolaşıyorlar.

Teknik tarafta, her kare bir x,ykonumun yanı sıra yan uzunluğunu temsil eden bir boyut olarak temsil edilir. Aynı zamanda meydanı kimin işgal ettiği hakkında bilgi içerir. Tüm kareler bir ArrayList.

Devriye davranışını nasıl tanıtabilirim? Ne istiyorum her ajan alanın belirli bir bölümünü devriye (onlar devriye hangi alanlarda kendi aralarında bölmek). Bulduğum ana sorun şöyledir:

  • Resimde görüldüğü gibi arazi alanı çok rastgele. Sınırların her yönde nerede olduğunu anlamak oldukça zordur.
  • Ajanlar bölgeleri devriye gezmek için nasıl bölmeliler?
  • Arazi alanları ayrık olabilir, çünkü rakip takım ortadan toprak alabilir.

Her yöndeki en uzak kareyi alma, bunları bölgenin sınırları olarak ele alma ve bölgeleri bu sınırlara göre bölme fikrim vardı, ancak bu çok alakasız arazi içerebilir.

Bu soruna nasıl yaklaşmalıyım?


1
Belki de fikirler için bazı görüntü işleme tekniklerine bakabilirsiniz? Eşzamanlı olarak çalışan çeşitli bölge büyüme algoritmaları, ekibine ait tüm karolara bir devriye ajanı atanana kadar her ajandan ortaya çıkabilir.
Quetzalcoatl

@Quetzalcoatl: Güzel fikir, uygulanması kolay, ancak bu çok eşit olmayan devriye bölgelerine yol açacaktır. Yukarıdaki görüntüdeki yeşil ajanları düşünün. Sağ üstteki ajanın kaplayacağı ~ 15 karesi olacak, merkezde sadece 2 tane olacak.
Junuxx

Um, bu, hemen hemen takımına ait olan bir sonraki en yakın bloğu seçmek gibi.
Tohmas

1
Gerçekten de, kusurludur. Belki de ajanları bölge için tohum olarak kullanmak yerine, tohumlar başlangıçta rastgele ekilebilir (ajan başına bir tane). Bölge büyüdükten sonra, her bir bölgeyi fayanslarla bir sınıf kümesi gibi düğüm olarak ele alan bir dengeleme adımı gerçekleştirilebilir. KNearestNeighbour veya KMean veya benzeri bir tür yakınsamaya kadar tekrarlanabilir, bunun üzerine bölgeler kabaca dengelenmiş olarak kabul edilebilir, daha sonra her ajan en yakın tohuma (öklid mesafesi?) Atanır. (Ben muhtemelen bunu aşırı karmaşık düşünüyorum, daha basit bir yolu olmalı ...)
Quetzalcoatl

1
Belki de her ajan mıknatıs gibi diğer tüm ajanları iterek başlayabilir. Bu, ajanları bölgenin farklı köşelerine zorlar. Ajanlar dinlenince, araziyi Quetzalcoatl'un önerdiği gibi bölün. Bölgeler kabaca eşit olmalıdır.
22j13

Yanıtlar:


9

Büyüleyici bir soru. Ele almanız gereken ilk sorunlardan biri, devriye gezme davranışının "optimum" devriye gezme veya "gerçeğe yakın" devriye gezdirme isteyip istemediğinizdir. Ben sadece bu kelimeleri uyduruyorum ama demek istediğim:

Optimum : Temsilciler, kapsama alanlarını sistem için bir bütün olarak mükemmel şekilde dağıtacak şekilde hareket ederler.

Gerçekçi : Temsilciler hareket eder ve kendilerini olabildiğince eşit dağıtmaya çalışırlar, ancak her birinin yalnızca kendi perspektiflerine göre yerel verilere erişimi vardır.

İkinci yaklaşıma odaklanacağım, ki Craig Reynolds'un Otonom Karakterler için Direksiyon Davranışları'ndan çeşitli direksiyon modellerinin ağırlıklı harmanlamasını kullanarak çözebilirsiniz . Yönlendirme davranışlarının temel fikri, bir ortamda doğaçlama navigasyon üretmek için bir araya gelen basit güçleri kullanmaktır. Sizin durumunuzda, aşağıdaki yönlendirme davranışlarını birleştirmek istediğinizi düşünüyorum:

  • Kaçınma (dış bölge) - Temsilciler kendi topraklarında kalmaya ve dışına taşınmaktan kaçınmaya çalışırlar. Yine de bazı gerçekçilik için, bölgenin "dışına çıkmanın" etkisinin% 100 olması gerekmez. Alanın dışına çıkmak için biraz "köşeleri kesmek" muhtemelen daha gerçekçi bir hareket sağlayacaktır.

  • Gezinme - Ajanlar etrafta dolaşmaya ve keşfetmeye çalışır. Bu, ağır bir şekilde tartmak isteyeceksiniz, aksi takdirde ajanlar birbirinden en uygun ayırma noktasını bulmaya çalışacak ve daha sonra "kalmaya" çalışacaklar.

  • Ayırma (diğer ajanlar) - Temsilciler diğer ajanlardan uzak durmaya çalışırlar (böylece maksimum zemini kaplarlar ve kümelenmezler).

  • Ara (işgalciler) - Temsilciler algıladıkları istilacıları kapatmaya çalışır.

Dinamik olarak göreceli ağırlıklandırma ile oynamak isteyeceğinizi düşünüyorum. Örneğin, bir ajan bir istilacı tespit ederse, ayırma ağırlığı düşmelidir. (Başka bir deyişle, sadece birini bulduklarında değil, avlandıklarında yayılmaları gerekir.) Sanırım yukarıdaki dört model için ağırlıklarla oynasaydın, seninkine oldukça yakın bir şey olurdu ' yeniden arıyor.

Açıklanan davranış örüntülerini izleyen "tekliflerin" nasıl uygulanacağı konusunda çevrimiçi olarak birkaç kaynak vardır. Açık kaynak kodlu uygulama opensteer öneririm .


2

Bir yaklaşım, her hücre için, bir "bekçi" tarafından en son ziyaret edildiği zamanı kaydetmek ve gardiyanların sürekli olarak en uzun ziyaret edilmemiş komşu hücreye gitmesini sağlamaktır.

Tabii ki, bu bölgenin bağlı olduğunu varsayar.

Bu mükemmel bir çözüm değil, kodlaması kolay, değişen koşullara uyarlanabilir ve verimlidir. Bu algoritmayı bir süre önce yazdığım bir rts ai'de keşif ve taciz saldırıları için başarıyla kullandım.

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.