AI가 서로 다른 경로를 갖도록 만들기


16

AI가 맵의 가장자리에 스폰되어 중앙을 향하는 하향식 2D 게임이 있습니다.

경로 찾기를 위해 A *와 노드 메쉬를 사용하고 있습니다.

현재 AI는지도 가장자리의 한 지점에서 생성되며 모두 중앙까지 가장 짧은 경로 인 동일한 경로를 사용합니다.

이제 저는 그들이 더 놀랍고 흥미롭고 서로 다른 길을 가고 싶습니다.

나는 이것을하기위한 두 가지 아이디어를 즉시 생각할 수 있지만 사람들이 자주 사용하는 다른 방법이나 더 나은 방법이 있는지 알고 싶습니까?

  1. 적 한 마리가 스폰되어 중앙으로 경로가 생성되면 해당 경로에있는 모든 노드의 비용이 일시적으로 증가한 다음 시간이 지남에 따라 천천히 감소합니다. 그런 다음 나중에 생성 된 적 AI는 더 넓은 길을 밟아야합니다.

  2. 위의 접근법은 AI가 더 넓고 더 넓은 길을 택하고 여전히 매우 예측 가능할 것입니다. 그래서 맵 주위에 여러 중간 목표 노드를 소개하겠다고 생각했습니다. AI가 스폰되면 중간 목표 중 하나를 무작위로 선택하고 먼저지도 중심으로 향합니다. 이것을 비용 증가의 위의 접근법과 결합하면 꽤 좋아 보일 수 있습니까?

사람들이 AI가 자신의 길을 변화시키고 설득력 있고 놀랍도록 변화시키는 데 가장 효과적인 방법은 무엇입니까?

답변:


7

두 번째 옵션은보다 근본적인 접근 방식을 암시합니다 : 적들이 다른 방향에서 플레이어에게 접근하도록합니다. 문제는 플레이어가 "주변"을 갖기 위해 얼마나 멀리 여행해야합니까? 이것에 대한 이상적인 조합은

  • 플레이어의 위치를 ​​밀접하게 둘러싸는 (즉, 따르는) 포인트를 동적으로 생성하는 단계;
  • 네버 마인드가 이러한 주변 지점으로의 임의의 경로로, 어느 정도까지 제안한 것.

이런 식으로 플레이어가 수렴 할 때 실제 경로 변화를 얻기 위해 AI가 불필요하게 긴 우회를하지 않도록 할 수 있습니다.

협업 확산 은 알고리즘의 일부로 암시 적으로 원하는 것을 수행합니다. 그러나 구현하기는 쉽지 않습니다.


협업 확산은 가중치를 부여하는 플러드 채우기에 불과합니다. 구현하기가 쉽지 않습니다. 아마도 A *보다 쉽습니다. 그것은 세상에 대한 다른 관점을 요구합니다-사소한 개념적 변화, 그러나 구현 문제는 없습니다.

AI 실체 관리 측면에서 비표준 적 관점의 결과로 구현하는 것은 여전히 ​​쉬운 일이 아닙니다. :)
Engineer

고마워 닉. 지도 중앙에 플레이어를 둘러싸는 웨이 포인트를 설정하는 것이 주요 방법이라고 생각합니다. 이 단계에서 동적으로 생성되는지 또는 특정 상황에서 각 레벨에 대해 수공예품을 만들지 확실하지 않습니다. 다시 감사합니다!
TerryB

12

첫 번째 아이디어로 경로를 찾을 때 각 노드의 가중치에 작은 임의의 값을 추가하십시오 . 이렇게하면 모든 에이전트가 약간 다른 환경에서 경로를 찾습니다. 이것이 귀하의 경우에 효과가 있는지 확실하지 않지만 실제로 시도하기 쉽습니다.


적들은 닭처럼 달려 가고 세밀한 환경에서 길은 그렇게 다르지 않습니다. 다른 솔루션에 대한 좋은 추가이지만 그 자체로는 솔루션이 아닙니다
Coyote

@Coyote 이것은 탐색 메쉬 구조와 노드 가중치, 속도 및 임의의 구성 요소 사이의 관계에 많이 의존합니다. 그렇기 때문에 정답이 아닌 시도 제안으로 답을 구했습니다.
Nevermind

실제로 :) 나는 보통 엔트로피의 팬입니다. 그러나 최종 결과는 거의 없습니다.
코요테

나는 실제로 Nick Wiggill의 대답이 나의 것보다 낫다고 믿는다. 그러나 어쨌든 그것은 가치있는 공감대를 얻지 못하고 있습니다.
Nevermind

그것은 ...하지만 당신은 첫 번째 간단합니다 ... 우리는 그것을 아래로 투표하려고 할 수 있습니다 : P
코요테

3

그러나 의견에 설명 된 제한 사항을 고려할 때 Nevermind의 대답이 마음에 듭니다 .

  1. 중심까지의 단일 단위 알고리즘은 이동 한 총 거리를 기록합니다.
  2. 각 후속 단위에 대해 이보다 임의의 작은 거리 인 거리를 할당하십시오.
  3. 각 유닛에 대해 A *를 수행하는 동안 얼마나 가까이 있고 얼마나 멀리 여행하고 싶은지에 따라 추가 무게를 추가하십시오. 이것은 아마도 다음과 같을 것입니다 (distanceToGoal) + Max(0, desiredDistance - distanceTravelled)).

이것은 유닛이 더 나아가려고 시도 할 것입니다. 아마도 다른 경로 일 것이므로 다른 경로를 취할 수도 있습니다.

각 유닛의 시작 속도에 추가 할 수도 있지만 임의 범위는 약간 더 커야합니다.


2

Nick Wiggill이 지적한 것처럼 가장 간단한 방법은 목표를 둘러싼 원을 얻는 것입니다.

  • 이 원에 가까운 점을 경유지로 임의로 할당합니다.
  • 초기 경로에서 원의 모든 경로를 제거 하거나이 점의 값을 크게 증가시킵니다.
  • 그런 다음 그 웨이 포인트에서 목표로가는 길을 찾으십시오.

중요한 부분은 원래 웨이 포인트에 대한 원의 모든 경로를 제거하는 것입니다. 원을 교차하는 적과 초기 웨이 포인트에 도달했을 수 있습니다.

그것으로부터 당신은 원에 2 차 웨이 포인트를 추가하여 여러 가지 값으로 재생하여 변형을 얻을 수 있습니다.


당신의지도가 그것을 지원한다면,이 원 주위의 '흥미로운'위치 (문간, 덮개, 나무, 바위, 건물, 어떤 전술적 이점이있는 노드)를 찾아서 적들이 가능한 경우에만 그 위치로 향하게하십시오 그들이해야한다면 오픈. 이것은 원의 가장자리에서 임의의 지점을 때리는 것보다 훨씬 똑똑해 보일 것입니다.
DampeS8N

감사합니다 Coyote, 그렇습니다. 아마도 Nicks 솔루션을 사용하고 DampeS8N이 제안한대로 주요 지점을 경유지로 제안 할 것입니다. AI가 "원을 가로 지르는"문제를 피하기 위해 원 안에있는 노드의 비용을 크게 늘리려 고합니다. 따라서 A *가 그 주위를 라우팅해야합니다. :)
TerryB

2

여기서 문제는 본질적으로 A *가 대상으로 가장 빠른 경로를 찾는 알고리즘이라는 것입니다. 그것이 '좋은'경로의 기본 기준이라면, 모든 배우들이 같은 결정을 내린다는 것은 놀라운 일이 아닙니다.

해야 할 일은 경로에 대한 품질 기준을 수정하여 '가장 짧은'것이 유일한 요소는 아닙니다. 무작위성의 요소가 이것의 핵심이지만 경로 찾기 정보에서 멀어지지는 않습니다 (즉, 액터가 대상으로 어리석게 원형 교차로를 가져갑니다).

A * 길 찾기는 선천적으로 순진합니다. 일반적으로 액터가 시작하기 전에 전체 경로에 대한 완벽한 지식을 가지고 있다고 가정합니다. 항상 비현실적으로 보일 것입니다. 이 솔루션은 중간 목표를 고르는 것이 목표에서 한 걸음 멀어지는 것을 제안했습니다. AI는 목표에 가까워 지려고하지만 한 번에 작은 부분 만 탐색하려고합니다 (이것은 멀리까지만 탐색 할 수있는 실제 생활과 유사합니다) 보시다시피 더 많은 길을지나 갈수록 더 앞을 볼 수 있습니다).

아마도 그것을 보는 더 간단한 방법을 추천합니다. 길을 찾을 때 지금까지 찾은 최고의 경로 하나만 유지하지 마십시오. 대신 가장 좋은 5 개 또는 10 개의 경로 집합을 수집하십시오. 명확한 특이 치를 버릴 때는 임계 값을 사용하십시오. 예를 들어 최고의 경로가 목표를 달성하기 위해 20u를 통과하면 다음 최고는 21u를 통과하고 그 다음 경로는 50u를 통과합니다. 최고 경로보다 20 % 더 큰 임계 값을 설정하십시오. 따라서 50u 경로는 어리석게 길기 때문에 버립니다. 이제 몇 가지 경로를 선택할 수 있으며 해당 경로 세트에서 무작위로 선택하면 액터가 다른 결정을 내립니다.

그러나 표준 A * 검색으로는 이러한 종류의 정보를 얻지 못하므로 알고리즘을 수정하거나 가능한 경로 세트를 수집하기 위해 다른 것을 사용해야한다고 생각합니다.


1

반복되는 적 (또는 적 유형)이 적은 경우 이동에 영향을주는 개성을 부여 할 수 있습니다. 그들은 큰일 필요는없고, 가끔씩 나오는 것들 일뿐입니다. 이것의 좋은 예는 Pac-Man의 유령입니다. A *를 여러 중개 목표로 세분화하십시오. 어쩌면 한 적은 정말 어리 석고 쉽게 잃어 버릴 수 있습니다. 창의력을 발휘하십시오.

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