Модуль II·Статья I·~4 мин чтения
Метод ветвей и границ (Branch and Bound)
Методы ветвей и границ
Превратить статью в подкаст
Выберите голоса, формат и длину — AI запишет аудио
Метод ветвей и границ (Branch and Bound)
Принцип «умного перебора»
Полный перебор всех вариантов невозможен при больших n. Но можно быть умнее: если на каком-то шаге мы знаем, что «дальше ничего хорошего не будет» — отсечём целую ветвь дерева перебора. Метод ветвей и границ (Branch and Bound, B&B) систематизирует эту идею. Это основа всех промышленных ЦЛП-решателей. Когда Gurobi «решает» задачу с миллионом переменных — внутри работает B&B с множеством эвристик.
Структура алгоритма
Дерево поиска: каждый узел — это подзадача с дополнительными ограничениями. Корень — исходная задача без дополнительных ограничений.
Нижняя оценка (lower bound, LB) для узла: минимально возможное значение целевой функции в этом узле. Обычно — оптимум ЛП-релаксации подзадачи.
Лучшее найденное решение (incumbent): лучшее целочисленное решение, найденное на данный момент.
Правило отсечения: если LB(узел) ≥ incumbent, этот узел бесполезен — отсекаем его вместе со всеми потомками.
Алгоритм Branch and Bound
-
Инициализация: корневой узел = исходная ЛП-релаксация. incumbent = ∞.
-
Выбор узла: выбираем активный (не отсечённый) узел для обработки.
-
Вычисление нижней оценки: решаем ЛП-релаксацию в этом узле.
- Если ЛП нет решения: отсекаем (задача нед допустима).
- Если LB ≥ incumbent: отсекаем (не лучше текущего решения).
- Если ЛП-оптимум целочисленный: обновляем incumbent.
-
Ветвление: берём дробную переменную xᵢ = α (α ∉ ℤ). Создаём две дочерние подзадачи:
- Ветвь «вниз»: добавляем xᵢ ≤ ⌊α⌋
- Ветвь «вверх»: добавляем xᵢ ≥ ⌈α⌉
-
Добавляем дочерние узлы в очередь активных. Повторяем с шага 2.
Стратегии ветвления
Выбор переменной для ветвления:
- Most Fractional: выбираем xᵢ ближайший к 0.5 (наиболее «дробный»)
- Strong Branching: решаем ЛП-релаксацию обеих ветвей для нескольких кандидатов, выбираем лучший. Дорого, но даёт меньше узлов.
- Pseudocost Branching: используем историю прошлых ветвлений для предсказания «полезности»
Стратегии обхода дерева:
- Best-First Search: выбираем узел с минимальной нижней оценкой. Быстро достигает оптимума, но требует много памяти.
- Depth-First Search: углубляемся по одной ветви. Быстро находим допустимые решения (обновляем incumbent), экономия памяти.
- Комбинация: depth-first до нахождения incumbent, потом best-first.
Нижние оценки: ЛП и Лагранжева релаксация
ЛП-оценка: решаем ЛП-релаксацию. Хорошая оценка, но вычислительно дорого.
Лагранжева релаксация: «смягчаем» часть ограничений, добавляя их в цель со штрафами λ.
Задача ЦЛП: min cᵀx при Ax ≥ b, Bx ≤ d, x ∈ {0,1}ⁿ.
Лагранжева подзадача: Lₗ(λ) = min_{x ∈ {0,1}ⁿ, Bx ≤ d} {cᵀx + λᵀ(b − Ax)}.
Если Bx ≤ d — «простая» структура (например, задача о назначении), Lₗ(λ) решается легко!
Lₗ(λ) — нижняя оценка для любого λ ≥ 0. Лучшая оценка: max_{λ ≥ 0} Lₗ(λ) — задача Лагранжевой двойственности, решается субградиентным методом.
Полный разбор: задача о рюкзаке через B&B
Задача: W=10, предметы (c,w): (6,4), (5,3), (4,2), (3,1).
Корневой узел: ЛП-релаксация. Жадное решение по соотношению c/w: берём 4 (c=3,w=1), 3 (c=4,w=2), 2 (c=5,w=3). Остаток 4 кг → берём 6/4 = 1.5 единицы предмета 1: x₁ = 1, x₂ = 1, x₃ = 1, x₄ = 1, ценность = 3+4+5+6=18. LB = 18 (целочисленное!).
incumbent = 18. Ответ найден в корне без ветвлений. Оптимум = 18!
(В более сложных примерах с нецелочисленным ЛП-оптимумом нужно ветвиться.)
Производительность на практике
Рекорд TSP: 85,900 городов (США) решено оптимально в 2006 году (Applegate, Bixby, Chvátal, Cook). Время: несколько месяцев на кластере компьютеров. Использованы: B&B + режущие плоскости + мощные эвристики.
Gurobi 10.0: задачи с 10⁶ переменных и 10⁵ ограничений решаются за секунды-минуты (для хорошо структурированных задач). Используется: Boeing (расписания), Google (оптимизация рекламы), банки (управление портфелем).
Эвристики поиска в B&B
Современные ЦЛП-решатели (Gurobi, CPLEX) ускоряют B&B десятками эвристик:
- Эвристики выбора переменной для ветвления: pseudocost branching, strong branching, reliability branching
- Эвристики выбора узла: best-first, depth-first, best-estimate
- Презолвинг (presolve): упрощение задачи до начала поиска (фиксирование переменных, агрегирование ограничений)
- Простейшие эвристики поиска целочисленного решения: feasibility pump, RINS, local branching — позволяют быстро найти incumbent для агрессивного отсечения
Параллелизация
B&B хорошо параллелизуется: разные узлы дерева могут обрабатываться независимыми потоками или машинами. Промышленные решатели поддерживают многопоточность с сотнями ядер. Сложности: балансировка нагрузки (некоторые ветви глубже других), синхронизация incumbent (чтобы все потоки использовали лучшее текущее решение).
Применения
B&B решает реальные задачи планирования авиаперевозок (American Airlines, более миллиона переменных), оптимизации сетей доставки (UPS, FedEx), составления школьных расписаний, портфельной оптимизации с дискретными решениями (число акций), задач VLSI-проектирования.
§ Акт · что дальше