|
在课堂上我们的五子棋程序有最基本的棋型判断,但是并不具有“前瞻性”。我们可以利用Minimax算法来解决这一问题。该算法基于当前状态推测对我方最有利而对方最不利的落子点位,同时假设对方会在对对方最有利而对我方最不利的点位落子。α-β剪枝搜索是Minimax算法的一个优化。
下面是实现上述逻辑的伪代码:
- # Minimax算法框架:
- # - 最大化己方收益,最小化对方收益
- # - 通过深度搜索模拟未来几步的可能走法
- # - alpha表示己方保证的最低分,beta表示对方保证的最高分
- # - 当alpha >= beta时,可以剪枝停止搜索该分支
- def recursive_search(board,turn,depth,a,b):
- if depth<=0:
- return 静态评估棋盘的价值
- 生成有价值的下一招候选集合(取决于你怎么判断有价值,可以将所有空白点位设为下一招,也可以将有邻居的空白点位设为下一招,或者别的方法也行)
- for 下一招 in 下一招候选集合:
- 取出下一招的x,y
- board[y][x]=turn #假设这一步是己方下,注意此处的己方可能是我方,也可能是对方,会交替更换
- score=-self.recursive_search(board,对方的turn(交替落子方),depth-1,-b,-a) #深度搜索,score由静态评估棋盘的价值一层层传递上来
- board[y][x]=0 #深度搜索后重置
- if score>a:
- a=score #a是此前最好的评分,但是现在被更新了
- 认为(x,y)是局部最优解
- if a>=b:
- break
- 更新当前最优解为(x,y)
- return a
复制代码 在实现这一算法后,棋力将有很大提升。
|
|