5

簡単なチェスの位置評価関数をまとめています。チェスエンジンを作るのはこれが初めてなので、評価関数を入れるのは非常にためらいを感じています。この Chess Programming Wiki ページに示されているものは、良い候補のようです。ただし、これには最後に省略記号があるため、使用するのに適しているかどうかわかりません。

エンジン全体が整って機能するようになったら、評価関数に戻って、適切に分類することを実際に試みるつもりです。しかし今のところ、平均的なアマチュアと対戦するのに十分な機能が必要です。

4

1 に答える 1

10

評価関数の最も基本的なコンポーネントは、明らかにマテリアルです。これは完全に簡単なはずですが、それだけでは興味深いプレイにはなりません。エンジンには位置感覚がまったくなく、戦術的なラインに反応するだけです。しかし、ここから始めます。

value = white_material - black_material           // calculate delta material

次に、ピーススクエア テーブルによる位置認識を紹介します。たとえば、これはポーン用の事前定義されたテーブルです。

pawn_table = {
     0,  0,  0,  0,  0,  0,  0,  0,
    75, 75, 75, 75, 75, 75, 75, 75,
    25, 25, 29, 29, 29, 29, 25, 25,
     4,  8, 12, 21, 21, 12,  8,  4,
     0,  4,  8, 17, 17,  8,  4,  0,
     4, -4, -8,  4,  4, -8, -4,  4,
     4,  8,  8,-17,-17,  8,  8,  4,
     0,  0,  0,  0,  0,  0,  0,  0
}

これは、一般的なセンチポーン (ポーンの値は ~100) 値システムを想定していることに注意してください。遭遇する白いポーンごとに、ポーンの四角でテーブルにインデックスを付け、対応する値を追加します。

for each p in white pawns
    value += pawn_table[square(p)]

黒いピースのインデックスを作成するときに、単純な計算を使用してテーブルを反映できることに注意してください。別の方法として、別のテーブルを定義することもできます。

単純な評価では、これは非常にうまく機能し、エンジンはおそらくすでに共通のオープニングを再生しているでしょう。ただし、いくつかの簡単な改善を行うことはそれほど難しくありません。たとえば、オープニングとエンドゲームのテーブルを作成し、ある種のフェーズ計算を使用してそれらの間を補間できます。これは、ゲームが進行するにつれて、その位置がボードのコーナーからボードの中央に移動するキングに特に効果的です。

したがって、評価関数は次のようになります。

evaluate(position, colour) {
    phase = total_pieces / 32                     // this is just an example

    opening_value += ...                          // sum of evaluation terms
    endgame_value += ...

    final_value = phase * opening_value + (1 - phase) * endgame_value
    return final_value * sign(colour)             // adjust for caller's perspective
}

このタイプの評価は、静止検索とともに、ほとんどのアマチュアを全滅させるのに十分なはずです.

于 2013-06-29T20:16:45.540 に答える