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;
}