Estou desenvolvendo um jogo / simulação em que agentes estão lutando por terra. Eu tenho a situação mostrada na figura abaixo:
Essas criaturas estão andando e ocupando pedaços de terra em que pisam se estiverem livres. Para tornar isso mais interessante, quero introduzir um comportamento de "patrulhamento", de modo que os agentes estejam realmente andando por suas terras para patrulhar qualquer intruso que queira levá-la.
No lado técnico, cada quadrado é representado como uma x,y
posição e como uma dimensão representando seu comprimento lateral. Ele também contém informações sobre quem ocupa a praça. Todos os quadrados são armazenados em um ArrayList
.
Como posso introduzir um comportamento de patrulhamento? O que eu quero é que cada agente patrulhe uma certa parte da área (eles dividem entre si quais áreas patrulharão). O principal problema que encontrei é o seguinte:
- A área de terra é muito aleatória, como pode ser visto na figura. É bastante difícil entender onde estão os limites em cada direção.
- Como os agentes deveriam dividir as regiões para patrulhar?
- Áreas de terra podem ser desarticuladas, pois a equipe adversária pode tomar o território do meio.
Tive a ideia de tomar o quadrado mais distante em cada direção, tratando-os como limites da área e dividir regiões com base nesses limites, mas isso pode incluir muitas terras irrelevantes.
Como devo abordar esse problema?
Respostas:
Pergunta fascinante. Penso que um dos primeiros problemas que você deve abordar é se deseja que o comportamento de patrulhamento seja "ótimo" ou "realista". Estou apenas inventando essas palavras, mas o que quero dizer é:
Ótimo : os agentes se movimentam de uma maneira que distribui perfeitamente sua área de cobertura para o sistema como um todo.
Realistas : os agentes se movimentam e tentam se distribuir o mais igualmente possível, mas cada um só tem acesso a dados locais de acordo com sua perspectiva.
Vou focar na segunda abordagem, que acho que você pode resolver usando a mistura ponderada de vários padrões de direção dos comportamentos de direção de Craig Reynolds, para caracteres autônomos . A idéia básica dos comportamentos de direção é usar forças simples que se combinam para produzir navegação improvisada em torno de um ambiente. No seu caso, acho que você deseja combinar os seguintes comportamentos de direção:
Prevenção (território externo) - Os agentes tentam permanecer dentro de seu território e evitam sair dele. Para algum realismo, porém, a influência de "sair" do território não precisa ser 100% aqui. Um pouco de "cortar cantos" para sair da área provavelmente resultaria em movimentos mais realistas.
Vagando - Os agentes tentam continuar andando e explorando. Esse aqui você vai querer pesar muito, caso contrário, os agentes tentarão encontrar um ponto de separação ideal um do outro e depois "permanecerão".
Separação (outros agentes) - Os agentes tentam manter distância de outros agentes (para cobrir o terreno máximo e não se amontoar).
Procurar (invasores) - Os agentes tentam se aproximar de todos os invasores que detectam.
Eu acho que você gostaria de brincar dinamicamente com o peso relativo. Por exemplo, se um agente detectar um invasor, a ponderação da separação deve diminuir. (Em outras palavras, eles só precisam se espalhar quando estão caçando, e não quando encontram alguém.) Acho que se você brincasse com os pesos dos quatro padrões acima, teria algo bem próximo do que você ' está procurando.
Existem alguns recursos online sobre como implementar "boids" que seguem os padrões de comportamento descritos. Eu recomendo o opensteer de implementação de código aberto .
fonte
Uma abordagem é registrar, para cada célula, a última vez que foi visitado por um "guarda", e fazer com que os guardas se movam continuamente para a célula vizinha que tenha sido mais visitada por mais tempo.
Obviamente, isso pressupõe que o território esteja conectado.
Esta não é uma solução perfeita, mas fácil de codificar, adaptável às novas circunstâncias e eficiente. Eu tenho usado com sucesso esse algoritmo para ataques de aferição e assédio em um rts ai que escrevi há algum tempo.
fonte