Pianificazione della pattuglia del territorio


14

Sto sviluppando un gioco / simulazione in cui gli agenti stanno combattendo per la terra. Ho la situazione mostrata nella foto qui sotto:

Un'area piastrellata verde e rossa, con "creature" di colore simile

Queste creature stanno camminando e occupando pezzi di terra su cui calpestano se sono libere. Per renderlo più interessante, voglio introdurre un comportamento di "pattugliamento", in modo tale che gli agenti stiano effettivamente camminando intorno alla loro terra per pattugliare eventuali intrusi che potrebbero voler prenderlo.

Dal punto di vista tecnico, ogni quadrato è rappresentato sia come x,yposizione che come dimensione che rappresenta la sua lunghezza laterale. Contiene anche informazioni su chi occupa la piazza. Tutti i quadrati sono memorizzati in un ArrayList.

Come posso introdurre un comportamento di pattugliamento? Quello che voglio è che ogni agente pattuglia una certa porzione dell'area (si dividono tra loro le aree che pattugliano). Il problema principale che ho riscontrato sono i seguenti:

  • L'area di terra è molto casuale, come si vede nella foto. È piuttosto difficile capire dove siano i limiti in ogni direzione.
  • In che modo gli agenti dovrebbero dividere le regioni per pattugliare?
  • Le aree di terra possono essere disgiunte, poiché la squadra avversaria può prendere il territorio dal centro.

Ho avuto l'idea di prendere il quadrato più lontano in ogni direzione, trattando quelli come i confini dell'area e dividere le regioni in base a quei confini, ma questo potrebbe includere un sacco di terra irrilevante.

Come dovrei affrontare questo problema?


1
Potresti forse esaminare alcune tecniche di elaborazione delle immagini per idee? Vari algoritmi di crescita della regione in esecuzione contemporaneamente potrebbero emanare da ciascun agente fino a quando a tutte le tessere appartenenti alla loro squadra non è stato assegnato un agente di pattugliamento.
Quetzalcoatl,

@Quetzalcoatl: bella idea, facile da implementare, ma questo porterebbe a regioni di pattuglia molto disuguali. Considera gli agenti verdi nell'immagine sopra. L'agente in alto a destra avrebbe ~ 15 quadrati da coprire, quello al centro solo 2
Junuxx

Uhm è più o meno come scegliere il blocco più vicino successivo che appartiene alla loro squadra dal blocco corrente.
Tohmas,

1
Anzi, è imperfetto. Forse piuttosto che usare gli agenti man mano che crescono i semi per la regione, i semi potrebbero inizialmente essere piantati casualmente (uno per agente). Una volta terminata la crescita della regione, forse potrebbe essere eseguita una fase di bilanciamento, trattando ogni regione come un cluster di classe con riquadri come nodi. KNearestNeighbour o KMean o simili potrebbero iterare fino a una qualche forma di convergenza, dopodiché le regioni potrebbero essere considerate approssimativamente bilanciate, con ogni agente quindi assegnato al seme più vicino (distanza euclidea?). (Penso che probabilmente sto complicando troppo questo, ci deve essere un modo più semplice ...)
Quetzalcoatl,

1
Forse ogni agente potrebbe iniziare respingendo tutti gli altri agenti come magneti. Ciò costringerà gli agenti a diversi angoli della regione. Quando gli agenti si fermano, quindi dividere la terra come suggerito da Quetzalcoatl. Le regioni dovrebbero essere più o meno uniformi.
Tyjkenn,

Risposte:


9

Domanda affascinante. Penso che uno dei primi problemi che devi affrontare sia se vuoi che il comportamento di pattugliamento sia pattugliamento "ottimale" o pattugliamento "realistico". Sto solo inventando queste parole, ma quello che voglio dire è:

Ottimale : gli agenti si muovono in modo da distribuire perfettamente la loro area di copertura per l'intero sistema.

Realistico : gli agenti si muovono e tentano di distribuirsi il più equamente possibile, ma ognuno ha accesso solo ai dati locali alla propria prospettiva.

Mi concentrerò sul secondo approccio, che penso tu possa risolvere usando la fusione ponderata di vari schemi di guida dai Comportamenti di comportamento di Craig Reynolds per personaggi autonomi . L'idea di base dei comportamenti di guida è quella di utilizzare forze semplici che si combinano per produrre una navigazione improvvisata in un ambiente. Nel tuo caso, penso che vorresti combinare i seguenti comportamenti di guida:

  • Evitamento (territorio esterno) - Gli agenti tentano di rimanere nel loro territorio ed evitare di spostarsi al di fuori di esso. Per un po 'di realismo, tuttavia, l'influenza di "uscire dal territorio" non deve essere al 100% qui. Un po 'di "taglio degli angoli" per uscire dall'area probabilmente renderebbe il movimento più realistico.

  • Vagabondo - Gli agenti tentano di continuare a muoversi ed esplorare. Questo vorrai pesare pesantemente altrimenti gli agenti cercheranno di trovare un punto di separazione ottimale l'uno dall'altro e quindi "rimani fermo".

  • Separazione (altri agenti) - Gli agenti tentano di mantenere una distanza dagli altri agenti (quindi coprono il terreno massimo e non si ammassano).

  • Cerca (invasori): gli agenti tentano di avvicinarsi a qualsiasi invasore che rilevano.

Penso che vorresti giocare con la ponderazione relativa in modo dinamico. Ad esempio, se un agente rileva un invasore, la ponderazione della separazione dovrebbe scendere. (In altre parole, devono solo sparpagliarsi quando cacciano, non quando trovano qualcuno.) Penso che se giocassi con i pesi per i quattro schemi sopra, avresti qualcosa di molto vicino a quello che stai cercando.

Ci sono alcune risorse online su come implementare "boids" che seguono i modelli di comportamento descritti. Consiglio l'implementazione open-source opensteer .


2

Un approccio è quello di registrare, per ogni cella, l'ultima volta che è stata visitata da una "guardia", e far sì che le guardie si spostino continuamente nella cella vicina che non è stata visitata più a lungo.

Naturalmente, questo presuppone che il territorio sia collegato.

Questa non è una soluzione perfetta, ma facile da codificare, adattabile alle circostanze mutevoli ed efficiente. Ho usato con successo questo algoritmo per scouting e attacchi di molestie in un rts ai che ho scritto qualche tempo fa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.