Die Antwort von jmite bezieht sich darauf, ob das Programm jemals eine Berechnung beenden wird - nur weil es unendlich ist, würde ich den Code nicht aufrufen, wenn er tot ist.
Es gibt jedoch einen anderen Ansatz: Ein Problem, für das es eine Antwort gibt, das jedoch nicht bekannt ist:
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)
{
...
}
}
Diese Routine ohne Zweifel nicht enthält toten Code - die Funktion wird eine Antwort zurück , das einen Weg führt aber nicht die andere. Viel Glück beim Finden! Mein Gedächtnis ist kein theoretischer Computer, der dies innerhalb der Lebensdauer des Universums lösen kann.
Ausführlicher:
Die Evaluate()
Funktion berechnet, welche Seite eine Schachpartie gewinnt, wenn beide Seiten perfekt spielen (mit maximaler Suchtiefe).
Normalerweise schauen die Schachbewerter bei jeder möglichen Bewegung in einer bestimmten Tiefe nach vorn und versuchen dann, das Spielfeld an dieser Stelle zu bewerten (manchmal kann das Erweitern bestimmter Zweige, wenn sie auf halbem Wege durch einen Austausch oder dergleichen schauen, eine sehr verzerrte Wahrnehmung hervorrufen.) Da die tatsächliche maximale Tiefe Ist 17695 Halbzüge die Suche erschöpfend, durchläuft sie jede mögliche Schachpartie. Da alle Spiele zu Ende sind, gibt es kein Problem zu entscheiden, wie gut ein Brett ist (und daher keinen Grund, die Bewertungslogik des Brettes zu überprüfen - sie wird niemals aufgerufen), das Ergebnis ist entweder ein Gewinn, ein Verlust oder ein Verlust Gleichstand. Wenn das Ergebnis ein Unentschieden ist, ist das Spiel fair, wenn das Ergebnis kein Unentschieden ist, ist es ein unfaires Spiel. Um es ein bisschen zu erweitern, bekommen wir:
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);
}
}
Beachten Sie auch, dass der Compiler praktisch nicht erkennen kann, dass Chessboard.Score () toter Code ist. Die Kenntnis der Schachregeln ermöglicht es uns Menschen, dies herauszufinden, aber um dies herauszufinden, muss man wissen, dass MakeMove die Stückzahl niemals erhöhen kann und dass Chessboard.Draw () true zurückgibt, wenn die Stückzahl zu lange statisch bleibt .
Beachten Sie, dass die Suchtiefe in Halbzügen und nicht in ganzen Zügen angegeben ist. Dies ist normal für diese Art von KI-Routine, da es sich um eine O (x ^ n) -Routine handelt. Das Hinzufügen einer weiteren Suchschicht hat einen großen Einfluss darauf, wie lange die Ausführung dauert.