Odpowiedź jmite dotyczy tego, czy program kiedykolwiek zakończy obliczenia - tylko dlatego, że jest nieskończony, nie wywołałbym kodu po jego śmierci.
Istnieje jednak inne podejście: problem, na który istnieje odpowiedź, ale nie jest znana:
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)
{
...
}
}
Procedura ta niewątpliwie ma zawierać martwego kodu - funkcja zwróci odpowiedź, która wykonuje jedną ścieżkę, ale nie innych. Powodzenia w znalezieniu go! Moja pamięć nie jest żadnym teoretycznym komputerem, który mógłby rozwiązać ten problem w ciągu życia wszechświata.
Bardziej szczegółowo:
W Evaluate()
Oblicza funkcja, która strona wygrywa Chess Games jeśli obie strony doskonale grać (z maksymalną głębokością wyszukiwania).
Oceniający szachy zwykle patrzą przed siebie przy każdym możliwym ruchu na pewną określoną głębokość, a następnie próbują punktować planszę w tym punkcie (czasami rozszerzanie niektórych gałęzi dalej, ponieważ spojrzenie w połowie wymiany lub temu podobne może powodować bardzo wypaczoną percepcję). Ponieważ rzeczywista maksymalna głębokość wynosi 17695 ruchów na pół, wyszukiwanie jest wyczerpujące, przemierzy każdą możliwą grę w szachy. Ponieważ wszystkie gry się kończą, nie ma problemu z podjęciem decyzji o tym, jak dobra jest pozycja każdej planszy (a zatem nie ma powodu, aby patrzeć na logikę oceny planszy - nigdy nie zostanie wywołana), wynikiem jest wygrana, przegrana lub rysunek. Jeśli wynikiem jest remis, gra jest sprawiedliwa, jeśli wynikiem nie jest remis, jest to gra niesprawiedliwa. Aby ją nieco rozszerzyć, otrzymujemy:
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);
}
}
Zauważ też, że kompilator praktycznie nie będzie mógł zrozumieć, że Chessboard.Score () jest martwym kodem. Znajomość zasad gry w szachy pozwala nam to zrozumieć, ale aby to zrozumieć, musisz wiedzieć, że MakeMove nigdy nie może zwiększyć liczby sztuk i że Chessboard.Draw () zwróci wartość true, jeśli liczba sztuk pozostanie statyczna przez zbyt długi czas .
Zauważ, że głębokość wyszukiwania jest w pół-ruchach, a nie w całości. Jest to normalne dla tego rodzaju procedury AI, ponieważ jest to procedura O (x ^ n) - dodanie jeszcze jednej warstwy wyszukiwania ma znaczący wpływ na czas działania.