0

アルファベータでリバーシゲームを構築していますが、アルファベータであなたの助けが必要です。問題は、コンピュータがボードの下側にある正方形の1つを選択し続けることです。私はコンピューターの可能な動きのリストを持っています(以下のコードで見ることができます)。つまり、コンピューターは、最良の動きでなくても、ほとんどの場合、そのリストの最後または最後の動きの1つを選択します。私の評価関数は単純です:黒い部分から白い部分を引いたものです。ところで:それはdepth = 1で正常に動作しますが、depth=3で動作する必要があります。

public int AlphaBeta(int depth,int turn,TreeNode root,int alpha,int beta)
{
    if(depth==0)
        return evaluationFunc(turn,turns,root.board,root);
    else
    {
        buildSons(turn,root);
        TreeNode head =  generateList(root.sons);
        return executeCheckTheSons2(depth,turn,head,alpha,beta);
    }
}

public int executeCheckTheSons2(int depth,int turn,TreeNode head,int alpha,int beta)
    {
        int score;
        if(turn==1)
        {
            while(head!=null)
            {
                head.board=simulateTheMove(head.board,head.getX(),head.getY(),turn);
                score=AlphaBeta(depth-1,turn*-1,head,alpha,beta);
                if(score > alpha)
                {
                    alpha=score;
                    setMove(head);
                }
                if(alpha >= beta)
                    return alpha;
                head=head.next;
            }
                return alpha;
        }
        else
        {
            while(head!=null)
            {
                head.board=simulateTheMove(head.board,head.getX(),head.getY(),turn);
                score=AlphaBeta(depth-1,turn*-1,head,alpha,beta);
                if(score<beta)
                {
                    beta=score;
                    setMove(head);
                }
                if(alpha >= beta)
                    return beta;
                head=head.next;
            }
            return beta;
        }       
    }

    public void setMove(TreeNode root)
    {
        while(root.father.father!=null)
            root=root.father;
        pnt.setX(root.getX());
        pnt.setY(root.getY());
    }
4

1 に答える 1

0

setMoveエラーは関数にあると思います。ピースをセットするための最終的な座標を設定する機能だと思います。現時点では、このブランチからの結果がグローバルに考えられる最良の結果ではない場合でも、ツリーのすべての深さに対してこれを呼び出しています。

たとえば、最後の可能な動きを評価していると想像してください。depth=3 から始めて、再帰的に for を呼び出しますdepth=2。ここで入力するexecuteCheckTheSons2と、スコア 0 から開始し、可能な動きを評価します。これらの動きの 1 つはおそらく 0 より大きいスコアを与えるため、setMove(head)移動先の座標を呼び出して、最後の可能な動きに設定します。関数から戻ったときに、この深さのスコアをスコアに記録しますが、全体的に見て、それは素晴らしい動きではありません。ただし、 setMove の最後の呼び出しはまだアクティブであり、後で変更する必要はありません。

この呼び出しを executeCheckTheSons2 の外に移動し、上位層の関数に移動する必要があります。または、関数のローカル変数に x 座標と y 座標を記録し、代わりに関数から戻る前にexecuteCheckTheSons2呼び出します。setMove

この質問が役に立つ場合は、これを回答として受け入れてください。

于 2012-03-30T18:32:39.360 に答える