Идея: дать игроку возможность сыграть с компьютером ровно своего
уровня. Для этого нужно откалибровать параметры движка (Skill Level,
Depth, Timeout) так, чтобы профиль ошибок движка соответствовал
профилю игроков с целевым рейтингом.
- Разбить партии по корзинам рейтинга (например, 800--999, 1000--1199, ...).
- Для каждой позиции считать:
- ход игрока,
- рейтинг на момент хода,
- фазу (дебют / миттельшпиль / эндшпиль),
- материал, темп.
- Рассчитать метрики:
- ACPL (average centipawn loss),
- Blunder rate (ошибки >200 cp),
- Miss rate по тактикам,
- Move-match@k (совпадение с ходами «оракула»).
Оракул = Stockfish в максимальном режиме (depth=35+, без ограничений).
Для набора параметров θ = (skill, depth, movetime): - Прогнать
Stockfish с θ по эталонным позициям. - Сравнить его ходы с оракулом. -
Посчитать те же метрики (ACPL, blunder rate, match).
Для каждой корзины рейтинга R задать целевой вектор метрик T(R).
Для θ рассчитать вектор M(θ).
Функция потерь:
L(θ; R) = w1*(ACPL(θ)-ACPL_R)^2
+ w2*(Blunder(θ)-Blunder_R)^2
+ w3*(Match(θ)-Match_R)^2
- Для каждой корзины рейтинга минимизировать L.
- Найти θ(R).
- Сгладить зависимости:
depth(R),movetime(R)--- непрерывные,skill(R)--- ступенчатая.
Ошибки распределены по фазам. Добавляем фазовый компонент:
L(θ; R) = Σ_F α_F * L_F(θ; R, F)
где α_F = доля фаз (дебют/миттель/эндшпиль).
- Использовать ограничение по времени/глубине, а не только
Skill Level. - Добавлять шум в оценку при близких вариантах (разница <30--50 cp).
- Для низких рейтингов: вероятность пропуска тактики.
- Во время партии измерять ACPL и blunder rate игрока.
- Оценивать рейтинг R̂ игрока.
- Подстраивать θ(R̂) плавно каждые N ходов.
Цель ELO Skill Depth Время/ход
900 2 6--8 80--120 мс 1100 4 8--10 120--180 мс 1300 6 10--12 180--250 мс 1500 8 12--13 250--350 мс 1700 10 13--14 350--500 мс 1900 12 14--15 500--700 мс 2100 14 15--16 0.8--1.2 с 2300 16 16--17 1.2--1.8 с 2500 18--20 18--20 2.0--3.0 с
(ориентир, точная калибровка зависит от вашей базы)
- Использовать тест-позиции вне обучающей базы.
- Сравнивать кривые точности по сложности позиций.
- Проверять профиль ошибок по фазам и материалу.
- Кэшировать оценки оракула по FEN.
- Запускать движок батчами.
- Нормировать метрики к контролю времени.
- Версионировать маппинг «рейтинг → θ» при обновлении движка.
Так можно построить карту «рейтинг → настройки Stockfish» и реализовать режим, где движок подстраивается под силу игрока. Это и будет настоящий «зеркальный режим».