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:
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,y
posició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?
Respuestas:
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 .
fuente
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.
fuente