QT五子棋详解之九:置换表,zobrist哈希,生成32位和64位随机数



我们很容易明白,在alpha-beta剪枝算法中,会遇到重复的棋局。如下面的两个图的走法是一样的,不必要将两个局面的得分都计算一次。




因此需要将棋盘的信息保存起来以备后续使用,这就是置换表。在棋类游戏中经常使用的就是zobrist哈希。

zobrist哈希并不是一种最好的哈希算法,但是确实最高效的。有时候我们必须在最好与效率之间做出选择。

zobrist是一个人的名字,源自他1970的年的一片论文



试想一下你如何有效的存储一个棋盘的信息呢?zobrist提供了一种办法:棋盘的一个唯一的标识就是棋盘的所有状态的异或值。

棋盘的每一个状态实际就对应着一个随机数。在五子棋中,我们忽视空白,将每一个位置的状态标示为黑棋或白棋两种状态。

第一步:是需要初始化每一个状态的随机数。设置两个数组。对于随机数的产生使用了Twister算法,开源项目:www.agner.org/random

其实就是用别人写好的,调用一下函数,不要想得那么复杂。rand函数只能生成五位随机数,不推荐使用。

  int WriteZobrist[15][
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
围棋是一种复杂的博弈,对于围棋人机对弈,通常采用博弈树搜索算法。而为了加快搜索速度,可以使用Zobrist Hashing技术来优化搜索。 具体实现步骤如下: 1. 定义棋盘状态 我们需要定义一个二维数组来示棋盘。其中,空点用0示,黑子用1示,白子用2示。 2. 定义Zobrist哈希 我们需要定义一个Zobrist哈希,用来存储每个棋盘状态的哈希值。在实现中,我们需要定义一个随机数数组,用来示每个点的随机哈希值,然后通过异或运算将每个点的哈希值合并成整个棋盘状态的哈希值。 3. 实现博弈树搜索算法 我们需要实现一个博弈树搜索算法,来搜索最优的下棋位置。在实现中,我们可以采用极小极大算法来搜索最优解。具体实现步骤如下: - 对于当前棋盘状态,首先计算出当前哈希值,并查询Zobrist哈希,如果已经存在该状态的哈希值,则直接返回对应的估值。 - 如果当前状态不在哈希中,则遍历所有空点,逐个尝试落子,并递归搜索下一层棋盘状态。 - 在递归搜索下一层时,交换当前玩家,并更新哈希值。 - 在搜索完所有子状态后,根据当前玩家的颜色,返回最大或最小的估值,并将当前状态的哈希值和估值存入Zobrist哈希中。 4. 实现下棋功能 当我们搜索出最优的下棋位置后,就可以将对应的棋子落在棋盘上,并更新棋盘状态和哈希值。 总结: 通过以上步骤,我们可以实现一个基于Zobrist哈希和博弈树搜索算法的围棋人机对弈程序。该程序可以在较短时间内搜索出最优解,并且可以通过调整博弈树的深度来控制搜索速度和难度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值