C#极小极大树的实现

C#极小极大树的实现,c#,tree,chess,C#,Tree,Chess,我正在尝试编写C#Chess AI 在那一刻,我必须建立我的minmax树。我尝试使用递归,但是我的递归函数必须为每个节点调用自己大约1000000次。我得到堆栈溢出异常后,大约。。。60000个电话。我猜您使用的是深度优先搜索。当搜索空间如此之大时,这并不太有用。在实现minimax时,您可以使用宽度优先搜索作为深度优先搜索来实现 作为函数的参数,您应该有一个允许递归的最大级别数,并在每次递归调用函数时减少一个级别,直到停止并回溯时达到零为止。从一个小的最大深度开始,然后慢慢增加它,直到找到一

我正在尝试编写C#Chess AI


在那一刻,我必须建立我的minmax树。我尝试使用递归,但是我的递归函数必须为每个节点调用自己大约1000000次。我得到堆栈溢出异常后,大约。。。60000个电话。

我猜您使用的是深度优先搜索。当搜索空间如此之大时,这并不太有用。在实现minimax时,您可以使用宽度优先搜索作为深度优先搜索来实现


作为函数的参数,您应该有一个允许递归的最大级别数,并在每次递归调用函数时减少一个级别,直到停止并回溯时达到零为止。从一个小的最大深度开始,然后慢慢增加它,直到找到一个可接受的解决方案,否则时间就会用完。

鉴于递归的深度可能未知,您可能希望停止到一个合理的限制,例如提前10步和/或忽略效用分数较低的树。通过添加这些额外的约束,您还可以确保快速找到解决方案,而无需进行大量优化

正如其他人所说,考虑到大量的迭代,您可能有一个bug。可能会删减各种规则或选择不同的搜索策略以减少所需的迭代次数,例如,或者可能是为了好玩

即使结果不是完美的,也最好返回结果,而不是在搜索树太深后失败


祝你好运。

大多数国际象棋搜索程序只能搜索到深度9或10。这根本不足以使堆栈溢出

您的程序可能有错误。在任何情况下,您都需要对搜索设置深度限制,因为如果没有深度限制,您将无法进行全宽搜索(探索所有移动到给定深度的可能性),因为国际象棋游戏可能具有无限深度(重复位置或移动限制规则除外)

在搜索到大约深度9后,必须使用静态board评估函数来评估和评分位置。然后使用mini-max算法修剪搜索树的分支。不过,这仍然是一个指数搜索


还有一些技术,比如静态搜索,你可以在位置不稳定的位置继续搜索(例如,如果一块棋子可以拿,或者国王在检查中)。

如果你有兴趣学习如何编写C#国际象棋引擎,我邀请你访问

该博客描述了从第一步开始创建一个C#Chess引擎,并提供了C#代码示例

您可能最感兴趣的页面是:


本文详细解释了Min-Max和Alpha-Beta搜索算法,包括这两种算法的C#代码示例。

你确定你没有空递归吗?不过,您需要发布代码或更多详细信息以获得答案。“每个节点1000次”-听起来有点过分…传统的minimax算法不会修剪任何分支。我认为您正在考虑alpha-beta修剪: