영토 순찰 계획


14

에이전트가 토지를 놓고 싸우는 게임 / 시뮬레이션을 개발 중입니다. 아래 그림과 같은 상황이 있습니다.

비슷한 색깔의 "생물"을 가진 녹색과 적색 타일 영역

이 생물들은 걸어 다니며 자유 로워지면 밟는 땅을 차지합니다. 이것을 더욱 흥미롭게하기 위해, 나는“순찰”행동을 소개하고 싶습니다. 요원들이 실제로 자신의 땅을 걸어 다니고 싶어하는 침입자로부터 순찰하고 있습니다.

기술 측면에서 각 사각형은 x,y측면 길이를 나타내는 위치뿐만 아니라 위치로 표시됩니다 . 또한 누가 사각형을 차지하는 지에 대한 정보도 포함합니다. 모든 사각형은에 저장됩니다 ArrayList.

순찰 행동을 어떻게 소개 할 수 있습니까? 내가 원하는 것은 각 요원이 해당 지역의 특정 부분을 순찰하는 것입니다 (순찰 할 지역을 나눕니다). 내가 찾은 주요 문제는 다음과 같습니다.

  • 그림에서 볼 수 있듯이 토지 면적은 매우 임의적입니다. 각 방향의 경계가 어디에 있는지 이해하기는 다소 어렵습니다.
  • 요원들은 지역을 순찰하기 위해 어떻게 분할해야합니까?
  • 상대 팀이 중간에서 영토를 차지할 수 있기 때문에 토지 영역이 분리 될 수 있습니다.

나는 각 방향으로 가장 큰 사각형을 가져 와서 그 경계를 지역의 경계로 취급하고 그 경계를 기준으로 지역을 나누는 아이디어를 가지고 있었지만 여기에는 관련이없는 토지가 많이 포함될 수 있습니다.

이 문제에 어떻게 접근해야합니까?


1
아마도 당신은 아이디어를위한 이미지 처리 기술을 볼 수 있습니까? 팀에 속한 모든 타일에 순찰 요원이 할당 될 때까지 동시에 실행되는 다양한 지역 성장 알고리즘이 각 요원에서 나올 수 있습니다.
케찰코아틀

@Quetzalcoatl : 좋은 아이디어, 구현하기 쉽지만 순찰 지역이 매우 불균형합니다. 위 이미지에서 녹색 에이전트를 고려하십시오. 오른쪽 상단 에이전트는 커버 ~ 15 개 사각형, 단지 2. 중앙에있는 한 것
Junuxx

Um은 현재 블록에서 팀에 속한 가장 가까운 다음 블록을 선택하는 것과 비슷합니다.
Tohmas

1
실제로, 그것은 불완전합니다. 아마도 그 지역의 씨앗으로 씨앗을 사용하는 대신에 씨앗을 무작위로 심을 수 있습니다 (에이전트 당 하나씩). 일단 영역이 성장하면, 밸런싱 단계가 수행 될 수 있으며, 각 영역을 타일이 노드 인 클래스 클러스터처럼 취급 할 수 있습니다. KNearestNeighbour 또는 KMean 또는 이와 유사한 기능은 어떤 형태의 수렴이 반복 될 때까지 반복 될 수 있으며, 그에 따라 각 에이전트가 가장 가까운 종자 (유클리드 거리?)에 할당되어 지역이 대략 균형을 잡은 것으로 간주 될 수 있습니다. (나는 아마도 이것을 지나치게 복잡하게 생각합니다, 더 간단한 방법이 있어야합니다 ...)
Quetzalcoatl

1
아마도 각 에이전트는 자석과 같은 다른 모든 에이전트를 격퇴하여 시작할 수 있습니다. 그러면 상담원이 해당 지역의 다른 구석으로 강제 이동합니다. 요원이 휴식을 취하면 케찰코아틀이 제안한대로 땅을 나눕니다. 지역은 대략 균일해야합니다.
tyjkenn 's

답변:


9

매혹적인 질문. 여러분이 해결해야 할 첫 번째 문제 중 하나는 순찰 행동이 "최적"순찰 또는 "실제"순찰이 되길 원하는지입니다. 나는 단지이 단어들을 만들어 내고 있지만, 내 말은 :

최적 : 상담원은 시스템 전체의 적용 범위를 완벽하게 분산시키는 방식으로 움직입니다.

생생한 : 에이전트는 가능한 한 동일하게 이동하여 자신을 배포하려고 시도하지만 각자 자신의 관점에서 로컬로 데이터에 액세스 할 수 있습니다.

저는 두 번째 접근법에 중점을 두겠습니다. Craig Reynolds의 자율적 인 캐릭터를위한 스티어링 행동 의 다양한 스티어링 패턴을 가중 혼합하여 해결할 수 있다고 생각합니다 . 조향 동작의 기본 아이디어는 환경 주위에서 즉석 탐색을 생성하기 위해 결합하는 간단한 힘을 사용하는 것입니다. 귀하의 경우 다음 조향 동작을 결합하고 싶다고 생각합니다.

  • 회피 (외계 영역)-상담원은 자신의 영역 내에 머 무르려고 시도하고 외부 영역으로 이동하지 마십시오. 그러나 일부 현실주의의 경우, "외부 스테핑"의 영향이 100 % 일 필요는 없습니다. 이 영역을 벗어나는 "절단 코너"가 조금 더 사실적인 움직임을 만들 것입니다.

  • 방황 -요원들이 계속 움직이며 탐색을 시도합니다. 이 방법을 사용하면 무게를 크게 측정하고 싶을 것입니다. 그렇지 않으면 상담원이 서로 최적의 분리 지점을 찾은 다음 "퍼팅 상태"를 유지하려고합니다.

  • 분리 (기타 에이전트)-에이전트는 다른 에이전트와 거리를 유지하려고 시도합니다 (따라서 최대지면을 덮고 뭉치지 않음).

  • 탐색 (침략자)-상담원이 탐지 한 침략자를 닫으려고합니다.

상대 가중치를 동적으로 사용하고 싶을 것 같습니다. 예를 들어, 상담원이 침입자를 감지하면 분리 가중치가 드롭 다운되어야합니다. (즉, 그들은 누군가를 찾을 때가 아니라 사냥을 할 때만 퍼질 필요가 있습니다.) 위의 네 가지 패턴에 대한 가중치를 가지고 놀면, 당신은 당신이 가진 것에 아주 가까운 무언가를 가질 것이라고 생각합니다. 다시 찾고 있습니다.

설명 된 동작 패턴을 따르는 "보이드"를 구현하는 방법에 대한 온라인 리소스가 꽤 있습니다. 오픈 소스 구현 opensteer를 권장합니다 .


2

하나의 접근 방식은 각 셀에 대해 "가드"가 마지막으로 방문한 시점을 기록하고, 가장 오래 방문하지 않은 인접 셀로 가드가 계속 이동하도록하는 것입니다.

물론 이것은 영토가 연결되어 있다고 가정합니다.

이것은 완벽한 솔루션은 아니지만 코딩하기 쉽고 변화하는 환경에 적응하며 효율적입니다. 나는이 알고리즘을 성공적으로 썼다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.