如何并行化negamax算法



是否有一种方法可以并行化以下negamax算法?

01 function negamax(node, depth, color)
02     if depth = 0 or node is a terminal node
03         return color * the heuristic value of node
04     bestValue := −∞
05     foreach child of node
06         v := −negamax(child, depth − 1, −color)
07         bestValue := max( bestValue, v )
08     return bestValue

当这样提出时,作为单个递归函数,不容易。

最简单的方法是将其分为两个函数:一个专门用于您在树的根部的第一个调用,然后是一个被称为的不同函数,并递归地继续自称。在根版中,您可以通过孩子并行将循环并行,并将不同的值存储在列表中。然后,您只需要一个非平行的循环即可找到最大列表,但这将立即完成。

请注意,如果您继续进行诸如Alpha-Beta修剪之类的增强功能,这将变得更加复杂。像我在这里建议的那样,天真平行的第一个循环将大大减少可以通过alpha-beta修剪来修剪的节点的数量

拓扑 纯[SERIAL]值依赖性链决定游戏:

鉴于树木的使用,递归配方的使用不是原因,而是导致的因果关系,因为递归配方非常易于绘制和代码。(对于那些确实对计算机科学感兴趣的人,只需基于递归构造的计算策略的资源消耗和测试(在 [SPACE] - 和 [TIME] domains中(它开始造成麻烦,一旦您的基准标准缩放在学校书籍示例之外的问题量表和/或超越设计师的选择,这是在这个非常有用的困境中,涉及深度递归水平的公平性和设置资源以及什么接下来发生,如果递归试图深入研究更深的一步,那么确实发生了"预缝"玻璃天花板(。


如何将其转换为true- [PARALLEL] 计算时间表?

关于找到true- [PARALLEL] 处理策略的机会直接确定找到不可行的pure- pure- [SERIAL] 依赖关系链,从每一个开始,这终端节点和向后进展,向树root节点。

树拓扑需要在树的反向穿越期间出现的相互依赖性的某种"交流",因此所有主要优点a true- [PARALLEL] 可以有效地丢失处理时间表为了将纯[SERIAL]值依赖性链的产物传递到"下一个"非本地处理的代码流执行。这使原始想法成为反pates。

意识到这一主要纯粹 - [SERIAL] 依赖性,任何想像当的执行尝试仍然可能是可能的,但是其绩效结果比任何合理支持的选择都更加反图案,因为它们实际上会花费成本给定串行链处理(在[TIME]-域中(,给定[SPACE] -domain允许使用此类作案操作。

,给出了串行链处理(是否递归制定(。

最新更新