SlideShare a Scribd company logo
1 of 36
2010/11/13
Devrookie 엠에스박( 박민수 )
 그래프 순회 복습
 A*의 개요
 A*의 특징
 A*의 적용
 A*의 약점
 Q & A
 참고자료
 Depth-First Search( 깊이 우선 탐색 )
1 4 2 3
5
1 5목표
시작
도착
거리 숫자
 Breadth-First Search( 너비 우선 탐색 )
1 4
5
1 5목표
시작
도착
거리 숫자
 Dijkstra Algorithm
 각 노드사이의 거리를 저장하여 최단거리를 구
한다.
 특정 노드까지 거리의 합을 저장하고 다른 경로
와 비교하여 노드 이동때 마다 최단거리의 노드
를 구한다.
 구해진 경로로 가면 최단거리가 된다.
 Dijkstra Algorithm
1 5
1 5목표
시작
도착
거리 숫자
 Best-First Search
 휴리스틱에 따라 가장 좋은 경로에 있다고
판단되는 노드로 이동한다.
 방문한 곳은 가지 않는다.
 도착점에 도달하면 알고리즘을 종료한다.
 Best-First Search
2 3 4
2 5목표
시작
도착
거리 숫자
휴리스틱 (숫자)
1 5
 Best-First Search
 휴리스틱을 기반으로 찾아낸다고 최적의 값이
나오는 것은 아니다.
2 3 4 1 5
거리 : 5 + 4 + 3 + 3 = 15
2 4 1 5
거리 : 3 + 3 + 3 = 9
 Peter Hart, Nils Nilsson, Bertram Raphael
가 1968년에 만든 그래프 순회 알고리즘이
다.
 Edsger Dijkstra가 1959년에 만든 알고리
즘의 확장판이다.
 A* 알고리즘은 Best-First 검색을 이용해 시
작점에서 도착점까지의 가장 적은 비용을
사용하는 경로를 찾아낸다.
 조사하지 않은 노드중에서 가장 효율적이
라고 판단되는 노드로 찾는다.
 찾아진 노드가 도착점이면 종료하고
아니면 인접한 다른 노드들에서 찾는다.
 조사한 노드들은 Close List에 담고
조사하지 않은 노드들은 Open List에 담는
다.
 알고리즘의 시작
 Close List는 비어있다.
 Open List는 시작점만 들어있다.
 알고리즘의 흐름
 Open List에 있는 노드들 중 가장 효율적인 노드를
찾고 도착점인지 비교한다.
 아니라면 그 노드와 인접한 노드가 Close List에 있
으면 무시하고 Open List에 있으면 그 노드까지의
경로 효율을 다시 계산해 더 효율적이면 갱신한다.
 효율적인 노드를 찾는 방법
 시작점에서 해당 노드까지 가는 가장 적은 비용
▪ CostFromStart
 해당 노드에서 도착점까지 가는 가장 적은 비용
▪ CostToGoal
 이 두 비용의 합이 제일 적은 노드가 효율적이
다.
 의사코드
 Open List : Priority Queue
 Close List : List
StartNode.Location = StartLocation;
StartNode.CostFromStart = 0;
StartNode.CostToGoal = PathCostEstimate();
StartNode.Parent = NULL;
OpenList.push( StartNode );
 의사코드
while( !OpenList.empty() ) {
Node = OpenList.pop(); // 최저의 Cost
if( Node == Goal )
return true;
else
인접한 노드들 추가
CloseList.push( Node );
}
return false;
 의사코드( 인접한 노드 추가 )
for ( 인접한 노드들 ) {
if(새로운 노드가 CloseList나 OpenList에 있는데
비용이 최저비용 보다 크면 ){
무시한다.
}
}
else {
새로운 노드를 초기화 해준다.
새로운 노드가 CloseList에 있으면 OpenList로 옮긴다.
새로운 노드가 OpenList에 있으면 갱신해준다.
if( 새로운 노드가 CloseList와 OpenList에 없으면 )
OpenList에 새로운 노드를 넣어준다.
}
}
 경로가 존재한다면 하나의 경로를 찾는다.
 경로가 존재하지 않는다면 모든 경로를 찾는
다.
 최적의 경로를 찾는다. ( 비용 계산이 올바르
면 )
 휴리스틱을 효율적으로 사용한다.
 평균적으로 빠른 성능을 보인다.
 노드의 표현
 A*를 게임에 적용하려면 게임의 길을 그래프로
표현해야 한다.
 길을 찾는 유닛에 대해 방향, 속도등을 고려하
고
지형의 속성에 대해서도 고려하면 좀 더 지능적
인
길찾기가 가능하다.
 노드의 표현
 공간 분할 정사각형 격자 쿼드 트리
볼록 다각형 가시점 일반화된 원통
 노드의 표현
 공간 분할
▪ 정사각형 격자
▪ 가장 간단한 방법이다.
▪ 공간을 동일한 크기의 정사각형 격자로 분할한다.
▪ 검색 위치는 정사각형 중심 혹은 모서리등 적절히 정한다.
▪ 하나의 정사각형 격자 하나가 한 속성을 나타내게 하는게 좋
다.
 노드의 표현
 공간 분할
▪ 쿼드 트리
▪ 공간을 서로 다른 크기의 정사각형으로 분할한다.
▪ 하나의 사각형을 점점 더 작은 사각형으로 분할한다.
▪ 검색 위치는 정사각형 중심 혹은 모서리등 적절히 정한다.
▪ 사각형의 크기가 클 수록( 상위 노드 일수록 ) 검색이 빠르다.
 노드의 표현
 공간 분할
▪ 볼록 다각형
▪ 공간을 볼록 다각형으로 분할한다.
▪ C-Cell : 각 정점과 가시점을 연결한 선으로 볼록 다각형을 만
든다.
▪ 최대 영역 해체 : 정점들을 연결하고 그 선중 짧은 것을 선택한
다.
▪ 네비게이션 메쉬 : 메쉬에 정보를 기록해 둔다.
 노드의 표현
 공간 분할
▪ 가시점
▪ 공간을 분할하지 않고 직접 위치를 결정한다.
▪ 각 장애물의 볼록 정점과 약간 떨어진 위치를 검색 위치로 한
다.
▪ 각 검색 위치 사이의 평균을 이용해 검색 위치를 더 생성하는
등
검색 위치가 많이 잘 배치 될 수록 부드러운 길찾기를 하게 된
다.
 노드의 표현
 공간 분할
▪ 일반화된 원통
▪ 이웃하는 장애물 사이에 원통을 둔다.
▪ 이 원통들을 이은 선들의 교점을 검색 위치로 한다.
 노드의 표현
 공간 분할
▪ 모든 곳들의 길을 잘 찾는지 지속적인 테스트가 필요
하다.
▪ 되도록 적은 검색 위치를 두고 모든 곳에 길찾기를 할
수 있게 하는 것이 좋다.
▪ 이동이 부드럽게 보일 정도는 검색 위치를 두어야 한
다.
 노드의 표현
 이웃한 노드
▪ 사각형 격자면 주위의 네칸의 노드들.
▪ 인덱스의 이동으로 쉽게 접근이 가능하다.
▪ 아니면 선으로 연결된 노드들.
▪ 접근이 쉽게 이웃 정보들을 자료구조에 저장해 놓는게 좋다.
 노드의 표현
 비용
▪ 이동 거리
▪ 걸리는 시간
▪ 소비한 이동력
▪ 소비한 연료
 노드의 표현
 비용 계산
▪ 출발 지점과 도착 지점
▪ 유닛의 타입
 비용 저장
▪ 이웃 정보와 같이 저장해 두는 것이 이상적이다.
 노드의 표현
 추정
▪ 최적의 경로를 찾기 위해서는 비용을 과대평가하지
말 것.
▪ 맵 상의 최단 거리에 단위 거리당 최소 지형 비용을
적용.
▪ 검색 속도를 높이기 위해서는 적절한 휴리스틱 가중
치를
두어야 한다.
 노드의 표현
 추정
 노드의 표현
 추정
 A*도 막 만들고 적용하면 게임에서 사용하
기 힘들 수 있다.
 맵의 크기가 크면 Open List, Close List가
커져서 메모리를 많이 사용하게 된다.
 맵의 크기가 크면 A*를 위해 CPU가 많이
사용될 것이다.
 도달할 수 없는 길을 다 돌아봐야 알 수 있
다.
 미리 갈 수 있나 없나를 간단하게 판단하고 있
다면 A*를 계산하는게 효율적이다.
 GPG1 – 3.3 A* 길찾기 알고리즘의 기초
 http://en.wikipedia.org/wiki/A*_search_algorithm – A* Wikipedia
 http://www.policyalmanac.org/games/aStarTutorial.htm
 http://theory.stanford.edu/~amitp/GameProgramming/
 http://redcarrot.tistory.com/45
 http://sonia-searchalgorithms.blogspot.com/2008_04_01_archive.html
 http://blog.naver.com/nsunlee?Redirect=Log&logNo=130048748400
The End

More Related Content

What's hot

나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용Susang Kim
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬KyeongWon Koo
 
NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개Seungmo Koo
 
Software engineer가 되기 위한 여정
Software engineer가 되기 위한 여정Software engineer가 되기 위한 여정
Software engineer가 되기 위한 여정Aree Oh
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
1시간만에 만드는 음성인식 인공지능 챗봇
1시간만에 만드는 음성인식 인공지능 챗봇1시간만에 만드는 음성인식 인공지능 챗봇
1시간만에 만드는 음성인식 인공지능 챗봇정명훈 Jerry Jeong
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건강 민우
 
프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법Lee Sangkyoon (Kay)
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?増田 亨
 
TERA Server Architecture
TERA Server ArchitectureTERA Server Architecture
TERA Server Architectureujentus
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018devCAT Studio, NEXON
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)Seung-June Lee
 
손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.Kwangsung Ha
 

What's hot (20)

나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용Python과 Tensorflow를 활용한  AI Chatbot 개발 및 실무 적용
Python과 Tensorflow를 활용한 AI Chatbot 개발 및 실무 적용
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개NHN NEXT 게임 전공 소개
NHN NEXT 게임 전공 소개
 
Software engineer가 되기 위한 여정
Software engineer가 되기 위한 여정Software engineer가 되기 위한 여정
Software engineer가 되기 위한 여정
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
1시간만에 만드는 음성인식 인공지능 챗봇
1시간만에 만드는 음성인식 인공지능 챗봇1시간만에 만드는 음성인식 인공지능 챗봇
1시간만에 만드는 음성인식 인공지능 챗봇
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
 
프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법프로그래머에게 사랑받는 게임 기획서 작성법
프로그래머에게 사랑받는 게임 기획서 작성법
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
TERA Server Architecture
TERA Server ArchitectureTERA Server Architecture
TERA Server Architecture
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 
손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.
 

Similar to [1113 박민수]a star_알고리즘

5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)hyun soomyung
 
다익스트라 최단 거리 알고리즘
다익스트라 최단 거리 알고리즘다익스트라 최단 거리 알고리즘
다익스트라 최단 거리 알고리즘장 공의
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서mil23
 
[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)Bill Kim
 
자료구조 04 최종 보고서
자료구조 04 최종 보고서자료구조 04 최종 보고서
자료구조 04 최종 보고서pkok15
 

Similar to [1113 박민수]a star_알고리즘 (6)

5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)5장 그래프의 비밀 (Programming Game AI by Example)
5장 그래프의 비밀 (Programming Game AI by Example)
 
다익스트라 최단 거리 알고리즘
다익스트라 최단 거리 알고리즘다익스트라 최단 거리 알고리즘
다익스트라 최단 거리 알고리즘
 
자료구조 트리 보고서
자료구조 트리 보고서자료구조 트리 보고서
자료구조 트리 보고서
 
[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)
 
2012 Ds 04
2012 Ds 042012 Ds 04
2012 Ds 04
 
자료구조 04 최종 보고서
자료구조 04 최종 보고서자료구조 04 최종 보고서
자료구조 04 최종 보고서
 

More from MoonLightMS

네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)MoonLightMS
 
[0212 박민수]환경 매핑
[0212 박민수]환경 매핑[0212 박민수]환경 매핑
[0212 박민수]환경 매핑MoonLightMS
 
[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정
[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정
[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정MoonLightMS
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자MoonLightMS
 
Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadowMoonLightMS
 
[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1MoonLightMS
 
[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑MoonLightMS
 
Assert에 대해서
Assert에 대해서Assert에 대해서
Assert에 대해서MoonLightMS
 

More from MoonLightMS (8)

네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)네트워크 스터디(Tcp 소켓 프로그래밍)
네트워크 스터디(Tcp 소켓 프로그래밍)
 
[0212 박민수]환경 매핑
[0212 박민수]환경 매핑[0212 박민수]환경 매핑
[0212 박민수]환경 매핑
 
[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정
[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정
[Gpg1권 박민수] 4.4 빠른 원통 절두체 교차 판정
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자
 
Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadow
 
[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1[1023 박민수] 깊이_버퍼_그림자_1
[1023 박민수] 깊이_버퍼_그림자_1
 
[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑[0918 박민수] 범프 매핑
[0918 박민수] 범프 매핑
 
Assert에 대해서
Assert에 대해서Assert에 대해서
Assert에 대해서
 

[1113 박민수]a star_알고리즘

  • 2.  그래프 순회 복습  A*의 개요  A*의 특징  A*의 적용  A*의 약점  Q & A  참고자료
  • 3.  Depth-First Search( 깊이 우선 탐색 ) 1 4 2 3 5 1 5목표 시작 도착 거리 숫자
  • 4.  Breadth-First Search( 너비 우선 탐색 ) 1 4 5 1 5목표 시작 도착 거리 숫자
  • 5.  Dijkstra Algorithm  각 노드사이의 거리를 저장하여 최단거리를 구 한다.  특정 노드까지 거리의 합을 저장하고 다른 경로 와 비교하여 노드 이동때 마다 최단거리의 노드 를 구한다.  구해진 경로로 가면 최단거리가 된다.
  • 6.  Dijkstra Algorithm 1 5 1 5목표 시작 도착 거리 숫자
  • 7.  Best-First Search  휴리스틱에 따라 가장 좋은 경로에 있다고 판단되는 노드로 이동한다.  방문한 곳은 가지 않는다.  도착점에 도달하면 알고리즘을 종료한다.
  • 8.  Best-First Search 2 3 4 2 5목표 시작 도착 거리 숫자 휴리스틱 (숫자) 1 5
  • 9.  Best-First Search  휴리스틱을 기반으로 찾아낸다고 최적의 값이 나오는 것은 아니다. 2 3 4 1 5 거리 : 5 + 4 + 3 + 3 = 15 2 4 1 5 거리 : 3 + 3 + 3 = 9
  • 10.  Peter Hart, Nils Nilsson, Bertram Raphael 가 1968년에 만든 그래프 순회 알고리즘이 다.  Edsger Dijkstra가 1959년에 만든 알고리 즘의 확장판이다.  A* 알고리즘은 Best-First 검색을 이용해 시 작점에서 도착점까지의 가장 적은 비용을 사용하는 경로를 찾아낸다.
  • 11.  조사하지 않은 노드중에서 가장 효율적이 라고 판단되는 노드로 찾는다.  찾아진 노드가 도착점이면 종료하고 아니면 인접한 다른 노드들에서 찾는다.  조사한 노드들은 Close List에 담고 조사하지 않은 노드들은 Open List에 담는 다.
  • 12.  알고리즘의 시작  Close List는 비어있다.  Open List는 시작점만 들어있다.  알고리즘의 흐름  Open List에 있는 노드들 중 가장 효율적인 노드를 찾고 도착점인지 비교한다.  아니라면 그 노드와 인접한 노드가 Close List에 있 으면 무시하고 Open List에 있으면 그 노드까지의 경로 효율을 다시 계산해 더 효율적이면 갱신한다.
  • 13.  효율적인 노드를 찾는 방법  시작점에서 해당 노드까지 가는 가장 적은 비용 ▪ CostFromStart  해당 노드에서 도착점까지 가는 가장 적은 비용 ▪ CostToGoal  이 두 비용의 합이 제일 적은 노드가 효율적이 다.
  • 14.  의사코드  Open List : Priority Queue  Close List : List StartNode.Location = StartLocation; StartNode.CostFromStart = 0; StartNode.CostToGoal = PathCostEstimate(); StartNode.Parent = NULL; OpenList.push( StartNode );
  • 15.  의사코드 while( !OpenList.empty() ) { Node = OpenList.pop(); // 최저의 Cost if( Node == Goal ) return true; else 인접한 노드들 추가 CloseList.push( Node ); } return false;
  • 16.  의사코드( 인접한 노드 추가 ) for ( 인접한 노드들 ) { if(새로운 노드가 CloseList나 OpenList에 있는데 비용이 최저비용 보다 크면 ){ 무시한다. } } else { 새로운 노드를 초기화 해준다. 새로운 노드가 CloseList에 있으면 OpenList로 옮긴다. 새로운 노드가 OpenList에 있으면 갱신해준다. if( 새로운 노드가 CloseList와 OpenList에 없으면 ) OpenList에 새로운 노드를 넣어준다. } }
  • 17.  경로가 존재한다면 하나의 경로를 찾는다.  경로가 존재하지 않는다면 모든 경로를 찾는 다.  최적의 경로를 찾는다. ( 비용 계산이 올바르 면 )  휴리스틱을 효율적으로 사용한다.  평균적으로 빠른 성능을 보인다.
  • 18.  노드의 표현  A*를 게임에 적용하려면 게임의 길을 그래프로 표현해야 한다.  길을 찾는 유닛에 대해 방향, 속도등을 고려하 고 지형의 속성에 대해서도 고려하면 좀 더 지능적 인 길찾기가 가능하다.
  • 19.  노드의 표현  공간 분할 정사각형 격자 쿼드 트리 볼록 다각형 가시점 일반화된 원통
  • 20.  노드의 표현  공간 분할 ▪ 정사각형 격자 ▪ 가장 간단한 방법이다. ▪ 공간을 동일한 크기의 정사각형 격자로 분할한다. ▪ 검색 위치는 정사각형 중심 혹은 모서리등 적절히 정한다. ▪ 하나의 정사각형 격자 하나가 한 속성을 나타내게 하는게 좋 다.
  • 21.  노드의 표현  공간 분할 ▪ 쿼드 트리 ▪ 공간을 서로 다른 크기의 정사각형으로 분할한다. ▪ 하나의 사각형을 점점 더 작은 사각형으로 분할한다. ▪ 검색 위치는 정사각형 중심 혹은 모서리등 적절히 정한다. ▪ 사각형의 크기가 클 수록( 상위 노드 일수록 ) 검색이 빠르다.
  • 22.  노드의 표현  공간 분할 ▪ 볼록 다각형 ▪ 공간을 볼록 다각형으로 분할한다. ▪ C-Cell : 각 정점과 가시점을 연결한 선으로 볼록 다각형을 만 든다. ▪ 최대 영역 해체 : 정점들을 연결하고 그 선중 짧은 것을 선택한 다. ▪ 네비게이션 메쉬 : 메쉬에 정보를 기록해 둔다.
  • 23.  노드의 표현  공간 분할 ▪ 가시점 ▪ 공간을 분할하지 않고 직접 위치를 결정한다. ▪ 각 장애물의 볼록 정점과 약간 떨어진 위치를 검색 위치로 한 다. ▪ 각 검색 위치 사이의 평균을 이용해 검색 위치를 더 생성하는 등 검색 위치가 많이 잘 배치 될 수록 부드러운 길찾기를 하게 된 다.
  • 24.  노드의 표현  공간 분할 ▪ 일반화된 원통 ▪ 이웃하는 장애물 사이에 원통을 둔다. ▪ 이 원통들을 이은 선들의 교점을 검색 위치로 한다.
  • 25.  노드의 표현  공간 분할 ▪ 모든 곳들의 길을 잘 찾는지 지속적인 테스트가 필요 하다. ▪ 되도록 적은 검색 위치를 두고 모든 곳에 길찾기를 할 수 있게 하는 것이 좋다. ▪ 이동이 부드럽게 보일 정도는 검색 위치를 두어야 한 다.
  • 26.  노드의 표현  이웃한 노드 ▪ 사각형 격자면 주위의 네칸의 노드들. ▪ 인덱스의 이동으로 쉽게 접근이 가능하다. ▪ 아니면 선으로 연결된 노드들. ▪ 접근이 쉽게 이웃 정보들을 자료구조에 저장해 놓는게 좋다.
  • 27.  노드의 표현  비용 ▪ 이동 거리 ▪ 걸리는 시간 ▪ 소비한 이동력 ▪ 소비한 연료
  • 28.  노드의 표현  비용 계산 ▪ 출발 지점과 도착 지점 ▪ 유닛의 타입  비용 저장 ▪ 이웃 정보와 같이 저장해 두는 것이 이상적이다.
  • 29.  노드의 표현  추정 ▪ 최적의 경로를 찾기 위해서는 비용을 과대평가하지 말 것. ▪ 맵 상의 최단 거리에 단위 거리당 최소 지형 비용을 적용. ▪ 검색 속도를 높이기 위해서는 적절한 휴리스틱 가중 치를 두어야 한다.
  • 32.  A*도 막 만들고 적용하면 게임에서 사용하 기 힘들 수 있다.  맵의 크기가 크면 Open List, Close List가 커져서 메모리를 많이 사용하게 된다.  맵의 크기가 크면 A*를 위해 CPU가 많이 사용될 것이다.
  • 33.  도달할 수 없는 길을 다 돌아봐야 알 수 있 다.  미리 갈 수 있나 없나를 간단하게 판단하고 있 다면 A*를 계산하는게 효율적이다.
  • 34.
  • 35.  GPG1 – 3.3 A* 길찾기 알고리즘의 기초  http://en.wikipedia.org/wiki/A*_search_algorithm – A* Wikipedia  http://www.policyalmanac.org/games/aStarTutorial.htm  http://theory.stanford.edu/~amitp/GameProgramming/  http://redcarrot.tistory.com/45  http://sonia-searchalgorithms.blogspot.com/2008_04_01_archive.html  http://blog.naver.com/nsunlee?Redirect=Log&logNo=130048748400