Planificación de patrullas territoriales

14

Estoy desarrollando un juego / simulación donde los agentes están luchando por la tierra. Tengo la situación que se muestra en la imagen a continuación:

Un área de mosaico verde y rojo, con "criaturas" de colores similares

Estas criaturas están caminando y ocupando trozos de tierra que pisan si son libres. Para hacer esto más interesante, quiero introducir un comportamiento de "patrullaje", de modo que los agentes estén caminando por sus tierras para patrullar de cualquier intruso que quiera tomarlo.

En el lado técnico, cada cuadrado se representa como una x,yposición, así como una dimensión que representa la longitud de su lado. También contiene información sobre quién ocupa la plaza. Todos los cuadrados se almacenan en un ArrayList.

¿Cómo puedo introducir el comportamiento de patrullaje? Lo que quiero es que cada agente patrulle una determinada parte del área (se dividen entre sí qué áreas patrullarán). El problema principal que he encontrado son los siguientes:

  • El área de tierra es muy aleatoria, como se ve en la imagen. Es bastante difícil entender dónde están los límites en cada dirección.
  • ¿Cómo deberían los agentes dividir las regiones para patrullar?
  • Las áreas de tierra pueden ser disjuntas, ya que el equipo contrario puede tomar territorio desde el medio.

Tuve la idea de tomar el cuadrado más alejado en cada dirección, tratarlos como los límites del área y dividir las regiones en función de esos límites, pero esto podría incluir muchas tierras irrelevantes.

¿Cómo debería abordar este problema?

Tohmas
fuente
1
¿Quizás podría mirar algunas técnicas de procesamiento de imágenes para obtener ideas? Varios algoritmos de crecimiento regional que se ejecutan simultáneamente podrían emanar de cada agente hasta que todos los mosaicos pertenecientes a su equipo hayan sido asignados a un agente de patrulla.
Quetzalcóatl
@Quetzalcoatl: Buena idea, fácil de implementar, pero esto llevaría a regiones de patrulla muy desiguales. Considere los agentes verdes en la imagen de arriba. El agente superior derecho tendría ~ 15 cuadrados para cubrir, el del centro solo 2.
Junuxx
Um es más o menos como elegir el siguiente bloque más cercano que pertenece a su equipo del bloque actual.
Tohmas
1
De hecho, es imperfecto. Quizás, en lugar de utilizar los agentes como semillas para el crecimiento de la región, las semillas podrían plantarse al azar inicialmente (una por agente). Una vez que la región crece ha terminado, tal vez se podría realizar un paso de equilibrio, tratando cada región como un grupo de clase con mosaicos como nodos. KNearestNeighbour o KMean o similar podría iterar hasta alguna forma de convergencia, con lo cual las regiones podrían considerarse más o menos equilibradas, con cada agente asignado a la semilla más cercana (¿distancia euclidiana?). (Creo que probablemente estoy complicando demasiado esto, tiene que haber una manera más simple ...)
Quetzalcóatl
1
Quizás cada agente podría comenzar por repeler a todos los demás agentes como imanes. Eso obligará a los agentes a diferentes rincones de la región. Cuando los agentes se detengan, dividan la tierra como sugirió Quetzalcóatl. Las regiones deberían ser aproximadamente iguales.
tyjkenn

Respuestas:

9

Pregunta fascinante Creo que uno de los primeros problemas que debe abordar es si desea que el comportamiento de patrullaje sea "óptimo" o "realista". Solo estoy inventando estas palabras, pero lo que quiero decir es:

Óptimo : los agentes se mueven de una manera que distribuye perfectamente su área de cobertura para todo el sistema.

Realista : los agentes se mueven e intentan distribuirse lo más equitativamente posible, pero cada uno solo tiene acceso a los datos locales desde su perspectiva.

Me voy a centrar en el segundo enfoque, que creo que puedes resolver usando una combinación ponderada de varios patrones de dirección de los Comportamientos de dirección de Craig Reynolds para personajes autónomos . La idea básica de los comportamientos de dirección es usar fuerzas simples que se combinan para producir una navegación improvisada alrededor de un entorno. En su caso, creo que le gustaría combinar los siguientes comportamientos de dirección:

  • Evitación (fuera del territorio): los agentes intentan permanecer dentro de su territorio y evitan moverse fuera de él. Sin embargo, para algunos realistas, la influencia de "salir" del territorio no tiene por qué ser del 100% aquí. Un poco de "corte de esquinas" para salir del área probablemente resultaría en un movimiento más realista.

  • Errante : los agentes intentan seguir moviéndose y explorando. Este va a querer pesar mucho de lo contrario los agentes van a tratar de encontrar un punto de separación óptimo entre sí y luego "quedarse".

  • Separación (otros agentes): los agentes intentan mantener una distancia de otros agentes (para que cubran el terreno máximo y no se agrupen).

  • Buscar (invasores): los agentes intentan acercarse a cualquier invasor que detecten.

Creo que te gustaría jugar con la ponderación relativa de forma dinámica. Por ejemplo, si un agente detecta a un invasor, la ponderación de separación debería descender. (En otras palabras, solo necesitan extenderse cuando están cazando, no cuando encuentran a alguien). Creo que si jugaras con los pesos de los cuatro patrones anteriores, tendrías algo bastante cercano a lo que tú ''. que estas buscando.

Hay bastantes recursos en línea sobre cómo implementar "boids" que siguen los patrones de comportamiento descritos. Recomiendo la implementación de código abierto opensteer .

Cameron Fredman
fuente
2

Un enfoque es registrar, para cada celda, cuándo fue visitado por última vez por un "guardia", y hacer que los guardias se muden continuamente a la celda vecina que no haya sido visitada por más tiempo.

Por supuesto, esto supone que el territorio está conectado.

Esta no es una solución perfecta, pero fácil de codificar, adaptativa a las circunstancias cambiantes y eficiente. He utilizado con éxito este algoritmo para ataques de exploración y acoso en un rts ai que escribí hace un tiempo.

Meriton
fuente