minimax - Minimax 单独有效,但带有 alpha-beta 修剪的 minimax 不起作用
问题描述
当我在没有 alpha beta 修剪的情况下运行我的代码时,它运行得非常好。但是,当我尝试添加 alpha beta 修剪时,我开始收到类似“tictactoe:349 Uncaught TypeError: Cannot read property '0' of undefined at bestMove (tictactoe:349) at :1:1”之类的错误我一直在使用 Sebastian Lague 关于极小极大和 alpha-beta 修剪的视频。
board = boardBackup;
function eval(){
var i;
for(i=0; i<3; i++){
if(board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != null){
if(board[0][i] == "o"){
return 1;
} else{
return -1;
}
}
else if(board[i].join("") == "xxx" || board[i].join("") == "ooo"){
if(board[i][0] == "o"){
return 1;
} else{
return -1;
}
}
else if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != null){
if(board[0][0] == "o"){
return 1;
} else{
return -1;
}
}
else if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != null){
if(board[0][2] == "o"){
return 1;
} else{
return -1;
}
}
}
if(!board[0].includes(null) && !board[1].includes(null) && !board[2].includes(null)){
return 0;
}
}
function bestMove(){
var topMove;
var value = -Infinity;
var movesLegal = legalMoves();
var currentMove;
var i;
for(i=0; i<movesLegal.length; i++){
board[legalMoves()[i][0]][legalMoves()[i][1]] = "o";
move = minimax(board, 9, -Infinity, Infinity, false)
if(move>value){
topMove = JSON.parse(JSON.stringify(board))
value = move;
}
board[movesLegal[i][0]][movesLegal[i][1]] = null;
}
board = topMove;
}
function minimax(position, depth, alpha, beta, maximizing){
var value;
if(depth == 0 || eval() != undefined){
return eval()
}
if(maximizing){
value = -Infinity
var movesLegal = legalMoves();
var i;
for(i=0; i<movesLegal.length; i++){
board[movesLegal[i][0]][movesLegal[i][1]] = "o";
evaluation = minimax(board, depth -1, alpha, beta, false)
value = Math.max(value, evaluation);
alpha = Math.max(alpha, evaluation)
if(beta <= alpha){
break
}
board[movesLegal[i][0]][movesLegal[i][1]] = null;
}
return value;
}
else{
value = Infinity
var movesLegal = legalMoves();
var i;
for(i=0; i<movesLegal.length; i++){
board[movesLegal[i][0]][movesLegal[i][1]] = "x";
evaluation = minimax(board, depth-1, alpha, beta, true)
value = Math.min(value, evaluation)
beta = Math.min(beta, evaluation)
if(beta <= alpha){
break
}
board[movesLegal[i][0]][movesLegal[i][1]] = null;
}
return value;
}
}
function legalMoves(){
var movesLegal = [];
var i;
var j;
for(i=0; i<3; i++){
for(j=0; j<3; j++){
if(board[i][j] == null){
movesLegal[movesLegal.length] = i.toString() + j;
}
}
}
return movesLegal;
}
function tictac(input){
board[input[0]][input[1]] = "x";
}
function gameWin(){
if(eval() == 1){
alert("O Wins!")
}
else if(eval() == -1){
alert("X Wins!")
}
else if(eval() == 0){
alert("Tie!")
}
}
编辑:我第一次发布了错误的代码
解决方案
推荐阅读
- python-2.7 - Pabot - 无法运行并行机器人框架测试
- sql-server - 在 SSAS 多维数据集中修改维度的单个表达式
- rxjs - 过滤 Observable 中的数组
- java - hibernate抛出构造函数错误,多个字段
- python - 3秒后隐藏一帧/通过调用函数(需要以两种方式完成)
- graph-databases - 查询顶点间边的索引
- c# - 持久化 FileHelpers 中只读属性的值
- r - 使 dplyr::if_else() 返回一个 NA 值
- java - Spek 测试未在 Maven Java 项目中运行
- css - 如何完全以角度呈现来自组件的不同页面?