Your SlideShare is downloading. ×
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Dynamic Programming Knapsack
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Dynamic Programming Knapsack

803

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
803
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
14
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Динамическое программирование для «Рюкзака» Н.Н. Кузюрин С.А. Фомин 10 октября 2008 г. 1 / 14
  • 2. Задача «Сумма размеров» («Рюкзак-выполнимость») Даны: a1 , . . . , an , aj ∈ N — «размеры» или «веса»; B ∈ N — «размер рюкзака». Cуществует ли решение уравнения: n ai xi = B, xi ∈ {0, 1}. i=1 2 / 14
  • 3. Суммы размеров: динамическое программирование A = [1, 3, 4, 7, 6] B = 10 def KnapsackSat (A, B) : + 1 --> [0, 1] T ← [0] + 3 --> [0, 1, 3, 4] for a ∈ A : + 4 --> [0, 1, 3, 4, 5, 7, 8] news ← [ ] + 7 --> [0, 1, 3, 4, 5, 7, 8, 10] for x ∈ T : + 6 --> [0, 1, 3, 4, 5, 7, 8, 10, 6, 9] Solution exists new ← x + a if new ≤ B ∧ new ∈ T : A = [2, 4, 6, 8] B = 9 news.append (new) + 2 --> [0, 2] T ← T + news + 4 --> [0, 2, 4, 6] + 6 --> [0, 2, 4, 6, 8] + 8 --> [0, 2, 4, 6, 8] if B ∈ T : No solution print quot;Solution existsquot; Сложность — O(nB). 3 / 14
  • 4. Полиномиальность vs. Псевдополиномиальность Упражнение Рассмотрим модификацию задачи «Сумма размеров», разрешим даже отрицательные размеры. Формально: Даны целые числа ai , ∀i ∈ [1 . . . n] − n2 ≤ ai ≤ n2 , и число B. Рассмотрим задачу «Существует ли решение в 0-1 переменных (x1 , . . . , xn ) уравнения n i=1 ai xi = B?» Существует ли полиномиальный алгоритм для этой задачи? 4 / 14
  • 5. Задача «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 5 / 14
  • 6. «Рюкзак»: динамическое программирование def KnapsackDynP (Items, B) : Sols ← {0 : Solution ()} # Хеш: вес-> самый дорогой набор for item ∈ Items : # Цикл по всем предметам — O(n) newSols ← [ ] for sol ∈ Sols.values () : # по всем частичным — O(B) Try ← sol + item # формируем новый набор if Try.weight ≤ B : # лезет в рюкзак? if Try.weight ∈ Sols ∨ Try.cost > Sols[Try.weight].cost : newSols.append (Try) # подходит! for sol ∈ newSols : # регистрируем новые решения Sols[sol.weight] ← sol result ← Solution () for sol ∈ Sols.values () : # ищем самое дорогое решение if sol.cost > result.cost : # не обязательно самое тяжелое result ← sol return result, len (Sols) 6 / 14
  • 7. «Рюкзак»: динамическое программирование Предметы ( стоимость ): [ 6 , 3 , 5 , 5 , 7 , 1 ], B = 9 вес 3 4 2 6 5 8 Sols item newSols 0 6 6 0: 0 3 [3] 0 6 3 0: 0, 3: 3 4 [4, 9] 3 7 0 6 3 9 2 0: 0, 3: 3, 4: 4 , 7: 7 5 [5, 8, 5] 2 8 9 0 6 3 2 0: 0, 3: 3, 4: 4 , 5: 5, 7: 9 , 8: 8 , 9: 8 7 5 9 5 6 5 [6, 11 9 ] 0 6 3 2 0: 0, 3: 3, 4: 4 , 5: 5, 6: 5 , 7: 7 , 8: 9 6 8 8, 9: 11 9 5 7 [] 0 6 3 2 0: 0, 3: 3, 4: 4 , 5: 5, 6: 5 , 7: 7 , 8: 9 6 8 8, 9: 11 9 1 8 [] 11 Оптимальное решение: 9 7 / 14
  • 8. Полиномиальность vs. Псевдополиномиальность Лемма Сложность алгоритма с отбором «дорогих» решений — O(nB). Упражнение Придумайте входные наборы для этого алгоритма, на которых он будет работать экспоненциальное время. Упражнение Постройте алгоритм динамического программирования для задачи «Knapsack», основанный на отборе наиболее «легких» частичных решений. Какова будет его временная сложность? Придумайте входные наборы для этого алгоритма, на которых он будет работать экспоненциальное время. 8 / 14
  • 9. «Рюкзак»: отбор легких решений 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 ())] # возвращаем самое дорогое 9 / 14
  • 10. «Рюкзак»: отбор легких решений Предметы ( стоимость ): [ 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 10 / 14
  • 11. Парето-оптимальные решения Определение Подмножество предметов для задачи «Knapsack» доминирует над другим таким подмножеством, если стоимость первого набора предметов больше, а вес — меньше или равен весу второго набора. Т.е. набор доминирующих подмножеств есть набор Парето-оптимальных решений, т.е. таких решений, в которых нельзя улучшить один параметр (стоимость), без ухудшения другого параметра (увеличения веса). 11 / 14
  • 12. Алгоритм Немхаузера–Ульмана def KnapsackNemhauserUllman (Items, B) : ParetoS ← [Solution ()] # Парето-оптимальные по весу for item ∈ Items : newSolutions ← [ ] for solution ∈ ParetoS : if solution.weight + item.weight ≤ B : newSolutions.append (solution + item) mergedSolution ← mergeSolutions (ParetoS, newSolutions) ParetoS ← mergedSolution return ParetoS[−1], len (ParetoS) 12 / 14
  • 13. Алгоритм Немхаузера–Ульмана Упражнение Придумайте входные наборы для алгоритма Немхаузера–Ульмана, на которых он будет работать экспоненциальное время. Заметим, что практика использования показала, что на реальных данных алгоритм Немхаузера–Ульмана работает достаточно хорошо (см. тему «Полиномиальный в среднем алгоритм для задачи о рюкзаке»). 13 / 14
  • 14. Интернет поддержка курса http://discopal.ispras.ru/ Вопросы? 14 / 14

×