注意:
エンジンが確定的であることは良い考えです。ランダムに移動を選択する理由はありません。エンジンの強度を下げるためにそれを行うだけです。エンジンを非決定的にすると、バグのデバッグと再現が非常に難しくなります。私の推奨はそれをしないことです。
エンジンを変更しないでください。オープニングブックを使用して、ランダムに行を選択することができます。たとえば、CuteChessソフトウェアなど、多くのチェスGUIでそれを行うことができます。Arena GUIでもそれが可能です。
しかし、あなたが主張した場合:
ストックフィッシュのソースコードを見てみましょう。
Move Skill::pick_best(size_t multiPV) {
const RootMoves& rootMoves = Threads.main()->rootMoves;
static PRNG rng(now()); // PRNG sequence should be non-deterministic
// RootMoves are already sorted by score in descending order
Value topScore = rootMoves[0].score;
int delta = std::min(topScore - rootMoves[multiPV - 1].score, PawnValueMg);
int weakness = 120 - 2 * level;
int maxScore = -VALUE_INFINITE;
// Choose best move. For each move score we add two terms, both dependent on
// weakness. One is deterministic and bigger for weaker levels, and one is
// random. Then we choose the move with the resulting highest score.
for (size_t i = 0; i < multiPV; ++i)
{
// This is our magic formula
int push = ( weakness * int(topScore - rootMoves[i].score)
+ delta * (rng.rand<unsigned>() % weakness)) / 128;
if (rootMoves[i].score + push > maxScore)
{
maxScore = rootMoves[i].score + push;
best = rootMoves[i].pv[0];
}
}
return best; }
- ストックフィッシュはマルチPVを開始します(TSCPではサポートされていないため、自分でコーディングする必要があります!)
- 乱数を計算し、PVごとにスコアに追加します
- 重み付けされた各PVを比較し、最適なPVを選択します
次のリンクが役立つ場合があります。
推奨事項:エンジンを弱めたい場合以外は、行わないでください。