본문 바로가기

Note..

A* algorithm

길찾기 알고리즘 중 대표적인 A*알고리즘.
원리같은거야 다른 블로그에서 상세히 설명해주고있으니 그냥 c++에서의 코드만 보자.

A*의 기본개념은 젤 빠를만한 길로 가보고 막히면 다시 다른길로...    의 방법. 사람이 보기엔 당연한거겠지만, 코드로 표현하기엔 대단한 사람들의 대단한 발상에서 생겨났다.

주석을 어느정도 달긴 했지만... 코드를 보기전에 길이 찾아지는 과정을 순차적으로 이해하면 코드이해도 쉬워질것같다.

☆우선 필요한 재료를 준비한다.
'닫힌목록' 이라 불리는 리스트 1개, '열린목록'이라 불리는 우선순위큐(리스트여도 상관없음) 1개, 맵 1개,
노드들..

여기서 노드는 위치좌표와 F,G,H라는 중요한 것들, 그리고 자기 이전의 노드를 가리킬 포인터를 가지는 클래스(든 구조체든)이다.
노드의 F,G,H가 핵심속성이라고 해야하나...  뭐 그런거다.
     F 는 G+H이고,
     G 는 시작지점 - 현재지점 까지의 거리값
     H 는 현재지점 - 종료지점 까지의 거리값
이다.  여기다가 휴리스틱 값이니 해서 이동하는데 드는 비용을 위치마다 다르게 할 수도 있는데,,  그냥 모든 맵의 이동비용은 1로 계산했다.

☆다음으로 알고리즘 진행 순차를 살펴본다.
1. 시작지점을 열린목록에 넣는다.
2. 열린목록의 가장 작은 F값을 빼내어 닫힌목록에 넣는다.
3. 닫힌목록의 맨 꽁무니것의 주변을 탐색해 열린목록에 넣는다.
4. 열린목록에 더이상 노드가 없거나 닫힌목록에 종료지점이 있으면 마친다.
5. 2-4를 반복한다.

이라고 간단하게 표현되지만, 실제 코드로 옮길때는 살짝 다르다. 게다가 주변을 탐색한다는게 할 일이 가장 많은 부분이다 ㅎ
우선은 맨 처음 시작지점을 열린목록에 넣었다 바로 빼니.. 그냥 처음부터 닫힌목록에 넣고 시작하는게 좋다.
그리고 주변탐색 일은 다시 나눠진다. 주변탐색은 맵의 형태나 이동방식에 따라 조금 달라지지만, 간단하게 사각타일이고 대각선 이동이 된다고 한다면, 한 방향에 대해서
          IF 갈 수 있는 맵인가
             IF 닫힌 목록에 없는가
                F값을 계산한 후 열린목록에 추가하는데..
                   IF 열린목록에 이미 있다면
                      G값이 작은걸로 갱신
                   ELSE
                       새로 추가
 정도의 과정을 거친다..  어째 한글로 써놓으니 더 복잡해보이는군

이정도만 알고 코드를 보면 이해하는데 어려움은 없을것같다.
(소스 퍼가는건 상관없지만, 이해의 목적으로 만든 소스라 실제 사용하기엔 무리가있다는 점을 아셔야합니다.)

'Note..' 카테고리의 다른 글

mysqldump  (0) 2012.02.18
c++ mysql  (0) 2012.02.07
Windows Installer  (0) 2012.01.31
Windows.SystemColors  (0) 2012.01.20
티스토리에서 Syntax highlighting 하기  (0) 2011.12.16