SlideShare a Scribd company logo
1 of 38
올해로 23년차 개발자 및 직업능력개발훈련교사입니다.
최근 8년 동안은 아이폰 & 안드로이드 용 앱 및 게임 위주로 개발 활동을 했으며
Cocos2d-x와 Unity3D를 이용한 게임개발 강의를 하고 있습니다.
http://www.cocos2d-x.kr 에서 Cocos2d-x 커뮤니티를 운영 하고 있습니다.
저서
01
02
03
알고리즘(라틴어, 독일어: Algorithmus, 영어: algorithm 알고리듬[*], IPA: [ǽlɡərìðm])이
란 어떠한 문제를 해결하기 위한 여러 동작들의 모임이다. 유한성을 가지며, 언젠가는 끝나야 하
는 속성을 가지고 있다. 수학과 컴퓨터 과학에서 알고리즘이란 작동이 일어나게 내재하는 단계
적 집합이다. 알고리즘은 연산, 데이터 진행 또는 자동화된 추론을 수행한다. 알고리즘이라는 단
어는 페르시아의 수학자이던 알콰리즈미의 이름에서 따온 것이다.
• 입력 - 알고리즘은 0 또는 그 이상의 외부에서 제공된 자료가 존재한다.
• 출력 - 알고리즘은 최소 1개 이상의 결과를 가진다.
• 명확성 - 알고리즘의 각 단계는 명확하여 애매함이 없어야 한다.[4]
• 유한성 - 알고리즘은 단계들을 유한한 횟수로 거친 후 문제를 해결하고 종료해야
한다. 알고리즘의 한 단계 이후 m의 값은 n 보다 작으며, m!=0이면 n의
값은 다음 번 단계에서 줄어든다.
• 효과성 - 알고리즘의 모든 연산들은 사람이 종이와 연필을 이용하여 유한한 시간
안에 정확하게 수행할 수 있을 정도로 충분히 단순해야 한다.
알고리즘은 이하의 요건을 만족해야만 한다.
* 어떤 문제를 해결하기 위한 절차, 방법, 명령어들의 집합
* 정답이 있는 알고리즘
* 정답이 없는 알고리즘
- 어떤 가치를 우선시하는가?
• 선택 정렬
• 삽입 정렬
• 버블 정렬
…
• 좌선법/우선법
• DFS / BFS
• Dijkstra (다익스트라) 알고리즘
• A* 알고리즘
전산학 분야에 있어서, A* 알고리즘(A* algorithm 에이 스타 알고리듬[*])은 주어진 출발 꼭짓
점에서부터 목표 꼭짓점까지 가는 최단 경로를 찾아내는 그래프/트리 탐색 알고리즘 중 하나이
다.
이 알고리즘은 각 꼭짓점 {x} 에 대해 그 꼭짓점을 통과하는 최상의 경로를 추정하는 순위값인 "
휴리스틱 추정값 " {h(x)} 을 매기는 방법을 쓴다. 이 알고리즘은 이 휴리스틱 추정값의 순서로
꼭짓점을 방문한다. 그러므로 A* 알고리즘을 너비 우선 탐색의 한 예로 분류할 수 있다.
이 알고리즘은 1968년 피터 하트, 닐스 닐슨, 버트램 라팰이 처음 기술하였다. 그 3명의 논문에
서, 이 알고리즘은 A 알고리즘(algorithm A)이라고 불렸다. 적절한 휴리스틱을 가지고 이 알
고리즘을 사용하면 최적(optimal)이 된다. 그러므로 A* 알고리즘이라고 불린다.
이를 위한 평가 함수 {f(n)}은 다음과 같다.
{f(n)=g(n)+h(n)}
• {g(n)} : 출발 꼭짓점으로부터 꼭짓점 {n}까지의 경로 가중치
• {h(n)} : 꼭짓점 {n}으로부터 목표 꼭짓점까지의 추정 경로 가중치
A* 알고리즘은 출발지점에서 목표지점까지 가장 비용이 낮은(보통 가장 짧은) 경로를 찾는데,
다음의 계산값을 사용하여 다음으로 이동할 경로를 결정한다.
goal(목표) : 시작노드로부터 이 노드까지 오는 데 드는 비용이다.
heuristic(휴리스틱) : 이 노드에서 목표까지 가는데 드는 '추정된' 비용이다.
fitness(적합도) : g와 h의 합. f값이 낮을수록 이 경로가 최단 경로일 가능성이 크다.
f = g + h
시작노드로부터 이 노드까지 오는 데 드는 비용이다.
goal(목표)
휴리스틱이란 '경험에 기초한 추측'을 뜻한다. 그러므로 이 비용은 이 노드에서 목표까지 가는데
드는 '추정된' 비용이다.
heuristic(휴리스틱)
휴리스틱을 계산하는데 여러 가지 방법이 있을 수 있지만, 여기서는 맨하탄 방식을 사용한다.
g 와 h 의 합이고 이 노드를 거쳐 가는 경로의 비용에 대한 최선의 추측을 의미한다.
f 값이 낮을수록 이 경로가 최단 경로일 가능성이 크다.
fitness(적합도)
현재 위치에 연결된 다음 노드가 여러 개일 경우, 연결된 모든 노드의 f 값을 계산하여 f 값이 가
장 작은 노드를 선택하여 탐색을 수행하다 목표 노드에 도착하면 탐색을 종료한다.
현재위치에서 다음의 어떤 노드로 이동할 것인가를 결정하는 방법
loop
current = node in OPEN with the lowest f_cost
remove current from OPEN
add current to CLOSED
if current is the target node //path has been found
return
foreach neighbour of the current node
if neighbour is not traversable or neighbour is in CLOSED
skip to the next neighbour
if new path to neighbour is shorter OR neighbour is not in OPEN
set f_cost of neighbour
set parent of neighbour to current
if neighbour is not in OPEN
add neighbour to OPEN
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar
[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar

More Related Content

More from 강 민우

[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데
[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데
[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데강 민우
 
[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원
[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원
[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원강 민우
 
[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가
[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가
[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가강 민우
 
[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점
[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점
[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점강 민우
 
[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인
[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인
[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인강 민우
 
[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과 세계를 만드는 법
[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과  세계를 만드는 법[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과  세계를 만드는 법
[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과 세계를 만드는 법강 민우
 
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법강 민우
 
[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가
[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가
[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가강 민우
 
[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다
[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다
[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다강 민우
 
[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성
[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성
[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성강 민우
 
[IGC2018] 인플루전 곽노진 - 인디게임이 망할 수 밖에 없는 현실과 이유
 [IGC2018] 인플루전 곽노진 -  인디게임이 망할 수 밖에 없는 현실과 이유 [IGC2018] 인플루전 곽노진 -  인디게임이 망할 수 밖에 없는 현실과 이유
[IGC2018] 인플루전 곽노진 - 인디게임이 망할 수 밖에 없는 현실과 이유강 민우
 
[IGC2018] 라운드8 박성준 - 블레스 언리쉬드 우리는 왜 모든것을 재설계했나
[IGC2018] 라운드8 박성준 - 블레스 언리쉬드  우리는 왜 모든것을 재설계했나[IGC2018] 라운드8 박성준 - 블레스 언리쉬드  우리는 왜 모든것을 재설계했나
[IGC2018] 라운드8 박성준 - 블레스 언리쉬드 우리는 왜 모든것을 재설계했나강 민우
 
[IGC2018] 아이봉 정봉재 - 아직 아이 망하니
[IGC2018] 아이봉 정봉재 - 아직 아이 망하니[IGC2018] 아이봉 정봉재 - 아직 아이 망하니
[IGC2018] 아이봉 정봉재 - 아직 아이 망하니강 민우
 
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소강 민우
 
[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트
[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트
[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트강 민우
 
[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우
[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우
[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우강 민우
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법강 민우
 
[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터
[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터
[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터강 민우
 
[IGC2018] AMD Don Woligroski - WHY RADEON
[IGC2018] AMD Don Woligroski - WHY RADEON[IGC2018] AMD Don Woligroski - WHY RADEON
[IGC2018] AMD Don Woligroski - WHY RADEON강 민우
 
[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략
[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략
[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략강 민우
 

More from 강 민우 (20)

[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데
[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데
[IGC2018] TeamHoray 문지환 - 던그리드, 이랬으면 더 좋았을 텐데
 
[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원
[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원
[IGC2018] 에픽게임즈 신광섭 - 언리얼엔진4 포트나이트 멀티플랫폼 개발 지원
 
[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가
[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가
[IGC2018] 잔디소프트 윤세민 - HTML5 게임 어디까지 가능한가
 
[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점
[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점
[IGC2018] 해피툭 김봉균 - 대만 게임 시장 진출시 유의해야 할 점
 
[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인
[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인
[IGC2018] 캡콤 토쿠다 유야 - 몬스터헌터 월드의 게임 컨셉과 레벨 디자인
 
[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과 세계를 만드는 법
[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과  세계를 만드는 법[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과  세계를 만드는 법
[IGC2018] 산타모니카스튜디오 에이브 타라키 - 게임의 컨셉 디자인과 세계를 만드는 법
 
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
 
[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가
[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가
[IGC2018] 스튜디오EIM 정사인 - 좋은 소리는 무엇인가
 
[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다
[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다
[IGC2018] 유유자적라이프 김윤정 - SunShine 베를린을 밝게 비추다
 
[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성
[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성
[IGC2018] 자라나는 씨앗 김효택 - MazM 시리즈로 바라본 스토리 게임의 가능성
 
[IGC2018] 인플루전 곽노진 - 인디게임이 망할 수 밖에 없는 현실과 이유
 [IGC2018] 인플루전 곽노진 -  인디게임이 망할 수 밖에 없는 현실과 이유 [IGC2018] 인플루전 곽노진 -  인디게임이 망할 수 밖에 없는 현실과 이유
[IGC2018] 인플루전 곽노진 - 인디게임이 망할 수 밖에 없는 현실과 이유
 
[IGC2018] 라운드8 박성준 - 블레스 언리쉬드 우리는 왜 모든것을 재설계했나
[IGC2018] 라운드8 박성준 - 블레스 언리쉬드  우리는 왜 모든것을 재설계했나[IGC2018] 라운드8 박성준 - 블레스 언리쉬드  우리는 왜 모든것을 재설계했나
[IGC2018] 라운드8 박성준 - 블레스 언리쉬드 우리는 왜 모든것을 재설계했나
 
[IGC2018] 아이봉 정봉재 - 아직 아이 망하니
[IGC2018] 아이봉 정봉재 - 아직 아이 망하니[IGC2018] 아이봉 정봉재 - 아직 아이 망하니
[IGC2018] 아이봉 정봉재 - 아직 아이 망하니
 
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
[IGC2018] 퍼니파우 최재영 - 감성을 위한 개발요소
 
[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트
[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트
[IGC2018] 유니티 함영호 - 디바이스를 통해 본 모바일 게임 마켓 인사이트
 
[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우
[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우
[IGC2018] 선본네트워크 우중 - 매력 넘치는 캐릭터 메이킹 노하우
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터
[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터
[IGC2018] 이락연구소 이장주 - 심리학의 관점으로 본 영웅과 몬스터
 
[IGC2018] AMD Don Woligroski - WHY RADEON
[IGC2018] AMD Don Woligroski - WHY RADEON[IGC2018] AMD Don Woligroski - WHY RADEON
[IGC2018] AMD Don Woligroski - WHY RADEON
 
[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략
[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략
[IGC2018] 로그러스 IT 원경연 - 글로벌 시장 진출을 위해 고려할 게임 현지화 전략
 

[IGC 2017] 경일직업능력개발원 이재환 - 시작하는 게임 프로그래머를 위한 알고리즘, 그리고 첫걸음 AStar

  • 1.
  • 2. 올해로 23년차 개발자 및 직업능력개발훈련교사입니다. 최근 8년 동안은 아이폰 & 안드로이드 용 앱 및 게임 위주로 개발 활동을 했으며 Cocos2d-x와 Unity3D를 이용한 게임개발 강의를 하고 있습니다. http://www.cocos2d-x.kr 에서 Cocos2d-x 커뮤니티를 운영 하고 있습니다. 저서
  • 4.
  • 5. 알고리즘(라틴어, 독일어: Algorithmus, 영어: algorithm 알고리듬[*], IPA: [ǽlɡərìðm])이 란 어떠한 문제를 해결하기 위한 여러 동작들의 모임이다. 유한성을 가지며, 언젠가는 끝나야 하 는 속성을 가지고 있다. 수학과 컴퓨터 과학에서 알고리즘이란 작동이 일어나게 내재하는 단계 적 집합이다. 알고리즘은 연산, 데이터 진행 또는 자동화된 추론을 수행한다. 알고리즘이라는 단 어는 페르시아의 수학자이던 알콰리즈미의 이름에서 따온 것이다. • 입력 - 알고리즘은 0 또는 그 이상의 외부에서 제공된 자료가 존재한다. • 출력 - 알고리즘은 최소 1개 이상의 결과를 가진다. • 명확성 - 알고리즘의 각 단계는 명확하여 애매함이 없어야 한다.[4] • 유한성 - 알고리즘은 단계들을 유한한 횟수로 거친 후 문제를 해결하고 종료해야 한다. 알고리즘의 한 단계 이후 m의 값은 n 보다 작으며, m!=0이면 n의 값은 다음 번 단계에서 줄어든다. • 효과성 - 알고리즘의 모든 연산들은 사람이 종이와 연필을 이용하여 유한한 시간 안에 정확하게 수행할 수 있을 정도로 충분히 단순해야 한다. 알고리즘은 이하의 요건을 만족해야만 한다.
  • 6. * 어떤 문제를 해결하기 위한 절차, 방법, 명령어들의 집합 * 정답이 있는 알고리즘 * 정답이 없는 알고리즘 - 어떤 가치를 우선시하는가?
  • 7.
  • 8. • 선택 정렬 • 삽입 정렬 • 버블 정렬 … • 좌선법/우선법 • DFS / BFS • Dijkstra (다익스트라) 알고리즘 • A* 알고리즘
  • 9.
  • 10. 전산학 분야에 있어서, A* 알고리즘(A* algorithm 에이 스타 알고리듬[*])은 주어진 출발 꼭짓 점에서부터 목표 꼭짓점까지 가는 최단 경로를 찾아내는 그래프/트리 탐색 알고리즘 중 하나이 다. 이 알고리즘은 각 꼭짓점 {x} 에 대해 그 꼭짓점을 통과하는 최상의 경로를 추정하는 순위값인 " 휴리스틱 추정값 " {h(x)} 을 매기는 방법을 쓴다. 이 알고리즘은 이 휴리스틱 추정값의 순서로 꼭짓점을 방문한다. 그러므로 A* 알고리즘을 너비 우선 탐색의 한 예로 분류할 수 있다. 이 알고리즘은 1968년 피터 하트, 닐스 닐슨, 버트램 라팰이 처음 기술하였다. 그 3명의 논문에 서, 이 알고리즘은 A 알고리즘(algorithm A)이라고 불렸다. 적절한 휴리스틱을 가지고 이 알 고리즘을 사용하면 최적(optimal)이 된다. 그러므로 A* 알고리즘이라고 불린다. 이를 위한 평가 함수 {f(n)}은 다음과 같다. {f(n)=g(n)+h(n)} • {g(n)} : 출발 꼭짓점으로부터 꼭짓점 {n}까지의 경로 가중치 • {h(n)} : 꼭짓점 {n}으로부터 목표 꼭짓점까지의 추정 경로 가중치
  • 11. A* 알고리즘은 출발지점에서 목표지점까지 가장 비용이 낮은(보통 가장 짧은) 경로를 찾는데, 다음의 계산값을 사용하여 다음으로 이동할 경로를 결정한다. goal(목표) : 시작노드로부터 이 노드까지 오는 데 드는 비용이다. heuristic(휴리스틱) : 이 노드에서 목표까지 가는데 드는 '추정된' 비용이다. fitness(적합도) : g와 h의 합. f값이 낮을수록 이 경로가 최단 경로일 가능성이 크다. f = g + h
  • 12. 시작노드로부터 이 노드까지 오는 데 드는 비용이다. goal(목표)
  • 13. 휴리스틱이란 '경험에 기초한 추측'을 뜻한다. 그러므로 이 비용은 이 노드에서 목표까지 가는데 드는 '추정된' 비용이다. heuristic(휴리스틱) 휴리스틱을 계산하는데 여러 가지 방법이 있을 수 있지만, 여기서는 맨하탄 방식을 사용한다.
  • 14. g 와 h 의 합이고 이 노드를 거쳐 가는 경로의 비용에 대한 최선의 추측을 의미한다. f 값이 낮을수록 이 경로가 최단 경로일 가능성이 크다. fitness(적합도) 현재 위치에 연결된 다음 노드가 여러 개일 경우, 연결된 모든 노드의 f 값을 계산하여 f 값이 가 장 작은 노드를 선택하여 탐색을 수행하다 목표 노드에 도착하면 탐색을 종료한다. 현재위치에서 다음의 어떤 노드로 이동할 것인가를 결정하는 방법
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31. loop current = node in OPEN with the lowest f_cost remove current from OPEN add current to CLOSED if current is the target node //path has been found return foreach neighbour of the current node if neighbour is not traversable or neighbour is in CLOSED skip to the next neighbour if new path to neighbour is shorter OR neighbour is not in OPEN set f_cost of neighbour set parent of neighbour to current if neighbour is not in OPEN add neighbour to OPEN

Editor's Notes

  1. 강연 제목 : 시작하는 게임프로그래머를 위한 알고리즘, 그리고 첫걸음 A*
  2. 안녕하세요~ 이번 세션 강연을 하게 된 이재환입니다. 간단한 제 소개입니다. 보시는 것처럼 23년차 개발자이면서, 직업훈련기관에서 게임프로그래밍을 가르치고 있습니다. 네이버 cocos2d-x 사용자모임 카페에서 내폰젤무거워 라는 닉네임으로 카페를 운영하고도 있습니다. 보신 책들이 있을지 모르겠지만 이런 책들도 썼습니다. 직업훈련기관에서 게임프로그래밍을 가르치고 있다 보니, 처음 게임프로그래밍에 접하게 되는 학생들을 많이 보게 되더군요. 대졸, 고졸의 학력도 다양하고, 전공도 다양합니다. 게임프로그래밍을 전공한 친구들(이 친구들은 왜 오는지 모르겠어요…), 컴퓨터공학 등의 유사 전공자들, 그리고 문과계열의 비전공자들… 신학과 출신도 가르쳐 본 적이 있네요. 요새는 툴이 좋아져서 기획자, 그래픽 디자이너분들도 유니티로 직접 만들고 그러잖아요. 그런데 대부분이 전공자가 아니다보니 알고리즘, 자료구조 같은 얘기가 나오면 많이들 위축이 되요. 그래서 이번 강연 제의를 받고 그런 분들을 위해 알고리즘이 쉽진 않지만 또 그렇다고 어렵기만 한것도 아니다를 알려드려야겠다고 생각했습니다. 이런 분들을 포함해서 이번 강연에 초보자가 익히면 좋은 A*알고리즘을 설명하고자 합니다. 이 강연을 통해 알고리즘에 대한 두려움을 없앴으면 하는 게 제 작은 바램입니다.
  3. 차례 소개
  4. 차례 : 1.알고리즘이란?
  5. 알고리즘은 무엇일까요? 위키백과에서는 다음과 같이 말하고 있군요. 어렵습니다. 기본 정의부터 어려운데, 시중에서 “알고리즘”이 들어간 이름의 책들을 보면 더욱 더 어렵습니다.
  6. 사실 알고리즘은 그렇게 어려운 개념은 아닙니다. 어렵게 배울 필요도 없고요... 제가 생각하는 알고리즘은 생각을 정리하고 표현하는 일련의 방법입니다. 여기 써 있는 것처럼 정답이 있는 것도 있고, 정답이 없는 경우도 있습니다. 정답이 없는 경우라면 최선의 경우가 있는 것이겠고요. 예를 들어볼까요. 홀수, 짝수를 구하는 방법은 무엇일까요? 컴퓨터는 사람처럼 인지적 방법으로 이것은 홀수다, 이것은 짝수다 하고 구분을 하지 못합니다. 구분짓는 명확한 방법이 있어야 합니다. 바로 2로 나누어 나머지가 있으면 홀수, 없으면 짝수라고 판단하는 것이 컴퓨터가 홀수, 짝수를 구분하는 방법입니다. 이것이 홀수, 짝수를 구하는 알고리즘이라고 할 수 있습니다. 그렇다면 알고리즘은 정답이 있어야 하는 걸까요? 다음 상황을 생각해 봅시다. 엘레베이터 앞에서 많은 분들이 다음과 같은 말들을 합니다. 일반인 : 왜 이렇게 엘레베이터가 늦게 오는 거야? 개발자 : 언놈이 프로그램을 이렇게 짠거야? 네, 그렇습니다. 엘레베이터가 오는 방법은 여러 가지 프로그래밍 방법이 사용됩니다. 여러분이 흔히 아는 방법은 홀수층, 짝수층을 오가는 엘레베이터… 저층, 고층을 구분해서 오가는 엘레베이터 등이 대표적이겠죠. 그러면 이렇게 구분하면 과연 엘레베이터는 일찍 올까요? 이런 문제는 알고리즘은 존재했지만, 정답은 없습니다. 또다른 예입니다. 여러분들이 흔히 보는 네비게이션의 길찾기입니다. 네비게이션의 길찾기 옵션은 보통 다음과 같습니다. 시간이 가장 적게 걸리는 길 찾기 비용이 가장 적게 드는 길 찾기 거리가 가장 짧은 길 찾기 운전자가 어떤 가치를 우선시하냐에 따라서 다른 길을 제시할 수 있습니다. 이처럼 어떤 문제를 해결하기 위해서, 생각을 정리한 것이 알고리즘이라고 생각합니다. 정답이 있는 알고리즘도 있지만, 가치를 반영한 알고리즘, 즉 정답이 없는 알고리즘도 있습니다. 시간을 우선시한 알고리즘, 비용을 우선시한 알고리즘, 어떤 가치를 우선시했냐에 따라 알고리즘도 바뀌게 됩니다.
  7. 그러면 이런 알고리즘은 왜 공부해야 할까요? 꼭 공부를 해야 할까요? 정답은… 모르겠습니다. 하지만 제 생각은 “공부를 하고, 아는게 많아지면 편해진다” 입니다. 비유를 들어 보겠습니다. 예전 전쟁이 많던 시절이 있었습니다. 전쟁이 많던 시절의 알고리즘은 무었이었을까요? 네, 바로 병법이 전쟁에서 사용되던 알고리즘입니다. 적이 이렇게 나오니까, 이렇게 대응을 하면 되겠네~ 뭐 이런 것이죠. 처음에는 병법이 없었으니까… 많이 이기고 살아남은 장수한테 노우하우가 생겼습니다. 이런 사람에게 붙는 별명이 있죠. 네, 바로 백전노장! 입니다. 백전노장 한명이 생기기 위해서는 99명이 패배를 경험해야 합니다. 그나마 살아남으면 좋은데, 죽으면  경험을 살릴 수도 없습니다. 그런데 이런 전쟁에서 변수가 생겼습니다. 병법이 등장한거죠. 백전노장이 아니어도 전쟁을 이길 방법이 생긴겁니다. 직접 전쟁을 경험하진 않았지만, 병법을 통해 여러가지 전투의 방법을 간접적으로 경험해 볼 수 있었던 거죠. 그래서 전 개인적으로 이 시대의 병법가들을 프로그래머라고 생각합니다. 어느 분야에나 천재는 있습니다. 천재는 남들이 이루어 놓은거 공부하지 않아도 잘합니다. 그러니까 천재겠죠. 전쟁에서 오자서가 그런 사람입니다. 병법따위는 몰라도 감이 워낙 좋았습니다. 하지만 우리는 천재가 아니니까 이런 경우에 이 사람이 이렇게 전투를 했구나 하면서 분석해서 그 방법을 자신의 일에 적용하는 겁니다. 어느정도 검증된 방법이기 때문에 안정감이 온단 느낌일까요? 프로그램도 그렇습니다. 매일 새로운 로직을 만들고, 새로운 프로그램을 만드는 것이 아닙니다. 매일같이 하는 일들을 보면, 반복적인 일들이 많습니다. 이럴때 알고리즘이 필요한 겁니다. 매번 똑같이 어려운 문제를 푸는 것이 아니고, 어려운 문제의 패턴을 파악했다가 해당 문제가 나오면 그 문제를 풀었던 패턴을 대입해 보는 겁니다. 한번 2x2 가 4라는 것을 이해했으면 그 다음부터는 구구단으로 쓰는 겁니다. 전 이것이 알고리즘을 공부하고, 사용해야 할 이유라고 생각합니다. 여기서 한걸음 더 나아가면 디자인 패턴의 영역으로 들어가게 되죠. 이건 시간이 허락하지 않으므로 오늘은 생략하겠습니다. ^^
  8. 프로그래머한테 기초적으로 요구되는 알고리즘을 간단하게 적어 보았습니다. 자료구조, 알고리즘 책을 보면 기본적으로 나오는 내용들입니다. 오늘은 이 중에서 A* 알고리즘만 살펴보도록 하겠습니다.
  9. 차례 : 2.A* 알고리즘
  10. 다음은 위키백과에서 찾은 A* 알고리즘의 개요입니다. 일단 글이 빽빽하면 읽기도 전에 어려워 보입니다. 저만 그런가요? +_+ 요약하면 A* 알고리즘은 최단 경로를 찾기 위한 알고리즘으로, 그래프/트리 탐색 알고리즘 중의 하나라고 어렵게 설명되어 있습니다. 뭔가 길게 설명되어야 하는 것은 어려운 겁니다. 어려운건 쉽게 설명이 안되죠. 반면에 쉬운 것은 짧고 간단하게 설명될 수 있습니다. 그래서 이 내용도 다음 페이지에서 쉽게 만들어 짧게 설명해 보도록 하겠습니다. 어려운 것도 쉽게 설명해 주어야 하는게 제 직업 특성입니다. ^^;; 그래서 심층적인 이론보다는 실용적인 측면에서만 접근하겠습니다. 그래프, 트리, 깊이 우선, 너비 우선 등의 이론은 생략하고 사용방법을 위주로 설명드리겠습니다. 사용하지 못하는 이론은 백날 공부해봐야 소용없기 때문입니다.
  11. A*(에이 스타) 알고리즘은 1968년에 만들어진 것으로, 탐색을 수행하는데 있어 매우 효과적인 알고리즘이며 다양한 종류의 문제들을 해결하는데 사용되어 왔습니다. A* 알고리즘은 출발지점에서 목표지점까지 가장 비용이 낮은(보통 가장 짧은) 경로를 찾는데, 다음과 같이 'f = g + h' 계산값을 사용하여 다음으로 이동할 경로를 결정합니다. g는 goal(목표)로서, 시작노드로부터 이 노드까지 오는 데 드는 비용이다. 시작노드에서 이 위치까지 오는 경로들은 여러 개가 있을 수 있는데, 이 노드는 그 경로들 중 특정한 하나를 의미한다. h는 heuristic(휴리스틱)으로, 이 노드에서 목표까지 가는데 드는 '추정된' 비용이다. 이때 h는 휴리스틱을 의미하며, 휴리스틱이란 '경험에 기초한 추측'을 뜻합니다. 여기에 사용되는 휴리스틱은 다양하게 존재합니다. 사람마다 경험은 다르니까요~ f는 fitness(적합도)로서, g와 h의 합이고 이 노드를 거쳐 가는 경로의 비용에 대한 최선의 추측을 의미한다. “f값이 낮을수록 이 경로가 최단 경로일 가능성이 크다.”라는 것이 A* 알고리즘의 핵심입니다.
  12. goal(목표) 옆으로 한 칸 가는 비용입니다. (0, 0)에서 (1, 0)으로 이동하면 차이는 한 칸.. 네 1입니다. 또 위로 한 칸 가는 비용입니다. (0, 0)에서 (0, 1)으로 이동하면 차이는 역시 한 칸, 비용은 1입니다. 자, 이번은 사선으로 움직이는 비용을 구해 봅시다. 여기서 중학교때 배운 수학을 써야겠네요. 네, 피타고라스 정리입니다. 우리는 항상 말했었죠. 수학은 배워서 어디다 쓰나요? 네, 여기다 쓰는 겁니다. (0, 0)에서 (1, 1)으로 이동하면 이동하는 비용은 루트2, 즉 1.414… 입니다. 여기서 계산의 편의를 위해서 10을 곱해서 옆으로 한 칸 이동하는데 비용은 10, 위로 한칸 이동하는데 드는 비용도 10, 사선으로 이동하는데 드는 비용은 14 로 정합니다. 이 비용은 해당 위치까지 가 보면서 발생한 실제로 측정된 값입니다.
  13. heuristic(체험치, 경험치) 이것이 '추측된' 비용인 이유는 목표까지의 실제 비용을 아직은 알지 못하기 때문이다. 가봤더니 진흙탕이더라… 가봤더니 바닥이 물바닥이더라… 가봤더니 막힌 길이더라. 휴리스틱을 계산하는데 여러 가지 방법이 있을 수 있지만, 일반적으로 A* 알고리즘에서는 맨하탄 방식을 사용합니다. 맨하탄 방식이란 현재사각형에서 목표사각형에 도달하기 까지의 대각선 이동을 제외한 가로,세로로 이동한 총숫자를 계산할 수 있고 거기에 10을 곱합니다. 도시의 한쪽에서 다른 한쪽까지의 블록을 계산하는 것과 같은 방식이기 때문에 이렇게 명명됐습니다. 그리고 H비용을 계산할 때 우리는 어떤 방해물도 무시합니다. (이 방식은 발견적방식이라고도 불리는데, 좀더 알기를 원하는 분은 여기(http://www.policyalmanac.org/games/heuristics.htm)에서 참고) 아직 가보지도 못한 곳의 장애물을 미리 계산할 필요는 없다라는 것입니다.
  14. fitness(적합도) 앞에서 얘기한 것처럼  f는 g와 h의 합이고 이 노드를 거쳐 가는 경로의 비용에 대한 최선의 추측을 의미한다. “f값이 낮을수록 이 경로가 최단 경로일 가능성이 크다.”라는 것이 A* 알고리즘의 핵심입니다. 현재위치에서 다음의 어떤 노드로 어떻게 이동할 것인가를 결정하는 방법은 다음과 같습니다. 현재위치에 연결된 다음 노드가 여러개일 경우, 각각의 다음 노드마다 시작위치에서 다음 노드까지의 거리와 그 노드에서 목표까지의 추정된 휴리스틱 값을 더한 f값들을 계산하여, f값이 가장 작은 노드쪽으로 이동하는 것이 목표까지의 가장 짧은 경로가 될 가능성이 높습니다. 이렇게 f값이 가장 작은 노드들을 선택하여 탐색을 수행하다 목표노드에 도착하면 탐색을 종료하게 됩니다.
  15. 다음과 같은 모양에서 길찾기를 해 보겠습니다. 초록색은 시작위치, 빨강색은 목표 위치이고, 파란색은 지나갈 수 없는 장애물입니다. 코딩의 편의를 위해서, 좌표는 좌측 하단이 (0, 0)이 되게 배치했습니다.
  16. A* 알고리즘은 두 종류의 상태 목록을 관리합니다. 하나는 아직 조사하지 않은 상태들을 담은 '열린목록(Open List)'이고, 또 하나는 이미 조사한 상태들을 담은 '닫힌목록(Closed List)'입니다. 처음 시작위치에서 이동할 수 있는 이웃노드마다 f값을 계산하여 open 에 저장합니다. 이동이 일어난 시작위치는 close에 저장합니다. 오픈된 각 상태마다 클로즈 된 이전 상태의 위치정보도 저장하고 있어야 합니다. 우측 상단은 자기의 이름입니다. 가운데는 부모의 이름입니다. 여기서 오픈 리스트에 추가되는 노드들은 A를 부모로 가지게 됩니다.
  17. 열린 목록의 상태들 중 가장 비용이 작은 상태인 (2, 3) 노드로 이동합니다. 여기서는 (2, 3)이 비용 40으로 제일 작습니다. 이 때 열린 목록에서는 제거합니다. 그 상태가 목표가 아니면 닫힌 목록에 추가하고 이웃한 위치들로 확장을 합니다. 이웃 위치들이 새로운 것이면 열린 목록에 넣습니다. 이미 열린 목록에 있고 그것의 경로가 이전 것보다 비용이 더 싸면 그 위치의 정보를 갱신합니다. 여기서는 (2, 3)노드에서 다시 값을 계산해봐야 더 비싸지기만 하므로 무시합니다. 만일 그 위치들이 이미 닫힌 목록에 있는 것이면 이미 조사를 마친 것이므로 그냥 무시합니다. 목표에 도달하기 전에 열린 목록이 비게 되면 시작 위치로부터 목표에 도달하는 경로가 존재하지 않는 것입니다.
  18. 열린 목록의 상태들 중 가장 비용이 작은 것을 순서대로 가져옵니다. 여기서는 (2, 2), (2, 4)가 비용 54로 제일 작습니다. 벡터에 들어간 순서가 빠른 (2, 2)를 선택합니다. 열린 목록에서 제거합니다. 그 상태가 목표가 아니면 닫힌 목록에 추가하고 이웃한 위치들로 확장을 합니다. 이웃 위치들이 새로운 것이면 열린 목록에 넣습니다. 두 개가 추가됩니다. 새로 추가된 두 개의 부모는 C가 됩니다. 이런 방식으로 f값이 가장 작은 상태들로 계속 확장을 해 나갑니다. 하늘색 표시는 닫힌 상태를 가르키는 것으로 이미 지나왔던 상태들을 의미합니다.
  19. 그림과 같이 결국 목표상태에 도달하였습니다. 목표상태에 도달한 다음에는 목표지점부터 시작해서 닫힌 목록에서 부모의 위치가 저장되어 있는 이전 상태의 경로를 따라 이동합니다. 이 경로가 목표까지의 가장 짧은 경로가 됩니다. 목표지점에서 시작지점으로 이동하는 경로 배열이나 벡터에 저장 이것을 다시 거꾸로 찾아가면 시작지점에서 목표지점으로 이동하는 경로가 되며, A* 알고리즘은 종료됩니다.
  20. 특정 랭귀지의 문법에 관계없이 A* 알고리즘을 만들기 위한 슈도코드는 이와 같습니다.
  21. 다양한 종류의 휴리스틱을 적용해 볼 수 있는 사이트
  22. 차례 : 3.A* 알고리즘 적용
  23. 최단거리 이동 앞서 설명한 최단거리 이동을 cocos2d-x 로 만들어본 예제입니다.
  24. 길(미로)찾기 실제 게임이라면 이렇게 길찾기를 하는 게임은 거의 없습니다. 컴퓨터가 길을 찾으면 게임을 왜 합니까? 사용자가 어렵게 길을 찾아 나가야 재미가 있는 거죠?
  25. 적 캐릭터 이동 (cocos2d-x) 주인공 캐릭터는 사용자가 직접 움직이면 되고, 적 캐릭터는 누가 움직여주지 않잖아요? 스스로 움직여야지... 그래서 주로 이렇게 적의 움직임, 적의 AI를 만들 때 사용합니다. AI… 알파고 얘기할때만 사용되는 용어가 아닙니다. 게임에서 흔히, 적 캐릭터의 움직임등을 만들 때 사용되는 용어입니다.
  26. 적 캐릭터 이동 (Unity3D) 이제 같은 움직임을 유니티에서 해보겠습니다. 유니티는 워낙 쉽다 보니까… 기획자, 디자이너분 들도 쉽게 많이 하는데요.. (비디오 첫번째 부분) 다들 여기까지는 무난하게 합니다. (비디오 두번째 두분) 그런데 이런 프로그램적 지식이 없이 만들다보면 … 이렇게 얘가 오다가 장애물에 걸려서 서 버리게 됩니다. 만약 유저가 이런 버그를 발견하게 되면, 혼자서도 보스를 잡을 수 있게 됩니다. 몹 오는길에 장애물을 두고, 몹의 움직임을 막아 버리는 거죠. 바보가 된 몹은 시간이 걸리더라도 혼자서 잡을 수 있게 되는 겁니다. (비디오 세번째 두분) 물론 유니티는 좋은 엔진이기 때문에 Nav Mesh 등 기본적으로 제공되는 것이 있습니다. 이것을 적용하면 엄청 쉽게 몹의 움직임을 장애물을 피해서 오게 만들 수 있습니다. 그런데 이게 3D 기반이라 유니티로 2D 게임을 만들면 적용을 못합니다. 그리고 내가 만든게 아니기 때문에 내 입맛대로 바꿀 수가 없습니다. (비디오 네번째 두분) 그래서 이런 알고리즘을 적용해서 해야 하는 겁니다. 가상의 그리드를 만들고… 여기서 보이는 부분은 DebugDraw 로 Scene뷰에서만 보이는 겁니다. 가상의 그리드 크기에 맞게 눈에 보이게 사이즈를 맞춰서 그려준 거죠. 그리고 이렇게 아까의 거미의 움직임에 적용을 하면 이렇게 잘 움직이게 되는 겁니다.
  27. Q & A