학교생활/인공지능

프로젝트: A* 탐색시스템 개발

park_juyoung 2018. 10. 25. 00:12

(1)  내용 설명: 

15-puzzle 탐색 문제는 8-puzzle 탐색 문제와 동일하나 다만 3 X 3 타일 블록 대신에 4 X 4 타일 블록을 사용하는 것이다 ( 아래 그림 참조.)


 

15-Puzzle 문제에 대하여 경로를 찾는 프로그램을 개발한다. 프로그램은 맨 처음에 start 노드와 goal 노드를 입력받는다. 그 다음 탐색을 수행하여 그 두 노드(상태) 사이를 연결하는 경로를 출력하고 종료한다.

 

(주의:  주어진 start 상태에 대하여 goal 상태를  아무렇게나 임의의 state 를 넣으면 경로가 없을 수도 있고 아니면 너무 거리가 먼 goal 일수도 있다. 따라서 반드시 종이로 타일 블록을 만들어서 실지로 7 ~ 23 번의 이동 만에 도달 가능한 state 를 알아 내서 그것을 goal 로 넣어야 한다.)

 

· 사용할 탐색 알고리즘:

    A* 탐색알고리즘을 사용한다.

    g^(n) : n0부터 n 까지로의 지금까지 찾은 경로의 비용 (각 아크는 모두 비용이 1.0 으로 한다),

    h^(n) : state n 의 각 타일(1 ~ 15)  goal state 의 대응 위치의 셀의 타일과 비교하여 잘못

            놓여진 타일의 수.

 

(2)  데이타 구조

 - 상태 즉 노드:   4X4 타일블록을 하나의 구조체로 나타내도록 한다. 이는 2차원 배열을 필드로 가지는  구조체를 정의하여 이용한다.

 

     typedef int TileBlk [4][4] ; // 주의:  타일이 없는 셀에는 -1 을 넣어서 타일이 없음을 표시함

     typedef struct anode *Ty_nodeptr ;

     typedef struct anode {

TileBlk  tile;

Double fhat, ghat, hhat;

Ty_nodeptr pred ;   // 부모에 대한 포인터임.

} Ty_node ;

 

 - Open, Closed   연결리스트의 노드에 대한 구조체 정의:

    Typedef struct linknode *Ty_linknodePtr ;

    Typedef struct linknode {

             Ty_nodeptr nodeptr ;

             Ty_linkednodePtr next ;

    } Ty_linknode ;

 

 - Open, Closed :  노드에 대한 포인터들을 가지는 연결리스트이다.

    Ty_linknodePtr Open = NULL ;

    Ty_linknodePtr Closed = NULL ;

 

주의:  탐색트리 (TR) 은 각 노드의 pred 포인터로 표현된다.

 

 

 

 

(3)  실행 예:  텍스트 방식의 입출력

 

(타일이 없는 셀은 -1 으로 입력한다. 출력시에는 빈 셀은 blank 를 출력한다.)

 

시작노드를 입력하시오(1, 2, 3, 4행 순으로 각 행마다 4 개의 수):

     -1  2   4  3    

     10  5   8  11   

     12  14  9  7   

     1   13  6  15

 

목표노드를 입력하시오:

     2  4    8   3    

     10  5  -1  11   

     12  14  9  7   

     1  13   6  15

 

경로 탐색 결과입니다:

[0]  This is the start state.

        2  4   3   

    10  5  8  11  

    12  14  9  7  

    1   13  6  15

 

==> move right (빈타일이 우측으로 옮겨간 것을 나타냄)

[1]  2     4   3   

    10  5  8  11  

    12  14  9  7  

    1  13  6  15

 

==> move right

[2]  2  4       3   

    10  5   8  11  

    12  14  9  7  

    1   13  6  15

 

==> move down

[3]  2  4   8  3   

    10  5      11  

    12  14  9  7  

    1   13  6  15

 

This sequence is a path to the goal !!

Length of the path  = 3

 


github : https://github.com/park-ju1008/Astar-algorithm


'학교생활 > 인공지능' 카테고리의 다른 글

Neural Network 기반 숫자인식 시스템 개발  (6) 2018.10.25