这个评估函数如何在 Connect 4 游戏中发挥作用? (Java)
How this evaluation function work in a Connect 4 game? (Java)
我正在探索如何将 Minimax 算法用于带有 alpha-beta 剪枝的连四游戏。
所以我在查看有关 Connect4 玩家策略的源代码时发现了这个评估函数:
/**
* Get the score of a board
*/
public int score(){
int score = 0;
for (int r= 0; r < ROWS; r++) {
if (r <= ROWS-4) {
for (int c = 0; c < COLS; c++) {
score += score(r, c);
}
} else {
for (int c = 0; c <= COLS-4; c++) {
score += score(r, c);
}
}
}
return score;
}
/**
* Helper method to get the score of a board
*/
public int score(int row, int col){
int score = 0;
boolean unblocked = true;
int tally = 0;
//int r, c;
if (row < ROWS-3) {
//check up
unblocked = true;
tally = 0;
for (int r=row; r<row+4; r++) {
if (board[r][col] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[r][col] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
if (col < COLS-3) {
//check up and to the right
unblocked = true;
tally = 0;
for (int r=row, c=col; r<row+4; r++, c++) {
if (board[r][c] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[r][c] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
}
}
if (col < COLS-3) {
//check right
unblocked = true;
tally = 0;
for (int c=col; c<col+4; c++) {
if (board[row][c] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[row][c] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
if (row > 2) {
//check down and to the right
unblocked = true;
tally = 0;
for (int r=row, c=col; c<col+4; r--, c++) {
if (board[r][c] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[r][c] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
}
}
return score;
}
我在这个 PDF 中找到了所有这些代码:http://ryanmaguiremusic.com/media_files/pdf/ConnectFourSource.pdf
我只是想了解这个评估函数是如何工作的,并决定要采取的最佳行动...
谁能给我一些帮助?将不胜感激。
这是一个一般性的答案:
评估应该为更好的职位提供更好的价值。在游戏中,通常通过以下方式计算分数来评估位置:增加理想 configurations/events 的分数,减少不理想的分数。决定评估的特征应该改变多少值(= 平衡权重)可能非常困难。
如果我们将此应用到 连接四个 ,那么一个特征可能是存活威胁的数量。但是对于一个非常好的算法(解决 7x6)你必须看看获胜的一步是在奇数还是偶数线上。然后有一些规则,例如 "if the 2nd player has 2 even threats he has won the game"(这一切都归结为填满棋盘并强制移动时,给出的规则有点简化:如果第二个玩家可以,则必须杀死一个均匀的威胁'如果第一个玩家在那里有奇怪的威胁,请不要填写其他栏)。
给定规则的简单示例(O = 第一名玩家,X = 第二名玩家),X 获胜:
* X X X *
O O X O O
1 2 3 4 5 6 7
曾经有一篇关于它的非常详细的科学论文。目前我能找到的最接近的:http://web.mit.edu/sp.268/www/2010/connectFourSlides.pdf
应该给你一些想法。
顺便说一句。开书(一般是任何形式的预定义智慧,如定势、定势)和特殊的残局评估器可以大大提高minimax的性能。
我正在探索如何将 Minimax 算法用于带有 alpha-beta 剪枝的连四游戏。
所以我在查看有关 Connect4 玩家策略的源代码时发现了这个评估函数:
/**
* Get the score of a board
*/
public int score(){
int score = 0;
for (int r= 0; r < ROWS; r++) {
if (r <= ROWS-4) {
for (int c = 0; c < COLS; c++) {
score += score(r, c);
}
} else {
for (int c = 0; c <= COLS-4; c++) {
score += score(r, c);
}
}
}
return score;
}
/**
* Helper method to get the score of a board
*/
public int score(int row, int col){
int score = 0;
boolean unblocked = true;
int tally = 0;
//int r, c;
if (row < ROWS-3) {
//check up
unblocked = true;
tally = 0;
for (int r=row; r<row+4; r++) {
if (board[r][col] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[r][col] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
if (col < COLS-3) {
//check up and to the right
unblocked = true;
tally = 0;
for (int r=row, c=col; r<row+4; r++, c++) {
if (board[r][c] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[r][c] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
}
}
if (col < COLS-3) {
//check right
unblocked = true;
tally = 0;
for (int c=col; c<col+4; c++) {
if (board[row][c] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[row][c] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
if (row > 2) {
//check down and to the right
unblocked = true;
tally = 0;
for (int r=row, c=col; c<col+4; r--, c++) {
if (board[r][c] == CHECKERS[1-playerToMoveNum]) {
unblocked = false;
}
if (board[r][c] == CHECKERS[playerToMoveNum]) {
tally ++;
}
}
if (unblocked == true) {
score = score + (tally*tally*tally*tally);
}
}
}
return score;
}
我在这个 PDF 中找到了所有这些代码:http://ryanmaguiremusic.com/media_files/pdf/ConnectFourSource.pdf
我只是想了解这个评估函数是如何工作的,并决定要采取的最佳行动... 谁能给我一些帮助?将不胜感激。
这是一个一般性的答案:
评估应该为更好的职位提供更好的价值。在游戏中,通常通过以下方式计算分数来评估位置:增加理想 configurations/events 的分数,减少不理想的分数。决定评估的特征应该改变多少值(= 平衡权重)可能非常困难。
如果我们将此应用到 连接四个 ,那么一个特征可能是存活威胁的数量。但是对于一个非常好的算法(解决 7x6)你必须看看获胜的一步是在奇数还是偶数线上。然后有一些规则,例如 "if the 2nd player has 2 even threats he has won the game"(这一切都归结为填满棋盘并强制移动时,给出的规则有点简化:如果第二个玩家可以,则必须杀死一个均匀的威胁'如果第一个玩家在那里有奇怪的威胁,请不要填写其他栏)。
给定规则的简单示例(O = 第一名玩家,X = 第二名玩家),X 获胜:
* X X X *
O O X O O
1 2 3 4 5 6 7
曾经有一篇关于它的非常详细的科学论文。目前我能找到的最接近的:http://web.mit.edu/sp.268/www/2010/connectFourSlides.pdf 应该给你一些想法。
顺便说一句。开书(一般是任何形式的预定义智慧,如定势、定势)和特殊的残局评估器可以大大提高minimax的性能。