1

チェッカーのゲームにNegaMaxを実装しようとしています。現在、深度0でテストしています。つまり、現在のプレーヤーは、他のプレーヤーが次に何をする可能性があるかに関係なく、すべての動きを評価するだけです。ゲームの約半分で完全に機能し(スコアを正しく計算します)、途中で意味のない答えを吐き出し始めます。

たとえば、白は1個残っていて、黒は5個ある場合がありますが、たとえば、白が負けているためにすべてが負である場合、白の動きは7のスコアとして評価されます。黒は次の手で勝つ可能性がありますが、1000であるはずなのに、勝った手は-4と評価されます。

一貫してガベージを出力していることは理解できますが、最初の数ターンは機能し、その後混乱し始めるのはなぜですか?

private static Move GetBestMove(Color color, Board board, int depth)
{
    var bestMoves = new List<Move>();
    IEnumerable<Move> validMoves = board.GetValidMoves(color);
    int highestScore = int.MinValue;
    Board boardAfterMove;
    int tmpScore;
    var rand = new Random();

    Debug.WriteLine("{0}'s Moves:", color);

    foreach (Move move in validMoves)
    {
        boardAfterMove = board.Clone().ApplyMove(move);

        if (move.IsJump && !move.IsCrowned && boardAfterMove.GetJumps(color).Any())
            tmpScore = NegaMax(color, boardAfterMove, depth);
        else
            tmpScore = -NegaMax(Board.Opposite(color), boardAfterMove, depth);

        Debug.WriteLine("{0}: {1}", move, tmpScore);

        if (tmpScore > highestScore)
        {
            bestMoves.Clear();
            bestMoves.Add(move);
            highestScore = tmpScore;
        }
        else if (tmpScore == highestScore)
        {
            bestMoves.Add(move);
        }
    }

    return bestMoves[rand.Next(bestMoves.Count)];
}

private static int NegaMax(Color color, Board board, int depth)
{
    return BoardScore(color, board);
}

private static int BoardScore(Color color, Board board)
{
    if (!board.GetValidMoves(color).Any()) return -1000;
    return board.OfType<Checker>().Sum(c => (c.Color == color ? 1 : -1) * (c.Class == Class.Man ? 2 : 3));
}

6x6のボードで、気に入らないボードの状態を分離しました。

 . . .
. w B 
 W . .
. . . 
 . w .
. . W 

w = white, b = black, capital letter = king

これはプレイされた時間や移動回数の問題ではなく、特定のボードの状態が好きではないようです。しかし、この状態に特有のことは何も見当たりません。

この状態では、ブラックの4つの動きすべてを-13と評価します。私がどのように得点したかを見ると、1人あたり2ポイント、1人あたり3ポイント、他のプレイヤーが所有している場合はマイナスと表示されます。すべてのピースを白として扱っているように見えます...それが13を取得する唯一の方法です。


私は別の手がかりを見つけました。ボードスコア法では、私はそれが見ているものを印刷するようになりました..これはそれが私に言っていることです:

2: White 
4: White 
6: White 
13: White 
17: White 

ボードの正方形に次のように番号が付けられている場合:

  00  01  02
03  04  05
  06  07  08
09  10  11
  12  13  14
15  16  17

確かに黒い部分が白いと言っていると思います……これを引き起こしている原因を解明するために。


だから...今私は色が間違っていることを知っていますが、BoardScore機能だけです。私の通常の表示ルーチンはこれを理解していませんでした。さもなければ、私は数時間前に問題を理解していたでしょう。ApplyMove色が変わる機能にあるのではないかと思います。

public Board ApplyMove(Move m)
{
    if (m.IsJump)
    {
        bool indented = m.Start % Width < _rowWidth;
        int offset = indented ? 1 : 0;
        int enemy = (m.Start + m.End) / 2 + offset;
        this[m.Color, enemy] = Tile.Empty;
    }

    this[m.Color, m.End] = this[m.Color, m.Start];
    this[m.Color, m.Start] = Tile.Empty;

    var checker = this[m.Color, m.End] as Checker;
    if (m.IsCrowned) checker.Class = Class.King;

    return this;
}

しかし、それもあまり意味がありません...ピースは開始位置から終了位置にコピーされるだけです。何であるかを調査する必要m.Colorがあります...おそらくそれはより多くの手がかりを提供するでしょう!私は探偵のように感じます。

4

2 に答える 2

2

あなたの説明を考えると、私は自分自身がピースの色のデータを疑っています。どういうわけか間違った設定になっていると、すべてがネガティブと評価されます。

BoardScore関数にはあまり満足していません。そのような複雑な数式は、エラーを隠すのが得意で、デバッグが困難です。

BoardScoreを単純化し、何が起こっているかをより簡単に表示できるようにするために、関数Checker.Value(Color)を追加します。

Colorのデータ型は表示されていません。白黒以外の破損した値が許可されている場合は、観察している動作が発生します。

最新のアップデートがあれば、boardAfterMoveを調べて、正しく生成されていることを確認します。

もう一度編集してください:そこには2つの呼び出しがあります-それは正しく複製されていますか?

于 2010-09-06T19:22:03.677 に答える
0

問題が見つかりました。

        foreach (char ch in checkers)
        {
            switch (ch)
            {
                case 'w':
                    Add(new Checker(Color.White, Class.Man));
                    break;
                case 'W':
                    Add(new Checker(Color.White, Class.King));
                    break;
                case 'b':
                    Add(new Checker(Color.Black, Class.Man));
                    break;
                case 'B':
                    Add(new Checker(Color.White, Class.King));
                    break;
                default:
                    Add(Tile.Empty);
                    break;
            }
        }

ブラックキングでのみ発生します。愚かなクローン!! なぜディープコピーが簡単にできなかったのですか?

于 2010-09-06T19:36:28.600 に答える