就像我们在之前的文章中讨论的那样,硬编码的 AI 可以用来创建一个聪明的对手,你可以挑战经典的井字游戏!

但是,该算法仍然可以进一步优化。但我们如何做到这一点?Alpha Beta Pruning 是一种搜索算法,它试图减少由 minimax 算法在其搜索树中评估的集线器数量。它是一种对抗性搜索算法,通常用于两人游戏(井字游戏、国际象棋、围棋等)的机器游戏。

当观察到不少于一个概率最终比以前分析的举动更令人遗憾时,它就停止完全评估一个举动。此类举动无需进一步评估。当连接到标准的极小极大树时,它会恢复与极小极大树无法区分的移动,但会修剪掉不会以任何方式、形状或形式影响官方结论的分支!

你一定在想这个数字到底意味着什么。好吧,它显示了算法如何忽略在我们的游戏动作中并不真正需要的子树。该算法保持了两个品质,alpha 和 beta,它们分别说明了扩展玩家所保证的基本分数和限制玩家所保证的最大分数。起初 alpha 是负无穷大,而 beta 是肯定无穷大,即两个玩家以他们最可怕的分数开始。在任何时候,限制玩家 (beta) 保证的最极端分数都不会像扩展玩家 (alpha) 保证的基本分数一样多(即 beta <= alpha),增强玩家不需要考虑这个中心的亲戚,因为他们永远不会真正参与进来。

算法

笔记 :

  • Alpha Beta Pruning 不是一种新算法,实际上是一种优化!

  • Alpha最大化者目前在该水平或以上可以保证的最佳值。

  • Beta最小化器当前可以保证在该级别或以上的最佳值。

当然,我们使用井字游戏作为参考示例!

def minimax(depth, player, alpha, beta)if gameover or depth == 0return calculated_scoreendchildren = all legal moves for playerif player is AI (maximizing player)for each childscore = minimax(depth - 1, opponent, alpha, beta)if (score > alpha)alpha = scoreendif alpha >= betabreakendreturn alphaendelse #player is minimizing playerbest_score = +infinityfor each childscore = minimax(depth - 1, player, alpha, beta)if (score < beta)beta = scoreendif alpha >= betabreakendreturn betaendend
end#then you would call it like
minimax(2, computer, -inf, +inf)
Python
复制

复杂

  • 最坏情况性能: O(|E|) = O(b^(d/2))
  • 最坏情况空间复杂度: O(|V|) = O(b * d)

实现

  • Next Best Move Guesser - Python

交互式控制台游戏- Python


import numpy as np
import sys
from copy import copyrows = 3
cols = 3board = np.zeros((rows,cols))inf = float("inf")
neg_inf = float("-inf")def printBoard():for i in range(rows):for j in range(cols):if board[i, j] == 0:sys.stdout.write(' _ ')elif board[i, j] == 1:sys.stdout.write(' X ')else:sys.stdout.write(' O ')print ''# The heuristic function which will be evaluating board's position for each of the winning POS
heuristicTable = np.zeros((rows+1, cols+1))
numberOfWinningPositions = rows + cols + 2for index in range(rows+1):heuristicTable[index, 0] = 10**indexheuristicTable[0, index] =-10**indexwinningArray = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]])def utilityOfState(state):stateCopy = copy(state.ravel())heuristic = 0for i in range(numberOfWinningPositions):maxp = 0minp = 0for j in range(rows):if stateCopy[winningArray[i,j]] == 2:maxp += 1elif stateCopy[winningArray[i,j]] == 1:minp += 1heuristic += heuristicTable[maxp][minp]return heuristicdef minimax(state,alpha,beta,maximizing,depth,maxp,minp):if depth==0:return utilityOfState(state),staterowsLeft,columnsLeft=np.where(state==0)returnState=copy(state)if rowsLeft.shape[0]==0:return utilityOfState(state),returnStateif maximizing==True:utility=neg_inffor i in range(0,rowsLeft.shape[0]):nextState=copy(state)nextState[rowsLeft[i],columnsLeft[i]]=maxp#print 'in max currently the Nextstate is ',nextState,'\n\n'Nutility,Nstate=minimax(nextState,alpha,beta,False,depth-1,maxp,minp)if Nutility > utility:utility=NutilityreturnState=copy(nextState)if utility>alpha:alpha=utilityif alpha >=beta :#print 'pruned'break;#print 'for max the best move is with utility ',utility,' n state ',returnStatereturn utility,returnStateelse:utility=inffor i in range(0,rowsLeft.shape[0]):nextState=copy(state)nextState[rowsLeft[i],columnsLeft[i]]=minp#print 'in min currently the Nextstate is ',nextState,'\n\n'Nutility,Nstate=minimax(nextState,alpha,beta,True,depth-1,maxp,minp)if Nutility < utility:utility=NutilityreturnState=copy(nextState)if utility< beta:beta=utilityif alpha >=beta :#print 'pruned'break;return utility,returnStatedef checkGameOver(state):stateCopy=copy(state)value=utilityOfState(stateCopy)if value >=1000:return 1return -1def main():num=input('enter player num (1st or 2nd) ')value=0global boardfor turn in range(0,rows*cols):if (turn+num)%2==1: #make the player go first, and make the user player as 'X'r,c=[int(x) for x in raw_input('Enter your move ').split(' ')]board[r-1,c-1]=1printBoard()value=checkGameOver(board)if value==1:print 'U win.Game Over'sys.exit()print '\n'else: #its the computer's turn make the PC always put a circle'#right now we know the state if the board was filled by the other player state=copy(board)value,nextState=minimax(state,neg_inf,inf,True,2,2,1)board=copy(nextState)printBoard()print '\n'value=checkGameOver(board)if value==1:print 'PC wins.Game Over'sys.exit()print 'Its a draw'if __name__ == "__main__":main()
Python
复制

应用

它的主要应用是在国际象棋游戏中。Stockfish(国际象棋)是一个 C++ 开源国际象棋程序,实现了 Alpha Beta 剪枝算法。Stockfish 是一个成熟的实现,被评为当今最强大的国际象棋引擎之一,它在 2016 年和 2017 年赢得了顶级国际象棋引擎锦标赛就证明了这一点。

需要注意的一件更有趣的事情是,alpha-beta 剪枝的实现通常可以通过它们是“软故障”还是“硬故障”来描述。伪代码说明了故障软变化。使用 fail-soft alpha-beta,alphabeta 函数可能返回的值 (v) 超过(v < α 或 v > β)由其函数调用参数设置的 α 和 β 边界。相比之下,fail-hard alpha-beta 将其函数返回值限制在 α 和 β 的包含范围内。

Minimax 算法中的 Alpha Beta 剪枝相关推荐

  1. 五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...

  2. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...

  3. 五子棋AI算法-Alpha Beta剪枝

    上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...

  4. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  5. alpha,beta剪枝详解

    α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...

  6. alpha beta 剪枝算法

    摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子​​树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...

  7. python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解

    Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β  则N有解. 若 α > β 则N无解. ...

  8. 软件版本中的Alpha,Beta,RC,Trial是什么意思

    版本号: V(Version):即版本,通常用数字表示版本号.(如:EVEREST Ultimate v4.20.1188 Beta ) Build:用数字或日期标示版本号的一种方式.(如:VeryC ...

  9. (转)软件版本中的Alpha,Beta,RC,Trial是什么意思?

    版本号: V(Version):即版本,通常用数字表示版本号.(如:EVEREST Ultimate v4.20.1188 Beta ) Build:用数字或日期标示版本号的一种方式.(如:VeryC ...

  10. c语言博弈算法,C ++中博弈论中的Minimax算法(Alpha-Beta修剪)

    描述 Aplha-Beta修剪是minimax算法中使用的一种优化技术.该算法的思想是切断游戏树的分支,由于已经存在更好的动作,因此无需进行评估. 该算法引入了两个新领域-Alpha-这是最大化玩家可 ...

最新文章

  1. ASPNET 页面编码
  2. 复制网页自动追加文字js
  3. fileinput 图片上传
  4. Effective STL 条款30
  5. [css] 如果css文件过大时,如何异步加载它?
  6. 分屏 取消_记录Android7.0以上手机开启分屏后活动的生命周期变化
  7. python使用sqlalchemy判断数据库是否包含某张表
  8. Ubuntu下构建gstreamer开发环境
  9. Java存储任意对象_浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象...
  10. 静态NAT、动态NAT、PAT(端口多路复用)的配置
  11. AndroMDA中的用例图和活动图介绍(MagicDraw)
  12. 龙芯源码编译mysql_使用源码包在龙芯2F上安装mysql
  13. 【spark】RDD-API
  14. SpringBoot 实现统一参数校验
  15. 仿站高手是怎么练成的 分析仿站必备知识总结
  16. 魔法密文 Writeup| DASCTF Oct X 吉林工师
  17. 相遇问题 - 时针与分针
  18. s7-200软件怎么测试,S7 200 测速程序是否正确请高手指导
  19. 【STM32F407的DSP教程】第18章 DSP控制函数-更好用的SIN,COS计算
  20. 用chatGPT写一段SAP的代码

热门文章

  1. 微信公众号群发模板消息占用每月4次群发次数吗
  2. 俄罗斯航空发动机AL-31F(solidworks模型)
  3. python识别图片中数字_使用Python程序识别图像中的数字
  4. JavaScript 设计模式——策略模式
  5. 金蝶kis专业版 服务器系统,金蝶kis专业版服务器设置
  6. 将ppt的图保存成矢量图
  7. linux复制文件的命令是什么?
  8. android rxbus github,RxBus的实现及简单使用
  9. 面试精选逻辑推理题总结
  10. sketch软件_初学UI设计要学sketch软件吗?