1. Жадный алгоритм для «Рюкзака»
с гарантированной точностью 2
Н.Н. Кузюрин С.А. Фомин
10 октября 2008 г.
1 / 10
2. Приближенный алгоритм с гарантированной точностью
Определение
Алгоритм называется C -приближенным, если при любых исходных
данных он находит допустимое решение со значением целевой
функции, отличающимся от оптимума не более чем в C раз.
2 / 10
3. Задача
«0–1 Рюкзак (Knapsack)»
Даны:
c1 , . . . , cn , cj ∈ N — «стоимости» предметов;
a1 , . . . , an , aj ∈ N — «размеры» или «веса»;
B ∈ N — «размер рюкзака».
Найти максимальное значение f ∗ целевой функции
n
f ≡ ci xi → max
i=1
с ограничением на размер «рюкзака»:
n
ai xi ≤ B, xi ∈ {0, 1}.
i=1
3 / 10
4. Тривиально-жадный алгоритм для «Рюкзака»
ci
Отсортировать предметы в порядке убывания ai .
A←0
for all i ∈ {1..n} do
if A + ai ≤ B then
A ← A + ai
xi ← 1
else
xi ← 0
end if
end for
return {x1 , . . . , xn }
Упражнение
Докажите, что ∀k > 1, ∃{ci , ai }, B для которых алгоритм выберет
набор в k раз хуже оптимального.
4 / 10
5. Тривиально-жадный алгоритм для «Рюкзака»
ci
Отсортировать предметы в порядке убывания ai .
A←0
for all i ∈ {1..n} do
if A + ai ≤ B then
A ← A + ai
xi ← 1
else
xi ← 0
end if
end for
return {x1 , . . . , xn }
Упражнение
Докажите, что ∀k > 1, ∃{ci , ai }, B для которых алгоритм выберет
набор в k раз хуже оптимального.
5 / 10
6. «Жадный-2» для «Рюкзака»
Вес рюкзака 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)]
def KnapsackGreedy (T , B) :
Берем предмет: <= ($8 , 1 кг)
T .sort (SortByConsumerAppeal)
Берем предмет: <= ($5 , 2 кг)
Cmax ← Cg ← Ag ← 0 Берем предмет: <= ($7 , 5 кг)
for (c, a) ∈ T : Cg=$20 или Cmax=$8 ?
Набран рюкзак стоимостью $20
Cmax ← max (c, Cmax)
if Ag + a ≤ B : # если лезет в рюкзак
Вес рюкзака B= 100 кг
Ag ← Ag + a # Берем предмет (c, a) Входной массив T <= [(10, 1), (150, 100), (50, 40), (40, 20)]
Cg ← Cg + c Отсортированный T => [(10, 1), (40, 20), (150, 100), (50, 40)]
Берем предмет: <= ($10 , 1 кг)
return max (Cg, Cmax) # выбираем что больше
Берем предмет: <= ($40 , 20 кг)
Берем предмет: <= ($50 , 40 кг)
Cg=$100 или Cmax=$150 ?
Набран рюкзак стоимостью $150
6 / 10