C# 带Alpha-Beta修剪的Minimax;类变量还是通过递归发送它们?
当使用Minimax进行Alpha-Beta修剪时,是否可以将Alpha和Beta作为类变量,而不是通过递归发送它们 而不是:C# 带Alpha-Beta修剪的Minimax;类变量还是通过递归发送它们?,c#,chess,minimax,C#,Chess,Minimax,当使用Minimax进行Alpha-Beta修剪时,是否可以将Alpha和Beta作为类变量,而不是通过递归发送它们 而不是: private ValuedMove AlphaBetaSearch(Board state) { return MaxValue(state, 0, int.MinValue, int.MaxValue); } private ValuedMove MaxValue(Board state, int d, int alpha, int beta) {
private ValuedMove AlphaBetaSearch(Board state)
{
return MaxValue(state, 0, int.MinValue, int.MaxValue);
}
private ValuedMove MaxValue(Board state, int d, int alpha, int beta)
{
if (d == depth || state.GameRunning == false)
return new ValuedMove(Heuristic.BoardValue(state, Player));
ValuedMove v = new ValuedMove(int.MinValue);
foreach (Move move in LegalMoves)
{
ValuedMove minCheck = MinValue(state.ImagineMove(move), d + 1, alpha, beta);
if (v.Value >= beta)
return v;
alpha = Max(alpha, v.Value);
}
return v;
}
private ValuedMove MinValue(Board state, int d, int alpha, int beta)
{
//Minimax and Alpha-Beta logic here
}
我可以写:
int alpha, beta;
private ValuedMove AlphaBetaSearch(Board state)
{
alpha = int.MinValue;
beta = int.MaxValue;
return MaxValue(state, 0);
}
private ValuedMove MaxValue(Board state, int d)
{
//Minimax and Alpha-Beta logic here
}
private ValuedMove MinValue(Board state, int d)
{
//Minimax and Alpha-Beta logic here
}
我这样问是因为当我试图通过这样做来优化代码时(我的想法是,如果我不需要将INT发送到每个递归,我也许可以节省一点时间),我的棋手突然变成了一个白痴,牺牲他的皇后杀死一个棋子,并犯了其他愚蠢的错误
他经常表现得比他的“常规Alpha-Beta”对手差很多,我猜这是因为他也只搜索了树的一小部分,与他的对手相比(他们都使用相同的深度,但修改后的玩家似乎更具攻击性,从而减少了访问的节点数)。为了确保这一点,我已经做了两次了,除了我在这里所做的以外,我不会改变任何事情
如果我已经正确理解了Alpha-Beta算法,这应该不会有任何区别,但对我的棋手来说,确实如此。我做错什么了吗
所以,我现在的主要问题不是这是一件优化方面的好事还是代码实践方面的好事,而是这是否应该是可能的。你不能真正做到这一点。AlphaBeta是一种递归算法。这意味着它自己在呼唤自己。每次它调用自己时,它都会使用(可能)不同的alpha和beta值。每个递归都需要自己版本的变量,这些变量将包含不同的值。如果在类中包含变量,那么在对AlphaBeta的所有(递归)调用之间只会共享一组变量
尽管如此,用类成员替换函数参数可能不是一个好的优化。这两种技术都有成本。在调用之前,需要将参数推送到堆栈上,并且需要通过指针(隐藏的
this
指针)间接访问成员。让我们忘记哪个成本更高。这种微观优化可能太微不足道了,根本无法产生任何影响。你不能真正做到这一点。AlphaBeta是一种递归算法。这意味着它自己在呼唤自己。每次它调用自己时,它都会使用(可能)不同的alpha和beta值。每个递归都需要自己版本的变量,这些变量将包含不同的值。如果在类中包含变量,那么在对AlphaBeta的所有(递归)调用之间只会共享一组变量
尽管如此,用类成员替换函数参数可能不是一个好的优化。这两种技术都有成本。在调用之前,需要将参数推送到堆栈上,并且需要通过指针(隐藏的
this
指针)间接访问成员。让我们忘记哪个成本更高。这种微优化可能太微不足道了,根本无法产生任何影响。随着您的更改到位,alpha
和beta
什么时候会被更改?我在其中一个函数中添加了代码以向您展示。除了没有alpha和beta作为参数外,修改后的函数是相同的。在您进行更改后,alpha
和beta
何时会被更改?我在其中一个函数中添加了代码以向您展示。除了没有alpha和beta作为参数外,修改后的函数是相同的。当然,你是对的。我知道我的理论有问题,但我无法指出,因为我所有的手动Alpha-Beta示例显然都太简单了。谢谢当然,你是对的。我知道我的理论有问题,但我无法指出,因为我所有的手动Alpha-Beta示例显然都太简单了。谢谢