SlideShare ist ein Scribd-Unternehmen logo
1 von 14
Downloaden Sie, um offline zu lesen
Динамическое программирование для «Рюкзака»

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



               10 октября 2008 г.




                                        1 / 14
Задача
«Сумма размеров» («Рюкзак-выполнимость»)
Даны:
a1 , . . . , an , aj ∈ N — «размеры» или «веса»;
     B ∈ N — «размер рюкзака».
Cуществует ли решение уравнения:
                        n
                             ai xi = B,   xi ∈ {0, 1}.
                       i=1




                                                         2 / 14
Суммы размеров: динамическое программирование

                                       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
Полиномиальность vs. Псевдополиномиальность



Упражнение
Рассмотрим модификацию задачи «Сумма размеров», разрешим
даже отрицательные размеры. Формально: Даны целые числа
ai , ∀i ∈ [1 . . . n] − n2 ≤ ai ≤ n2 , и число B. Рассмотрим задачу
«Существует ли решение в 0-1 переменных (x1 , . . . , xn ) уравнения
    n
    i=1 ai xi = B?»
Существует ли полиномиальный алгоритм для этой задачи?




                                                                 4 / 14
Задача
«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
«Рюкзак»: динамическое программирование
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
«Рюкзак»: динамическое программирование

              Предметы ( стоимость ): [ 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
Полиномиальность vs. Псевдополиномиальность
Лемма
Сложность алгоритма с отбором «дорогих» решений — O(nB).

Упражнение
Придумайте входные наборы для этого алгоритма, на которых он
будет работать экспоненциальное время.

Упражнение
Постройте алгоритм динамического программирования для
задачи «Knapsack», основанный на отборе наиболее «легких»
частичных решений.
    Какова будет его временная сложность?
    Придумайте входные наборы для этого алгоритма, на которых он
    будет работать экспоненциальное время.

                                                            8 / 14
«Рюкзак»: отбор легких решений

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
«Рюкзак»: отбор легких решений


              Предметы ( стоимость ): [ 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
Парето-оптимальные решения



Определение
Подмножество предметов для задачи «Knapsack» доминирует над
другим таким подмножеством, если стоимость первого набора
предметов больше, а вес — меньше или равен весу второго набора.

Т.е. набор доминирующих подмножеств есть набор
Парето-оптимальных решений, т.е. таких решений, в которых нельзя
улучшить один параметр (стоимость), без ухудшения другого
параметра (увеличения веса).




                                                          11 / 14
Алгоритм Немхаузера–Ульмана
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 / 14
Интернет поддержка курса




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



                           14 / 14

Weitere ähnliche Inhalte

Andere mochten auch

Amplifying Reduction Non Approx
Amplifying Reduction Non ApproxAmplifying Reduction Non Approx
Amplifying Reduction Non ApproxStas Fomin
 
Randomized Rounding
Randomized RoundingRandomized Rounding
Randomized RoundingStas Fomin
 
Greedy Knapsack
Greedy KnapsackGreedy Knapsack
Greedy KnapsackStas Fomin
 
average-knapsack.beam.pdf
average-knapsack.beam.pdfaverage-knapsack.beam.pdf
average-knapsack.beam.pdfStas Fomin
 
testopia-missing-link
testopia-missing-linktestopia-missing-link
testopia-missing-linkStas Fomin
 
Probabilistically Checkable Proofs
Probabilistically Checkable ProofsProbabilistically Checkable Proofs
Probabilistically Checkable ProofsStas Fomin
 
A commutative model composition operator to support software adaptation
A commutative model composition operator to support software adaptationA commutative model composition operator to support software adaptation
A commutative model composition operator to support software adaptationSébastien Mosser
 

Andere mochten auch (9)

Amplifying Reduction Non Approx
Amplifying Reduction Non ApproxAmplifying Reduction Non Approx
Amplifying Reduction Non Approx
 
Randomized Rounding
Randomized RoundingRandomized Rounding
Randomized Rounding
 
Greedy Knapsack
Greedy KnapsackGreedy Knapsack
Greedy Knapsack
 
Dnf Counting
Dnf CountingDnf Counting
Dnf Counting
 
average-knapsack.beam.pdf
average-knapsack.beam.pdfaverage-knapsack.beam.pdf
average-knapsack.beam.pdf
 
testopia-missing-link
testopia-missing-linktestopia-missing-link
testopia-missing-link
 
Probabilistically Checkable Proofs
Probabilistically Checkable ProofsProbabilistically Checkable Proofs
Probabilistically Checkable Proofs
 
A commutative model composition operator to support software adaptation
A commutative model composition operator to support software adaptationA commutative model composition operator to support software adaptation
A commutative model composition operator to support software adaptation
 
Intro Erevan
Intro ErevanIntro Erevan
Intro Erevan
 

Mehr von Stas Fomin

Levenstein distance.beam
Levenstein distance.beamLevenstein distance.beam
Levenstein distance.beamStas Fomin
 
«Собор или базар»: системы контроля версий — централизованные или распределен...
«Собор или базар»: системы контроля версий — централизованные или распределен...«Собор или базар»: системы контроля версий — централизованные или распределен...
«Собор или базар»: системы контроля версий — централизованные или распределен...Stas Fomin
 
Какой у вас Agile: свежевыжатый или порошковый?
Какой у вас Agile: свежевыжатый или порошковый?Какой у вас Agile: свежевыжатый или порошковый?
Какой у вас Agile: свежевыжатый или порошковый?Stas Fomin
 
Mindmaps: история и идеология
Mindmaps: история и идеологияMindmaps: история и идеология
Mindmaps: история и идеологияStas Fomin
 
Теория ограничений и Линейное программирование
Теория ограничений и Линейное программированиеТеория ограничений и Линейное программирование
Теория ограничений и Линейное программированиеStas Fomin
 
Введение в Subversion
Введение в SubversionВведение в Subversion
Введение в SubversionStas Fomin
 
Fake Flash Drives from TopKeen
Fake Flash Drives from TopKeenFake Flash Drives from TopKeen
Fake Flash Drives from TopKeenStas Fomin
 
Randomized Complexity
Randomized ComplexityRandomized Complexity
Randomized ComplexityStas Fomin
 
P Reducibility And Npc
P Reducibility And NpcP Reducibility And Npc
P Reducibility And NpcStas Fomin
 
Packing Average
Packing AveragePacking Average
Packing AverageStas Fomin
 
Obfuscation Curstate Review
Obfuscation Curstate ReviewObfuscation Curstate Review
Obfuscation Curstate ReviewStas Fomin
 
Maximal Independent Set
Maximal Independent SetMaximal Independent Set
Maximal Independent SetStas Fomin
 
Max Cut Semidefinite
Max Cut SemidefiniteMax Cut Semidefinite
Max Cut SemidefiniteStas Fomin
 
Intro And Samples
Intro And SamplesIntro And Samples
Intro And SamplesStas Fomin
 
Greedy Covering Almost Ok
Greedy Covering Almost OkGreedy Covering Almost Ok
Greedy Covering Almost OkStas Fomin
 
Greedy Covering
Greedy CoveringGreedy Covering
Greedy CoveringStas Fomin
 
Derandomization Maxsat
Derandomization MaxsatDerandomization Maxsat
Derandomization MaxsatStas Fomin
 
Derandomization Luby
Derandomization LubyDerandomization Luby
Derandomization LubyStas Fomin
 

Mehr von Stas Fomin (20)

Levenstein distance.beam
Levenstein distance.beamLevenstein distance.beam
Levenstein distance.beam
 
«Собор или базар»: системы контроля версий — централизованные или распределен...
«Собор или базар»: системы контроля версий — централизованные или распределен...«Собор или базар»: системы контроля версий — централизованные или распределен...
«Собор или базар»: системы контроля версий — централизованные или распределен...
 
Какой у вас Agile: свежевыжатый или порошковый?
Какой у вас Agile: свежевыжатый или порошковый?Какой у вас Agile: свежевыжатый или порошковый?
Какой у вас Agile: свежевыжатый или порошковый?
 
Mindmaps: история и идеология
Mindmaps: история и идеологияMindmaps: история и идеология
Mindmaps: история и идеология
 
Теория ограничений и Линейное программирование
Теория ограничений и Линейное программированиеТеория ограничений и Линейное программирование
Теория ограничений и Линейное программирование
 
Введение в Subversion
Введение в SubversionВведение в Subversion
Введение в Subversion
 
Fake Flash Drives from TopKeen
Fake Flash Drives from TopKeenFake Flash Drives from TopKeen
Fake Flash Drives from TopKeen
 
Randomized Complexity
Randomized ComplexityRandomized Complexity
Randomized Complexity
 
P Reducibility And Npc
P Reducibility And NpcP Reducibility And Npc
P Reducibility And Npc
 
Packing Average
Packing AveragePacking Average
Packing Average
 
Obfuscation Curstate Review
Obfuscation Curstate ReviewObfuscation Curstate Review
Obfuscation Curstate Review
 
Maximal Independent Set
Maximal Independent SetMaximal Independent Set
Maximal Independent Set
 
Max Cut Semidefinite
Max Cut SemidefiniteMax Cut Semidefinite
Max Cut Semidefinite
 
Intro And Samples
Intro And SamplesIntro And Samples
Intro And Samples
 
Greedy Covering Almost Ok
Greedy Covering Almost OkGreedy Covering Almost Ok
Greedy Covering Almost Ok
 
Greedy Covering
Greedy CoveringGreedy Covering
Greedy Covering
 
Sat Average
Sat AverageSat Average
Sat Average
 
Derandomization Maxsat
Derandomization MaxsatDerandomization Maxsat
Derandomization Maxsat
 
Derandomization Luby
Derandomization LubyDerandomization Luby
Derandomization Luby
 
Christofides
ChristofidesChristofides
Christofides
 

Dynamic Programming Knapsack

  • 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