Php proc_open () и глубина аномалии шахматного движка вяленой рыбы 1 - PullRequest
0 голосов
/ 21 октября 2019

Ждем интеграции шахматного движка stockfish в скрипт php-cli.

Произошло непредвиденное поведение, программа stockfish закрывается напрямую, без «раздумий», она возвращает толькоположение на глубине 1, когда вызывается из php.

Для лучшего понимания при запуске программы stockfish из командной строки приведено ожидаемое поведение (gif):

enter image description here


С 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 потоков ЦП в многопроцессорных системах.

1 Ответ

1 голос
/ 21 октября 2019

Ну, это было довольно просто, труба была закрыта слишком рано.

Оставив здесь рабочий код для будущих читателей.

$descr = [0 => ["pipe", "r"], 1 => ["pipe", "w"]];
$pipes = [];
$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], "setoption name Skill Level value 17\n"); // Set level between 1 and 20
    fwrite($pipes[0], "go movetime 5000\n"); // Return bestmove after 5 seconds          
    while (!feof($pipes[1])) {    
        echo fgets($pipes[1]);
    }
    fclose($pipes[0]);
    fclose($pipes[1]);
    proc_close($process);    
}
// RETURN last line: bestmove e2e4 ponder e7e6
...