R码的包含alpha-beta剪枝的Minimax理论
需要帮助开发R中的alpha-beta修剪minimax算法。目前我已经实现了minimax算法,但它仅适用于3x3板。4x4电路板不运行-->到长时间运行 我从3x3板上复制了代码,但我意识到我无法提供深度。所以我假设它适用于4x4电路板的所有示例。在minimax代码部分实现alpha-beta剪枝需要修改什么。由于我对这个领域相当陌生,所以我试图修改现有代码,以了解每个部分正在做什么R码的包含alpha-beta剪枝的Minimax理论,r,alpha,minimax,beta,pruning,R,Alpha,Minimax,Beta,Pruning,需要帮助开发R中的alpha-beta修剪minimax算法。目前我已经实现了minimax算法,但它仅适用于3x3板。4x4电路板不运行-->到长时间运行 我从3x3板上复制了代码,但我意识到我无法提供深度。所以我假设它适用于4x4电路板的所有示例。在minimax代码部分实现alpha-beta剪枝需要修改什么。由于我对这个领域相当陌生,所以我试图修改现有代码,以了解每个部分正在做什么 # draw the board for tic tac toe draw_board <- fun
# draw the board for tic tac toe
draw_board <- function(board) {
xo <- c("X", " ", "O") # symbols
par(mar = rep(0, 4))
plot.new()
plot.window(xlim = c(0, 40), ylim = c(0, 40))
abline(h = c(10, 20, 30), col = "darkgrey", lwd = 4)
abline(v = c(10, 20, 30), col = "darkgrey", lwd = 4)
pieces <- xo[board + 2]
text(rep(c(5, 15, 25, 35), 4), c(rep(35, 4), rep(25, 4), rep(15, 4), rep(5, 4)), pieces, cex = 6)
# identify location of any three in a row
square <- t(matrix(board, nrow = 4))
hor <- abs(rowSums(square))
if(any(hor == 4))
hor <- (5 - which(hor == 4)) * 10 - 5
else
hor <- 0
ver <- abs(colSums(square))
if(any(ver == 4))
ver <- which(ver == 4) * 10 - 5
else
ver <- 0
diag1 <- sum(diag(square))
diag2 <- sum(diag(t(apply(square, 2, rev))))
# draw winning lines
if(hor > 0) lines(c(0, 40), rep(hor, 2), lwd = 10, col = "red")
if(ver > 0) lines(rep(ver, 2), c(0, 40), lwd = 10, col = "red")
if(abs(diag1) == 4) lines(c(2, 38), c(38, 2), lwd = 10, col = "red")
if(abs(diag2) == 4) lines(c(2, 38), c(2, 38), lwd = 10, col = "red")
}
# Human player enters a move
move_human <- function(game) {
text(4, 0, "Click on screen to move", col = "grey", cex=.7)
empty <- which(game == 0)
move <- 0
while (!move %in% empty) {
coords <- locator(n = 1) # add lines
coords$x <- floor(abs(coords$x) / 10) + 1
coords$y <- floor(abs(coords$y) / 10) + 1
move <- coords$x + 4 * (4 - coords$y) # 4 is the number of rows/columns --> needs to be a square
}
return (move)
}
# Evaluate winner function
eval_winner <- function(game_1, player) {
game <- matrix(game_1, nrow = 3, byrow = T)
hor <- rowSums(game)
ver <- colSums(game)
diag <- c(sum(diag(game)), sum(diag(apply(game, 1, rev))))
if (-4 %in% c(hor, ver, diag))
return(-10)
if (4 %in% c(hor, ver, diag))
return(10)
else
return(0)
}
# Minimax AI function
minimax <- function(game_1, player) {
free <- which(game_1 == 0)
if(length(free) == 1) {
game_1[free] <- player
return(list(move = free, U = eval_winner(game_1, player)))
}
poss.results <- rep(0, 16)
for(i in free) {
game <- game_1
game[i] <- player
poss.results[i] <- eval_winner(game, player)
}
mm <- ifelse(player == -1, "which.min", "which.max")
if(any(poss.results == (player * 10))) {
move <- do.call(mm, list(poss.results))
return(list(move = move, U = poss.results[move]))
}
for(i in free) {
game <- game_1
game[i] <- player
poss.results[i] <- minimax(game, -player)$U
}
random <- runif(16, 0, 0.1)
poss.results[-free] <- 100 * -player
poss.results <- poss.results + (player * random)
move <- do.call(mm, list(poss.results))
return(list(move = move, U = poss.results[move]))
}
# Main game engine human versus randomly choosing computer!
tic_tac_toe <- function(player1 = "human", player2 = "computer") {
game <- rep(0, 16) # Empty board
winner <- FALSE # Define winner
player <- 1 # First player
#players <- c(player1, player2)
players <- c("human", "computer")
draw_board(game)
while (0 %in% game & winner == 0) { # Keep playing until win or full board
if (players[(player + 3) %% 3] == "human") # Human player
move <- move_human(game)
else { # Computer player
move <- minimax(game, player)
move <- move$move
}
game[move] <- player # Change board
draw_board(game)
winner <- max(eval_winner(game, 1), abs(eval_winner(game, -1))) == 6 # Winner, winner, chicken dinner?
player <- -player # Change player
}
if (winner == 1)
print("Human has won")
else if (winner == 2)
print("Computer has won")
else
print("Play ended in a draw")
}
#为tic-tac-toe绘制电路板
画板重复白兔说的话:你应该看一看
如果您更加具体,并且在将来包含您的代码,我们可能会更有帮助,但是我会根据您提供的内容给您一些一般性的建议
我推测你的问题可能是以下几点:
你没有限制你的深度。您正试图搜索到游戏的最后一步。Minimax应该只搜索足够的车次,以使您的硬件能够应对压力
你的评分功能太低效了。在Minimax搜索中,score函数通常是大部分计算时间。如果效率低下,你将为此付出代价
类似地,生成有效移动列表的代码可能效率低下
您可能正在考虑无效的移动,这会导致树的分支超出其应有的范围
您没有充分概括您的代码。它对4x4不起作用,因为你已经硬编码了一些东西来依赖3x3板而没有意识到它
你的Alpha-Beta修剪不正确。你什么也没修剪李>
根据我实施MiniMax+变体的经验,这些往往是一些失败点。我将重申WhiteRabbit所说的:您应该看看
如果您更加具体,并且在将来包含您的代码,我们可能会更有帮助,但是我会根据您提供的内容给您一些一般性的建议
我推测你的问题可能是以下几点:
你没有限制你的深度。您正试图搜索到游戏的最后一步。Minimax应该只搜索足够的车次,以使您的硬件能够应对压力
你的评分功能太低效了。在Minimax搜索中,score函数通常是大部分计算时间。如果效率低下,你将为此付出代价
类似地,生成有效移动列表的代码可能效率低下
您可能正在考虑无效的移动,这会导致树的分支超出其应有的范围
您没有充分概括您的代码。它对4x4不起作用,因为你已经硬编码了一些东西来依赖3x3板而没有意识到它
你的Alpha-Beta修剪不正确。你什么也没修剪李>
根据我实施MiniMax+变体的经验,这些往往是一些失败点。嘿,Daan,欢迎使用SO。请看下面的链接。嘿,大安,欢迎来到SO。请看下面的链接。谢谢Brad S。我已经添加了用于解决此“问题”的代码。希望这能提供更多的信息。谢谢Brad S。我已经添加了用于解决此“问题”的代码。希望这能提供更多的信息。