私のチェスのプログラムに簡単なNegaMaxを実装することに問題があります。NegaMaxが期待どおりに動作しない
私のコードに次のようになりますnegamaxいくつかのウェブサイトによると:
int Position::negaMax(int curr_depth, int depth) {
cd = curr_depth-1;
if (curr_depth==depth) return evaluate();
int max = -500000;
calc_moves(true);
doBackup(cd);
for (int i=0;i<mvSize[cd];i++) {
move_figure(mvD[cd][i][0],mvD[cd][i][1],mvD[cd][i][2],mvI[cd][i][0],mvI[cd][i][1]);
int score = -negaMax(curr_depth+1,depth);
cd--; undoMove(cd);
if (curr_depth==1)
cout << "Move: " << getMoveString(i) << ", Score: " << score << endl;
if (score>max)
max=score;
}
return max;
}
しかし、このコードで、私はこの出力を得る:I negaMax場合は、右することはできません
Move: a2a3, Score: 0
Move: a2a4, Score: 0
Move: b2b3, Score: 0
Move: b2b4, Score: 0
Move: c2c3, Score: 0
Move: c2c4, Score: 0
Move: d2d3, Score: 0
Move: d2d4, Score: 0
Move: e2e3, Score: 0
Move: e2e4, Score: 0
Move: f2f3, Score: 0
Move: f2f4, Score: 0
Move: g2g3, Score: 0
Move: g2g4, Score: 0
Move: h2h3, Score: 0
Move: h2h4, Score: 0
Move: b1a3, Score: 0
Move: b1c3, Score: 0
Move: g1h3, Score: 0
Move: g1f3, Score: 0
score: 0
開始位置からのply3について。
再帰関数呼び出しの前にマイナス記号を削除すると、より良い結果が得られます。しかし、私の意見では、上記のコードのマイナス記号がなければ、私は1人のプレイヤーのスコアを最大にしますが、両方のプレーヤーのスコアは最大にしないためです。
Move: a2a3, Score: 0
Move: a2a4, Score: 30
Move: b2b3, Score: 0
Move: b2b4, Score: 30
Move: c2c3, Score: 0
Move: c2c4, Score: 30
Move: d2d3, Score: 295
Move: d2d4, Score: 295
Move: e2e3, Score: 295
Move: e2e4, Score: 295
Move: f2f3, Score: 0
Move: f2f4, Score: 30
Move: g2g3, Score: 0
Move: g2g4, Score: 30
Move: h2h3, Score: 0
Move: h2h4, Score: 30
Move: b1a3, Score: 30
Move: b1c3, Score: 30
Move: g1h3, Score: 30
Move: g1f3, Score: 30
score: 295
さまざまなバージョンのMinMax、NegaMax、AlphaBetaを実装しようとしました。しかし、私はいつも0というスコアを得ています。私はどんなヒントに対しても非常に感謝しています。
あなたのアドバイスをいただき、ありがとうございます。私はこのメソッドを使用して、私の評価関数のいくつかのスコアで最も深い層の現在の板の状況を表示し、少しバグがあることを認識しました。マイナス記号のない1人のプレーヤーにとってなぜそれがうまくいったのか分かりませんが、最大化は両方のプレイヤーにとってうまくいくようです。 – Peter
心配する必要はありません。時には最も微妙なバグは、特にチェスエンジンのようなもので、一見無関係の問題を引き起こすことがあります! –