ptas knapsack
Post on 27-Jun-2015
285 Views
Preview:
TRANSCRIPT
Полностью полиномиальная приближенная схема для«Рюкзака»
Н.Н. Кузюрин С.А. Фомин
10 октября 2008 г.
1 / 29
Задача о рюкзакеЗадача
«0–1 Рюкзак (Knapsack)»Даны:c1, . . . , cn, cj ∈ N — «стоимости» предметов;a1, . . . , an, aj ∈ N — «размеры» или «веса»;
B ∈ N — «размер рюкзака».Найти максимальное значение f ∗ целевой функции
f ≡n∑
i=1
cixi → max
с ограничением на размер «рюкзака»:
n∑i=1
aixi ≤ B, xi ∈ {0, 1}.
2 / 29
ОпределениеАлгоритм с мультипликативной ошибкой не более (1 + ε), где ε > 0,называется ε-оптимальным.
Определение
Полностью полиномиальной аппроксимационной схемой(FPTAS) называется приближенный алгоритм, в котором уровеньточности ε выступает в качестве нового параметра, и алгоритмнаходит ε-оптимальное решение за время, ограниченное полиномом отдлины входа и величины ε−1.
3 / 29
ОпределениеАлгоритм с мультипликативной ошибкой не более (1 + ε), где ε > 0,называется ε-оптимальным.
Определение
Полностью полиномиальной аппроксимационной схемой(FPTAS) называется приближенный алгоритм, в котором уровеньточности ε выступает в качестве нового параметра, и алгоритмнаходит ε-оптимальное решение за время, ограниченное полиномом отдлины входа и величины ε−1.
4 / 29
«Рюкзак»: отбор легких решений
def KnapsackDynpLightest (Items, B) :
Sols← {0: Solution ()} # Хеш: цена -> самый легкий набор
for item ∈ Items : # Цикл по всем предметам — O(n)
newSols← [ ]
for sol ∈ Sols.values () : # по всем частичным — O(f ∗)Try← sol + item # формируем новый набор
if Try.weight ≤ B : # лезет в рюкзак?
if Try.cost 6∈ Sols ∨ Try.weight < Sols[Try.cost].weight :
newSols.append (Try) # подходит!
for sol ∈ newSols : # регистрируем новые решения
Sols[sol.cost]← sol
return Sols[max (Sols.keys ())] # возвращаем самое дорогое
5 / 29
«Рюкзак»: отбор легких решений
Предметы (стоимостьвес ): [6
3, 3
4, 2
5, 5
6, 5
7, 1
8], B = 9
Sols item newSols
0: 00
63
[63]
0: 00, 6: 6
334
[34, 9
7]
0: 00, 9: 9
7, 3: 3
4, 6: 6
325
[25, 5
9, 8
8]
0: 00, 2: 2
5, 3: 3
4, 5: 5
9, 6: 6
3, 8: 8
8, 9: 9
756
[56, 11
9]
0: 00, 2: 2
5, 3: 3
4, 5: 5
6, 6: 6
3, 8: 8
8, 9: 9
7, 11: 11
957
[]
0: 00, 2: 2
5, 3: 3
4, 5: 5
6, 6: 6
3, 8: 8
8, 9: 9
7, 11: 11
918
[18]
Оптимальное решение: 119
6 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
7 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
8 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
9 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
10 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
11 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
12 / 29
ЛеммаСложность алгоритма с отбором «легких» решений — O(nf ∗).
Округлим ci ← bci/scalec · scale, т.е. выполнено ci ≡ 0 (mod scale):ci можно поделить на scale ⇒ это не изменит оптимальногонабора.Время работы ⇒ O( nf ∗
scale ).Веса ai не меняли ⇒ любое допустимое решение «округленной»допустимо для исходной.Потери «округления» ⇒ оптимум получившейся задачи будетменьше исходной.
Стоит ли игра свеч?
13 / 29
«округленная» задача
c̃i — Стоимости, c̃i = bci/scalec · scale;x̃i — Включение предмета в оптимальный набор, x̃i ∈ {0, 1};f̃ — Оптимум «округленной» задачи, f̃ =
∑ni=1 c̃i x̃i .
«Округление» только одного j-го предмета.x̃j = 1 — f ∗ − f̃ = cj − c̃j ≤ scale.x̃j = 0 — f ∗ − f̃ ≤ cj − c̃j ≤ scale.
«округлять» все предметы ⇒ f ∗ − f̃ ≤ n · scale.
14 / 29
«округленная» задача
c̃i — Стоимости, c̃i = bci/scalec · scale;x̃i — Включение предмета в оптимальный набор, x̃i ∈ {0, 1};f̃ — Оптимум «округленной» задачи, f̃ =
∑ni=1 c̃i x̃i .
«Округление» только одного j-го предмета.x̃j = 1 — f ∗ − f̃ = cj − c̃j ≤ scale.x̃j = 0 — f ∗ − f̃ ≤ cj − c̃j ≤ scale.
«округлять» все предметы ⇒ f ∗ − f̃ ≤ n · scale.
15 / 29
«округленная» задача
c̃i — Стоимости, c̃i = bci/scalec · scale;x̃i — Включение предмета в оптимальный набор, x̃i ∈ {0, 1};f̃ — Оптимум «округленной» задачи, f̃ =
∑ni=1 c̃i x̃i .
«Округление» только одного j-го предмета.x̃j = 1 — f ∗ − f̃ = cj − c̃j ≤ scale.x̃j = 0 — f ∗ − f̃ ≤ cj − c̃j ≤ scale.
«округлять» все предметы ⇒ f ∗ − f̃ ≤ n · scale.
16 / 29
Решение «округленной» — аппроксимация исходной
f ∗: оптимум исходной задачи;f ′: стоимость аппроксимации,f ′ =
∑ni=1 ci x̃i ≥
∑ni=1 c̃i x̃i = f̃ .
Абсолютная погрешность f ∗ − f ′ ≤ f ∗ − f̃ ≤ n · scale.Погрешность ≤ ε
1+ε f∗ ⇒ решение — ε-приближенное:
f ′ ≥ f ∗ − ε
1 + εf ∗ =
f ∗
(1 + ε).
scale → max
scale ≤ εf ∗
n(1 + ε)
Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max{
1, εflbn(1+ε)
}.
17 / 29
Решение «округленной» — аппроксимация исходной
f ∗: оптимум исходной задачи;f ′: стоимость аппроксимации,f ′ =
∑ni=1 ci x̃i ≥
∑ni=1 c̃i x̃i = f̃ .
Абсолютная погрешность f ∗ − f ′ ≤ f ∗ − f̃ ≤ n · scale.Погрешность ≤ ε
1+ε f∗ ⇒ решение — ε-приближенное:
f ′ ≥ f ∗ − ε
1 + εf ∗ =
f ∗
(1 + ε).
scale → max
scale ≤ εf ∗
n(1 + ε)
Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max{
1, εflbn(1+ε)
}.
18 / 29
Решение «округленной» — аппроксимация исходной
f ∗: оптимум исходной задачи;f ′: стоимость аппроксимации,f ′ =
∑ni=1 ci x̃i ≥
∑ni=1 c̃i x̃i = f̃ .
Абсолютная погрешность f ∗ − f ′ ≤ f ∗ − f̃ ≤ n · scale.Погрешность ≤ ε
1+ε f∗ ⇒ решение — ε-приближенное:
f ′ ≥ f ∗ − ε
1 + εf ∗ =
f ∗
(1 + ε).
scale → max
scale ≤ εf ∗
n(1 + ε)
Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max{
1, εflbn(1+ε)
}.
19 / 29
Решение «округленной» — аппроксимация исходной
f ∗: оптимум исходной задачи;f ′: стоимость аппроксимации,f ′ =
∑ni=1 ci x̃i ≥
∑ni=1 c̃i x̃i = f̃ .
Абсолютная погрешность f ∗ − f ′ ≤ f ∗ − f̃ ≤ n · scale.Погрешность ≤ ε
1+ε f∗ ⇒ решение — ε-приближенное:
f ′ ≥ f ∗ − ε
1 + εf ∗ =
f ∗
(1 + ε).
scale → max
scale ≤ εf ∗
n(1 + ε)
Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max{
1, εflbn(1+ε)
}.
20 / 29
PTAS для рюкзака
def KnapsackFPTAS (D, B , epsilon, LowerBound) :
Вычисляем нижнюю оценку стоимостиF_lb← LowerBound (copy (D), B)
параметр округления scale
scale← epsilon ∗ F_lb/len (D)/(1 + epsilon)
Набор c округленными стоимостямиDs← [(int (floor (c/scale)), a) for c , a ∈ D]
knapset← KnapsackDynpLightest (Ds, B)
ApproxCost← 0
for i ∈ knapset :ApproxCost← ApproxCost + D[i ][0]
21 / 29
Выбор flb:«MaxItemCost»
Тривиальная нижняя оценка — стоимость самого дорогого предмета:
flb ≡ cmax = maxi
ci .
Сложность «KnapsackFPTASMaxItemCost»:
O
(nf ′
scale
)≤ O
(n · ncmax
scale
)=
= O
(n · ncmax
cmaxεn(1+ε)
)= O
(n3(1 + ε)
ε
)= O
(n3
ε
).
22 / 29
Выбор flb:«MaxItemCost»
Тривиальная нижняя оценка — стоимость самого дорогого предмета:
flb ≡ cmax = maxi
ci .
Сложность «KnapsackFPTASMaxItemCost»:
O
(nf ′
scale
)≤ O
(n · ncmax
scale
)=
= O
(n · ncmax
cmaxεn(1+ε)
)= O
(n3(1 + ε)
ε
)= O
(n3
ε
).
23 / 29
«Жадный-2» для «Рюкзака»
def KnapsackGreedy (T , B) :
T .sort (SortByConsumerAppeal)
Cmax← Cg← Ag← 0
for (c, a) ∈ T :
Cmax← max (c, Cmax)
if Ag + a ≤ B : # если лезет в рюкзак
Ag← Ag + a # Берем предмет (c, a)
Cg← Cg + c
return max (Cg, Cmax) # выбираем что больше
Вес рюкзака 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 кг)
Cg=$20 или Cmax=$8 ?
Набран рюкзак стоимостью $20
Вес рюкзака B= 100 кг
Входной массив T <= [(10, 1), (150, 100), (50, 40), (40, 20)]
Отсортированный T => [(10, 1), (40, 20), (150, 100), (50, 40)]
Берем предмет: <= ($10 , 1 кг)
Берем предмет: <= ($40 , 20 кг)
Берем предмет: <= ($50 , 40 кг)
Cg=$100 или Cmax=$150 ?
Набран рюкзак стоимостью $150
24 / 29
Выбор flb:«KnapsackGreedy»
Теорема
Алгоритм «KnapsackFPTASKnapsackGreedy» имеет сложность O(
n2
ε
).
Доказательство.Используя f ′ ≤ f ∗ ≤ 2fG :
O
(nf ′
scale
)= O
(n · f ′ε·fG
n(1+ε)
)≤ O
(2n2(1 + ε)
ε
)= O
(n2
ε
).
25 / 29
Выбор flb:«KnapsackGreedy»
Теорема
Алгоритм «KnapsackFPTASKnapsackGreedy» имеет сложность O(
n2
ε
).
Доказательство.Используя f ′ ≤ f ∗ ≤ 2fG :
O
(nf ′
scale
)= O
(n · f ′ε·fG
n(1+ε)
)≤ O
(2n2(1 + ε)
ε
)= O
(n2
ε
).
26 / 29
Трассировка алгоритма «KnapsackFPTAS»Используются нижние оценки «MaxItemCost» и «KnapsackGreedy».D = [(134, 16), (789, 250), (56, 43), (345, 333), (4567, 857), (555, 47)]B = 1000Optimal Knapsack: [0, 2, 4, 5] costs 5312
LowerBound= <function MaxItemCost at 0x00C55DB0> => F_lb= 4567eps = 0.1 => scale = 69.196969697Ds = [(1, 16), (11, 250), (0, 43), (4, 333), (66, 857), (8, 47)]Approx. knapsack: [0, 4, 5] costs 5256
LowerBound= <function KnapsackGreedy at 0x00C55D30> => F_lb= 5312eps = 0.1 => scale = 80.4848484848Ds = [(1, 16), (9, 250), (0, 43), (4, 333), (56, 857), (6, 47)]Approx. knapsack: [0, 4, 5] costs 5256
LowerBound= <function KnapsackGreedy at 0x00C55D30> => F_lb= 5312eps = 0.06 => scale = 50.1132075472Ds = [(2, 16), (15, 250), (1, 43), (6, 333), (91, 857), (11, 47)]Approx. knapsack: [0, 2, 4, 5] costs 5312
27 / 29
�Карта памяти� лекции
28 / 29
top related