評価関数の最も基本的なコンポーネントは、明らかにマテリアルです。これは完全に簡単なはずですが、それだけでは興味深いプレイにはなりません。エンジンには位置感覚がまったくなく、戦術的なラインに反応するだけです。しかし、ここから始めます。
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
}
このタイプの評価は、静止検索とともに、ほとんどのアマチュアを全滅させるのに十分なはずです.