Ответ 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)
{
...
}
}
Эта процедура, без сомнения , содержит мертвый код - функция вернет ответ, который выполняет один путь, но не другой. Удачи в поиске! Моя память не теоретическая компьютер может решить эту проблему в течение жизни Вселенной.
Более детально:
В 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) - добавление еще одного поискового слоя оказывает значительное влияние на продолжительность выполнения.