🎓 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-ply2-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"]
  1. Обогащение. Движок уже умеет KingCaptureProbability — расширяем EnrichTrainingDataApp, дописываем колонки kcp_*. Это 216-DFS × 1.3M ≈ часы на многих ядрахпервая задача, которой реально нужен Oracle CPU. Позиционные фичи были дёшевы и прошли локально за минуты; KCP — нет. Здесь впервые «по делу» задействуется Oracle-Cloud-rannbuk.
  2. Переобучение LightGBM с KCP-фичами (в приватном EV-проекте, флаг набора фич расширить) — секунды.
  3. Serving только на 1-ply через уже параметризованный OnnxEvalSearch (набор фич выбирается аргументом). 2-ply намеренно не трогаем — KCP там неподъёмна.
  4. Арена 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-цепочка в духе плана:

  1. Расширить EnrichTrainingDataApp под kcp_* (движок → KingCaptureProbability); тест на реальной колонке.
  2. Обкатать Oracle на этом прогоне (первое реальное использование гранта; Oracle-Cloud-rannbuk).
  3. Переобучить, сравнить offline-метрики (как в шаге 4a плана).
  4. 1-ply-арена; при успехе — oracle-4 и/или ветка «KCP в корне 2-ply».