Проблема з ранцем - NP-комплект незважаючи на динамічне рішення програмування?


50

Проблеми з рюкзаком легко вирішуються за допомогою динамічного програмування. Динамічне програмування працює в поліномічний час; тому ми це робимо, правда?

Я читав, що це насправді NP-повна проблема, хоча це означатиме, що вирішити проблему в поліноміальній задачі, ймовірно, неможливо.

Де моя помилка?


5
Майте на увазі, що DP є многочленом "розміру таблиці". Таблиця експоненціально велика для Рюкзака (див. Відповідь Каве).
Рафаель

Відповіді:


40

Проблема з рюкзаком - коли числа задаються у вигляді двійкових чисел. У цьому випадку динамічне програмування зробить експоненціально багато кроків (у розмірі вводу, тобто кількості бітів на вході), щоб закінчити .NP-complete

З іншого боку, якщо цифри на вході задані не одинаковими, динамічне програмування буде працювати в поліноміальний час (за розміром введення).

Цей вид проблем називається слабоNP-complete .

: Ще одним хорошим прикладом для розуміння важливості кодування, що використовується для введення, є розгляд звичайних алгоритмів, щоб дізнатись, чи є число простим, яке переходить від до і перевірити, чи хтось із них ділить . Це многочлен у але не обов'язково у вхідному розмірі. Якщо задано у двійковій формі, розмір вводу дорівнює і алгоритм працює у часі який є експоненціальним у вхідному розмірі. І звичайна обчислювальна складність проблеми - wrt розмір вводу.2nnnnlgnO(n)=O(2lgn/2)

Цей вид алгоритму, тобто поліном у найбільшій кількості, що є частиною вхідних даних, але експоненціальний у вхідній довжині називається псевдополіномом .


Але подумайте про предмети, які потрібно покласти в рюкзак. Об'єкти потрібно вводити, і такий вхід повинен бути многочленом з кількістю об'єктів. Якщо об’єктів достатньо багато, то вхід є многочленом із розміром задачі. То чому я не можу сказати, що проблема "Рюкзак" - це проблема P з точки зору розміру таблиці? Я помиляюся?
Стрин

@Strin, ні, невелика кількість предметів може бути достатньою, щоб відчути великий рюкзак, наприклад, якщо розмір Рюкзака становить , одного об'єкта розміром достатньо. Розмір вводу приблизно , набагато менший за . (Я припускаю, що ми говоримо про Рюкзак 0-1.)mm2lgmm
Kaveh

Чи можете ви розбити вхід на менші входи, чиє двійкове кодування має розмір, який закінчує алгоритм у поліноміальний час, а потім поєднувати рішення?
Char

@Kaveh "Розмір вводу приблизно 2 lg m" Я не розумію, звідки ви отримуєте цю частину. Зв'язок між m(розміром упаковки) та n(кількістю предметів) абсолютно невідомий, правда? І знову "коли числа даються як двійкові числа" ... але чи не могли ви цього сказати? З більшістю алгоритмів ми говоримо про розмір вводу в базі 10. Чому тут говорять про двійкові? І чи кодуєте ви в двійковій, восьмеричній, десятковій і т. Д ... actualкількість разів, яку ви повторюєте через основний цикл алгоритму, безпосередньо залежить від обох nі W.
The111

1
@ The111, я думаю, що краще, якщо ви опублікуєте це як нове запитання, і я опублікую відповідь. Я думаю, що ваше питання є більш фундаментальним, і там коментарі не дуже пов'язані з цим питанням.
Каве

33

Основна плутанина полягає в різниці між " розміром " і " значенням ".

" Поліномний час " передбачає поліном wrt розмір вводу.

" Псевдополіномічний час " має на увазі поліноміальне wrt значення вводу. Можна показати (нижче), що це еквівалентно розміру вхідного wrt .


Іншими словами: Нехай представляє розмір вхідного сигналу, а являє собою значення вводу.NsizeNval

Поліном час: дляO(Nsizex)xN

Псевдополія. Час: дляO(Nvalx)xN

Тепер проблема з рюкзаком має рішення псевдополіномічного, а не поліноміального , оскільки рішення динамічного програмування дає час роботи залежно від значення - тобто , де - значення, що представляє максимальну потужність.O(nW)W

Тепер значення можна перетворити у розмір , представивши його у вигляді # цифр, необхідних для його представлення. вказує, скільки цифр потрібно для представлення за допомогою бази . Це може бути вирішено для щоб отримати:Nsize=Logb(Nval)NvalbNval

Nval=bNsize

Підключення цього до визначення псевдополіномічного часу показує, що це експоненціальна wrt :Nsize

Псевдополія. Час: дляb , x NO(bxNsize)b,xN


7
Створили тут рахунок, щоб сказати велике спасибі! Лише після вашого прикладу я остаточно зрозумів це.
Інорія

2
Ваша відповідь б'є всіх, браво!
Мухаммед Разіб

1
Щоб додати до цієї чудової відповіді, ми можемо сказати, що якщо ми змінимо W з 100 на 101, розмір проблеми не збільшиться, розмір збільшується, якщо ми додамо ще один біт до W, що робить його вдвічі більшим, тому таблиця буде мають удвічі більше рядків, і тому при збільшенні розміру на одиницю час задачі збільшується вдвічі, тому це експоненціально.
Амінь

@bcorso Припустимо, вам присвоєно значення N. І вам довелося знайти суму чисел від 1 до N, і ви використовували метод for циклу, це був би алгоритм часу псевдополінома?
DollarAkshay

8

Проблема " Рюкзак", як визначено у статті Карпа, є NP-Complete, оскільки з іншого завдання NPC (в даному випадку точне покриття) є зменшенням до Knapsack. Це означає, що не існує поліноміального алгоритму, який би міг вирішити всі екземпляри проблеми Knapsack, якщо тільки .P=NP

Однак існують різні варіанти (наприклад, 0-1 Рюкзак та інші ), які можуть мати або не мати поліноміально-часових рішень або хороших наближень. Але це не те саме, що загальна проблема з Рюкзаком. Також можуть бути ефективні алгоритми, які працюють для конкретних (сімейств) екземплярів , але в інших випадках цей алгоритм займе більше часу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.