R码的包含alpha-beta剪枝的Minimax理论

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

需要帮助开发R中的alpha-beta修剪minimax算法。目前我已经实现了minimax算法,但它仅适用于3x3板。4x4电路板不运行-->到长时间运行

我从3x3板上复制了代码,但我意识到我无法提供深度。所以我假设它适用于4x4电路板的所有示例。在minimax代码部分实现alpha-beta剪枝需要修改什么。由于我对这个领域相当陌生,所以我试图修改现有代码,以了解每个部分正在做什么

# 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。我已经添加了用于解决此“问题”的代码。希望这能提供更多的信息。