경로 찾기에서의 상황 인식


11

예를 들어 잠긴 문과 열쇠와 같은 특정 아이템을 수집 한 후에 만 ​​특정 통로가 열리도록하는 던전을 통한 최단 경로를 찾아야한다고 가정 해 봅시다.

"가장 짧은 경로"라는 단어에 대한 일반적인 내장 반응은 분명히 A *입니다. 그러나 신뢰할 수있는 휴리스틱을 정의하는 많은 문제가 있으며 추가로 노드를 여러 번 방문해야 할 가능성이 높기 때문에 A *는 그러한 환경에서 실패합니다. 이는 기존의 A *에서도 가능하지 않으며 휴리스틱을 더욱 어렵게 만듭니다.

내가 생각한 것은 단순히 던전의 시작부터 끝까지의 경로를 찾고, 막힌 문을 무시하는 것입니다. 이 길을 찾은 후, 우리의 길을 막는 각 문에 대해, 문에 도달하기 전에 적절한 열쇠를 찾고 문으로 돌아가는 추가 길을 찾고지나갑니다. 문을 여는 데 필요한 키의 경로가 다른 문에 의해 다시 차단되는 상황을 처리하는 데 동일한 시스템이 사용됩니다.이 문은 먼저 열어야합니다.

내 솔루션으로 볼 수있는 큰 문제는 품목 획득 경로를 포함한 모든 경로를 찾은 후에는 목표가 더 멀리있는 다른 차단 된 문이있을 수 있기 때문에 에이전트가 이동 한 총 거리가 가장 작지 않을 수 있다는 것입니다 적절한 키를 훨씬 쉽게 사용할 수 있습니다. A *는 막힌 문이 단순히 무시되는 첫 번째 패스에서이 문을 무시했을 것입니다.

나는 이것을 해결하려고 시도한 첫 번째 사람이 아니라고 확신하며 문제에 대한 의견을 부탁드립니다.


나는 규칙적인 A *가 어떻게 구현되는지 모르지만, 다양한 경로를 가진 구현이 "가중치"스케일을 갖는 것을 보았습니다. 가능한 모든 경로를 계산 한 다음 잠긴 문을 가로 지르는 경로의 "무게"를 양의 무한대로 설정할 수 없습니까? 이로 인해 해당 경로가 무한정 길어 지므로 사용되지 않습니다. 물론 업데이트 할 때마다 엔티티마다 경로를 미리 계산하지 않고 적용 할 수 있습니다.
William Mariager

답장을 보내 주셔서 감사하지만 잊어 버린 것은 문을 여는 것이 목표 노드에 대한 유일한 방법 일 수 있다는 것입니다.이 경우 언급 한 알고리즘은 경로를 찾지 못할 것입니다. 또는 차단 된 경로의 가중치가 단순히 무한한 경우 차단 된 경로 중 하나를 선택하여 원래 문제보다 먼저 진행됩니다.
Marc Müller

답변:


8

간단한 A *를 사용하여 이러한 상황을 최적으로 처리하는 방법은 검색 공간을 확장하는 것입니다. 즉, 캐릭터가 소지하고있는 아이템의 각 조합에 대해 별도의 던전 사본이 있다고 상상해보십시오.

던전의 각 사본에서 통과 가능한 문은 해당 항목 집합을 사용하여 통과 할 수있는 문입니다. 한 던전 복사본에서 다른 던전 복사본으로 전달하는 유일한 방법은 아이템의 위치에 서서 집어 올리는 것입니다.

문을 열거 나 닫을 수있는 스위치와 같은 다른 상태 변경을 포함하도록이 트릭을 확장 할 수 있습니다. 상태가 각 드롭 된 항목의 위치를 ​​포함해야하기 때문에 플레이어가 항목을 삭제하도록 허용 할 수도 있지만 잠재적 인 검색 공간이 엄청나게 증가하기 때문입니다.

매우 유용한 최적화는 모든 문이 잠겨 있다고 가정 할 때 각 문 (실제로 각 문의 각 측면)과 항목에서 도달 가능한 다른 문 / 항목까지의 최단 경로를 미리 계산하는 것 입니다. 이러한 경로가 있으면 이러한 중요한 위치 를 서로 연결하는 그래프에서 각 경로를 가중치 가장자리로 처리하고 다른 모든 위치를 무시할 수 있습니다.

예를 들어, 던전에는 10 개의 문과 5 개의 열쇠가 있다고 가정하십시오. 그러면 전체 검색 공간에 총 25 * 32 = 800 개의 노드에 대해 2 * 10 + 5 = 25 개의 중요한 위치와 2 ^ 5 = 32 개의 가능한 항목 조합이 있습니다. 특히 검색 공간의 대부분에 도달 할 수없는 경우가 많기 때문에 이는 매우 겸손한 수치입니다.


5

실제 세계의 관점에서 : A에서 B로 향하고 잠겨있는 방식으로 문 D를 발견했다면 키 D를 찾아야한다는 사실을 알게 될 것입니다. 따라서 AI가 일반적인 사람만큼 모르는 경우 , 그것은 키를 스카우트하는 것을 포함 할 것이며, 그것은 그 자체로 일련의 작은 길 찾기 단계입니다. 반면에 경로를 시도하기 전에 해당 경로에 잠겨진 문이 있다는 것을 AI가 알기를 원할 수도 있으며,이 경우 키를 찾을 수있는 위치를 알고있을 것입니다.

어느 쪽이든, 문제는 두 가지 수준의 연결성 중 하나입니다. "지상"수준에서, 당신은 항상 하나의 분할되지 않은 영역 내에서 안전하게 안전하게 이동할 수 있다는 것을 알고 있습니다. 여기에서 현재 A * 경로 찾기 구현을 자유롭게 사용할 수 있습니다. (간단한 예에서는 구역을 단일 방으로 볼 수 있습니다. 문을 잠금 해제하지 않고 다른 방에 갈 수는 없습니다. 실제로는 던전의 전체 지역이 될 수 있습니다.) 실체 움직임이지만 주변 지역을 먼저 조사하는 대신 눈을 내리고 걸어 다니는 것과 비슷합니다. 또는이 경우에는 잠긴 문입니다. 따라서 A *가 실행되는지면지도는 플레이어가 현재 영역 내에서만 이동하도록 제한해야합니다.

다음으로, 지형보다 지형이 더 높은 상위 수준의 맵이 있습니다. 실제로 장애물에 대한 지상의 세부 사항은 신경 쓰지 않으며 영역 간의 연결에만 신경 쓰입니다. 이 토폴로지 맵은 현재 던전에있는 모든 영역의 이상적인 연결성을 보여주기 때문에 현재 잠겨있는 영역이있는 짝수 영역 간의 연결을 보여줍니다. 가장자리 사이-각각 영역 사이의 문을 나타냅니다-문을 열려면 아직 필요한 키가 저장되어 있습니다. 그렇지 않으면 열린 것으로 간주됩니다. 따라서 가장 짧은 경로에 대한이 그래프를 검색 할 때 검색이 실행될 때 가장자리의 데이터를 확인하여 찾은 경로를 이미 열려있는 경로로만 제한해야 합니다. 여기서의 연결성은 개방성을 의미하는 것이 아니라 잠재적 인 개방성을 의미합니다.

별도의 영역에 속하는 지점으로 이동하려면 먼저 상위 레벨지도를 검색하여 경로를 찾으십시오. (이 레벨에서는 A * 또는 다른 최단 경로 알고리즘을 사용할 수 있습니다.) 경로를 찾으면 해당 상위 레벨 맵은 현재 영역에서 다른 영역으로가는 데 사용해야하는 문에 대한 정보도 제공해야합니다. 이제 로컬 영역에서 지상 AI를 수행하여 해당 문으로 이동할 수 있습니다. 문에 도달하면 캐릭터는 그 문 / 포탈을 통과 할 수 있습니다. 그는 현재 구역 B에 있습니다.이 구역이 목표 구역 인 경우 지상 탐색을 사용하여 키로 이동할 수 있습니다. 그렇지 않은 경우 대상 영역에 도달 할 때까지 1 단계를 반복해야합니다.

찾고있는 열쇠 자체가 잠긴 문 뒤에있을 가능성이 있으며, 그 문 열쇠도 마찬가지로 .. 이것은 본질적으로 의존성 해결 문제이며, 이것을 해결하는 몇 가지 방법이 있으며, 그중 하나는 Petri Nets입니다. 참조 우수한 종이.

추신. 절차 적으로 던전을 생성하는 경우 플레이어의 시작 위치를 이미 알고있는 경우 종속성 순서에 대한 정보를 저장할 수 있습니다.


2

"가장 짧은 경로"라는 단어에 대한 일반적인 내장 반응은 분명히 A *입니다. 그러나 신뢰할 수있는 휴리스틱을 정의하는 많은 문제가 있으며 추가로 노드를 여러 번 방문해야 할 가능성이 높기 때문에 A *는 그러한 환경에서 실패합니다. 이는 기존의 A *에서도 가능하지 않으며 휴리스틱을 더욱 어렵게 만듭니다.

첫째, 허용 가능한 휴리스틱이 완벽 할 필요는 없습니다. 그것은 단지 과소 평가되어야하고 아무것도 아닌 것보다 낫어야합니다. 실제 거리를 사용하는 경우 A *는 적어도 도움이 될 것으로 보이며 휴리스틱이 검색을 많이 개선하지 않더라도 표준 너비 우선 검색보다 여전히 낫습니다. 또는 유사합니다.

둘째, A *는 원하는만큼 노드를 방문 할 수 있습니다. A *는 경로 찾기 알고리즘이 아니라 검색 알고리즘입니다. 상태를 검색합니다. 게임에서 우리는 종종 당신이 그 상태에 도달하는 방법을 신경 쓰지 않고 경로가 얼마나 짧은 지에 관심이 있기 때문에 위치와 위치를 동일시합니다. 그러나 이와 같은 문제에서 상태는 위치와 키 보유와 같은 다른 관련 상태의 조합입니다.

그러나 이러한 합병증으로 인해 A *가 '매우 효율적'이라는 영역에서 '성공할 수는 있지만 아마도 필요한 시간에 맞지 않을 것'으로 이동하는 것은 사실입니다. 필요한 타임 스케일은 무엇입니까? 실제로, 왜 이렇게해야합니까? 실제로 가장 짧은 경로가 필요합니까, 아니면 합리적인 경로로 충분합니까?

내가 생각한 것은 단순히 던전의 시작부터 끝까지의 경로를 찾고, 막힌 문을 무시하는 것입니다. 이 길을 찾은 후, 우리의 길을 막는 각 문에 대해, 문에 도달하기 전에 적절한 열쇠를 찾고 문으로 돌아가는 추가 길을 찾고지나갑니다.

그러한 시스템이 차선 책임을 증명하는 것은 쉽습니다. 추가 경로를 어디에서 시작 하시겠습니까? 처음부터 문에 대한 원래 경로를 그리는 데 시간을 낭비한 것입니다. 끝에서 시작점 근처에 키를 놓으면 경로가 한 번 충분할 때 경로가 맵을 두 번 통과 함을 의미합니다. 문과 원본 경로 사이의 경로와 원래 경로에 대한 최적의 병합 지점을 계산하려고 시도하면 최적의 결과를 얻을 수 있지만 순열 수와 검색을 단순화하기 위해 휴리스틱을 작성하기가 어려워 리소스를 많이 사용하게됩니다. 문제에 여러 키를 추가하면 Traveling Salesman 문제가 발생하기 때문에 효율적으로 해결할 수 없습니다.

'최단 경로'기준을 완화 할 수 있다면 내가 시도하는 것은 다음과 같습니다.

  • 중요한 위치 (키 위치, 문 위치, 잠긴 영역 내의 위치) 만 포함하는 상위 레벨 그래프를 작성하고 그 사이의 직선 거리를 확인하십시오. 지도가 이미 방이나 다른 개별 위치로 나뉘어져 있다면 좋습니다.
  • A *를 사용하여 처음부터 끝까지이 그래프의 경로를 찾으십시오. 정상적인 직교 거리 휴리스틱은이를 관리하기에 충분해야합니다.
  • 이제이 웨이 포인트 사이의이 단순화 된 경로를 사용하여 A *를 다시 사용하여 한 웨이 포인트에서 다음 웨이까지 저수준 경로를 플로팅하십시오.
  • 이 저수준 경로를 결합하여 전체 경로를 형성하십시오.

일단 그 작업을 마치면 약간의 최적화를 고려할 것입니다. 낮은 레벨의 경로는 키를 수집하기 위해 작은 우회로를 만들 가능성이 높아지도록 키를 사용하여 영역에 가중치를 부여합니다.


0

당신이 제공 한 정보로 약간의 수정만으로 A *를 사용할 수 있다고 생각합니다. 일반적인 A * 알고리즘에서는 모든 노드를 통과 할 때 표시하여 다시 통과하지 않도록합니다. 이것이 아이템에 문제를 일으키는 정확한 부분입니다. 주요 변경 사항은 이전에 노드를 통과했을 때 항목이 무엇이 었는지 기억하는 것입니다. 다음은 내가 의미하는 바를 설명하는 sudo 코드입니다.

if (nodestoCheck.notempty())
    newNode = nodeToCheck.first;
    if (notpassed(newNode.pos, newNode.items))
        if (room(newNode).containItem)
            add NewNode + room(NewNode).items 
        else
            do normal A* algorithm for new Node

이 알고리즘을 사용하면 먼저 항목이없는 모든 노드를 확인하기 시작합니다. 첫 번째 검색 그룹이 일부 문에 의해 차단 될 가능성이 높습니다. 그러나 모든 방을 검색하기 전에 그 문의 열쇠를 찾을 수 있습니다. 해당 키에서 특정 키를 갖는 새로운 검색을 시작합니다. 이번에는 문에 도달하면 통과 할 수 있습니다. 던전에서 벗어날 때까지 동일한 루틴이 계속됩니다. 문과 열쇠가 많을 때마다 메모리 소비가 유일한 문제 일 수 있습니다. 적어도 10 또는 15 개의 키에는 문제가되지 않습니다.


0

일반 A * 만 사용하고 잠긴 문을 통과 할 수없는 영역으로 모델링하지 마십시오. 일단 키를 집어 들면 (키 타일 위를 걷는가?) 특정 잠금 문을 통과 가능한 영역으로 변경합니다.

이것이 의미하는 바는 패스 파인더가 가장 짧은 열쇠가없는 경로 로 가고 길을 따라 키를 찾으면 도움이된다면 경로에 경로를 통합한다는 것 입니다.

그것은 나에게 꽤 합리적인 것 같습니다. 완벽하지는 않지만 문제에 대한 간단한 해결책입니다.

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