A * 상담원이 다른 상담원을 피하도록하려면 어떻게합니까?


19

타일 ​​맵에서 다중 에이전트 A * 알고리즘을 구현하고 있습니다. 에이전트는 X 및 Y 축에서만 이동합니다. 경로를 계산할 때 다른 위치가 어디인지 확인하여 충돌을 피합니다.

에이전트가 다른 타일에서 같은 타일을 통과해야하는 상황을 제외하고는 잘 작동합니다. 이와 같은 상황에서는 한 에이전트가 다른 에이전트가 통과하기를 기다리는 것이 가장 좋습니다.

샘플 상황

또한 북쪽 복도가 없으면 길 찾기가 실패합니다.

그런 알고리즘을 어떻게 구현할 수 있습니까?


2
"트래픽 AI"를 구축하는 방법에 대한 답변 ? 여기에 관련이 있습니다.
Anko

몇 가지 의견 1) 나는 교차 할 때 두 명의 적들이 어떻게 겹칠 수 있는지 100 % 괜찮다고 생각하지 않습니다. 홀수 인 매우 사실적인 스타일을 선택한 경우에만 젤다가 괜찮습니다. 2) (* 2, * 2) 맵 해상도로 경로를 허용하는 것을 고려할 수 있으므로 두 명의 적이 1 단위의 경로를 통과 할 수 있습니다. 3) 여러 경로를 항상 사용할 수 있도록지도를 디자인 할 수도 있습니다 (? :-) 알고있는 흥미로운 제약 조건 일 수 있습니다).
GameAlchemist

답변:


18

길 찾기가 실패하도록하여 시작할 수 있습니다. 실패시 경로 찾기를 다시 시도하기 위해 나중에 임의 시간을 선택하십시오. 일부 저수준 네트워킹 프로토콜은 그렇게작동합니다 . 한 번에 하나씩 경로를 작성하고 에이전트가 통과 할 모든 타일을 사용 된 것으로 표시해야합니다. 추가 경로가 실패하면 임의 타이머를 다시 시작하면 새 경로 검색이 확산되고 루핑 오류가 발생하지 않습니다.

문제의 두 번째 부분은 두 경로를 반환하여 처리 할 수 ​​있습니다. 첫 번째 경로는 블록에서 실패하더라도 정기 리턴입니다. 두 번째 경로는 모든 에이전트를 완전히 무시하는 경로입니다. 그런 다음이 두 경로에서 얻은 지식을 사용하여 기다릴 것인지 먼 길을가는 것이 더 좋은지 결정할 수 있습니다. 그 결정에 대한 휴리스틱 스에는 약간의 작업이 필요하지만 전혀 시도하지 않는 것이 좋습니다.

이와 같이 에이전트가 단일 폭 복도로 많이 차단되는 매우 나쁜 경우에는 에이전트가 신속하게 경로를 찾고 실제 경로가 열릴 때까지 기다릴 수있는 안전한 지점을 추가해야 할 수도 있습니다 (따라서 에이전트가 기다렸다가 복도를 막으십시오).


19

문제를 해결하는 대신 레몬을 섭취하고 레모네이드를 만드는 방법이 있습니다.

몇 년 전 저의 친구가 여러분이 설명하는 문제가있는 잘 알려진 FPS를 작업하고있었습니다. 제한된 지역에는 특정 위치를 원하는 여러 AI 캐릭터가 있고 경로 찾기 알고리즘이 끊임없이 충돌하고 있습니다. 서로에. 특히 플레이어는 적들로 가득 찬 작은 방에 수류탄을 던질 것이고, 그 지역의 AI 캐릭터들은 각각 출구로 달려 가려고하지만 서로 마주쳐 서 멈추고 돌아 서고, 다른 사람을 때리고 돌리는 등 이것은 매우 비현실적으로 보입니다.

계산 예산이 부족한 경우 성공적으로 실행할 수있는 더 나은 경로 찾기 알고리즘을 구축하려고합니다. 따라서 친구는 길 찾기 문제를 해결하는 대신 AI에 매우 저렴한 검사를 추가했습니다. 만약 AI가 단기간에 다른 AI에 두 번 충돌 한 경우 출구 찾기를 중단하고 대신 커버를 시도하십시오. 이제 PC가 수류탄을 휘두르고 출구를 향해 많은 적들이 도망 치는 것을 보게됩니다. 서로 충돌하는 사람들은 돌아 서서 나올 수 없다는 것을 깨달은 것 같아서 머리가 터지기 직전에 오리를 덮고 덮습니다. 이것은 사실적이고 플레이어에게 매우 만족 스럽습니다.

충돌 생성 알고리즘의 단점을 전환하여 이점을 얻을 수있는 유사한 방법이 있습니까?


1
+1 나는 이것을 좋아한다, 그것은 파괴적이고 완전히 기능적이다 =)
Patrick Hughes

3

나는 보통 다른 지역화 된 시나리오에 대해 다른 형태의 경로 찾기로 A * 경로를 늘리는 것이 가장 좋습니다. 단위 회피는 일반적으로 그 중 하나입니다. 특히 여러 요원이 동시에 이동하여 동적 차단기가 생성되는 세계에서 특히 그렇습니다.

일반적으로 엣지 팔로우 테크닉이 효과적입니다. 경로를 따라갈 때 원래 경로 계산의 일부가 아닌 차단자가 발생하면 기본적으로 방향 (시계 방향 또는 시계 반대 방향)을 선택하고 해당 방향으로 이동하여 차단기를 가로지 릅니다. 당신이 할 수 없다면, 당신은 블로커가 스스로 해결 될 때까지 기다립니다.

당신은 또한 유닛들이 협력 적으로 경로를 설정하는 능력을 구현할 수 있습니다; 즉, 장치는 다른 장치가 약간 옆으로 움직여서 차단 장치를 "과도하게 짜낼"수 있습니다. 타일 ​​기반 이동으로 제한되는 타일 기반 게임에서는이 기능이 제대로 작동하지 않습니다. 예를 들어 단일 너비 복도에서 교착 상태를 계속 유지할 수 있기 때문입니다. 이 경우 장치가 서로에게 "장소 전환"을 요청하도록하면 대부분의 경우 해결됩니다. 때때로 이것은 유닛들이 서로 뛰어 넘는 결과를 낳습니다.

"유닛 회피"는 게임에서 길 찾기를 논의 할 때 상당히 일반적인 주제입니다. 특히 당신은 체크 아웃 할 수 있습니다 길 찾기은 "유동장"에이 질문을 최고 사령관 2 RTSS에 사용 일반적으로이 문제로 실행 많은 흥미로운 모든 종류의 방법으로 해결한다.


이것은 정확히-길 찾기가 A *를 의미한다는 매우 일반적인 인식이있는 것 같습니다 . 그렇지 않습니다.
Steven Stadnicki 2016 년

2

턴 기반 / 틱 기반 이동 시스템을 사용하는 경우 각 전환에서 에이전트가 향후 맵 모양으로 이동하는 3D 그래프를 만들 수 있습니다. 그런 다음 각 요원에게 향후 해당 시점에있을 타일을 요구하고 액세스 할 수없는 것으로 표시합니다. 그런 다음 각 상담원은 그래프를 전환하는 세 번째 방법으로 다음 틱에 ""aiting "이라는 추가 옵션이 있습니다. 이것은 시스템에서 더 어려울 수 있지만 무작위로 기다리는 것보다 더 나은 결과를 제공해야합니다. 가장 짧은 경로가 해당 에이전트를 통과하는 경우 두 에이전트가 bt와 통신하도록 허용하는 것이 더 좋습니다.


다음은 해당 시간 큐브에 대한 논문입니다 : www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/… 여기에 구현이 있습니다 : allseeing-i.com/ASIPathFinder
Rage

0

A *와 같은 알고리즘을 사용하면 비용 휴리스틱 작업에있어 위도가 가장 높습니다.

이 경우 휴리스틱을 조정하여 에이전트를 다른 에이전트에 가깝게 가져가는 이동 비용을 증가시킬 수 있습니다. 문제는 상위 경로를 가져 오려고 시도하고 결국 진동하는 결과를 초래할 수 있습니다 정확한 타이밍에 따라 서로 가까이있을 때 경로 사이에서 앞뒤로 움직입니다.

또 다른 가능성은 상담원이 의도 한 경로를 추적하고 다른 상담원이 의도 한 경로를 따라 비용을 상향 조정하는 것입니다. 이를 통해 상담원은 서로 협소 한 범위 내에서 효과적으로 조정할 수 있습니다. 여기서 가장 큰 문제는 모든 경로가 차단 된 경우 마지막으로 이동 한 에이전트에 대해 경로 찾기가 계속 실패 할 수 있다는 것입니다.

경로가 하나만있는 경우 경로 찾기가 실패하거나 교착 상태가 될 때까지 서로 진행됩니다.

둘 중 어느 것도 충분하지 않으면 비용을 계산할 때 시간을 추적해야합니다. 두 번째 상담원의 비용은 첫 번째 상담원이 명확 해지기까지 걸리는 시간과 일반 순회 비용을 합한 것이어야합니다. 그러면 상담원은 대기 시간과 다른 경로를 선택하는 시간을 정확하게 결정할 수 있습니다.

타이밍을 조정하는 것이 훨씬 더 많은 노력을 기울일 수 있으므로 대부분의 사람들은 상황이 충분할 때까지 레벨 레이아웃과 비용 값을 조정합니다.


0

일반적으로 경로 추종 중에 이와 같은 문제를 해결하기 위해 조향 동작 을 사용하도록 조정 합니다. 그리고 당신은 여전히 ​​그룹 행동에 대한 영감을 얻기 위해 많은 사람들이 걸릴 수 있습니다. 그러나 불행히도 단순한 타일 기반 이동에는 직접 적용 할 수 없습니다.

대부분의 상황에서 이미 충돌을 피할 수 있으므로이 특정 상황에 초점을 맞추십시오. 요원이 움직이고 싶을 때마다 길 찾기를 다시하거나 다른 사람이 움직일 때 다른 사람들이 어떻게 반응하는지 알 수 없습니다. 둘째, 나는 그 요원들이 서로에게 친숙하다고 생각합니다.

한 요원이 다른 요원을 기다리는 것이 좋습니다. 정확히 그렇게하는 것이 좋습니다. 에이전트에게 다른 경로에 액세스 할 수있는 방법을 제공하고 다른 경로의 일부가 아닌 자신의 경로의 첫 번째 타일을 검색 한 다음 그곳으로 이동하십시오. 이 기술의 문제점은 다음과 같습니다.

  1. 다른 요원 주위에 다른 허용 가능한 방법이 있는지 어떻게 결정합니까? 당신이 그를 돌아 다닐 충분한 공간이 있다면 당신은 다른 요원을 기다리기를 원하지 않습니다. 다른 에이전트를 고려할 때 경로 찾기 실패는 해결하려는 상황의 명백한 징후이지만, 예에서 발생한 경로 찾기 실패는 없습니다. 그러나 약간의 계산으로 대체 경로 A *가 작은 원으로 다른 요원을 돌아 다닐지 아니면 북부 복도와는 완전히 다른 경로를 사용할지 결정할 수 있습니다.

  2. 한 라운드 / 오퍼레이션 중에 에이전트가 얼마나 멀리 이동할 수 있는지 알 수 없지만 그 거리가 충분하지 않거나 모든 에이전트가 병렬로 이동하는 경우 두 에이전트는 경로의 다른 쪽 끝에서 대기하기로 결정합니다. 다른 요원에게 자신의 경로를 비운다는 신호를 보내서 해결할 수 있습니다.


0

가능한 해결책 중 하나는 그러한 좁은 지점에서 유닛 충돌을 비활성화하는 것입니다.

예를 들어 스타 크래프트 게임에서 작업자 (SCV, 프로브, 드론)는 크리스탈 채굴시 서로 충돌하지 않습니다.

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