并行博弈树搜索算法-第6篇 百花齐放:各种并行Alpha-Beta算法

个人对Alpha-Beta搜索算法的理解 Alpha-Beta是对Max-Min搜索的剪枝。 那么Max-Min究竟是什么呢? 这个Max-Min算法可以应用于很多棋类游戏,例如五子棋。 博弈树 五子棋很明显的一个特点就是,你将尽最大努力在横竖斜方向使五个棋子连续排在一起,而你的对手将对你穷追堵截,最后谁先达到目标谁就获胜。 棋类游戏都有一个特点,你下一手,我下一手,那么如何使我下的每一手棋都是最优呢?枚举。 枚举出现在棋盘上我能下的每一... 阅读详情

下面开始介绍一些在Alpha-Beta算法中引入并行化的方法和算法.

6.1     并行求值(Parallel Evaluation)

游戏的博弈程序经常要在搜索深度和叶结点的求值复杂度之间进行平衡.一些博弈程序,使用简化的估值函数,以获得更深的搜索深度.但是花费在对叶结点的求值中的时间仍然占搜索时间的很大一部分.一个在博弈树搜索中应用并行性的思想[6]就是将求职函数设计得较为复杂,并将它划分到多个处理器中并行计算,然后综合各部分结果,得到最终的估值.

6.2     并行吸出(Parallel Aspiration)

并行吸出(Parallel Aspiration)或者窗口分裂(Window Spittting)搜索[13]基于这样的思想:如果将搜索窗口设置为一个小的区间,如果最大最小值处于这个小的区间中,那么就可以在搜索较少的叶结点的情况下得到最大最小值.

在并行吸出搜索中,初始搜索窗口[-∞, +∞]被划分成p个不相交的区间.其中p为处理器的个数.每个处理器以分配给它们的区间作为搜索窗口,使用Alpha-Beta算法并行地搜索同一棵博弈树.由于这些搜索窗口覆盖了初始窗口[-∞, +∞],所以总有一个处理器可以搜索到正确的最大最小值.当这个正确的最大最小值被一个处理器搜索到之后,所有其他的处理器就立即停止搜索.

实验表明[6],在一些情况下,当处理器个数p较少时(例如,p为2或3),这种算法可以获得超过p倍的加速,但是,算法能获得的最大加速却非常有限,并且与处理器个数的多少无关.

6.3     Tree Splitting 算法

在Tree Splitting 算法中,处理器同过通信线(communicationline)以树形结构组织起来,形成一棵处理器树(processor tree).处理器树的结点对应一个处理器,结点之间的连线对应于通信线.处理器树中的每个内部处结点都有若干子结点,这些子结点均为父结点的子处理器(child processor).没有子结点的处理器称为叶处理器(leaf processor),否则称为主处理器(master).叶处理器执行串行的Alpha-Beta算法,也就是从算法(slavealgorithm),而主处理器均执行主算法(master algorithm).

在Tree Splitting 算法开始后,博弈树的根结点由给处理器树的根结点处理.该根处理器产生博弈树的根结点的所有移动,并将这些子结点交给它的子处理器处理.父处理器总是把自身负责的结点的子结点交给其子处理器处理,如此继续,直到一个结点的搜索被分配给处理器树中的叶结点.叶处理器执行串行Alpha-Beta算法,并将结果提交给其父处理器.内部结点接收其子处理器提交的博弈值,并判断是否能据此改变搜索窗口的alpha值,如果可以,它将中断所有子处理器的搜索,并强迫所有子孙处理器更新搜索窗口.当内部结点接收到所有子处理器提交的博弈值之后,就计算最佳的博弈值并提交给父处理器.最后,就可以在根处理器里得到博弈树的最大最小值.

一个Tree Splitting 算法的伪代码如下所示[6]:

TreeSplit(node, alpha, beta)

1:    if(I am a leaf processor) then

2:         return(AlphaBeta(node, alpha, beta))

3:    fori ← 1 to node.branch.length par-do

4:         while(a slave j is idle) do

5:               new_node ← Traverse(node,node.branch[i])

6:               value[i] ← -j.Treesplit(new_node,-beta, -alpha)

7:               critical begin

8:                    if value[i] > alpha then

9:                          alpha ← value[i]

10:              critical end

11:              if alpha ≥ beta then

12:                   Terminate()

13:                   return alpha

14:   returnalpha

Update(depth, side, bound)

1:    if(side > 0) then

2:         alpha[depth] ← Max(alpha[depth],bound)

3:    else

4:         beta[depth] ← Min(beta[depth],bound)

5:    ifdepth > 0 then

6:         Update(depth-1, -side,-bound)
上述伪代码中,Update()函数就是进行搜索窗口更新的函数.par-do指的是并行地执行for循环中的代码.j.Treesplit()指的是在传递参数给空闲处理器j,在j中执行Treesplit()函数,并将处理结果返回到当前处理器.

主处理器在等待其子处理器搜索完成时处于空闲状态,为了利用这段空闲时间,Tree Splitting 算法可以引入如下的改进:

1.在空闲时,主处理器执行从算法,搜索那些由于找不到空闲子处理器而没有被搜索的子树.

2.主处理负责博弈树中的多层结点,以减少空闲时间.

3.主处理可以将一个子结点的所有子结点都分配给一个子处理器,这不仅减少了子处理器的空闲时间,而且能使得alpha值和beta值的共享更方便.

在Tree Splitting算法中,只有离根结点的深度少于k的结点才能并行搜素.其中k为处理器树的深度.由于在一个最好或者较好的移动找到前,可能大量无用的搜索已经并行完成了,所以算法的搜索开销比较大.

6.4     PVSplit算法

主变量分裂(Principal Variation Splitting,简称PVSplit)算法是对Tree Splitting算法的一种改进.它的基本思想是,直到最左路径搜索完成之后,才进行博弈树树的分裂(tree decomposition),开始并行搜索.与TreeSplitting算法一样,PVSplit算法也使用处理器树的方式来管理处理器,分配对博弈树的搜索.

一个PVSplit算法的伪代码如下所示[6]:

PVSplit(node, alpha, beta)

1:    if(node.depth = 0) then

2:         return(TreeSplit(p,alpha, beta))

3:    new_node ← Traverse(node,node.branch[1])

4:    alpha ← -PVSplit(new_node,-beta, -alpha)

5:    ifalpha ≥ betathen

6:         returnalpha

7:    fori ← 2 to node.branch.length par-do

8:         while(a slave j is idle) do

9:               new_node ← Traverse(node,node.branch[i])

10:              value[i] ← -j.TreeSplit(new_node,-beta, -alpha)

11:              critical begin

12:                   if (value[i] > alpha) then

13:                         alpha ← value[i]

14:              critical end

15:              if (alpha ≥ beta) then

16:                   Terminate()

17:                   return alpha

18:   returnalpha

PVSplit算法对强有序的博弈树的搜索效率较高.试验表明,在搜索强有序博弈树时,PVSplit算法比Tree Splitting算法的性能优越,尤其是在处理器树较宽的时候.衡量处理器树宽度的指标是处理器树的扇出(fan-out),即每个处理器所拥有的子处理器的个数.

6.5 

数据结构算法-并行搜索算法 虽然感觉好像写死 如果执行完,返回点东西 那么是没法子的 要么只能定义结构体 包含功能性返回值 参数设置修改等等 但也只能这样用 因为早期的也没有一些模版 啊什么的 当然就算模版 也不这么自由 要想达到恐怕得用全新的CPU 架构协议 到时候未必是所有的程序语言能够开发 应用系统 应用程序…虽然单个CPU的效率,看似乎只能执行一个进程,但他会切换 切换的时间 每秒执行 亿或者上百万条指令 单个CPU 是以时间片段 执行 可能以10微秒 的切换到另一个进程 把不同的时间片分给不同的进程。 阅读详情

相关推荐

Unity插件-Mirror使用方法(一)Mirror介绍

Unity Mirror 是一个专为 Unity 引擎设计的开源、社区驱动的网络库,主要用于简化多人联机游戏的开发。它最初是为了替代 Unity 原生的 UNet 系统(已被官方弃用)而创建的,因其轻量、灵活和高效的特点,成为 Unity 开发者构建多人游戏的热门选择。

qq_44501691的博客 4099

CocosCreator | 自定义启动页之H5

01 效果对比 默认启动页: 自定义启动页: 02 启动页存在的意义 我们在 creator 中的开发的游戏都是基于 cocos engine,所以在展示我们的游戏之前,是必须要先加载 cocos engine,然后才是我们自己的业务代码 流程图如下: 而构建完成后未精简的 cocos engine 代码为 1.9M 如果再加上物理相关代码的话,一共是2M 别忘了,我们自己的首场景也要加载过程哦 所以,从游戏启动,到真...

Valiancer 5896

深入瑞芯微SDK:手把手解析Uboot、Kernel到Rootfs的镜像生成与烧录

本文深入解析瑞芯微SDK中从Uboot、Kernel到Rootfs的镜像生成与烧录全流程,揭示编译背后的技术细节。通过详细分析SDK架构、镜像生成流水线、分区表定制、Rootfs构建及烧录科学,帮助开发者从会编译进阶到懂原理,掌握系统级开发的关键技术。

weixin_29193359的博客 270

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2101

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 477

手把手教你绕过网易易盾验证码:滑块、点选、语序全攻略

本文深度解析了以网易易盾为代表的现代验证码技术,重点探讨了滑块、点选、语序及空间推理等交互式验证码的工作原理与对抗策略。文章从行为验证和空间推理的核心逻辑出发,剖析了验证码交互的数据流与关键参数,并提供了模拟人类行为轨迹、维护设备指纹等工程实践方法,旨在帮助开发者在合规前提下设计更健壮的自动化流程。

3c4x5z6v7b的博客 706

局部路径规划算法 - B样条曲线(B-spline Curves)

本文详解了B样条以及代码实现

BigDavid123的博客 6506

详解卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

qq_25762497的博客 25万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 并行博弈树搜索算法-第5篇 人多力量大(?):并行Alpha-Beta算法
下一篇: 文件系统那些事-第1篇 丰富多样的文件系统
存储李希
博客等级 码龄15年 418粉丝 69原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值