2017-03-20 12 views
0

tic-tac-toe AI를 개발하기위한 minimax/alpha-beta 알고리즘에 사용할 최적의 평가 함수를 찾고 있습니다.

행/열/대각선의 빈칸에 빈칸이있는 원/십자 기호의 수를 세고 있습니다 (행이 3 개이며 빈 공간이 없음). 이러한 행의 기호 수를 기준으로 10^(카운터 -1)로 분리 점수를 곱하면 1,10 또는 100 포인트가됩니다.

최적의 솔루션을 거의 찾을 수 없어서 알파벳 알고리즘에서이 함수를 사용하는 데 문제가 있으므로 많이 개선 할 수 있다고 확신합니다.

내 질문은 -이 기능을 어떻게 개선 할 수 있습니까? 작은 코드와 제안이 감사합니다.

내 코드 : 당신은 AI가 만든 후에 무슨 기회 사용자 (다시 다음 AI) 볼 수 있도록

tic-tac-toe 게임의 평가 함수 개선 - alpha-beta 알고리즘

private int h(int[][] field, int depth, int player) //final score of the node 
     { 
      if (win(field, 1)) //if human won 
       return -1000; //very bad for MAX=computer 
      if (win(field, 0)) //if computer won 
       return 1000; 

      int heuristics = individualScore(field, 0) - individualScore(field, 1); 
      return heuristics; 
     } 

private int individualScore(int[][] field, int player) 
     { 

      int sum = 0; 
      int otherPlayer = -1; 
      if (player == 0) //if computer is the current player 
       otherPlayer = 1; //other player is human 
      else 
       otherPlayer = 0;//Vice versa 
      for (int i = 0; i < 3; i++) // rows 
      { 
       int counter = 0; 
       bool rowAvailable = true; 
       for (int l = 0; l < 3; l++) 
       { 
        if (field[i][l] == player) 
         counter++; 
        if (field[i][l] == otherPlayer) 
        { 
         rowAvailable = false; 
         break; 
        } 
       } 
       if (rowAvailable && counter > 0) 
        sum += (int)Math.Pow(10, counter - 1); 
      } 

      for (int i = 0; i < 3; i++) // columns 
      { 
       int counter = 0; 
       bool columnAvailable = true; 
       for (int k = 0; k < 3; k++) 
       { 
        if (field[k][i] == player) 
         counter++; 
        if (field[k][i] == otherPlayer) 
        { 
         columnAvailable = false; 
         break; 
        } 
       } 
       if (columnAvailable && counter > 0) 
        sum += (int)Math.Pow(10, counter - 1); 
      } 
      int counterD = 0; 
      bool diagonalAvailable = true; 
      for (int i = 0; i < 3; i++) //diagonals 
      { 
       if (field[i][i] == player) 
        counterD++; 
       if (field[i][i] == otherPlayer) 
       { 
        diagonalAvailable = false; 
        break; 
       } 
      } 
      if (diagonalAvailable && counterD > 0) 
       sum += (int)Math.Pow(10, counterD - 1); 
      counterD = 0; 
      diagonalAvailable = true; 
      int j = 0; 
      for (int i = 2; i >= 0; i--) 
      { 
       if (field[i][j] == player) 
        counterD++; 
       if (field[i][j] == otherPlayer) 
       { 
        diagonalAvailable = false; 
        break; 
       } 
      } 
      if (diagonalAvailable && counterD > 0) 
       sum += (int)Math.Pow(10, counterD - 1); 

      return sum; 
     } 

답변

-1

당신은 당신의 AI를 할 수는 앞으로도 두 단계 하나 봐 그 단계 (그리고이 기회를 다시 평가). 또한 인공 지능이 사용자를 속이려고 시도 할 때 물건을 추가해도 빠져 나갈 수는 없습니다. 이것은 Tic-Tac-Toe에는 그다지 많은 가능성이 없다는 사실 때문에 가능합니다.

정말로 멋진 게임을 원한다면 신경망을 만들 수 있습니다. 신경망은 게임을 통해 배우기도하지만 완전히 다른 이야기입니다.