Дайте определение NP-полноты и приведите пример редукции от SAT к задаче рюкзака или наоборот; обсудите, какие эвристики и приближённые алгоритмы используются на практике для NP-трудных задач и как оценивать их качество
Определение NP‑полноты: - Язык (задача) LLL называется NP‑полным, если 1. L∈NPL\in\mathrm{NP}L∈NP (решение проверяется детерминированно за полином), 2. для любой задачи A∈NPA\in\mathrm{NP}A∈NP существует полиномиальная сводимость (полиномиально вычислимая функция) fff такая, что для любого входа xxxx∈A ⟺ f(x)∈L.
x\in A \iff f(x)\in L. x∈A⟺f(x)∈L.
Это называется полиномиальной много‑в‑одном сводимостью (many‑one). (Cook–Levin: SAT — с.н.с. NP.) Пример сводимости SAT → Задача рюкзака (через Subset‑Sum): - Схема (классическая идея): сначала привести SAT к 3‑SAT. Пусть дано 3‑SAT с переменными x1,…,xnx_1,\dots,x_nx1,…,xn и дизъюнктами (клауза) C1,…,CmC_1,\dots,C_mC1,…,Cm. - Построим экземпляр SUBSET‑SUM (подмножество сумм), затем заметим, что SUBSET‑SUM сводится к 0–1 knapsack тривиально. Построение (эсквиз): 1. Выбираем основание B>mB>mB>m (например B=m+1B=m+1B=m+1), чтобы при сложении цифр не было переносов. 2. Числа будут иметь n+mn+mn+m «цифр»: первые nnn цифр соответствуют выбору значения для каждой переменной, последние mmm — выполнению клауз. 3. Для каждой переменной xix_ixi создаём два числа ai,Ta_{i,T}ai,T и ai,Fa_{i,F}ai,F. В iii-й (переменной) позиции обе эти числа имеют цифру 111 (это обеспечивает выбор ровно одного значения для каждой переменной), а в позициях клауз у числа стоит 111 там, где соответствующая литерала (например xix_ixi или ¬xi\neg x_i¬xi) входит в клаузу. 4. Для каждой клаузулы добавляем вспомогательные «заполняющие» числа, чтобы можно было довести суммарную цифру в каждой клаузовой позиции до заданного целевого значения (обычно «1») ровно тогда, когда выбран хотя бы один истинный литерал в этой клаузе. 5. Целевое число TTT задаём так, чтобы первые nnn цифр = 111 (обеспечить ровно один выбор значения на переменную), последние mmm цифр = требуемые значения для клауз (например 111). - Правильность: существует подмножество чисел, сумма которого равна TTT тогда и только тогда, когда в 3‑SAT есть удовлетворящее присваивание (выбор одного из ai,T,ai,Fa_{i,T},a_{i,F}ai,T,ai,F для каждой переменной и подбор заполняющих чисел обеспечивает каждую клаузу). - Затем SUBSET‑SUM сводится к 0–1 KNAPSACK: взять веса = эти числа, вместимость = TTT, доходы равны весам и требовать достижение ровно вместимости (или задать доход‑порог). Таким образом получаем сводимость SAT ≤p KNAPSACK. Эвристики и приближённые алгоритмы на практике (коротко и по назначению): - Жадные алгоритмы (greedy): просты и быстры; часто дают хорошее начальное решение (например жадный по плотности value/weightvalue/weightvalue/weight для рюкзака). - Локальный поиск: hill‑climbing, simulated annealing, tabu search — быстро улучшают решение на больших экземплярах. - Популяционные/эволюционные алгоритмы и метаэвристики: genetic algorithms, GRASP — применимы, когда пространство решений сложно. - Линейное программирование и округление: решаем LP‑релаксацию, затем округляем; даёт гарантии через интегральный разрыв. - Прямые алгоритмы с ветвлением и отсечением (branch‑and‑bound / branch‑and‑cut): точные методы с сильными эвристиками и оценками (используются в солверах). - Специальные аппроксимации и схемы: для KNAPSACK есть FPTAS — для любого ε>0\varepsilon>0ε>0 можно получить решение с ценностью не менее (1−ε)OPT(1-\varepsilon)\mathrm{OPT}(1−ε)OPT за время полиномиальное в nnn и 1/ε1/\varepsilon1/ε (т.е. poly(n,1/ε) \mathrm{poly}(n,1/\varepsilon)poly(n,1/ε)). - Для других задач: PTAS, константные аппроксимации (например 0.878…0.878\ldots0.878… для Max‑Cut по Goemans–Williamson с SDP), приближения через специализированные эвристики. Как оценивать качество эвристики/приближения: - Аппроксимационное отношение (approximation ratio). Для задачи максимизации определить ρ=ALGOPT,
\rho=\frac{\mathrm{ALG}}{\mathrm{OPT}}, ρ=OPTALG,
где ALG\mathrm{ALG}ALG — значение алгоритма, OPT\mathrm{OPT}OPT — оптимум. Алгоритм считается α\alphaα-аппроксимационным, если для всех входов ALG≥α⋅OPT\mathrm{ALG}\ge \alpha\cdot\mathrm{OPT}ALG≥α⋅OPT. Для минимизации обычно берут ρ=OPTALG\rho=\frac{\mathrm{OPT}}{\mathrm{ALG}}ρ=ALGOPT. - Относительная погрешность (relative gap): (OPT−ALG)/OPT(\mathrm{OPT}-\mathrm{ALG})/\mathrm{OPT}(OPT−ALG)/OPT. - Гарантии на время: полиномиальность, зависимость от 1/ε1/\varepsilon1/ε (для FPTAS). - Интегральный разрыв LP: насколько хороша LP‑релаксация — даёт теоретическую оценку округления. - Эмпирическая оценка: бенчмарки, сравнение с оптимумом на малых экземплярах (или с лучшими известными решениями), статистика по набору инстансов (средняя/худшая/медианная разница), стабильность и время. - Вероятностные гарантии: для рандомизированных алгоритмов смотреть вероятность достижения требуемого соотношения/предела. Краткое резюме: - NP‑полнота = принадлежность NP + полиномиальная сводимость из любой задачи NP. - Практически для SAT→Knapsack используют серию сводимостей (SAT→3‑SAT→SUBSET‑SUM→KNAPSACK) через кодирование присваиваний в числа; Subset‑Sum легко превращается в knapsack. - На практике применяют комбинацию жадных эвристик, локального поиска, LP‑релаксаций, метаэвристик и точных методов с отсечением; качество оценивают теоретическими гарантиями (аппрокс‑коэффициент, FPTAS/PTAS) и эмпирическими метриками (относительная ошибка, бенчмарки, время).
- Язык (задача) LLL называется NP‑полным, если
1. L∈NPL\in\mathrm{NP}L∈NP (решение проверяется детерминированно за полином),
2. для любой задачи A∈NPA\in\mathrm{NP}A∈NP существует полиномиальная сводимость (полиномиально вычислимая функция) fff такая, что для любого входа xxx x∈A ⟺ f(x)∈L. x\in A \iff f(x)\in L.
x∈A⟺f(x)∈L. Это называется полиномиальной много‑в‑одном сводимостью (many‑one). (Cook–Levin: SAT — с.н.с. NP.)
Пример сводимости SAT → Задача рюкзака (через Subset‑Sum):
- Схема (классическая идея): сначала привести SAT к 3‑SAT. Пусть дано 3‑SAT с переменными x1,…,xnx_1,\dots,x_nx1 ,…,xn и дизъюнктами (клауза) C1,…,CmC_1,\dots,C_mC1 ,…,Cm .
- Построим экземпляр SUBSET‑SUM (подмножество сумм), затем заметим, что SUBSET‑SUM сводится к 0–1 knapsack тривиально.
Построение (эсквиз):
1. Выбираем основание B>mB>mB>m (например B=m+1B=m+1B=m+1), чтобы при сложении цифр не было переносов.
2. Числа будут иметь n+mn+mn+m «цифр»: первые nnn цифр соответствуют выбору значения для каждой переменной, последние mmm — выполнению клауз.
3. Для каждой переменной xix_ixi создаём два числа ai,Ta_{i,T}ai,T и ai,Fa_{i,F}ai,F . В iii-й (переменной) позиции обе эти числа имеют цифру 111 (это обеспечивает выбор ровно одного значения для каждой переменной), а в позициях клауз у числа стоит 111 там, где соответствующая литерала (например xix_ixi или ¬xi\neg x_i¬xi ) входит в клаузу.
4. Для каждой клаузулы добавляем вспомогательные «заполняющие» числа, чтобы можно было довести суммарную цифру в каждой клаузовой позиции до заданного целевого значения (обычно «1») ровно тогда, когда выбран хотя бы один истинный литерал в этой клаузе.
5. Целевое число TTT задаём так, чтобы первые nnn цифр = 111 (обеспечить ровно один выбор значения на переменную), последние mmm цифр = требуемые значения для клауз (например 111).
- Правильность: существует подмножество чисел, сумма которого равна TTT тогда и только тогда, когда в 3‑SAT есть удовлетворящее присваивание (выбор одного из ai,T,ai,Fa_{i,T},a_{i,F}ai,T ,ai,F для каждой переменной и подбор заполняющих чисел обеспечивает каждую клаузу).
- Затем SUBSET‑SUM сводится к 0–1 KNAPSACK: взять веса = эти числа, вместимость = TTT, доходы равны весам и требовать достижение ровно вместимости (или задать доход‑порог). Таким образом получаем сводимость SAT ≤p KNAPSACK.
Эвристики и приближённые алгоритмы на практике (коротко и по назначению):
- Жадные алгоритмы (greedy): просты и быстры; часто дают хорошее начальное решение (например жадный по плотности value/weightvalue/weightvalue/weight для рюкзака).
- Локальный поиск: hill‑climbing, simulated annealing, tabu search — быстро улучшают решение на больших экземплярах.
- Популяционные/эволюционные алгоритмы и метаэвристики: genetic algorithms, GRASP — применимы, когда пространство решений сложно.
- Линейное программирование и округление: решаем LP‑релаксацию, затем округляем; даёт гарантии через интегральный разрыв.
- Прямые алгоритмы с ветвлением и отсечением (branch‑and‑bound / branch‑and‑cut): точные методы с сильными эвристиками и оценками (используются в солверах).
- Специальные аппроксимации и схемы: для KNAPSACK есть FPTAS — для любого ε>0\varepsilon>0ε>0 можно получить решение с ценностью не менее (1−ε)OPT(1-\varepsilon)\mathrm{OPT}(1−ε)OPT за время полиномиальное в nnn и 1/ε1/\varepsilon1/ε (т.е. poly(n,1/ε) \mathrm{poly}(n,1/\varepsilon)poly(n,1/ε)).
- Для других задач: PTAS, константные аппроксимации (например 0.878…0.878\ldots0.878… для Max‑Cut по Goemans–Williamson с SDP), приближения через специализированные эвристики.
Как оценивать качество эвристики/приближения:
- Аппроксимационное отношение (approximation ratio). Для задачи максимизации определить
ρ=ALGOPT, \rho=\frac{\mathrm{ALG}}{\mathrm{OPT}},
ρ=OPTALG , где ALG\mathrm{ALG}ALG — значение алгоритма, OPT\mathrm{OPT}OPT — оптимум. Алгоритм считается α\alphaα-аппроксимационным, если для всех входов ALG≥α⋅OPT\mathrm{ALG}\ge \alpha\cdot\mathrm{OPT}ALG≥α⋅OPT.
Для минимизации обычно берут ρ=OPTALG\rho=\frac{\mathrm{OPT}}{\mathrm{ALG}}ρ=ALGOPT .
- Относительная погрешность (relative gap): (OPT−ALG)/OPT(\mathrm{OPT}-\mathrm{ALG})/\mathrm{OPT}(OPT−ALG)/OPT.
- Гарантии на время: полиномиальность, зависимость от 1/ε1/\varepsilon1/ε (для FPTAS).
- Интегральный разрыв LP: насколько хороша LP‑релаксация — даёт теоретическую оценку округления.
- Эмпирическая оценка: бенчмарки, сравнение с оптимумом на малых экземплярах (или с лучшими известными решениями), статистика по набору инстансов (средняя/худшая/медианная разница), стабильность и время.
- Вероятностные гарантии: для рандомизированных алгоритмов смотреть вероятность достижения требуемого соотношения/предела.
Краткое резюме:
- NP‑полнота = принадлежность NP + полиномиальная сводимость из любой задачи NP.
- Практически для SAT→Knapsack используют серию сводимостей (SAT→3‑SAT→SUBSET‑SUM→KNAPSACK) через кодирование присваиваний в числа; Subset‑Sum легко превращается в knapsack.
- На практике применяют комбинацию жадных эвристик, локального поиска, LP‑релаксаций, метаэвристик и точных методов с отсечением; качество оценивают теоретическими гарантиями (аппрокс‑коэффициент, FPTAS/PTAS) и эмпирическими метриками (относительная ошибка, бенчмарки, время).