🎓 KCP-фича — тактика против глубины поиска
О чём это
Мы усилили оценку дешёвыми позиционными фичами (мобильность, безопасность короля) — и
oracle-3взял гейт: 2-ply + rich = 57.8% противaggressive(Plan-usileniya-value-modeli). Следующий рычаг — KingCaptureProbability (KCP): фича, кодирующая само условие победы напрямую. Она дорогая, поэтому её нельзя в листья глубокого поиска — но можно на 1 плай. Отсюда красивый эксперимент: побеждает ли богатая тактическая оценка на малой глубине более бедную оценку на большей глубине? Первые разделы концептуальные, дальше — инженерия и как это прогнать (наконец по делу — на Oracle).
Связанные: Plan-usileniya-value-modeli · 2-ply-Expectimax-poverkh-value-modeli · Chto-takoe-LightGBM · Oracle-Cloud-rannbuk · 03-Idei-po-uluchsheniyu-algoritmov
1. Что такое KCP
В Dice Chess побеждают захватом короля (нет мата — короля буквально бьют). KCP измеряет эту угрозу напрямую. Ход = бросок трёх костей (каждая 1–6 → тип фигуры) и до трёх микро-ходов; всего 216 = 6³ исходов броска. Для позиции KCP перебирает эти 216 бросков и считает, в какой доле сторона может добраться до вражеского короля (DFS по дереву микро-ходов внутри каждого броска):
То есть вероятность, что сторона c захватит короля соперника этим ходом при случайном броске. Считаем с обеих сторон и получаем два (или три) числа для модели:
| Фича | Смысл |
|---|---|
kcp_attack = | насколько уязвим король соперника к моему броску |
kcp_danger = | насколько уязвим мой король к его броску |
kcp_diff = attack − danger | нетто-перевес по прямой угрозе королю |
Важно: KCP dice-aware — усредняет по всем броскам, а не смотрит один конкретный.
2. Почему прямая фича сильнее прокси
Всё, что видит модель сейчас, — это прокси победы:
- материал — «обычно у кого больше, тот и выигрывает»;
- mobility / king_safety — эвристики про активность и приблизительную опасность.
KCP кодирует само условие победы. Позиция может быть равной по материалу и «спокойной» по эвристике, но если твой король захватывается следующим броском — ты проигрываешь. Материал этого не видит; king_safety видит приблизительно (атакующие фигуры рядом с королём); KCP считает это точно и с учётом костей.
Связь с тем, что уже сработало
mobility_diffстала фичей №1 по важности,king_safety_diffтоже помогла. KCP — их «идеальный предел» по линии короля: не «сколько фигур рядом», а «с какой вероятностью король реально падёт». Вопрос лишь в цене.
3. Загвоздка — цена (и почему эксперимент устроен именно так)
KCP дорогая: 216-DFS ≈ миллисекунды на одну оценку. А цена фичи платится на каждом листе поиска, который её вызывает:
| Где считать оценку | Листьев на ход | KCP × это |
|---|---|---|
| 2-ply expectimax | ~360 000 | ❌ тысячи секунд/ход — нереально |
| 1-ply | ~сотни кандидатов | ✅ десятки–сотни мс/ход — годится для живой игры |
Отсюда неочевидный вывод: KCP нельзя в листья 2-ply, но можно в 1-ply. Это переворачивает привычную логику «глубже = сильнее»: тут глубина и богатство оценки конкурируют за один и тот же бюджет времени.
Общий принцип из Plan-usileniya-value-modeli
Дешёвые фичи (мобильность, king-safety) — можно и в листья 2-ply. Дорогие (KCP) — только на мелкой глубине. Эксперимент проверяет, что выгоднее потратить бюджет: на лишний плай или на более умную оценку.
4. Эксперимент: 1-ply + KCP vs 2-ply + материал
Он сталкивает два способа «увидеть тактику»:
- 2-ply + материал — видит ответ соперника через глубину, но оценка листа слепа к королю (угрозу находит только поиском, и только на конкретном броске в узле).
- 1-ply + KCP — без заглядывания вперёд, но оценка напрямую содержит вероятность захвата короля, усреднённую по броскам → «видит» угрозу за один слой.
С учётом уже полученных чисел матрица такая:
| Оценка \ Глубина | 1-ply | 2-ply |
|---|---|---|
| материал | 41.5% | ~55% |
| + rich (mobility, king-safety) | 48% | 57.8% ✅ |
| + KCP | ← этот эксперимент | ✗ (KCP неподъёмна в листьях) |
Гипотеза: если 1-ply + KCP окажется ≈ или > 2-ply + rich (57.8%) — это сильный результат: бот дешевле в живой игре (нет 2-ply-взрыва) и прямее по сути игры. Если проиграет — 2-ply+rich остаётся чемпионом, а KCP отправляется в «дорого и не окупилось».
5. Как это ложится на наш конвейер
Механика — ровно та, что отработана на позиционных фичах (Plan-usileniya-value-modeli), но шаг обогащения теперь тяжёлый:
flowchart LR A["training_data.csv.gz<br/>(1.3M строк)"] --> B["EnrichTrainingDataApp<br/>+ колонка kcp (216-DFS)"] B -->|"часы × многоядерность"| C["Oracle CPU<br/>(наконец по делу)"] C --> D["training_data_kcp.csv.gz"] D --> E["LightGBM переобучение<br/>--features rich+kcp"] E --> F["ONNX (dice-free)"] F --> G["OnnxEvalSearch<br/>ТОЛЬКО 1-ply"] G --> H["арена vs aggressive"]
- Обогащение. Движок уже умеет
KingCaptureProbability— расширяемEnrichTrainingDataApp, дописываем колонкиkcp_*. Это 216-DFS × 1.3M ≈ часы на многих ядрах → первая задача, которой реально нужен Oracle CPU. Позиционные фичи были дёшевы и прошли локально за минуты; KCP — нет. Здесь впервые «по делу» задействуется Oracle-Cloud-rannbuk. - Переобучение LightGBM с KCP-фичами (в приватном EV-проекте, флаг набора фич расширить) — секунды.
- Serving только на 1-ply через уже параметризованный
OnnxEvalSearch(набор фич выбирается аргументом). 2-ply намеренно не трогаем — KCP там неподъёмна. - Арена 1-ply+KCP vs
aggressive(сид фиксирован, воспроизводимо — см. Arena), сравнить с 57.8%.
6. Что решает результат
- Стоит ли прямая тактическая фича своей цены.
- Лучший live-бот по «сила × скорость»: 1-ply+KCP может оказаться и быстрым, и сильным → кандидат в
oracle-4. - Гибрид (если базовый вариант зайдёт). KCP слишком дорога для листьев 2-ply, но в корне кандидатов немного (сотни) — можно 2-ply+rich в листьях плюс KCP как корневой сигнал. Дёшево и потенциально складывается с глубиной.
7. Честные оговорки
- Это настоящий эксперимент, не гарантия. KCP может частично дублировать
king_safety_diff(который уже помог) — тогда прирост будет мал; а может дать ортогональный сигнал (точная вероятность vs приблизительная эвристика) — тогда заметный. - Основная стоимость — обогащение (Oracle-прогон). Обучение и арена дёшевы, так что цена ошибки — часы CPU, не дни.
- KCP считается на корне/1-ply — она про немедленную угрозу королю. Отложенные (через несколько ходов) угрозы по-прежнему ловит только поиск; поэтому гибрид «глубина + KCP» концептуально сильнее чистого 1-ply+KCP.
8. Порядок работ (когда возьмёмся)
Issue-цепочка в духе плана:
- Расширить
EnrichTrainingDataAppподkcp_*(движок →KingCaptureProbability); тест на реальной колонке. - Обкатать Oracle на этом прогоне (первое реальное использование гранта; Oracle-Cloud-rannbuk).
- Переобучить, сравнить offline-метрики (как в шаге 4a плана).
- 1-ply-арена; при успехе —
oracle-4и/или ветка «KCP в корне 2-ply».