1

私は現在、チェッカー ゲームを実装していますが、AI の状態が悪いことが唯一の障害です。Groovyで書かれています。

私はアルファ、ベータ剪定を伴う次の(試みられた)negaMaxアルゴリズムを持っています。私はいくつかの疑似ガイドに従いましたが、結果がかなり無意味であるため、明らかにどこかで失敗しています。

メソッドは次のように呼び出されます。negaMax(3, Integer.MIN_VALUE, Integer.MAX_VALUE, 1)

私は 1 人がコンピュータ プレーヤーになると決めました。それ以外はすべてユーザーです。

def negaMax(int depth, int alpha, int beta, int player) {
    int score
    int bestScore = Integer.MIN_VALUE
    def moves = getMoves(player)                                        // this function returns a hashmap as I felt I needed not just the move but the checker
    // loop through all moves
    for (move in moves) {
        Position origin = move.key.location                             // save original position to allow undo
        move.key.location = move.value                                  // move piece
        if (depth == 0) {
            score = evaluateGameState(player)
        } else {
            score = -negaMax(depth - 1, -beta, -alpha, -player)         //  move score = - opponents best move
        }
        move.key.location = origin                                      // undo move
        if (player == 1) {                                              // save successor evaluations for the computer to search
            evaluations.put((move.key) , new PositionAndScore(score, move.value))
        }
        bestScore = Math.max(bestScore, score)
        alpha = Math.max(alpha, bestScore)
        if (alpha >= beta) {
            break                                                       // prune
        }
    }
    return bestScore
}

動きのハッシュ マップ、チェッカー (Piece オブジェクト) としてのキー、および実際の動きとしての値を持つことを選択しました。実際に何ができるかを追跡する必要があるため、動きだけを保存しても意味がありません。

別のハッシュマップを使用して、チェッカーをキーとして保存する後続の評価を保存しますが、代わりに今回は値の位置と位置スコアの両方を保存します (このためだけに Class PositionAndScore を作成しました)。

evaluateGameState 関数は、そのプレーヤーが動かせるピースの数としてスコアを初期化し、キ​​ングのポイントを追加し、タカブル ポジションにあるピースのポイントを撤回します。

ゲームをプレイするとき、コンピューターは最初の 2 つの動きを知的に見せますが、それ以降は下り坂になります。多くの場合、コンピューターは無効な動きを試みているため、実行されません。

私がこれまでに行ったことを調べて、何か間違っている点があればコメントするためだけに時間を割いてくれて、とても感謝しています。

どうもありがとう。


編集:わかりました、私はいくつかの進歩を遂げました。言及していないかもしれませんが、evaluationsハッシュマップはコンピューターの最善の動きを計算するために使用されます。それはそれから最高のスコアを取得します。

これが引き起こした問題は、プレーヤーが 1 であるループごとに評価ハッシュマップが追加されたため、正当ではない移動 (つまり、将来の移動であった) が追加されていたことでした。

これを解決するために、すべて同じ引数を使用するcallSearch()代わりに呼び出されるプリカーサ メソッドを追加することにしましたが、 も の引数に設定します。negaMaxrootDepthdepth

次に、アルゴリズムにこの小さな変更を加えました

if (player == 1 && depth == rootDepth) {

}

私の考えでは、検索がルートに戻ったら、後続の評価を追加したいだけです。

いずれにせよ、これをすべて行った後、コンピューターはもはや不正な動きをしようとはしませんが、それでも適切な動きをすることはできません. 少し初歩的ですが、これは私の評価関数かもしれません。

4

0 に答える 0