jmiteの答えは、プログラムが計算を終了するかどうかに適用されます。それが無限だからといって、コードを呼び出した後は呼び出したくないからです。
ただし、別のアプローチがあります。答えはあるが不明な問題です。
public void Demo()
{
if (Chess.Evaluate(new Chessboard(), int.MaxValue) != 0)
MessageBox.Show("Chess is unfair!");
else
MessageBox.Show("Chess is fair!");
}
public class chess
{
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
...
}
}
間違いなくこのルーチンにはデッドコードが含まれています。この関数は、1つのパスを実行し、他のパスは実行しないという応答を返します。しかし、それを見つけて頑張ってください!私の記憶は、宇宙の寿命内でこれを解決できる理論的なコンピューターではありません。
さらに詳細に:
このEvaluate()
関数は、両方の側が完全に(最大の検索深度で)プレイする場合、どちらの側がチェスゲームに勝つかを計算します。
チェスエバリュエーターは通常、指定された深さのあらゆる可能な動きを先読みし、その時点でボードにスコアを付けようとします(交換などの途中で見ると特定のブランチをさらに広げると、非常にゆがんだ認識が得られることがあります)。 17695半動きで検索は網羅的で、可能なチェスゲームをすべて横断します。すべてのゲームが終了するため、各ボードの位置がどれだけ良いかを判断しようとする問題はないため(したがって、ボード評価ロジックを参照する必要はありません-呼び出されることはありません)、結果は勝ち、負け、または引き分け。結果が引き分けの場合、ゲームは公平です。結果が引き分けでない場合、それは不公平なゲームです。少し拡張すると、次のようになります。
public Int64 Evaluate(Chessboard Board, int SearchDepth)
{
foreach (ChessMove Move in Board.GetPossibleMoves())
{
Chessboard NewBoard = Board.MakeMove(Move);
if (NewBoard.Checkmate()) return int.MaxValue;
if (NewBoard.Draw()) return 0;
if (SearchDepth == 0) return NewBoard.Score();
return -Evaluate(NewBoard, SearchDepth - 1);
}
}
また、コンパイラがChessboard.Score()がデッドコードであることを認識することは事実上不可能であることにも注意してください。チェスのルールを知っていれば、人間はこれを理解できますが、これを理解するには、MakeMoveがピースカウントを増やすことはできず、ピースカウントがあまりにも長く静的のままである場合、Chessboard.Draw()がtrueを返すことを知っておく必要があります。
検索の深さは、全体の動きではなく、半分の動きであることに注意してください。これはO(x ^ n)ルーチンであるため、この種のAIルーチンでは正常です。もう1つの検索プライを追加すると、実行にかかる時間に大きな影響があります。