Planejamento de patrulha do território


14

Estou desenvolvendo um jogo / simulação em que agentes estão lutando por terra. Eu tenho a situação mostrada na figura abaixo:

Uma área de azulejos verde e vermelho, com "criaturas" de cores semelhantes

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,yposiçã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?


1
Talvez você possa procurar algumas técnicas de processamento de imagem para obter idéias. Vários algoritmos de crescimento de região em execução simultaneamente poderiam emanar de cada agente até que todos os blocos pertencentes a sua equipe recebessem um agente de patrulha.
Quetzalcoatl

@Quetzalcoatl: Boa ideia, fácil de implementar, mas isso levaria a regiões de patrulha muito desiguais. Considere os agentes verdes na imagem acima. O agente superior direito teria ~ 15 quadrados para cobrir, o do centro apenas 2.
Junuxx:

Hum é mais ou menos como escolher o próximo bloco mais próximo que pertence à sua equipe no bloco atual.
Tohmas

1
Na verdade, é imperfeito. Talvez, em vez de usar os agentes como sementes para a região cresçam, as sementes possam ser plantadas aleatoriamente inicialmente (uma por agente). Depois que a região cresce, talvez seja possível executar uma etapa de equilíbrio, tratando cada região como um cluster de classe com blocos como nós. O KNearestNeighbour ou KMean ou similar podem repetir-se até alguma forma de convergência, com as quais as regiões podem ser consideradas mais ou menos equilibradas, com cada agente sendo atribuído à semente mais próxima (distância euclidiana?). (Eu acho que provavelmente estou complicar isso, tem que haver uma maneira mais simples ...)
Quetzalcoatl

1
Talvez cada agente possa começar repelindo todos os outros agentes como ímãs. Isso forçará os agentes a diferentes cantos da região. Quando os agentes descansarem, divida a terra como Quetzalcoatl sugeriu. As regiões devem ser mais ou menos uniformes.
tyjkenn

Respostas:


9

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 .


2

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.