Games
- Симметричные игры на графах
- На ациклических графах (DP за O(E))
- На цикличных графах (Ретроанализ за O(E))
- В обычной DP и ретроанализе поиск самого быстрого выиграша и самого долгого проигрыша.
- Функция Гранди
- Смысл: игр много. Если игра всего одна, мы ее полностью исследовали за O(E) в предыдущем пункте.
- Функция Гранди. Определения через mex, (mex = 0) <=> LOSE.
- Реализация за O(E).
- Прямая сумма игр, сила xor-а.
- Док-во того, что mex(A+B)=mex(A)^mex(B) табличкой 2n x 2n.
- Примеры
- Шоколадка (решение за O(n3)) [есть 2D грид, один из кусочков можно поделить на 2 по любому из измерений]
- Решение за O(1) (четные = выигрышные, остальные = проигрышные), или так: в конце все кусочки будут 1x1 => знаем, сколько всего ходов.
- Шоколадка + нельзя делить попалам
- Ним + кучку можно делить пополам (= то же самое, что и Ним)
- Ним + кучку можно делить на произвольное число слагаемых
- Штирлиц, Мюллер и очередь
- Hacking Bush
- Теория Смита
- Алгоритм Смита.
- Реализация алгоритма за O(VE), O(E3/2)
- Непомеченные вершины = Ainf, где A - множество конечных вершин-детей
- По состоянию понимаем, Draw OR Lose OR Win. Ainf - Win, если в A есть 0, иначе Draw
- Учимся XOR-ить 2 состояния (числа XOR-ятся также как в случае Гранди, inf + inf = Emptyinf, Ainf + a = (A XOR a)inf)
- Эквивалентность и док-во Смита
- Определение, любой ацикличный граф G ~= ниму a*
- Док-во эквивалентности игр для ацикличных графов (Гранди)
- Док-во эквивалентности игр для цикличных графов (Смит)
- Суть док-ва - у нас есть "лишние" ходы (ребра). Лишние - не позволяющие первому игроку выиграть (или свести в ничью).
Переборные стратегии
- Полный перебор.
- Рекурсия.
- Мир глобален, не копируется, после отката из рекурсии возвращается в старое состояние.
- Пример на задачки "найдем число путей на клетчатой плоскости".
- Предподсчет.
- Метод Ветвей и Границ (на примере задачи timus : 1152)
- Отсечение по времени.
- Memorization (хэширование, динамика) - IMPORTANT
- Отсечение по ответу - IMPORTANT
- Жадность, сортировка ребер
- Выбор первых k ребер.
- Iterative Increasing of k
- Iterative Deepening
- Нерекурсивная реализация bfs-ом. Очередь с ограничением по длине.
- Локальные оптимизации (введение, на примере Коммивояжера)
- Разворот двух пересекающихся отрезков.
- Случайные изменения
- Попытка переставить 5 подряд идущих вершин оптимальным способом.
- while (exists) do
- Начальное приближение дает хорошая жадность (Nearest).
- Отжиг (введение)
- На примере задачи веревкой длины P ограничить максимальное число точек на плоскости.
- Функция, которую мы оптимизируем f(state)
- Пытаемся сделать переход, меняем состояние. Вероятность изменения = exp{-t} (можно вносить заведомо "хорошие" изменения)
- Пытаемся взять или не взять новое состояние. Если f улучшилась, берем, если ухудшилась, то берем с вероятностью = exp{-t}.
- Отличия от Локальных Оптимизаций: иногда функция ухудшается
- Генетические алгоритмы (введение)
- Есть поколение состояний. Мы умеем модифицировать одну особь (состояние) отжигом.
- Можно параллельно улучшать (модифицировать) все особи и оставлять сколько то лучших.
- Добавим скрещивание (создание новой особи из старых двух)
- Оставим часть прежнего поколения.
- Добавим вероятность того, что плохое состояние тоже выживет.
- Увидим связь с bfs-ом в Методе Ветвей и Границ.