Приведите пример контрпримера, где жадный алгоритм для задачи коммивояжёра или рюкзака даёт существенно худшее решение, и объясните, почему требуется динамическое программирование или другие подходы
TSP (жадный nearest‑neighbor). Контрпример (можно сделать отношение сколь угодно большим). Пусть города: центр CCC и листья L1,…,LkL_1,\dots,L_kL1,…,Lk. Расстояния задаём d(C,Li)=1,d(Li,Lj)=M(i≠j),
d(C,L_i)=1,\qquad d(L_i,L_j)=M\quad(i\ne j), d(C,Li)=1,d(Li,Lj)=M(i=j),
где M≫1M\gg 1M≫1. Начинаем в CCC. Алгоритм «ближайший сосед» из CCC идёт в какой‑то LiL_iLi (стоимость 111), из LiL_iLi ближайший — обратно CCC (стоимость 111), затем в следующий лист и т.д. Получаем тур стоимостью примерно 2k2k2k. Но можно сконструировать оптимальный тур, который посещает листья в другом порядке и делает один длинный переход вместо многих (в не‑метрическом варианте можно сделать оптимум порядка M+kM+kM+k малым по отношению к жадному, или наоборот — подобрать параметры, чтобы жадный был хуже в O(M)O(M)O(M) раз). Это показывает, что локально минимальный выбор («самый близкий город сейчас») может привести к обязательному очень дорогому ребру позже — жадность не учитывает глобальную структуру. 0/1‑рюкзак (жадный по плотности value/weight). Классический простой контрпример: вместимость W=10W=10W=10. Товары: - AAA: вес 666, ценность 313131 (плотность 31/6≈5.16731/6\approx5.16731/6≈5.167); - BBB, CCC: по весу 555, ценности 252525 (плотность 25/5=525/5=525/5=5). Жадный по плотности возьмёт сначала AAA (самая большая плотность), после этого остаётся место 444 — ни BBB, ни CCC уже не поместятся, итоговая ценность 313131. Но оптимум — взять товары BBB и CCC (вместимость 5+5=105+5=105+5=10), ценность 25+25=5025+25=5025+25=50. Отношение 31/5031/5031/50 существенно хуже. Можно варьировать числа, чтобы разрыв был ещё больше. Почему требуется ДП или другие методы: - Жадные правила принимают локально оптимальное решение (например, наибольшая плотность или ближайший сосед), но задачи TSP и 0/1‑рюкзак имеют «глобальные» ограничения: выбор сейчас влияет на доступность хороших вариантов позже. - Динамическое программирование эксплуатирует принцип оптимальности Беллмана: оптимальный ответ для всей задачи строится из оптимальных ответов для подзадач (пересекающиеся подзадачи + оптимальная подструктура). Для рюкзака ДП по весу/предметам даёт точный оптимум за псевдополиномиальное время O(nW)O(nW)O(nW). Для TSP точный алгоритм (Held–Karp) использует ДП по подмножествам и вершине за O(n22n)O(n^2 2^n)O(n22n). - Для приближённых алгоритмов применяют: для TSP — специальные эвристики и приближённые алгоритмы (например, для метрического TSP есть 2‑приближение через минимальное остовное дерево и обход), для рюкзака — FPTAS (сжатие ценностей) даёт приближение 1−ε1-\varepsilon1−ε за полиномиальное время в nnn и 1/ε1/\varepsilon1/ε. Вывод: жадный подход прост и часто эффективен, но для задач с глобальными ограничениями (TSP, 0/1‑рюкзак) он может давать существенно худшие решения; для гарантированно хорошего (или точного) результата нужны ДП или более сложные алгоритмы/эвристики с доказанными оценками.
d(C,Li)=1,d(Li,Lj)=M(i≠j), d(C,L_i)=1,\qquad d(L_i,L_j)=M\quad(i\ne j),
d(C,Li )=1,d(Li ,Lj )=M(i=j), где M≫1M\gg 1M≫1. Начинаем в CCC. Алгоритм «ближайший сосед» из CCC идёт в какой‑то LiL_iLi (стоимость 111), из LiL_iLi ближайший — обратно CCC (стоимость 111), затем в следующий лист и т.д. Получаем тур стоимостью примерно 2k2k2k. Но можно сконструировать оптимальный тур, который посещает листья в другом порядке и делает один длинный переход вместо многих (в не‑метрическом варианте можно сделать оптимум порядка M+kM+kM+k малым по отношению к жадному, или наоборот — подобрать параметры, чтобы жадный был хуже в O(M)O(M)O(M) раз). Это показывает, что локально минимальный выбор («самый близкий город сейчас») может привести к обязательному очень дорогому ребру позже — жадность не учитывает глобальную структуру.
0/1‑рюкзак (жадный по плотности value/weight). Классический простой контрпример:
вместимость W=10W=10W=10. Товары:
- AAA: вес 666, ценность 313131 (плотность 31/6≈5.16731/6\approx5.16731/6≈5.167);
- BBB, CCC: по весу 555, ценности 252525 (плотность 25/5=525/5=525/5=5).
Жадный по плотности возьмёт сначала AAA (самая большая плотность), после этого остаётся место 444 — ни BBB, ни CCC уже не поместятся, итоговая ценность 313131. Но оптимум — взять товары BBB и CCC (вместимость 5+5=105+5=105+5=10), ценность 25+25=5025+25=5025+25=50. Отношение 31/5031/5031/50 существенно хуже. Можно варьировать числа, чтобы разрыв был ещё больше.
Почему требуется ДП или другие методы:
- Жадные правила принимают локально оптимальное решение (например, наибольшая плотность или ближайший сосед), но задачи TSP и 0/1‑рюкзак имеют «глобальные» ограничения: выбор сейчас влияет на доступность хороших вариантов позже.
- Динамическое программирование эксплуатирует принцип оптимальности Беллмана: оптимальный ответ для всей задачи строится из оптимальных ответов для подзадач (пересекающиеся подзадачи + оптимальная подструктура). Для рюкзака ДП по весу/предметам даёт точный оптимум за псевдополиномиальное время O(nW)O(nW)O(nW). Для TSP точный алгоритм (Held–Karp) использует ДП по подмножествам и вершине за O(n22n)O(n^2 2^n)O(n22n).
- Для приближённых алгоритмов применяют: для TSP — специальные эвристики и приближённые алгоритмы (например, для метрического TSP есть 2‑приближение через минимальное остовное дерево и обход), для рюкзака — FPTAS (сжатие ценностей) даёт приближение 1−ε1-\varepsilon1−ε за полиномиальное время в nnn и 1/ε1/\varepsilon1/ε.
Вывод: жадный подход прост и часто эффективен, но для задач с глобальными ограничениями (TSP, 0/1‑рюкзак) он может давать существенно худшие решения; для гарантированно хорошего (или точного) результата нужны ДП или более сложные алгоритмы/эвристики с доказанными оценками.