2011-09-08 3 views
1

M Tim Jones의 인공 지능 : A 시스템 접근 방식에서 가장 먼저 검색을 실행하는 동안 다음 움직임이 어떻게 생성되는지와 솔루션이 뽑혔다. 그렇게하기 위해우선 순위 검색을위한 평가 함수 알아 내기

,이 개 코드 섹션은 우리를 유세됩니다

#define checkPiece(board, y)((board & (1 << (15-y))) ? 1 : 0) 

#define MAX_TESTS 14 
#define MAX_VECTOR 4 

typedef struct { 
    unsigned char len; 
    unsigned char vector[MAX_VECTOR]; 
} test_t; 

const test_t tests[MAX_TESTS]={ 
          { 4, { 0, 4, 8, 12 } }, 
          { 4, { 1, 5, 9, 13 } }, 
          { 4, { 2, 6, 10, 14 } }, 
          { 4, { 3, 7, 11, 15 } }, 
          { 2, { 8, 13 } }, 
          { 3, { 4, 9, 14 } }, 
          { 4, { 0, 5, 10, 15 } }, 
          { 3, { 1, 6, 11 } }, 
          { 2, { 2, 7 } }, 
          { 2, { 1, 4 } }, 
          { 3, { 2, 5, 8 } }, 
          { 4, { 3, 6, 9, 12 } }, 
          { 3, { 7, 10, 13 } }, 
          { 2, { 11, 14 } } 
          }; 

이 두 가지가 EvaluateBoard 기능

void evaluateBoard(node_t *node_p) { 
    int test, i, check; 
    int cost = 0; 

    for (test = 0 ; test < MAX_TESTS ; test++) { 

     check = 0; 

     for (i = 0 ; i < tests[test].len ; i++) { 
      check += checkPiece(node_p->board, tests[test].vector[i]); 
     } 

     if (check > 1) cost+= (check-1); 
    } 

node_p->g = cost; 

    printf(" evaluateBoard %04x = (h %d, g %d)\n", 
     node_p->board, node_p->h, node_p->g); 

    return; 
} 

다음 이동에 사용된다 Cost int에 의해 결정되며 checkPiece 결과의 결과입니다. 이 경우 보드 == 1288이지만 y 값은 test_t tests에서 어떻게 선택됩니까?

또한 구조는 무엇입니까 test_t tests? 우리는 C 코드에서 비슷한 것을 본 적이 없다. 그것은 다차원 배열의 한 형태입니까?

답변

1

test_t는 구조체입니다. 코드 작성자는 초기화 된 배열로 테스트 배열을 초기화합니다. C에서는 이와 같은 구조를 초기화 할 수 있습니다. 내가 구조체 t 년대의 배열을 초기화하고 싶다면

struct t { 
    int num1; 
    double num2; 
}; 

struct t my_struct = { 123, 3.141 }; 

후 나는 같은 것을 할 수 있습니다 :

BFS 물건에 대한
struct t my_array[] = { 
    {123, 3.141}, 
    {3245, 6.2156}, 
    {912, 5.3}, 
    {0, 1.0} 
}; 

은 베스트 첫 번째 검색은 순수 heuristical 조합 검색 알고리즘이다. 즉, 그래프의 특정 노드에서 가장 적합한 후속 노드를 선택하게됩니다. 최적은 최소 비용 또는 최대 비용 일 수 있습니다. node_t는 A *, BFS 및 Dijkstra 검색 알고리즘을 지원하는 일반 C 구조와 유사합니다. 이것이 node_t 구조체의 h 멤버 변수가 무시되는 이유입니다. BFS에서는 사용되지 않습니다.

evaluateBoard()은 전체 테스트 목록을 검토하여 node_t 위치의 비용을 평가하고 있습니다. y 값을 선택하지 않으면 나중에 노드 비용을 평가하기 만하면 나중에 알고리즘에서 최적의 후행 이동을 선택할 수 있습니다.

+0

그건 그렇고, 내가 게임 산업에 종사했을 때 나는이 물건을 다룰 때 경로 찾기에 매우 익숙합니다. 그러나, 나는 당신이 사용하고있는 책을 읽지 않았습니다. 최고의 첫 번째 검색은 매우 쉽게 이해할 수있는 알고리즘입니다. 궁금한 점이 있으면 책이 잘 작동하지 않을 경우 도와 드릴 수 있습니다. –

+0

감사합니다. 설명이 도움이되었습니다. – Jason

1

또한 test_t 테스트 구조는 무엇입니까?

testsstruct test_t의 배열로 정의됩니다. 배열에 포함 된 각 요소 자체는 char의 배열을 포함합니다. 그래서, 네가 일종의 2 차원 배열이라고 말할 수 있습니다.

C (및 C++ 11)에서는 예제와 같이 중첩 된 중괄호가있는 구조체 및 구조체의 배열을 초기화 할 수 있습니다.

그러나 test_t 테스트에서 y 값은 어떻게 선택됩니까?

checkPiece 매크로에 필요한 y 값 자체는 현재 struct test_t에 포함 vector 배열의 n 번째 값이다.