마이크로 마우스 주행 알고리즘(Algorithm)도착점●?출발기본 4X4 미로마우스는 기본적으로 한 블록씩 주행한다. 『주행알고리즘』이란 마우스가 미로에서 주행할 때, 다음에 갈 방향을 판단해 주는 방법을 말하며,빨리 목표 지점을 찾아가거나 빠른 길을 찾기 위해서 현재 블록에서 다음에 어느 블록으로 갈지 판단하는 방법을말한다. 현재까지 탐색을 통해 알아낸 여러 자료(벽의 유무)를 종합해서 다음에 갈 방향을 결정하고, 2차 주행을 위해 다시 출발점으로 되돌아오는 등의 방법이 모두 주행 알고리즘에 포함된다.기본적으로 마우스의 주행은 현재 블록에서 앞?뒤 블록, 좌?우 블록으로 움직인다.현재 위치에서 다음에 가야할 블록을 판별해서 가야할 블록으로 움직이고, 다시 같은 일을 반복하는 것이 마우스가 움직이는 방법이다.즉, 주행 알고리즘에서는 현재 위치와 현재 마우스가 가고있는 방향, 미로에서의 벽 정보(알고있는 벽과 모르는 벽) 등으로 다음에 갈 방향을 판별만 해 주면 된다.주행 알고리즘에는 크게 목표지점을 빨리 찾아가기 위한 알고리즘과 2차주행을 위한 최단경로를 찾는 알고리즘이 있다.목표 지점을 찾아가기 위한 알고리즘은 좌?우수법, 확장 좌?우수법, 구심법등이 있고, 루프테스트, 등고선 법, 최단거리 탐색 알고리즘 등은 목표와 최단거리의 탐색에 모두 쓰일수 있다.보통 마우스의 주행 알고리즘은 위의 여러 알고리즘을 조합하여 사용한다.완주를 위해서는 다음의 3 과정이 필요하다.1.미로 탐색 → 2.최단경로 계산 → 3.최단경로 주행좌수법과 우수법좌수법이란 미로의 왼쪽 벽에 왼손을 접촉하면서 미로를 진행하는 방법이고우수법이란 미로의 오른쪽 벽에 오른손을 접촉하면서 미로를 진행하는 방법이다.예를 들어 좌수법을 이용한다면시 작NO목표지점?주행 끝.NO왼쪽 벽 유무왼쪽 블록으로 간다.NO앞쪽 벽 유무앞쪽으로 간다.NO오른쪽 벽 유무오른쪽 블록으로 간다.NOU-턴(180도 회전)NO이 방법으로 미로를 주행하면 다음과 같은 경로를 얻게 된다.도착점●?출발확장 좌수법아일랜드형 미로(섬모양)에서는 좌수법으로는 절대 통과 할 수가 없다. 이러한문제점을 개선하여 루프를 반복해서 주행하지 않도록 한 것이 확장 좌수법이다.도착점●?출발확장 좌수법의 기본적인 우선 순위는 좌수법의 경우와 같다.일반적인 좌수법의 우선 순서대로 벽의 유무를 체크하다가 벽이 없다면 그 블록을 전에 방문했던 곳인지 검사한다. 주행한 적이 없다면 그쪽으로 진행한다. 만약 주행했었다면 한가지 조건을 더 검사하는데 전에 지나갔던 방향과 지금 진입하려는 방향이 서로 반대인 경우에만 그쪽으로 진행한다. 과거에 진행했던 방향과 반대가 되지 않는다면 루프에 빠진다는 것을 의미하기 때문이다.도착점●?출발이를 구현하기 위해서는 블록인지의 여부와 주행 방향을 기억하는 배열이 필요하다visit_block[4][4]이것을 0으로 초기화 하고 해당블록을 빠져나갈 때의 방향을 저장해 놓는다.그 블록의 주행 여부는 이 값이 0인가 아닌가로 판별할 수 있다. 만일 (1,2)를 동쪽으로 지나갔다면 아래와 같이 해당 좌표에 방향을 써 놓으면 된다.visit_block[1][2]=EAST (EAST는 0이 아닌 값이다.)주행 경로를 보게 되면 NNNEEESSWSEWWNSENNW가 되게 된다.일반적으로 확장좌수법으로 골에는 도달할 수 있지만 최단 경로를 찾지는 못한다.우수법, 확장 우수법우수법 및 확장 우수법은 위의 방법과 동일하다.다만 우선 순위가 오른쪽 → 가운데 → 왼쪽의 순이다.구심법구심법은 좌수법에 비해 효율적인 알고리즘으로 가운데 중심을 향하여 주행하는 것을 말한다. 주행 우선 순위를 결정하기 위해서는 각 블록에서 중심까지의 거리를 의미하는 구심 테이블이 필요하다.****************************************************1110987655*************098765445**************************98*************98*************78*************567*************5678*************7898*************91098***************************************0987655****************************************************11121314여기에는 목표지점인 4개 블록 (7,7),(7,8),(8,7),(8,8)의 값은 0으로 되어 있고 각 블록마다 골까지의 거리를 나타내는 값이 저장되어 있다. 이 값들을 본통 무게값(Weight)라고 하는데 값이 적을수록 중심과의 거리가 가까우므로 우선 순위가 높다고 할 수 있다. 구심법의 경우에는 테이블에 따라 그 우선순위가 정해지게 된다. 구심테이블은 임의로 만들어 줄 수 있는데 이것에 따라 탐색 우선 순위가 바뀌게 된다.765876987다음과 같은 경우 마우스는 무게값이 적은쪽으로 진행하게 된다. 그러나 N쪽(위쪽)과 E쪽(오른쪽)의 무게값이 6으로 같다. 이런 경우 직진하는 것이 오른쪽으로 회전하는 것보다 유리하므로 직진을 선택하는 편이 좋다.구심법 루틴은 다음과 같이 표현될 수 있다.byte weight[256]; //무게값(weight)을 저장하는 변수byte min=255; //초기 무게값은 255byte temp_w,temp_dir; //임시 무게값과 방향을 저장하는 변수for(i=0;i