2017-10-25 6 views
-1

나는 네 개의 게임에 연결하는 minimax 알고리즘을 구현하려고합니다. 저는 evaluation-function으로 끝났습니다. 그리고 알고리즘 함수로 끝났습니다.네 가지 연결 - 평가 - C의

"마지막"문제에 대한 해결책을 찾을 수 없습니다. 여기 내 기능은 다음

void minimax(field f){ 
int i; 
field c; 
convert_1D_to_2D(f, c); 
for(i=0;i<COLS;i++) { 
    if(can_throw(c, i) == 0) { 
     throw(f, i); 
     convert_1D_to_2D(f, c); 
     if((is_winner(c) == 0) && (is_board_full(f) == 0)) { //no winner, board not full 
      minimax(f); 
     } 
     else if(is_winner(c) == 1) { //there is a winner 
      evaluate_turn(f); 
      //compare evaluation 
      undo_turn(f); 
     } 
     else if(is_winner(c) == 0 && (is_board_full(f) == 1)) { //no winner, board full 
      evaluate_turn(f); 
      //compare evaluation 
      undo_turn(f); 
     } 
    } 
} 

필드 F [0] 깊이이고, 다른 요소가되는 열이 발생하고 저장 F [COLS * ROWS + 1]과 배열이다. 은 "C"-board는 플레이어 플레이어 1 무료 0, 1, 2로 "그래픽"보드를 나타내는 2

static int evaluate_turn(field f) { 
field c; 
convert_1D_to_2D(f, c); 
if (((f[0] % 2) == 1) && (current_player == 1) && (is_winner(c) == 1)) { //player 1 won, max for him || +1 
    return 1; 
} 
else if (((f[0] % 2) == 2) && (current_player == 2) && (is_winner(c) == 1)) { //player 2 won, max for him || +1 
    return 1; 
} 
if (((f[0] % 2) == 1) && (current_player == 2) && (is_winner(c) == 1)) { //player 2 won, counting for 1 || -1 
    return -1; 
} 
else if (((f[0] % 2) == 2) && (current_player == 1) && (is_winner(c) == 1)) { //player 1 won, counting for 2 || -1 
    return -1; 
} 
else if ((is_board_full(f) == 1) && (is_winner(c) == 0)) { //draw || 0 
    return 0; 
} 

그래서 내 문제는 내가 깨끗한 솔루션 생각하지 수있다 평가를 위에서 아래로 비교하십시오. 필자는 새로운 데이터 구조를 도입 할 필요가 없다고 생각합니다. 마치 솔루션이 내 앞에 있지만 나는 그것을 잡지 못합니다.

재귀의 "뒤로 돌아 가기"평가를 비교할 수 있습니까? 그렇다면 어떻게?

아니면 좀 더 복잡한 새로운 것을 소개해야합니까? 아니면 뭔가 완전히 사라 졌을까요?

감사합니다.

답변

0

아니면 좀 더 복잡한 새로운 것을 소개해야합니까? 아니면 뭔가 완전히 사라 졌나요?

불행히도 대답은 후자입니다. Minimax는 void 함수가 아닙니다. 노드가 나타내는 노드의 값을 반환합니다. 그것은 평가 방법을 비교하는 방법입니다. 당신은 또 다른 근본적인 개념을 놓치고 있습니다. 당신의 기능은 터미널 노드가 게임이 승리하거나 보드가 가득 찬 노드로만 간주합니다. 이것이 기술적으로 사실이지만, 실제 minimax 함수는 그렇게 작동하지 않습니다. 노드의 수는 약 7^48이 될 것이므로 함수가 문자 그대로 현대 PC에서 종료되는 데 10 년 이상 걸릴 것입니다. 실세계 미니 맥스 함수가하는 일은 검색이 도달 할 수있는 최대 깊이를 설정하는 것입니다 (나무 가지 치기를 추가하지 않는 한이 값이 5 또는 6이 될 때까지). 그리고 그 깊이에있는 모든 노드를 터미널로 생각하고 발견 적 (부정확 한 추측) 평가 함수. 연결 4에서는 행 수가 3 인 것과 같은 것을 기반으로 할 수 있습니다. 당신이 승자가 있다는 것을 안다면 또 다른 실수는 당신의 평가 함수를 호출하는 것입니다. 적절한 값을 곧바로 반환하는 것보다 어떤 플레이어가 승리했는지 안다면 비싼 평가 함수를 호출 할 필요가 없습니다. 당신은 또한 당신이 한 것처럼 min과 max에 대한 함수를 스트리밍 할 수 없습니다. min과 max에 대해 별도의 함수를 생성하거나 negamax 변형을 사용해야합니다.

내 조언 : 실제로 알고리즘을 구현하는 방법을 이해하지 못하는 것 같습니다. minimax 및 negamax psuedocode에 대해 읽어보십시오.

관련 문제