
- •Предисловие
- •Введение
- •Алгоритмы и их сложность
- •Примеры задач и алгоритмов
- •Задачи на графах: «Коммивояжер», «Кратчайшие пути», «Остовные деревья»
- •Приближенные алгоритмы: «Составление расписаний»
- •«Сортировка слиянием»
- •«Быстрая сортировка»
- •Формально об алгоритмах. Несложно о сложности
- •«RAM»: машины с произвольным доступом
- •Сложность в худшем случае
- •Сложность в среднем
- •Полиномиальные алгоритмы
- •Полиномиальность и эффективность
- •Аппроксимация с гарантированной точностью
- •Алгоритмы с оценками точности
- •Жадные алгоритмы для «Покрытия множеств»
- •Приближенные алгоритмы для «Вершинного покрытия»
- •Жадный алгоритм для «Рюкзака»
- •Алгоритм Кристофидеса
- •Аппроксимация с заданной точностью
- •«Рюкзак»: динамическое программирование
- •Полностью полиномиальная приближенная схема для «Рюкзака»
- •Вероятностный анализ детерминированных алгоритмов
- •Сложность и полиномиальность в среднем
- •Задача упаковки
- •Выполнимость КНФ
- •Точность алгоритма для почти всех входов
- •«Рюкзак»: полиномиальность в среднем
- •Вероятностные алгоритмы и их анализ
- •Вероятностная проверка тождеств
- •Максимальное по включению независимое множество в графе
- •Протокол византийского соглашения
- •Вероятностное округление
- •Максимальный разрез в графе
- •Методы дерандомизации
- •Метод условных вероятностей
- •Метод малых вероятностных пространств
- •Полиномиальная проверка простоты
- •Основы теории сложности вычислений
- •Сложность вычислений
- •Машины Тьюринга и вычислимость
- •Сводимость по Куку
- •Недетерминированные алгоритмы
- •Сводимость по Карпу
- •Вероятностные вычисления
- •Вероятностно проверяемые доказательства
- •Схемы и схемная сложность
- •Коммуникационная сложность
- •Диаграмма классов сложности
- •Приложения
- •Введение в Python
- •Глоссарий
- •Предметный указатель
- •Список алгоритмов

88 |
Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
2.1.3Жадный алгоритм для «Рюкзака»
Жадный алгоритм для задачи о рюкзаке с гарантированной точностью 2.
Как мы уже отмечали, жадные эвристики являются простейшими и самыми популярными методами решения различных вычислительно трудных задач. Посмотрим, что эта эвристика может дать для задачи о рюкзаке.
Рассмотрим следующую задачу.
Задача 13. «0–1 Рюкзак (Knapsack)»
Даны:
c1; : : : ; cn, cj 2 N — «стоимости» предметов;
a1; : : : ; an, aj 2 N — «размеры» или «веса»;
B 2 N — «размер рюкзака».
Найти максимальное значение f целевой функции
∑n
f cixi ! max
i=1
с ограничением на размер «рюкзака»:
∑n
aixi B; xi 2 f0; 1g:
i=1

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
89 |
Содержательно задача означает выбор предметов с наибольшей суммарной стоимостью, умещающихся в рюкзак заданного размера. Эта задача часто возникает при выборе оптимального управления в различных экономико-финансовых областях (распределение бюджета отдела по проектам и т. п.).
Рассмотрим, какого результата можно добиться, используя, как в разделе 2.1.1, «жадный подход». Первая идея, которая обычно возникает при знакомстве с этой задачей, это выбирать предметы по
убыванию их относительной стоимости, помещая в рюкзак все, что помещается (см. алгоритм 18). К сожалению, о качестве эвристики алгоритма 18 ничего хорошего утверждать нельзя.
Упражнение 2.1.10. Докажите, что для любого числа k можно представить входной набор данных, для которых алгоритм 18 выберет набор, который в k раз хуже оптимального.
Понятно, что проблема состоит в том, что «польстившись» на первый небольшой, но «относительно дорогой» предмет, алгоритм рискует пропустить большой и ценный предмет из оптимального набора.
Оказывается, гарантированное качество работы этой эвристики можно улучшить, если после окончания ее работы сравнить стоимость полученного допустимого решения с максимальным коэффициентом cmax и в соответствии с максимумом выбрать либо «жадное решение», либо один предмет с максимальной стоимостью (мы считаем, что размеры всех предметов не превосходят размер рюкзака — в противном случае их просто можно исключить из рассмотрения).
Получится так называемый модифицированный жадный алгоритм (см. алгоритм 19 «Рюкзак-Жад- ный»), для которого уже можно гарантировать качество найденного решения.
Теорема 4. Для значения решения fG, полученного модифицированным жадным алгоритмом 19 «Рюк- зак-Жадный», и оптимального значения f для задачи 13 «Knapsack» выполняется
f
2 fG:

90 |
Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ |
Алгоритм 18 Жадный алгоритм для задачи 13 «Knapsack»
def usefullness((c, a)): return a*1.0/c
def KnapsackGreedy(T, B): T.sort(key=usefullness) Cg = Ag = 0
for c, a in T:
# если лезет в рюкзак if Ag + a <= B:
# берем предмет (c,a)
Ag = Ag + a
Cg = Cg + c return Cg
Вес рюкзака B= 10 кг
Входной массив T <= [(3, 6), (4, 3), (5, 2), (6, 5), (7, 5), (8, 1)]
Отсортированный T => [(8, 1), (5, 2), (7, 5), (4, 3), (6, 5), (3, 6)]
Берем предмет: <= ($8 , 1 кг)
Берем предмет: <= ($5 , 2 кг)
Берем предмет: <= ($7 , 5 кг)
Набран рюкзак стоимостью $20

2.1. АЛГОРИТМЫ С ОЦЕНКАМИ ТОЧНОСТИ |
91 |
Алгоритм 19 «Модифицированный жадный» для «Рюкзака»
def knapsack_greedy(T, B): |
Вес рюкзака B= 10 кг |
|
|
|
T.sort(key=usefullness) |
Входной массив T <= [(3, 6), (4, 3), (5, 2), (6, 5), (7, 5), (8, 1)] |
|||
Cmax = Cg = Ag = 0 |
Отсортированный T => [(8, 1), (5, 2), (7, 5), (4, 3), (6, 5), (3, 6)] |
|||
|
||||
for c, a in T: |
Берем предмет: <= ($8 , 1 кг) |
|||
Берем предмет: <= ($5 , 2 кг) |
||||
if a <= B: |
||||
Берем предмет: <= ($7 , 5 кг) |
||||
Cmax = max(c, Cmax) |
Cg=$20 или Cmax=$8 ? |
|
|
|
# если лезет в рюкзак |
Набран рюкзак стоимостью |
$20 |
|
|
if Ag + a <= B: |
Вес рюкзака B= 100 кг |
|
|
|
# берем предмет (c,a) |
|
|
||
Ag = Ag + a |
Входной массив T <= [(10, 1), (170, 100), (50, 40), (40, 20)] |
|||
Отсортированный T => [(10, 1), (40, 20), (170, 100), (50, 40)] |
||||
Cg = Cg + c |
||||
Берем предмет: <= ($10 |
, 1 кг) |
|||
#выбираем, что больше |
Берем предмет: <= ($40 |
, 20 кг) |
||
return max(Cg, Cmax) |
Берем предмет: <= ($50 |
, 40 кг) |
||
|
||||
|
Cg=$100 или Cmax=$170 ? |
|
|
|
|
Набран рюкзак стоимостью |
$170 |
|
|
|
|
|
|

92 Глава 2. АППРОКСИМАЦИЯ С ГАРАНТИРОВАННОЙ ТОЧНОСТЬЮ
Доказательство. Обозначим набор предметов, выбранных жадным алгоритмом 19 «Рюкзак-Жадный»,
через , а стоимость этого набора через . Рассмотрим набор ~ , полученный жадным алгоритмом,
Sg Cg Sg
которому разрешено (после того, как рюкзак будет заполнен) взять еще один предмет, и обозначим его
~ |
~ ci (см. рис. 2.6). |
|
|
|
|
|
|
стоимость Cg = |
|
|
|
|
|
||
|
i2Sg |
|
|
|
|
|
|
по определению C~ |
|
C + c |
max |
. С другой стороны, C~ |
|
f . Чтобы убедиться в этом, |
|
Заметим, что∑ |
g |
g |
g |
|
заметим, что любой предмет (обозначим его индекс через p) из оптимального набора или содержится
~ |
|
|
|
~ |
в Sg, или его относительная стоимость не превышает относительной стоимости любого предмета из Sg: |
||||
|
cp |
|
ci |
~ |
|
ap |
|
ai |
8i 2 Sg: |
Принимая во внимание, что стоимость равна площади, из рисунка 2.6 мы видим, что высота любого
~ |
~ |
|
|
предмета вне набора Sg не больше высоты предметов в наборе Sg. Добавление более «низких» прямо- |
|||
|
|
|
~ |
угольников из оптимального набора вместо каких-либо прямоугольников из Sg может только уменьшить |
|||
суммарную площадь, т. е. стоимость. Поэтому C~g f . Отсюда следует: |
|
|
|
~ |
f |
|
; |
Cg + cmax Cg |
|
||
2fG 2 max(Cg; cmax) Cg + cmax |
f : |
Откуда:
f fG 2 :