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) 루틴이기 때문에 이러한 종류의 AI 루틴에는 정상입니다. 하나 이상의 검색 플라이를 추가하면 실행 시간에 큰 영향을 미칩니다.