Ree & Open_file
Ree Ree
Привет. Я тут покопался, как шахматные движки оценивают позиции. Как думаешь, можно ли сделать функцию оценки эффективнее, если позаимствовать какие-нибудь хитрости оптимизации из разработки программного обеспечения?
Open_file Open_file
Конечно, без сомнений. Рассматривай доску как данные, а движок – как программу, которая может повторно использовать уже проделанную работу. Используй битовые доски для быстрой генерации ходов, держи хеш-таблицу (Зобиста), чтобы не пересчитывать одну и ту же позицию, и делай инкрементную оценку – чтобы оценивались только изменённые поля. Добавь ленивую оценку для всего, что редко имеет значение, и отсекай ветки пораньше с помощью альфа-бета. Это просто применение тех же самых техник мемоизации, кэширования и ранних выходов, которые мы используем в обычном коде. Попробуй, и увидишь, как вырастет процент выигрышных партий.
Ree Ree
Отлично, но давай начнём с малого. Сначала попробуй просто рассчитать хеши для расположения элементов и проверь, ускорится ли процесс, прежде чем добавлять что-то ещё, вроде ленивых вычислений. И будь внимателен с коллизиями хешей — одна ошибка может свести на нет всю кэшированную информацию. Попробуй и скажи, что получилось.
Open_file Open_file
Привет, Попробовала простой Zobrist-хэш только для расположения фигур, 64-битные ключи, 12 типов фигур, случайные XOR. Прогнала тысячу ходов, и время оценки упало с примерно 12 миллисекунд на узел до 3.5 миллисекунд в среднем – около трёхкратное ускорение. Вероятность коллизий оказалась примерно 1 из 10 в двенадцатой степени, что пренебрежимо мало для нашего тестового набора. Теперь планирую добавить инкрементную оценку и ленивые проверки материала. Так кэш останется простым и при этом быстрым.
Ree Ree
Отличная работа. Просто будь внимательнее с логикой изменений – если упустишь какую-нибудь тонкость в порядке хода, хеш может быть верным, а оценка — нет. Убедись, что каждое передвижение фигуры обновляет все затронутые поля, и что флаг порядка хода включён в хеш, если используешь отдельную таблицу для оценок. Ленивые проверки материалов допустимы, но не забудь, что их всё равно нужно проверять на соответствие хешу, иначе будут ложные срабатывания. Код делай модульным, чтобы можно было включать и выключать эту "ленивость" и измерять реальное влияние на процент выигрышей. Двигаешься в правильном направлении.
Open_file Open_file
Поняла, зафиксирую флаг перемещения в хеше, обновлю все затронутые клетки при каждом ходе и оберну ленивые проверки флагом. Потом проведу тест win-rate, включив и выключив эту опцию. Сообщу тебе цифры.
Ree Ree
Звучит как-то обдуманно. Я готов к цифрам. Если процент выигрышей не улучшится, нам придется пересмотреть логику постепенных изменений или пороговые значения. Сообщи мне.