KQQK checkmate in 4 moves :)
По следам старой публикации, всплыл вопросик, правда ли, что мат KQQK (два ферзя и король против "голого" короля) достигается при ходе белых не позднее 4-го хода. Если применить те же методы подсчёта, что здесь, получается, что да, вот соответствующая статистика:
wtm: Mate in 4: 130 wtm: Mate in 3: 46137 wtm: Mate in 2: 217727 wtm: Mate in 1: 98160 wtm: Broken positions: 336585
Правда, писать какой-то код с годами всё более лень, сегодня лично меня хватило только на это:
import chess
import chess.engine
#укажите здесь правильный путь к Стокфишу в показанном формате
engine = chess.engine.SimpleEngine.popen_uci(
"D:/Arena/Engines/stockfish-16/stockfish-windows-x86-64-avx2.exe")
def analyze_position(fen, num_moves_to_return=1, depth_limit=None, time_limit=None):
search_limit = chess.engine.Limit(depth=depth_limit, time=time_limit)
board = chess.Board(fen)
infos = engine.analyse(board, search_limit, multipv=num_moves_to_return)
return [format_info(info) for info in infos]
def format_info(info):
#смотрим всегда со стороны белых
score = info["score"].white()
#разедлим счёт на мат и сантипешки
mate_score = score.mate()
centipawn_score = score.score()
return {
"mate_score": mate_score, #ходов до мата
"centipawn_score": centipawn_score, #сантипешек
"pv": format_moves(info["pv"]), #ходы
}
#привести запись ходов к виду a1a2
def format_moves(pv):
return [move.uci() for move in pv]
print(analyze_position("8/8/4k3/8/8/8/1K6/QQ6 w - - 0 1",
num_moves_to_return=5, depth_limit=20)) #вариантов, глубина
Наверное, можно применять этот код и для офлайн-анализа других позиций.
Выполнялось из консольного проекта Python актуальной сборки Visual Studio 2019 с установленной как описано здесь (п. 5.2) библиотекой chess. Мат в 4 хода нашло :)
Прикрутить сюда перебор разрешённых позиций и будет примерно то, что нужно.
Налимов и Syzygy онлайн есть в этой статье.
07.04.2024, 13:22 [397 просмотров]

