并行博弈树搜索算法-第4篇 更上一层楼:Alpha-Beta算法的改进

在Alpha-Beta算法被广泛运用后,对该算法的很多改进算法也相继被提出.这些改进算法主要在以下几个方面对Alpha-Beta算法进行改进[7]:

1. 择序(ordering).在搜索博弈树时,内部结点有多个可能的移动.择序指的是搜索这些分支的顺序.择序影响着搜索叶结点的个数,使得其数目在[,]区间内变化.如果择序使得博弈树是随机的,那么所需搜索的叶结点的个数较多,如果择序使得博弈树是强有序的,那么所需搜索的叶结点的个数较少.

在Alpha-Beta算法中,提高择序的好坏就意味着提高剪枝发生的概率.所以一个好的移动(sufficientor good move)可以定义为:

a. 导致剪枝的移动.

b. 或者如果没有导致剪枝,但是产生了最小最大值.

注意一个好的移动并不一定是最优的移动(best move),因为一个导致剪枝的移动可能引起了该子结点上的搜索停止,但是并不意味着其后的子结点的搜索不会产生一个更好的值(value).

2. 搜索窗口的大小.搜索窗口的大小指的是β和α之差.搜索窗口越小,发生剪枝的概率越大.

3. 信息的重用.保存子树的搜索结果,并审查这棵子树是否在随后的搜索中再次出现.如果该子树再次出现,那么关于子树的搜索结果的信息就可重复使用.

对Alpha-Beta算法比较常用的改进[8]将在下面介绍.

4.1     吸出搜索(Aspirationsearch)

为了保证Alpha-Beta搜索能返回最大最小值,一般将搜索的窗口设置为[-∞,+∞].如果能够同过一种有效的方法就出最大最小值的估计值V及其误差范围e,那么搜索窗口上下限可以设的更紧一些[V - e, V + e].这样做虽然可能导致搜索不能返回正确的最大最小值,但是也有可能更快地找到正确最大最小值.当发现返回的值不处在预测的范围之内时,需要重新进行搜索.如果由于缩小窗口而节省的开销大于由于重新搜索而增加的开销,则搜索速度得到了提升.

普通的Alpha-Beta搜索一般按照如下方式调用函数发起对博弈树的搜索:

1:	node ← root
2:	AlphaBeta(node, -∞, +∞)
吸出搜索使用如下策略发起对博弈树的搜索:
1:	node ← root
2:	V ← estimated_value(node)
3:	e ← expected_error_limit(node)
4:	alpha ← V - e
5:	beta ← V + e
6:	V ← AlphaBeta(node, alpha, beta)
7:	if V ≥ beta then
8:		V ← AlphaBeta(node, -∞, beta)
9:	if V ≤ alpha then
10:		V ← AlphaBeta(node, alpha, +∞)

4.2     转移表(Transposition Table)

转移表是一个大的直接访问表(direct access table),表中存储了已经搜索过的结点(或者子树)的搜索结果,包括子树的博弈值,最佳移动(best move)和位置.不管该子树是搜索完全得到了博弈值,还是只是完成部分搜索得到缩小的搜索窗口,由于重新搜索一个曾经搜索过的位置经常发生,所以使用转移表可以达到一些提高搜索效率的目的.首先,可能可以通过使用转移表来缩小搜索窗口.其次,以前的最佳移动被率先尝试,而这个移动可能曾经导致了一个剪枝,并有可能再次引发剪枝.跟进一步的,如果该子树已经搜索完成,那么根本没有必要再次搜索,只需要返回转换表中的博弈值即可.

下面的程序就是使用转移表的Alpha-Beta算法[8]:

AlphaBeta(node, alpha, beta)
1:	(length, score, flag) ← Retrieve(node, node.opt)
2:	if length ≥ node.depth then
3:		if flag = VALID then
4:			return score
5:		if flag = LBOND then
6:			alpha ← Max(alpha, score)
7:		if alpha ≥ beta then
8:			return score;
9:	if depth ≤ 0 then
10:		return EvaluateNe
  • 11
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
k-means是一种聚类算法,可以将数据集中的数据分成k个类别。并行化k-means算法可以大大提高聚类速度,特别是对于大规模数据集和高维数据集。 并行k-means算法的基本思想是将数据集分成若干部分,每个部分分配给不同的处理器,然后在每个处理器上运行k-means算法。接着,将每个处理器上得到的聚类中心合并,以得到最终的聚类结果。 常见的并行k-means算法包括: 1. 基于数据分区的并行k-means算法:将数据集分成若干部分,每个部分分配给不同的处理器,每个处理器都运行k-means算法。然后,将每个处理器得到的聚类中心合并,以得到最终的聚类结果。 2. 基于任务分解的并行k-means算法:将k-means算法分解成若干子任务,每个子任务分配给不同的处理器。每个处理器都运行自己的子任务,然后将每个子任务的聚类中心合并,以得到最终的聚类结果。 3. 基于流水线的并行k-means算法:将k-means算法分解成若干阶段,每个阶段分配给不同的处理器。每个处理器都运行自己的阶段,然后将每个阶段的聚类中心合并,以得到最终的聚类结果。 总的来说,并行k-means算法可以利用多个处理器的计算能力,提高聚类速度。但并行化k-means算法也会带来一些问题,比如如何划分数据集、如何合并不同处理器上的聚类中心等。因此,在实际应用中需要根据具体情况选择合适的并行算法,以达到最好的聚类效果和速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值