3

私はウィキペディアの記事で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; 
     } 
    } 

答えて

4

深さ:3

のレベルは、ここに私の関数です。この深さでは、最終的な評価関数に依存します。この評価関数は、ボードの価値を効率的に予測できるという点で非常に困難です。

もっと簡単な操作を試してください。これは、より低い深さで効率的に解決できます。 Tic-Tac-Toeは、Min-Maxでの最初の試みのための非常に良いゲームです。これは、最終結果がよく知られているためです。あなたがアルゴリズムを正しく得るなら、それをまったく打ち負かすべきではありません。 Tic-Tac-Toeを実行してアルゴリズムが失われている場合は、間違いがあることがわかります。

また、Min-Maxが最適に再生されますが、依然として人間の敵に遅れて見えることに注意してください。例えば、勝利のチャンスがない場合、Min-Maxはランダムにプレイし始め、非常にダムの動きをします。これは、Min-Maxが対戦相手も完全にプレーすることを期待しているからです。これは通常、人間にとっては当てはまりません。この動作を変更し、そのような場合にmin-maxの再生が「遅くなる」というアルゴリズムを実行するために、アルゴリズムに対して行うことができる簡単な変更がいくつかあります。

+2

私は、評価関数が本当にシンプルで(材料のみ)、ほとんどのポジションで休止検索をしないと、すべての移動が同じスコアを返し、Minimaxは選択。その場合、最初に検索された移動が使用されます。 –

+0

ありがとう!私はチックタックつま先を試して、それは正常に動作しています。評価関数の改善に取り組んでいきます。 – apscience

+0

また、深さを上げることに取り組んでください。アルファベータプルーニングを使用している場合は、既にチェックしたすべてのパスが、どのパスをプルーニングできるのか、どのパスをまだ拡張する必要があるのか​​がわかります。したがって、パスを間違った順序で展開しても、フルツリーのほとんどを展開する必要があります。あなたが最良の道を最初に取った場合、あなたの枝刈りはより効果的になります。それは木の大部分が決して拡大されないからです。この事実を使用する通常の方法は、ある(速い)ヒューリスティックに基づいて、展開前に可能な移動をまずソートすることです。これは、同じ計算時間ではるかに深い深さにつながる可能性があります。 – LiKao

関連する問題