私はウィキペディアの記事でpseducodeに従っています。しかし、それはスコアを返し、私は何をしたいのかを知りたいときにはそれは正確には役に立ちません。アルファ・ベータ・プルーニングを使用したMinimax、結果の取得
私は、最良の動きを得る方法であると思ったことを試しましたが、私が実際にそれ(チェス)と対戦しようとしているようには働いていないと思いますが、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;
}
}
私は、評価関数が本当にシンプルで(材料のみ)、ほとんどのポジションで休止検索をしないと、すべての移動が同じスコアを返し、Minimaxは選択。その場合、最初に検索された移動が使用されます。 –
ありがとう!私はチックタックつま先を試して、それは正常に動作しています。評価関数の改善に取り組んでいきます。 – apscience
また、深さを上げることに取り組んでください。アルファベータプルーニングを使用している場合は、既にチェックしたすべてのパスが、どのパスをプルーニングできるのか、どのパスをまだ拡張する必要があるのかがわかります。したがって、パスを間違った順序で展開しても、フルツリーのほとんどを展開する必要があります。あなたが最良の道を最初に取った場合、あなたの枝刈りはより効果的になります。それは木の大部分が決して拡大されないからです。この事実を使用する通常の方法は、ある(速い)ヒューリスティックに基づいて、展開前に可能な移動をまずソートすることです。これは、同じ計算時間ではるかに深い深さにつながる可能性があります。 – LiKao