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

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

Конспект: ветви и границы

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

Понятия

Рекорд - лучшее найденное решение. Для максимума наибольшее, для минимума наименьшее.

Оценка (граница) - потолок достижимого в ветке: сверху для максимума, снизу для минимума.

Допустимая оценка - никогда не ошибается в опасную сторону: для максимума не меньше реально достижимого, для минимума не больше.

Релаксация (ослабление) - убрать требование задачи, решить что осталось, получить оценку.

Фронт открытых узлов - узлы, которые ещё предстоит раскрыть. У обхода в глубину это стек вызовов, у лучшего-первого - очередь с приоритетом по оценке.

Что унести

ВЕТВИ И ГРАНИЦЫ = поиск с возвратом + рекорд + оценка
    в каждом узле:  обновить рекорд, если решение допустимо
                    посчитать оценку ветки
                    отсечь, если оценка не лучше рекорда

максимум:  отсекаем при  оценка <= рекорд     (оценка сверху)
минимум:   отсекаем при  оценка >= рекорд     (оценка снизу)
рюкзак, узлов перебор (вместимость) ветви и границы шагов у ВиГ
15 предметов 39 864 23 598
20 предметов не уложился 61 1 346
25 предметов не уложился 52 1 573
30 предметов не уложился 35 1 677

Число узлов у сильной оценки почти не растёт с размером задачи - вот как выглядит хорошая граница. Ответы сверены с динамикой по вместимости: 420, 532, 675, 783.

ОТКУДА БЕРЁТСЯ ОЦЕНКА (ослабить = расширить множество решений)
целый рюкзак        → разрешить резать предметы      → жадность по цена/вес
коммивояжёр         → рёбра могут не быть путём      → сумма минимальных рёбер
коммивояжёр точнее  → убрать «степень каждого = 2»   → остовное дерево (МОД)
целые переменные    → разрешить дробные              → симплекс («релаксация»)
3 машины            → делить задачу между машинами   → max(объём/3, максимум)

несколько нижних оценок объединяются взятием НАИБОЛЬШЕЙ
ТОЧНОСТЬ ПРОТИВ ЦЕНЫ - ось, на которой выбирают оценку
оценка 0 ──────── ослабленная задача ──────── точный ответ
отсекает ничего      отсекает почти всё        отсекает всё
цена 0               O(1)...O(n) на узел       как вся задача
= полный перебор     рабочий метод             бессмысленно
коммивояжёр полный перебор оценка в лоб O(n²) оценка предпосчитанная
6 городов 5 387 шагов 15 264 2 599
8 городов 277 780 шагов 186 770 20 349
10 городов не уложился - 105 526

Оценку надо пересчитывать инкрементно, а не заново: на шести городах версия «в лоб» оказалась дороже полного перебора.

ПОРЯДОК ОБХОДА
в глубину        память O(n), рекорд сразу, узлов чуть больше минимума
лучший-первый    узлов минимум, память под весь фронт; где частичное решение не ответ - ответа долго нет
                 (при допустимой оценке первый дошедший узел сразу оптимален = A*)
гибрид           спуск в глубину, кандидаты в порядке оценки ← обычный выбор
при ветвлении 2  гибрид = «пробуем сначала ветку с лучшей оценкой»
рюкзак, 25 предметов в глубину лучший-первый
узлов раскрыто 52 23
шагов 1 573 2 828
в памяти путь, O(n) фронт до 15 узлов

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

Недопустимая оценка. Занижает потолок - отсекает ветку с оптимумом. Ответ есть, он просто хуже настоящего: 670 вместо 675 на одном наборе из четырёх. Проверять сравнением с полным перебором или с динамикой на малых данных.

Забыл сортировку в дробной оценке. Для рюкзака это условие ПРАВИЛЬНОСТИ, а не скорости: без сортировки по удельной цене ответы ломаются на всех размерах - 355 вместо 420, 700 вместо 783.

Перепутал направление. Для минимума нужна оценка снизу и сравнение >=, для максимума - сверху и <=. Ошибка в знаке отсекает оптимум.

Оценка дороже, чем экономит. Цена оценки умножается на число узлов. Замер: оценка «в лоб» на шести городах - 15 264 шага против 5387 у полного перебора.

Рекорд обновляется только на дне. В рюкзаке частичный набор - уже допустимое решение; обновляя рекорд в каждом узле, отсечения включаются раньше.

Рекорд инициализирован неправильно. Для минимума начальное значение обязано быть заведомо больше любого решения. Надёжнее - длина любого настоящего решения, например жадного.

Фронт лучшего-первого как список с линейным поиском максимума. На десятках тысяч узлов выбор максимума становится главной статьёй расходов. Нужна очередь с приоритетом.

Не проверил оценку узла при извлечении из фронта. Пока узел лежал, рекорд вырос - узел уже бесперспективен.

Ждёшь гарантии от жадного старта. На одном наборе он свёл дерево к одному узлу, на трёх других не сэкономил ничего. При обходе в глубину с ветвью «берём» первой первый спуск и ЕСТЬ жадное решение, поэтому старт экономит ровно его.

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

Все отсечения этой главы устроены на одном допущении: цель одна и она наша. Дальше - перебор в играх, где за соседний ход отвечает противник со строго противоположной целью. Дерево станет двухцветным, «лучшее в ветке» будет означать разное на чётных и нечётных уровнях, а отсечение по оценке получит собственное имя - альфа-бетаРазбирается в разделе 16, глава «Перебор в играх - минимакс и альфа-бета»: Альфа-бета: то же значение, вдвое большая глубина за ту же цену. Идея при этом останется та же: не раскрывать ветку, которая уже не может изменить ответ.

Комментарии

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

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

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