Actionscript 3 带Alpha-beta修剪的Minimax,得到结果

Actionscript 3 带Alpha-beta修剪的Minimax,得到结果,actionscript-3,algorithm,artificial-intelligence,chess,minimax,Actionscript 3,Algorithm,Artificial Intelligence,Chess,Minimax,我遵循了维基百科文章中的pseducode,我想我已经成功了。然而,它会返回分数,当我想知道我想做什么动作时,这并没有帮助 我尝试了我认为是获得最佳移动的一种方式,但我不认为它是有效的,因为当我实际尝试与它对抗(国际象棋)时,AI会做出一些深度级别为3的迟钝移动 以下是我的功能: public static function alphaBeta(node, depth, alph, beta, team, tellTheMove:Boolean = false):* { var

我遵循了维基百科文章中的pseducode,我想我已经成功了。然而,它会返回分数,当我想知道我想做什么动作时,这并没有帮助

我尝试了我认为是获得最佳移动的一种方式,但我不认为它是有效的,因为当我实际尝试与它对抗(国际象棋)时,AI会做出一些深度级别为3的迟钝移动

以下是我的功能:

public static function alphaBeta(node, depth, alph, beta, team, tellTheMove:Boolean = false):* {
        var pointer:ChessMove;
        if (depth == 0) {
            return scoreOf(node);
        }
        var childrenOf:Vector.<ChessMove >  = returnPossibleMoves(node,team);
        if (childrenOf.length == 0) {
            return scoreOf(node);
        }
        if (team == 0) {
            for (var i in childrenOf) {
                var that:Number = alphaBeta(childrenOf[i],depth - 1,alph,beta,1);
                if(tellTheMove){
                }
                if (that > alph) {
                    alph = that;
                    if(tellTheMove){
                        pointer = childrenOf[i];
                    }
                }
                if (beta <= alph) {
                    break;
                }
            }
            if(tellTheMove){
                return pointer; //Returns the move that's score last exceeded alpha.
            }
            return alph;
        } else {
            for (var j in childrenOf) {
                var that2:Number = alphaBeta(childrenOf[j],depth - 1,alph,beta,0);
                if (that2 < beta) {
                    beta = that2;
                }
                if (beta <= alph) {
                    break;
                }
            }
            return beta;
        }
    }
公共静态函数alphaBeta(节点、深度、alph、beta、团队、tellTheMove:Boolean=false):*{
var指针:棋子移动;
如果(深度==0){
(节点)的返回值;
}
var childrenOf:Vector.=returnPossibleMoves(节点、团队);
if(childrenOf.length==0){
(节点)的返回值;
}
如果(团队==0){
for(childrenOf中的var i){
变量为:数字=αβ(childrenOf[i],深度-1,alph,β,1);
if(tellTheMove){
}
如果(那>alph){
alph=该值;
if(tellTheMove){
指针=childrenOf[i];
}
}

if(beta深度3对于象棋这样的问题来说非常小。在这个深度上,大部分的力量取决于你的最终评估函数。这个评估函数很难有效地预测棋盘的价值

尝试一些更简单的方法,可以在较低的深度上有效地解决。Tic-Tac-Toe是一个非常好的游戏,第一次尝试Min-Max。这是因为最终结果是众所周知的。如果你的算法正确,你应该根本无法打败它。如果你做了Tic-Tac-Toe,而算法正在松动,你知道你有一个错误柯


还要注意的是,在某些情况下,Min-Max发挥最佳,但在人类对手看来仍然显得迟钝。例如,如果没有获胜的机会,Min-Max将开始随机发挥,并做出非常愚蠢的动作。这种情况是这样的,因为Min-Max期望对手也发挥完美,而人类通常不是这样。有一些si在这种情况下,可以对算法进行简单的更改以改变这种行为,并使最小最大播放“更少延迟”。

如果评估函数非常简单,我想补充一点(仅适用于材料)而且你没有静止搜索,在大多数位置,所有移动都将返回相同的分数,Minimax将无法做出选择。在这种情况下,将使用搜索到的第一个移动。谢谢!我尝试了tic tac toe,效果很好。我将努力改进我的评估功能。也尝试获得更高的深度。如果你使用alpha-beta修剪,您已经检查的所有路径都会告诉您哪些路径可以修剪,哪些仍然需要扩展。因此,如果您以错误的顺序扩展路径,您仍然需要扩展几乎整个树。如果您首先选择最佳路径,您的修剪将更有效,因为这样大多数树将永远不会扩展。通常使用这一事实的方法是,首先根据一些(快速)启发式方法,在展开之前对可能的移动进行排序。这可以在相同的计算时间内产生更大的深度。