1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# конспект · шаг 7 из 7

Конспект: перебор в играх

выжимка - её можно унести в заметки

Понятия

Дерево игры - дерево, у которого уровни по очереди принадлежат разным игрокам.

Минимакс - свёртка дерева игры: максимум на своём ходу, минимум на ходу противника. Значение корня - результат при идеальной игре ОБЕИХ сторон.

Негамакс - та же свёртка, записанная один раз: значение считается с точки зрения того, кто ходит, и при спуске меняет знак. Только для игр с нулевой суммой.

Альфа - что максимизирующий уже обеспечил себе выше по дереву (нижняя граница результата). Бета - то же для минимизирующего (верхняя граница).

Оценка позиции - дешёвая формула вместо результата партии; подставляется на горизонте поиска.

Эффект горизонта - систематическая ошибка обрезанного поиска: он выбирает ходы, отодвигающие неприятность за глубину видимости.

Число Гранди позиции - mex чисел Гранди позиций после хода; ноль - проигрыш ходящего. Теорема Шпрага-Гранди - сумма независимых игр имеет число Гранди XOR чисел частей. Ним - XOR размеров кучек; выигрышный ход делает его нулём.

Что унести

МИНИМАКС
ход наш        → max по детям
ход противника → min по детям
лист           → результат партии (или ОЦЕНКА, если дерево обрезано)
цена: порядка b^d - столько листьев у дерева

НЕГАМАКС (игра с нулевой суммой)
значение = max по ходам ( − значение(после хода) )
АЛЬФА-БЕТА
вниз едет интервал (альфа, бета) - значения, которые ещё могут повлиять
узел max:  альфа = max(альфа, найденное)
узел min:  бета  = min(бета,  найденное)
любой узел: альфа >= бета → выход, остальные ходы не смотрим

значение корня НЕ меняется - это тест на правильность реализации
из отсечённого узла возвращается ГРАНИЦА, а не точное значение
дерево b=3, d=6 (729 листьев, значение 32) узлов листьев шагов
минимакс 1 093 729 10 489
альфа-бета, случайный порядок 417 233 5 018
альфа-бета, идеальный порядок 125 53 1 497
альфа-бета, худший порядок 939 606 11 432

Идеальный порядок даёт ровно b^⌈d/2⌉ + b^⌊d/2⌋ − 1 листьев - замер совпал с формулой до единицы (53 при b=3 d=6, 63 при b=2 d=10, 127 при b=4 d=6). Практический смысл - УДВОЕНИЕ глубины при тех же ресурсах. Худший порядок, наоборот, делает альфа-бету дороже минимакса по шагам.

КРЕСТИКИ-НОЛИКИ 3×3 (замер на движке)
пустая доска         минимакс 549 946 узлов, 49,4 млн шагов
                     альфа-бета 18 297 узлов, 1,73 млн шагов   в 30 раз меньше
значение пустой доски = 0, ничья

X в углу, O в центре      7 332 узла / 667 518 шагов → 844 узла / 80 928 шагов
X в клетке 0, O в клетке 1  8 232 узла / 777 493 шага  → 749 узлов / 74 205 шагов
                          значение 1: ответ стороной на угол - проигрыш
КОГДА ДЕРЕВО НЕ КОНЧАЕТСЯ
обрезка по глубине + оценка позиции = прогноз, а НЕ доказательство
сила программы ≈ глубина × качество оценки

итеративное углубление 1, 2, ... d:  дороже одного прогона в b/(b−1) раза
    замер: 1,5 (b=4) ... 2,6 (b=2)
    даёт: готовый ответ в любой момент + подсказку по порядку ходов
таблица транспозиций: хранить значение + глубину + ТИП (точное / не выше / не ниже)
поиск спокойствия: на горизонте доигрывать взятия и шахи - лекарство от горизонта
обрезка на глубине 2 3 4 5 6 (до конца)
ответ поиска 15 52 15 72 32

Ответ обрезанного поиска не сходится, он скачет, и совпадение ответов на соседних глубинах ничего не доказывает: на другом дереве глубины 3, 4 и 5 дали 81, 81 и 81 при настоящем значении 36.

Ловушки джокера

Свернул оба уровня максимумом. Получается ответ на вопрос «а если противник подыграет»: в крестиках-ноликах такой перебор обещает выигрыш X, тогда как настоящее значение пустой доски 0.

Забыл откат хода. Та же ловушка, что во всём разделе: поставил - сыграл - СНЯЛ. Доска одна, и испорченное состояние протекает в соседние ветки.

Проверил конец игры после цикла по ходам. Терминальные случаи всегда идут первыми, иначе программа «продолжает игру» на уже выигранной доске.

Перепутал знаки или границы в негамаксе. При спуске меняются и знак, и места границ: -ab(..., -beta, -alfa). Ошибка даёт неверный ответ молча.

Положил границу в кеш как точное значение. Всплывёт там, где интервал другой, и испортит ответ. Хранить тип значения обязательно.

Решил, что обрезанный поиск что-то доказывает. Доказывает только поиск до терминальных позиций. Остальное - прогноз с точностью оценки.

Углубляешься, не трогая оценку. Каждый уровень дорожает в b раз и приносит всё меньше, если оценка плохая.

Ждёшь от альфа-беты выигрыша при любом порядке ходов. При худшем порядке она дороже минимакса - замер 11 432 шага против 10 489. Упорядочивание ходов - часть алгоритма, а не украшение.

Поверил, что приём «все используют», сработает и у тебя. Подсказка «лучший ход прошлой итерации» на наших деревьях со случайной оценкой не дала ничего (544 узла против 552), хотя в шахматных движках она обязательна. Проверять надо на своей задаче.

Куда это ведёт

Это была последняя глава раздела. Дальше - конспект: все приёмы сокращения перебора в одной таблице, по силе и по цене, от генерации объектов до альфа-беты, плюс дерево решений «какой приём брать на какой задаче».

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.