Полностью полиномиальная приближенная схема для
                  «Рюкзака»

             Н.Н. Кузюрин   С.А. Фомин



   ...
Задача о рюкзаке
Задача
«0–1 Рюкзак (Knapsack)»
Даны:
c1 , . . . , cn , cj ∈ N — «стоимости» предметов;
a1 , . . . , an , ...
Определение
Алгоритм с мультипликативной ошибкой не более (1 + ε), где ε > 0,
называется ε-оптимальным.

Определение
Полно...
Определение
Алгоритм с мультипликативной ошибкой не более (1 + ε), где ε > 0,
называется ε-оптимальным.

Определение
Полно...
«Рюкзак»: отбор легких решений
def KnapsackDynpLightest (Items, B) :
    Sols ← {0 : Solution ()}          # Хеш: цена -> ...
«Рюкзак»: отбор легких решений


              Предметы ( стоимость ): [ 6 , 3 , 2 , 5 , 7 , 1 ], B = 9
                  ...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
Лемма
Сложность алгоритма с отбором «легких» решений — O(nf ∗ ).

Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (...
«округленная» задача



         ci — Стоимости, ci = ci /scale · scale;
         ˜               ˜
         xi — Включени...
«округленная» задача



         ci — Стоимости, ci = ci /scale · scale;
         ˜               ˜
         xi — Включени...
«округленная» задача



         ci — Стоимости, ci = ci /scale · scale;
         ˜               ˜
         xi — Включени...
Решение «округленной» — аппроксимация исходной

            f ∗ : оптимум исходной задачи;
            f : стоимость аппро...
Решение «округленной» — аппроксимация исходной

            f ∗ : оптимум исходной задачи;
            f : стоимость аппро...
Решение «округленной» — аппроксимация исходной

            f ∗ : оптимум исходной задачи;
            f : стоимость аппро...
Решение «округленной» — аппроксимация исходной

            f ∗ : оптимум исходной задачи;
            f : стоимость аппро...
PTAS для рюкзака
def KnapsackFPTAS (D, B, epsilon, LowerBound) :
      Вычисляем нижнюю оценку стоимости
    F_lb ← LowerB...
Выбор flb :«MaxItemCost»


Тривиальная нижняя оценка — стоимость самого дорогого предмета:

                         flb ≡...
Выбор flb :«MaxItemCost»


Тривиальная нижняя оценка — стоимость самого дорогого предмета:

                         flb ≡...
«Жадный-2» для «Рюкзака»

                                                        Вес рюкзака B= 10 кг

                  ...
Выбор flb :«KnapsackGreedy »


Теорема
                                                                   n2
Алгоритм «Kna...
Выбор flb :«KnapsackGreedy »


Теорема
                                                                   n2
Алгоритм «Kna...
Трассировка алгоритма «KnapsackFPTAS»
Используются нижние оценки «MaxItemCost» и «KnapsackGreedy».
D = [(134, 16), (789, 2...
Карта памяти лекции




                      28 / 29
Интернет поддержка курса




http://discopal.ispras.ru/
Вопросы?



                           29 / 29
Upcoming SlideShare
Loading in …5
×

Ptas Knapsack

538 views

Published on

  • Be the first to comment

  • Be the first to like this

Ptas Knapsack

  1. 1. Полностью полиномиальная приближенная схема для «Рюкзака» Н.Н. Кузюрин С.А. Фомин 10 октября 2008 г. 1 / 29
  2. 2. Задача о рюкзаке Задача «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 2 / 29
  3. 3. Определение Алгоритм с мультипликативной ошибкой не более (1 + ε), где ε > 0, называется ε-оптимальным. Определение Полностью полиномиальной аппроксимационной схемой (FPTAS) называется приближенный алгоритм, в котором уровень точности ε выступает в качестве нового параметра, и алгоритм находит ε-оптимальное решение за время, ограниченное полиномом от длины входа и величины ε−1 . 3 / 29
  4. 4. Определение Алгоритм с мультипликативной ошибкой не более (1 + ε), где ε > 0, называется ε-оптимальным. Определение Полностью полиномиальной аппроксимационной схемой (FPTAS) называется приближенный алгоритм, в котором уровень точности ε выступает в качестве нового параметра, и алгоритм находит ε-оптимальное решение за время, ограниченное полиномом от длины входа и величины ε−1 . 4 / 29
  5. 5. «Рюкзак»: отбор легких решений 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 ∈ 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. 6. «Рюкзак»: отбор легких решений Предметы ( стоимость ): [ 6 , 3 , 2 , 5 , 7 , 1 ], B = 9 вес 3 4 5 6 5 8 Sols item newSols 0 6 0: 0 3 [6] 3 0 6 3 0: 0 , 6: 3 4 [3, 9] 4 7 0 9 3 6 2 0: 0 , 9: 7 , 3: 4 , 6: 3 5 [2, 5, 8] 5 9 8 0 2 3 5 0: 0 , 2: 5 , 3: 4 , 5: 9 , 6: 6 , 8: 8 , 9: 3 8 9 7 5 6 [5, 6 11 9 ] 0 2 3 5 0: 0 , 2: 5 , 3: 4 , 5: 6 , 6: 6 , 8: 8 , 9: 3 8 9 7 , 11: 11 9 5 7 [] 0 2 3 5 0: 0 , 2: 5 , 3: 4 , 5: 6 , 6: 6 , 8: 8 , 9: 3 8 9 7 , 11: 11 9 1 8 [1] 8 11 Оптимальное решение: 9 6 / 29
  7. 7. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 7 / 29
  8. 8. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 8 / 29
  9. 9. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 9 / 29
  10. 10. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 10 / 29
  11. 11. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 11 / 29
  12. 12. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 12 / 29
  13. 13. Лемма Сложность алгоритма с отбором «легких» решений — O(nf ∗ ). Округлим ci ← ci /scale · scale, т.е. выполнено ci ≡ 0 (mod scale): ci можно поделить на scale ⇒ это не изменит оптимального набора. nf ∗ Время работы ⇒ O( scale ). Веса ai не меняли ⇒ любое допустимое решение «округленной» допустимо для исходной. Потери «округления» ⇒ оптимум получившейся задачи будет меньше исходной. Стоит ли игра свеч? 13 / 29
  14. 14. «округленная» задача ci — Стоимости, ci = ci /scale · scale; ˜ ˜ xi — Включение предмета в оптимальный набор, xi ∈ {0, 1}; ˜ ˜ ˜ — Оптимум «округленной» задачи, f = n ci xi . f ˜ i=1 ˜ ˜ «Округление» только одного j-го предмета. ˜ xj = 1 — f ∗ − f = cj − cj ≤ scale. ˜ ˜ ˜ xj = 0 — f ∗ − f ≤ cj − cj ≤ scale. ˜ ˜ ˜ «округлять» все предметы ⇒ f ∗ − f ≤ n · scale. 14 / 29
  15. 15. «округленная» задача ci — Стоимости, ci = ci /scale · scale; ˜ ˜ xi — Включение предмета в оптимальный набор, xi ∈ {0, 1}; ˜ ˜ ˜ — Оптимум «округленной» задачи, f = n ci xi . f ˜ i=1 ˜ ˜ «Округление» только одного j-го предмета. ˜ xj = 1 — f ∗ − f = cj − cj ≤ scale. ˜ ˜ ˜ xj = 0 — f ∗ − f ≤ cj − cj ≤ scale. ˜ ˜ ˜ «округлять» все предметы ⇒ f ∗ − f ≤ n · scale. 15 / 29
  16. 16. «округленная» задача ci — Стоимости, ci = ci /scale · scale; ˜ ˜ xi — Включение предмета в оптимальный набор, xi ∈ {0, 1}; ˜ ˜ ˜ — Оптимум «округленной» задачи, f = n ci xi . f ˜ i=1 ˜ ˜ «Округление» только одного j-го предмета. ˜ xj = 1 — f ∗ − f = cj − cj ≤ scale. ˜ ˜ ˜ xj = 0 — f ∗ − f ≤ cj − cj ≤ scale. ˜ ˜ ˜ «округлять» все предметы ⇒ f ∗ − f ≤ n · scale. 16 / 29
  17. 17. Решение «округленной» — аппроксимация исходной f ∗ : оптимум исходной задачи; f : стоимость аппроксимации, f = n ci xi ≥ n ci xi = f . i=1 ˜ i=1 ˜ ˜ ˜ ˜ Абсолютная погрешность f ∗ − f ≤ f ∗ − f ≤ n · scale. ε Погрешность ≤ 1+ε f ∗ ⇒ решение — ε-приближенное: ε ∗ f∗ f ≥f∗− f = . 1+ε (1 + ε) scale → max εf ∗ scale ≤ n(1 + ε) εflb Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max 1, n(1+ε) . 17 / 29
  18. 18. Решение «округленной» — аппроксимация исходной f ∗ : оптимум исходной задачи; f : стоимость аппроксимации, f = n ci xi ≥ n ci xi = f . i=1 ˜ i=1 ˜ ˜ ˜ ˜ Абсолютная погрешность f ∗ − f ≤ f ∗ − f ≤ n · scale. ε Погрешность ≤ 1+ε f ∗ ⇒ решение — ε-приближенное: ε ∗ f∗ f ≥f∗− f = . 1+ε (1 + ε) scale → max εf ∗ scale ≤ n(1 + ε) εflb Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max 1, n(1+ε) . 18 / 29
  19. 19. Решение «округленной» — аппроксимация исходной f ∗ : оптимум исходной задачи; f : стоимость аппроксимации, f = n ci xi ≥ n ci xi = f . i=1 ˜ i=1 ˜ ˜ ˜ ˜ Абсолютная погрешность f ∗ − f ≤ f ∗ − f ≤ n · scale. ε Погрешность ≤ 1+ε f ∗ ⇒ решение — ε-приближенное: ε ∗ f∗ f ≥f∗− f = . 1+ε (1 + ε) scale → max εf ∗ scale ≤ n(1 + ε) εflb Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max 1, n(1+ε) . 19 / 29
  20. 20. Решение «округленной» — аппроксимация исходной f ∗ : оптимум исходной задачи; f : стоимость аппроксимации, f = n ci xi ≥ n ci xi = f . i=1 ˜ i=1 ˜ ˜ ˜ ˜ Абсолютная погрешность f ∗ − f ≤ f ∗ − f ≤ n · scale. ε Погрешность ≤ 1+ε f ∗ ⇒ решение — ε-приближенное: ε ∗ f∗ f ≥f∗− f = . 1+ε (1 + ε) scale → max εf ∗ scale ≤ n(1 + ε) εflb Нижняя оценка оптимума flb ≤ f ∗ ⇒ scale = max 1, n(1+ε) . 20 / 29
  21. 21. 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
  22. 22. Выбор flb :«MaxItemCost» Тривиальная нижняя оценка — стоимость самого дорогого предмета: flb ≡ cmax = max ci . i Сложность «KnapsackFPTASMaxItemCost »: nf n · ncmax O ≤O = scale scale n · ncmax n3 (1 + ε) n3 =O cmax ε =O =O . n(1+ε) ε ε 22 / 29
  23. 23. Выбор flb :«MaxItemCost» Тривиальная нижняя оценка — стоимость самого дорогого предмета: flb ≡ cmax = max ci . i Сложность «KnapsackFPTASMaxItemCost »: nf n · ncmax O ≤O = scale scale n · ncmax n3 (1 + ε) n3 =O cmax ε =O =O . n(1+ε) ε ε 23 / 29
  24. 24. «Жадный-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 24 / 29
  25. 25. Выбор flb :«KnapsackGreedy » Теорема n2 Алгоритм «KnapsackFPTASKnapsackGreedy » имеет сложность O ε . Доказательство. Используя f ≤ f ∗ ≤ 2fG : nf n·f 2n2 (1 + ε) n2 O =O ε·fG ≤O =O . scale ε ε n(1+ε) 25 / 29
  26. 26. Выбор flb :«KnapsackGreedy » Теорема n2 Алгоритм «KnapsackFPTASKnapsackGreedy » имеет сложность O ε . Доказательство. Используя f ≤ f ∗ ≤ 2fG : nf n·f 2n2 (1 + ε) n2 O =O ε·fG ≤O =O . scale ε ε n(1+ε) 26 / 29
  27. 27. Трассировка алгоритма «KnapsackFPTAS» Используются нижние оценки «MaxItemCost» и «KnapsackGreedy». D = [(134, 16), (789, 250), (56, 43), (345, 333), (4567, 857), (555, 47)] B = 1000 Optimal Knapsack: [0, 2, 4, 5] costs 5312 LowerBound= <function MaxItemCost at 0x00C55DB0> => F_lb= 4567 eps = 0.1 => scale = 69.196969697 Ds = [(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= 5312 eps = 0.1 => scale = 80.4848484848 Ds = [(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= 5312 eps = 0.06 => scale = 50.1132075472 Ds = [(2, 16), (15, 250), (1, 43), (6, 333), (91, 857), (11, 47)] Approx. knapsack: [0, 2, 4, 5] costs 5312 27 / 29
  28. 28. Карта памяти лекции 28 / 29
  29. 29. Интернет поддержка курса http://discopal.ispras.ru/ Вопросы? 29 / 29

×