首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >无递归的Alpha-beta树搜索

无递归的Alpha-beta树搜索
EN

Stack Overflow用户
提问于 2010-11-05 08:26:24
回答 2查看 1.7K关注 0票数 2

我希望看到一个没有递归的alpha-beta搜索的实现(更准确地说是negamax)。我知道基本的想法-使用一个或多个堆栈来跟踪级别,但拥有真正的代码会节省我很多时间。

用Java、C#或Javascript编写就好了,但C/C++也可以。

下面是(简化的)递归代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function search(crtDepth, alpha, beta)
{
  if (crtDepth == 0)
    return eval(board);

  var moves = generateMoves(board);
  var crtMove;
  var score = 200000;

  var i;
  while (i<moves.length) 
  {
    crtMove = moves.moveList[i++];

    doMove(board, crtMove);    
    score = -search(crtDepth-1, -beta, -alpha);
    undoMove(board, crtMove);

    if (score > alpha) 
    {
      if (score >= beta) 
      return beta;

      alpha = score;
    } 
  }
  return alpha;
}

搜索(4,-200000,200000);

EN

回答 2

Stack Overflow用户

发布于 2011-06-17 16:11:58

Knuth和Moore在1975年使用特别的Algol语言发布了一个迭代的alpha-beta例程。

An Analysis of Alpha Beta Pruning (第301页)

也在“算法分析论文选集”的第9章中。

它看起来并不是很容易转换成C#,但它可能会帮助那些想要做这件事的人,纯粹为了优化的乐趣。

我对国际象棋编程非常陌生,所以这超出了我的能力范围。另外,当我从"Copy-Make“切换到"Make-Unmake”时,我获得了最大的性能提升。我正在使用XNA,所以让我的GC延迟降到几乎为0解决了我所有的性能问题,现在它在我的360上比在我的PC上运行得更快,所以这种优化似乎很难满足我的需要。

另请参阅Recursion to Iteration

票数 1
EN

Stack Overflow用户

发布于 2018-01-31 18:45:26

对于较新的代码,我编写了一个非递归的Negamax例程作为EasyAI python库中的一个选项。具体源代码在:

https://github.com/Zulko/easyAI/blob/master/easyAI/AI/NonRecursiveNegamax.py

它使用一个具有固定对象数组(大小由目标深度决定)的简单循环,以有序的方式在树中上下移动。对于我正在使用它的特定项目,它比递归版本快六倍。但我相信每个游戏都会有不同的反应。

无可否认,这是一些密集和复杂的代码,到C/Java/C#的转换将是...很有挑战性。它几乎什么都没有,只是边界案例。:)

如果您将其转换为C/Java/C#,我希望看到结果。是否在评论中添加链接?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4104372

复制
相关文章
823. 排列 (递归搜索树 · 排列)
原题链接 描述 给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
浪漫主义狗
2022/07/11
4490
823. 排列 (递归搜索树 · 排列)
823. 排列 (递归搜索树 · 排列)
原题链接 描述 给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。
浪漫主义狗
2023/09/04
1280
823. 排列 (递归搜索树 · 排列)
821. 跳台阶 (递归搜索树 · 一维)
原题链接 描述 一个楼梯共有 n 级台阶,每次可以走一级或者两级,问从第 0 级台阶走到第 n 级台阶一共有多少种方案。
浪漫主义狗
2023/09/04
1360
821. 跳台阶 (递归搜索树 · 一维)
821. 跳台阶 (递归搜索树 · 一维)
原题链接 描述 一个楼梯共有 n 级台阶,每次可以走一级或者两级,问从第 0 级台阶走到第 n 级台阶一共有多少种方案。
浪漫主义狗
2022/07/11
1690
821. 跳台阶 (递归搜索树 · 一维)
822. 走方格 (递归搜索树 · 二维)
原题链接 描述: 给定一个 n×m 的方格阵,沿着方格的边线走,从左上角 (0,0) 开始,每次只能往右或者往下走一个单位距离,问走到右下角 (n,m) 一共有多少种不同的走法。
浪漫主义狗
2023/09/04
1230
822. 走方格 (递归搜索树 · 二维)
原题链接 描述: 给定一个 n×m 的方格阵,沿着方格的边线走,从左上角 (0,0) 开始,每次只能往右或者往下走一个单位距离,问走到右下角 (n,m) 一共有多少种不同的走法。
浪漫主义狗
2022/07/11
2660
Alpha-Beta 剪枝搜索实现黑白棋AI
黑方先行,双方交替下棋。 一步合法的棋步包括: 在一个空格处落下一个棋子,并且翻转对手一个或多个棋子; 新落下的棋子必须落在可夹住对方棋子的位置上,对方被夹住的所有棋子都要翻转过来, 可以是横着夹,竖着夹,或是斜着夹。夹住的位置上必须全部是对手的棋子,不能有空格; 一步棋可以在数个(横向,纵向,对角线)方向上翻棋,任何被夹住的棋子都必须被翻转过来,棋手无权选择不去翻某个棋子。 如果一方没有合法棋步,也就是说不管他下到哪里,都不能至少翻转对手的一个棋子,那他这一轮只能弃权,而由他的对手继续落子直到他有合法棋步可下。 如果一方至少有一步合法棋步可下,他就必须落子,不得弃权。 棋局持续下去,直到棋盘填满或者双方都无合法棋步可下。 如果某一方落子时间超过 1 分钟 或者 连续落子 3 次不合法,则判该方失败。
云微
2023/02/11
1K0
Alpha-Beta 剪枝搜索实现黑白棋AI
递归树
1.定义基本树结构 package com.un.common.utils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.util.List; @ApiModel("社区结构树") public class StructTree { @ApiModelProperty("社区结构id") private String csId;
用户5927264
2021/04/19
4850
LeetCode 95. 不同的二叉搜索树 II(递归)
类似题目: 程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)** LeetCode 96. 不同的二叉搜索树(DP)
Michael阿明
2020/07/13
5880
树的非递归遍历
树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。但我们需要借用到STL的栈模型来实现这个需求,具体的步骤如下:
我与梦想有个约会
2023/10/20
1950
GitHub开源的AI下五子棋(基于博弈树极大极小值alpha-beta剪枝搜索)
最近看到个两年前的AI案例,使用博弈树搜索算法实现AI下五子棋,什么是博弈树搜索呢?博弈就是相互采取最优策略斗争的意思。比如说下五子棋,你下一步,我下一步,这就是相互博弈。假设棋盘的大小是10*10,那就是100个点可以下, 那么第一步可选择的可能就是100, 假设是下在了A点, 那么第二步就有除了A点的剩下的99个点的可能。 假设下在了B点, 那么第二步就有除了B点的剩下的99个点的可能,假设下在了C点......
不脱发的程序猿
2021/01/20
3.8K0
java递归树实现
在下是首席架构师
2023/07/11
1970
java递归树实现
树的遍历非递归实现
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <algorithm> #include <map> #include <vector> #include <set> #include <queue> #include <stack> #include <math.h> using namespace std; struct Node { int val; Node* left; Node*
ShenduCC
2020/05/25
7940
二叉树的非递归遍历(递归和非递归)
二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。   1.递归实现 void pre_order(BTree
猿人谷
2018/01/17
1.5K0
递归函数及例题_递归树求解递归式例题
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说递归函数及例题_递归树求解递归式例题,希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
6810
递归函数及例题_递归树求解递归式例题
递归树:借助树来求解递归算法时间复杂度
我们前面讲过,递归的思想就是,将大问题分解为小问题来求解,然后再将小问题分解为小小问题。这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止。
acc8226
2022/05/17
1.5K0
递归树:借助树来求解递归算法时间复杂度
非递归遍历树
先序非递归遍历比较简单,感觉与DFS类似,根据先序遍历的规则根左右,先将根节点压入栈,然后遍历左子树,再遍历左子树的左子树,一头走到NULL,把每次遍历的左子树的根节点依次入栈并把当前结点数据打印出来。最后为NULL,开始回溯,返回到前一结点(也就是当前结点的根节点),开始遍历右子树。依次类推。
AngelNH
2020/04/16
8710
平衡搜索树
2-3树 ​ 其实仔细来看2-3树好像是 B 树的一个特例,它规定了一个节点要么有一个 key 要么有两个 key。 如果有一个 key 那么他就有两个子节点,左边小于这个 key 右边大于这个 key 如果有两个 key 那么他就有三个子节点,左边小于,中间处于两者之间,右边大于 ​ 这样一来就会发现他其实也会处在插入的时候出现分裂的情况,当一个节点需要插入的时候我们先让他插入,这时候可能出现一个节点有三个 key 的情况,我们就打出四个分支,然后我们把中间的那个 key 分裂到父节点
lwen
2018/04/17
9040
技能 | 只要五步,教你撸一个缩减版国际象棋AI
从国际象棋到中国围棋,人类与“机器”已经较上了劲。 看过那么多场对战,你是不是也想上手体验一把? 来来来,简单五步,手把手教你撸一个缩减版的国际象棋AI。 首先,我们来看一些基础概念: 移动生成 棋面评估 Minimax算法 alpha beta剪枝 在每个步骤中,我们将通过一个国际象棋程序技术来改进算法。我将演示每个步骤是如何影响算法的。 你可以在GitHub上查看AI算法的最终版本。 https://github.com/lhartikk/simple-chess-ai 我无法打败
AI科技大本营
2018/04/27
1.7K0
技能 | 只要五步,教你撸一个缩减版国际象棋AI
LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
Michael阿明
2020/07/13
4340
LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)

相似问题

无递归的树迭代

11

递归搜索树

115

递归树搜索

30

MySQL递归树搜索

67

无环尾递归树遍历

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文