2012-02-28 25 views
0

私のチェスのプログラムに簡単な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というスコアを得ています。私はどんなヒントに対しても非常に感謝しています。

答えて

0

ネガマックスの実際のスケルトンは正しく実装されているようです。 (しかし、私は、各プライを引いた再帰関数に渡される単一の深さ変数を見ることに慣れています。そして、0に等しいときに評価されたスコアを返します)。しかし、他のコードへの依存度が高いため、外部人としてのあなたの問題を診断するのは難しいです。

あなたのために釣るよりもむしろ、魚の釣り方法を教える方が良いと感じています。ツリー構造と累積スコアを視覚的に何らかの形で出力するルーチンを作成するために時間を費やすことをお勧めします。あなたはすでにそのようなもののビルディングブロックを持っているようです。これを最初に行うのは時間がかかるかもしれませんが、長期的にはデバッグに大いに役立ちます。チェスエンジンを使って私を信じてください。このツリーを通ってトラウリングするのは残念ながら頻繁に起こります。特にen - これらは木の中で(私はそこに行ってきた)あらゆる種類のトラブルを引き起こす可能性があります。 が動きを示し

<move-white ----> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <best black score> 
<move-white ----> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <best black score> 
<move-white ----> 
    <move-black ----><eval score> 
    <move-black ----><eval score> 
    <best black score> 
<best white score> 

...:

はこのような何かを出力してみてください。

明らかに、これははるかに大きく深くなりますが、少なくとも人間がよりフレンドリーな方法で何が起こっているかを見ることができます。うまくいけば、長期的には他の問題もあなたを助けるでしょう。チェスエンジンを使って良いデバッグシステムをセットアップすることは、あなたが気づくほど重要です。

+0

あなたのアドバイスをいただき、ありがとうございます。私はこのメソッドを使用して、私の評価関数のいくつかのスコアで最も深い層の現在の板の状況を表示し、少しバグがあることを認識しました。マイナス記号のない1人のプレーヤーにとってなぜそれがうまくいったのか分かりませんが、最大化は両方のプレイヤーにとってうまくいくようです。 – Peter

+0

心配する必要はありません。時には最も微妙なバグは、特にチェスエンジンのようなもので、一見無関係の問題を引き起こすことがあります! –

関連する問題