Ждем интеграции шахматного движка stockfish в скрипт php-cli.
Произошло непредвиденное поведение, программа stockfish закрывается напрямую, без «раздумий», она возвращает толькоположение на глубине 1, когда вызывается из php.
Для лучшего понимания при запуске программы stockfish
из командной строки приведено ожидаемое поведение (gif):
С php работает следующее ( начальная позиция, белые играют , запрашивает 50 глубины), возвращается ход a2a3 ,позиция на глубине 1, что является довольно плохим ходом!
Ответ мгновенный, когда прохождение всех уровней глубины должно занять как минимум много секунд.
Он идентичен любым позициям FEN , всегда возвращая глубину 1.
$descr = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$pipes = array();
$process = proc_open("stockfish", $descr, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], "uci\n");
fwrite($pipes[0], "ucinewgame\n");
fwrite($pipes[0], "position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - - 0 1\n");
fwrite($pipes[0], "go depth 50\n");
fclose($pipes[0]);
// Read all output from the pipe
while (!feof($pipes[1])) {
echo fgets($pipes[1]);
}
fclose($pipes[1]);
proc_close($process);
}
// RETURN last line: bestmove a2a3
Все версии stockfish
были протестированы, 8, 9, 10с тем же результатом.
Я пробовал много вариантов и разных способов запуска команд оболочки из php, включая posix_mkfifo()
конвейер, но ни одна из них не работает должным образом, всегда возвращая ход на глубину 1.
Другой пример , то же поведение, всегда возвращает «a2a3».
file_put_contents(".COMFISH","uci\nucinewgame\nsetoption name Threads value 1\nposition fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - - 0 1\ngo depth 50");
$COM = explode(" ",system("stockfish < .COMFISH"))[1];
var_dump($COM);
// RETURN a2a3
Это может быть напрямую связано с тем, как записан этот двоичный файл stockfish
(многопоточность), а не с поведением php,но я ищу объяснение здесь?
Из wiki :
Stockfish может использовать до 512 потоков ЦП в многопроцессорных системах.