java - Minimax算法陷入无限循环
问题描述
所以我在这个问题上已经有一段时间了。我正在尝试实现 minimax 算法来玩一个名为 mancala 的游戏。据我所知,我的代码应该可以工作,但是由于某种原因,当函数递归调用自身时,即使我知道它达到了游戏结束状态并返回了一些值,它也会继续评估为 0。我也知道它的计算结果为 0,因为 maxval 的初始数字是 0。如果有人能帮我弄清楚这一点,我会非常感激。
下面是实现的极小极大算法。请忽略深度参数,初始状态调用的棋盘包含数字 3 直到 12 并且不包括 6,maxTurn
true(最大优先)move -1
,alpha -1
和beta 37
(最高可能分数为 36)
private int[] miniMax(int[] board, boolean maxTurn, int move, int alpha, int beta, int depth){
int[] newState = new int[board.length];
if(endGame(board) == true){
int[] endReturn = new int[2];
for(int i = 0; i < 6; i++){ board[6] += board[i];}
endReturn[0] = board[6]; System.out.println("end state value: " + board[6]);
endReturn[1] = move;
return endReturn;
}
if(maxTurn == true){
int[] maxEval = new int[2];
maxEval[0] = -1;
for(int i = 0; i < 6; i++){
newState = Arrays.copyOf(board, board.length);
boolean goAgain = false;
if(board[i] == 0) continue;
int j = newState[i];
newState[i] = 0;
int k = i + 1;
while(j > 0){
if(k == 13)k = 0;
newState[k]++;
j--;
k++;
}
if(k == 6) goAgain = true;
if(k < 6 && newState[12 - k] > 0 && newState[k] == 1){
newState[6] = newState[6] + newState[12 - k] + 1;
newState[12 - k] = 0;
newState[k] = 0;
}
int[] eval = new int[2];
eval = miniMax(newState, goAgain, i, alpha, beta, depth--);
System.out.println("eval value: " + eval[0]);
if(eval[0] > alpha){
alpha = eval[0];
}
System.out.println("alpha value: " + alpha);
if(beta <= alpha) break;
if(eval[0] > maxEval[0]){
maxEval[0] = eval[0]; System.out.println("move given: " + i);
maxEval[1] = i;
}
} //System.out.println("maxEval given moveValue: " + maxEval[1]);
return maxEval;
}
else{
int[] minEval = new int[2];
for(int i = 7; i < 13; i++){
newState = Arrays.copyOf(board, board.length);
boolean max = true;
if(board[i] == 0) continue;
int j = newState[i];// System.out.println("this is j: " + j);
newState[i] = 0;
int k = i;
while(j > 0){
k++;
if(k == 6)k = 7;
if(k == 14)k = 0;
j--;
newState[k]++;
}
if(k == 13) max = false;
if(k > 6 && k<13 && newState[12 - k] > 0 && newState[k] == 1){
newState[13] = newState[13] + newState[12 - k] + 1;
newState[12 - k] = 0;
newState[k]--;
}
int[] eval = new int[2];
eval = miniMax(newState, max, i, alpha, beta, depth--);
if(minEval[0] > eval[0]){
minEval[0] = eval[0];
minEval[1] = i;
}
if(eval[0] < beta){
beta = eval[0]; System.out.println("beta: " + beta);
}
if(beta <= alpha) break;
}//System.out.println("maxEval given moveValue: " + maxEval[1]);
return minEval;
}
}
解决方案
推荐阅读
- excel - Excel VBA:如何确定当前运行时用户窗体中最后使用的文本框或组合框?
- excel - 如何在 Excel 中将文本更改为数字?
- python - 在 Python 中修改嵌套列表的元素时出现问题
- php - 在 Woocommerce 中排除特定产品的字段验证
- javafx - VSCode 中的 JavaFX-11:错误:无法找到或加载主类 Files\Java\javafx-sdk-11.0.2\lib
- android - 在Play商店上传apk时出现问题
- java - 用于 mac 的 Java 应用程序
- google-console-developer - 在 Google Developers 控制台中找不到 NBU Payments API
- indexing - ArangoDB HTTP/AQL 创建索引
- c# - 在回发时,我如何检查哪个 html 按钮在后面的代码中导致回发