Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Book-advanced-algorithms.pdf
Скачиваний:
298
Добавлен:
27.03.2016
Размер:
5.11 Mб
Скачать

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 :

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]