TGViewer
SoFCheck SoFCheck @sofcheck · 36 subscribers
Post #65 207
Лечения проблемы здесь оказалось два:

Во-первых, я ускорил проверку сгенеренных ходов на легальность. Для этого применяется упрощенная доска, которая содержит лишь нужные для проверки легальности данные. Применение хода на такой доске будет работать куда быстрее, чем применение хода на полной доске, поэтому получаем неплохое такое ускорение. Еще я добавил пару отсечений. Например, не под шахом всегда легально делать ход любой фигурой, кроме связанных и короля, поэтому можно определить легальность хода быстрее. Я пытался еще аналогичным образом добавить отсечения и для шахов, но бенчмарки лишь показали ухудшение производительности

После всех этих ускорений мой генератор легальных ходов стал уступать генератору из chess лишь в два раза. Дальше я его ускорять пока не планирую, потому что для этого может понадобиться переписать весь генератор ходов. А на практике, в принципе, псевдолегальных практически всегда хватает

Во-вторых, я придумал и добавил бенчмарк hperft (honest perft, hash perft), который позволяет псевдолегальным генераторам соревноваться на равных. А именно, в hperft надо не только вычислить количество позиций на заданной глубине, но и учесть некоторую сумму хэшей от этих всех позиций. Точные формулы можно посмотреть в коде. Нетрудно видеть, что hperft не дает срезать количество действий на последней глубине, а заставляет честно применять и отменять ходы

На hperft результаты owlchess и chess сравнялись, а вот shakmaty оказался быстрее их всех. Скорее всего дело в том, что у там лучше написан make_move, и в том, что в shakmaty по умолчанию не пересчитывается zobrist-хэш (а для этого существует отдельная обертка. Тем не менее гипотеза подтвердилась: псевдолегальный генератор действительно смог себя хорошо показать :)

Правда, hperft очень сильно перекошен в сторону make_move, и больше отражает время работы этой функции, а не собственно генерации ходов. По этой причине у меня в планах добавить приближенный к действиям реального движка бенчмарк: у каждой доски из всего множества ходов детерминированно и вне зависимости от их порядка выбираем 4-5 из них, и делаем рекурсивный спуск только с этими ходами
More from @sofcheck
  1. Sep 1, 2024А, и еще, основная логика новой версии утилиты Battlefield реализована в двух пакетах — in…
  2. Sep 1, 2024И кстати да, платформа для сражений шахматных движков будет называться day20 (как заметно…
  3. Sep 1, 2024Решил написать шахматную библиотеку на Go: https://github.com/alex65536/go-chess/tree/mast…
  4. Aug 12, 2023Тем не менее, я немного поломал обратную совместимость и выпустил версию 0.4.0 :) Основное…
  5. Aug 12, 2023Я в последнее время занимался своей шахматной либой на Rust, а именно, пытался слегка прок…
  6. Aug 6, 2023Потратил несколько дней на оптимизацию правил. В итоге практически никакого улучшения в си…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →