Задача о рюкзаке — это следующая задача комбинаторной оптимизации :
Свое название он получил от проблемы, с которой сталкивается человек, ограниченный рюкзаком фиксированного размера , и должен наполнить его наиболее ценными предметами. Проблема часто возникает при распределении ресурсов , когда лицам, принимающим решения, приходится выбирать из набора неделимых проектов или задач в рамках фиксированного бюджета или временных ограничений соответственно.
Задача о рюкзаке изучается уже более века, первые работы датируются 1897 годом. [1]
Задачи о рюкзаке возникают в реальных процессах принятия решений в самых разных областях, таких как поиск наименее затратного способа добычи сырья, [2] выбор инвестиций и портфелей , [3] выбор активов для секьюритизации, обеспеченной активами , [4] и генерация ключей для криптосистемы Меркла–Хеллмана [5] и других криптосистем с ранцем .
Одним из ранних применений алгоритмов ранца было построение и оценка тестов, в которых у испытуемых есть выбор, на какие вопросы отвечать. Для небольших примеров довольно просто предоставить испытуемым такой выбор. Например, если экзамен содержит 12 вопросов, каждый из которых оценивается в 10 баллов, испытуемому нужно ответить только на 10 вопросов, чтобы набрать максимально возможный балл в 100 баллов. Однако на тестах с неоднородным распределением значений баллов предоставить выбор сложнее. Фейерман и Вайс предложили систему, в которой студентам дается неоднородный тест с общим количеством баллов в 125. Студентов просят ответить на все вопросы в меру своих возможностей. Из возможных подмножеств задач, общее количество баллов которых в сумме составляет 100, алгоритм ранца определит, какое подмножество даст каждому студенту наивысший возможный балл. [6]
Исследование, проведенное в 1999 году в репозитории алгоритмов Университета Стоуни-Брук, показало, что из 75 алгоритмических задач, относящихся к области комбинаторных алгоритмов и разработки алгоритмов, задача о рюкзаке была 19-й по популярности и третьей по востребованности после суффиксных деревьев и задачи об упаковке в контейнеры . [7]
Наиболее распространенной решаемой проблемой является задача о рюкзаке 0-1 , которая ограничивает количество копий каждого вида предметов нулем или одним. Дан набор предметов, пронумерованных от 1 до , каждый из которых имеет вес и ценность , а также максимальную грузоподъемность ,
Здесь представляет собой количество экземпляров предмета , которые следует включить в рюкзак. Неформально, задача состоит в том, чтобы максимизировать сумму значений предметов в рюкзаке так, чтобы сумма весов была меньше или равна вместимости рюкзака.
Задача о рюкзаке с ограничением ( BKP ) снимает ограничение, что существует только один экземпляр каждого предмета, но ограничивает количество копий каждого вида предметов максимальным неотрицательным целым значением :
Задача о неограниченном рюкзаке ( UKP ) не устанавливает верхней границы для количества копий каждого вида предметов и может быть сформулирована так же, как и выше, за исключением того, что единственным ограничением является то, что это должно быть неотрицательное целое число.
Один из примеров задачи о неограниченном рюкзаке приведен с использованием рисунка, показанного в начале статьи, и текста «если доступно любое количество каждой книги» в подписи к этому рисунку.
Задача о рюкзаке интересна с точки зрения информатики по многим причинам:
Существует связь между проблемами «решения» и «оптимизации» в том, что если существует полиномиальный алгоритм, который решает проблему «решения», то можно найти максимальное значение для проблемы оптимизации за полиномиальное время, применяя этот алгоритм итеративно, увеличивая значение k. С другой стороны, если алгоритм находит оптимальное значение проблемы оптимизации за полиномиальное время, то проблему решения можно решить за полиномиальное время, сравнивая значение решения, выдаваемого этим алгоритмом, со значением k. Таким образом, обе версии проблемы имеют схожую сложность.
Одной из тем в исследовательской литературе является определение того, как выглядят «трудные» примеры задачи о рюкзаке, [8] [9] или, с другой стороны, определение того, какие свойства примеров на практике могут сделать их более податливыми, чем предполагает их наихудшее NP-полное поведение. [10] Целью поиска этих «трудных» примеров является их использование в системах криптографии с открытым ключом , таких как криптосистема рюкзака Меркла–Хеллмана . В более общем плане, лучшее понимание структуры пространства примеров задачи оптимизации помогает продвинуться в изучении конкретной проблемы и может улучшить выбор алгоритма.
Кроме того, примечателен тот факт, что сложность задачи о рюкзаке зависит от формы входных данных. Если веса и прибыли заданы как целые числа, она является слабо NP-полной , в то время как она является сильно NP-полной , если веса и прибыли заданы как рациональные числа. [11] Однако в случае рациональных весов и прибылей она все еще допускает полностью полиномиальную схему аппроксимации .
NP-трудность задачи о ранце относится к вычислительным моделям, в которых размер целых чисел имеет значение (например, машина Тьюринга ). Напротив, деревья решений считают каждое решение одним шагом. Добкин и Липтон [12] показывают нижнюю границу для линейных деревьев решений для задачи о ранце, то есть деревьев, где узлы решений проверяют знак аффинных функций . [13] Это было обобщено на алгебраические деревья решений Стилом и Яо. [14] Если элементы в задаче являются действительными числами или рациональными числами , нижняя граница дерева решений распространяется на модель реальной машины с произвольным доступом с набором инструкций, который включает сложение, вычитание и умножение действительных чисел, а также сравнение и либо деление, либо получение остатка («пол»). [15] Эта модель охватывает больше алгоритмов, чем модель алгебраического дерева решений, поскольку она охватывает алгоритмы, которые используют индексацию в таблицах. Однако в этой модели учитываются все шаги программы, а не только решения. Верхняя граница для модели дерева решений была дана Мейером ауф дер Хайде [16] , который показал, что для каждого n существует линейное дерево решений глубиной O ( n 4 ) , которое решает задачу подмножества-суммы с n элементами. Обратите внимание, что это не подразумевает никакой верхней границы для алгоритма, который должен решать задачу для любого заданного n .
Существует несколько алгоритмов для решения задач о рюкзаке, основанных на подходе динамического программирования [17] , подходе ветвей и границ [18] или гибридизации обоих подходов. [10] [19] [20] [21]
Неограниченная задача о рюкзаке ( UKP ) не накладывает ограничений на количество копий каждого вида предметов. Кроме того, здесь мы предполагаем, что
Обратите внимание, что имеет следующие свойства:
1. (сумма нулевых элементов, т.е. суммирование пустого множества).
2. , , где - стоимость -го вида предмета.
Второе свойство необходимо подробно объяснить. Как мы получаем вес в процессе выполнения этого метода ? Есть только способы, и предыдущие веса там, где есть общие виды различных элементов (говоря «различные», мы имеем в виду, что вес и значение не полностью совпадают). Если мы знаем каждое значение этих элементов и соответствующее максимальное значение ранее, мы просто сравниваем их друг с другом и в конечном итоге получаем максимальное значение, и мы закончили.
Здесь максимум пустого множества принимается равным нулю. Табулирование результатов от вверх до дает решение. Поскольку вычисление каждого включает проверку большинства элементов, и существует не более значений для вычисления, время выполнения решения динамического программирования составляет . Деление на их наибольший общий делитель является способом улучшения времени выполнения.
Даже если P≠NP , сложность не противоречит тому факту, что задача о ранце является NP-полной , поскольку , в отличие от , не является полиномиальной по длине входа в задачу. Длина входа в задачу пропорциональна количеству бит в , , а не самой себе. Однако, поскольку это время выполнения является псевдополиномиальным , это делает (версию решения) задачи о ранце слабо NP-полной задачей .
Аналогичное решение динамического программирования для задачи о рюкзаке 0-1 также выполняется за псевдополиномиальное время. Предположим, что являются строго положительными целыми числами. Определим как максимальное значение, которого можно достичь с весом, меньшим или равным, используя элементы вплоть до (первые элементы).
Мы можем определить рекурсивно следующим образом: (Определение A)
Решение затем можно найти, вычислив . Чтобы сделать это эффективно, мы можем использовать таблицу для хранения предыдущих вычислений.
Ниже приведен псевдокод динамической программы:
// Вход:// Значения (хранятся в массиве v)// Веса (хранятся в массиве w)// Количество отдельных элементов (n)// Емкость рюкзака (Вт)// ПРИМЕЧАНИЕ: Предполагается, что массив «v» и массив «w» хранят все соответствующие значения, начиная с индекса 1.массив m [ 0. . n , 0. . W ]; для j от 0 до W сделать : м [ 0 , j ] := 0 для i от 1 до n сделать : м [ я , 0 ] := 0 для i от 1 до n сделать : для j от 1 до W сделать : если w [ i ] > j тогда : m [ i , j ] := m [ i -1 , j ] еще : m [ i , j ] := max ( m [ i -1 , j ], m [ i -1 , j - w [ i ]] + v [ i ])
Следовательно, это решение будет выполняться во времени и пространстве. (Если нам нужно только значение m[n,W], мы можем изменить код так, чтобы требуемый объем памяти составлял O(W), что позволяет хранить две последние строки массива «m».)
Однако если мы сделаем шаг или два дальше, мы должны знать, что метод будет работать в промежутке времени между и . Из определения A мы знаем, что нет необходимости вычислять все веса, когда количество элементов и сами элементы, которые мы выбрали, фиксированы. То есть, программа выше вычисляет больше, чем необходимо, потому что вес часто меняется от 0 до W. С этой точки зрения мы можем запрограммировать этот метод так, чтобы он работал рекурсивно.
// Вход:// Значения (хранятся в массиве v)// Веса (хранятся в массиве w)// Количество отдельных элементов (n)// Емкость рюкзака (Вт)// ПРИМЕЧАНИЕ: Предполагается, что массив «v» и массив «w» хранят все соответствующие значения, начиная с индекса 1.Определить значение [ n , W ] Инициализируем все значения [ i , j ] = -1 Определить m := ( i , j ) // Определить функцию m так, чтобы она представляла максимальное значение, которое мы можем получить при условии: использовать первые i элементов, общий предел веса равен j { если i == 0 или j <= 0, то : значение [ i , j ] = 0 возвращаться если ( значение [ i -1 , j ] == -1 ) тогда : // m[i-1, j] не было вычислено, мы должны вызвать функцию m м ( я -1 , j ) если w [ i ] > j тогда : // предмет не может поместиться в сумку значение [ i , j ] = значение [ i -1 , j ] еще : если ( значение [ i -1 , j - w [ i ]] == -1 ) тогда : // m[i-1,jw[i]] не было вычислено, мы должны вызвать функцию m м ( я -1 , дж - ш [ я ]) значение [ i , j ] = макс ( значение [ i -1 , j ], значение [ i -1 , j - w [ i ]] + v [ i ]) }Выполнить m ( n , W )
Например, есть 10 различных предметов, а предел веса составляет 67. Таким образом, если вы используете описанный выше метод для вычисления , вы получите это, за исключением вызовов, которые производят :
Кроме того, мы можем разорвать рекурсию и преобразовать ее в дерево. Затем мы можем отрезать некоторые листья и использовать параллельные вычисления для ускорения выполнения этого метода.
Чтобы найти фактическое подмножество элементов, а не только их общую стоимость, мы можем выполнить это после запуска функции выше:
/*** Возвращает индексы предметов оптимального рюкзака.* i: Мы можем включить предметы с 1 по i в рюкзак* j: максимальный вес рюкзака*/функция рюкзак ( i : int , j : int ) : Установить <int> { если я == 0 тогда : возвращаться {} если m [ i , j ] > m [ i -1 , j ] тогда : возврат { i } ∪ рюкзак ( i -1 , j - w [ i ]) еще : возвратный рюкзак ( i -1 , j ) }рюкзак ( н , В )
Другой алгоритм для ранца 0-1, открытый в 1974 году [22] и иногда называемый «встреча посередине» из-за параллелей с одноименным алгоритмом в криптографии , является экспоненциальным по количеству различных элементов, но может быть предпочтительнее алгоритма DP, когда велико по сравнению с n . В частности, если являются неотрицательными, но не целыми числами, мы все равно могли бы использовать алгоритм динамического программирования, масштабируя и округляя (т. е. используя арифметику с фиксированной точкой ), но если задача требует дробных цифр точности для получения правильного ответа, необходимо будет масштабировать на , и алгоритм DP потребует пространства и времени.
Алгоритм « Встреча посередине» имеет входные данные: набор элементов с весами и значениями. Выходные данные: наибольшее объединенное значение подмножества. разбить множество {1... n } на два множества A и B приблизительно равного размера вычислить веса и значения всех подмножеств каждого множества для каждого подмножества A найдите подмножество B с наибольшим значением , такое, чтобы общий вес был меньше W отслеживать наибольшее совокупное значение, которое наблюдалось на данный момент
Алгоритм занимает место, и эффективные реализации шага 3 (например, сортировка подмножеств B по весу, отбрасывание подмножеств B, которые весят больше, чем другие подмножества B с большим или равным значением, и использование бинарного поиска для поиска наилучшего соответствия) приводят к времени выполнения . Как и в случае с атакой meet in the middle в криптографии, это улучшает время выполнения наивного подхода грубой силы (исследование всех подмножеств ), за счет использования экспоненциального, а не постоянного пространства (см. также baby-step giant-step ). Текущее усовершенствование алгоритма meet-in-the-middle, использующее идеи из алгоритма Шреппеля и Шамира для суммы подмножества, предоставляет в качестве следствия рандомизированный алгоритм для Knapsack, который сохраняет (с точностью до полиномиальных множителей) время выполнения и снижает требования к пространству до (см. [23] Следствие 1.4). Напротив, самый известный детерминированный алгоритм работает со временем с немного худшей пространственной сложностью . [24]
Что касается большинства NP-полных задач, может быть достаточно найти работающие решения, даже если они не оптимальны. Предпочтительно, однако, чтобы приближение сопровождалось гарантией разницы между значением найденного решения и значением оптимального решения.
Как и в случае со многими полезными, но вычислительно сложными алгоритмами, были проведены существенные исследования по созданию и анализу алгоритмов, которые приближают решение. Задача о ранце, хотя и NP-Hard, является одним из набора алгоритмов, которые все еще могут быть приближены к любой указанной степени. Это означает, что задача имеет схему приближения за полиномиальное время. Если быть точным, задача о ранце имеет полностью полиномиальную схему приближения за полиномиальное время (FPTAS). [25]
Джордж Данциг предложил жадный алгоритм приближения для решения задачи о неограниченном рюкзаке. [26] Его версия сортирует предметы в порядке убывания стоимости на единицу веса, . Затем он приступает к их помещению в мешок, начиная с максимально возможного количества копий первого вида предметов, пока в мешке не останется места для большего количества. При условии, что существует неограниченный запас каждого вида предметов, если — максимальная стоимость предметов, которые помещаются в мешок, то жадный алгоритм гарантированно достигнет по крайней мере значения .
Для ограниченной задачи, где предложение каждого вида предметов ограничено, приведенный выше алгоритм может быть далек от оптимального. Тем не менее, простая модификация позволяет нам решить этот случай: предположим для простоты, что все предметы по отдельности помещаются в мешок ( для всех ). Постройте решение, жадно упаковывая предметы как можно дольше, т.е. где . Кроме того, постройте второе решение, содержащее первый предмет, который не поместился. Поскольку обеспечивает верхнюю границу для релаксации LP задачи, один из наборов должен иметь значение не менее ; таким образом, мы возвращаем то из и имеет лучшее значение, чтобы получить -приближение.
Можно показать, что средняя производительность сходится к оптимальному решению по распределению с частотой ошибок [27]
Полностью полиномиальная схема аппроксимации времени (FPTAS) для задачи о рюкзаке использует тот факт, что причина, по которой задача не имеет известных полиномиальных решений, заключается в том, что прибыль, связанная с предметами, не ограничена. Если округлить некоторые из наименее значимых цифр значений прибыли, то они будут ограничены полиномом и 1/ε, где ε — это граница правильности решения. Это ограничение означает, что алгоритм может найти решение за полиномиальное время, которое будет правильным в пределах множителя (1-ε) от оптимального решения. [25]
на вход алгоритма FPTAS : ε ∈ (0,1] список A из n элементов, указанных их значениями, и весами вывода: S' решение FPTAS P := max // наибольшее значение элемента К := ε для i от 1 до n сделать := конец для вернуть решение S', используя значения в динамической программе, описанной выше
Теорема: Множество, вычисленное с помощью приведенного выше алгоритма, удовлетворяет , где — оптимальное решение.
Квантовый приближенный алгоритм оптимизации (QAOA) может быть использован для решения задачи о ранце с использованием квантовых вычислений путем минимизации гамильтониана задачи. Гамильтониан ранца строится путем вложения условия ограничения в функцию стоимости задачи со штрафным членом. [28] где — константа штрафа, которая определяется путем тонкой настройки для конкретного случая.
Решение задачи о неограниченном рюкзаке можно упростить, выбросив предметы, которые никогда не понадобятся. Для заданного предмета , предположим, мы смогли найти набор предметов, такой, что их общий вес меньше веса , а их общая стоимость больше стоимости . Тогда не может появиться в оптимальном решении, поскольку мы всегда можем улучшить любое потенциальное решение, содержащее , заменив его на набор . Поэтому мы можем вообще проигнорировать -й предмет. В таких случаях говорят, что доминирует . (Обратите внимание, что это не относится к задачам о ограниченном рюкзаке, поскольку мы, возможно, уже израсходовали предметы в .)
Нахождение отношений доминирования позволяет нам значительно сократить размер пространства поиска. Существует несколько различных типов отношений доминирования, [10] которые все удовлетворяют неравенству вида:
, а для некоторых
где и . Вектор обозначает количество копий каждого члена .
Существует множество вариаций задачи о рюкзаке, которые возникли из огромного количества приложений базовой задачи. Основные вариации происходят путем изменения числа некоторых параметров задачи, таких как число предметов, число целей или даже число рюкзаков.
Это изменение меняет цель человека, заполняющего рюкзак. Вместо одной цели, такой как максимизация денежной прибыли, цель может иметь несколько измерений. Например, могут быть экологические или социальные проблемы, а также экономические цели. Часто решаемые проблемы включают оптимизацию портфеля и транспортной логистики. [29] [30]
В качестве примера предположим, что вы управляете круизным лайнером. Вам нужно решить, сколько известных комиков нанять. Это судно может вместить не более одной тонны пассажиров, а артисты должны весить менее 1000 фунтов. Каждый комик имеет вес, приносит бизнес в зависимости от своей популярности и просит определенную зарплату. В этом примере у вас есть несколько целей. Конечно, вы хотите максимизировать популярность ваших артистов, минимизируя их зарплаты. Кроме того, вы хотите иметь как можно больше артистов.
В этом варианте вес предмета рюкзака задается D-мерным вектором , а рюкзак имеет D-мерный вектор вместимости . Цель состоит в том, чтобы максимизировать сумму значений предметов в рюкзаке так, чтобы сумма весов в каждом измерении не превышала .
Многомерный рюкзак вычислительно сложнее, чем рюкзак; даже для задача не имеет EPTAS , если только P NP. [31] Однако показано, что алгоритм в [32] эффективно решает разреженные экземпляры. Экземпляр многомерного рюкзака является разреженным, если существует набор для такой, что для каждого элемента рюкзака , такой, что и . Такие экземпляры возникают, например, при планировании пакетов в беспроводной сети с ретрансляционными узлами. [32] Алгоритм из [32] также решает разреженные экземпляры варианта с множественным выбором, многомерного рюкзака с множественным выбором.
Алгоритм IHS (Increising Height Shelf) оптимален для 2D-рюкзака (упаковки квадратов в двумерный квадрат единичного размера): когда в оптимальной упаковке содержится не более пяти квадратов. [33]
Эта вариация похожа на задачу упаковки контейнеров . Она отличается от задачи упаковки контейнеров тем, что можно выбрать подмножество элементов, тогда как в задаче упаковки контейнеров все элементы должны быть упакованы в определенные контейнеры. Идея заключается в том, что есть несколько рюкзаков. Это может показаться тривиальным изменением, но это не эквивалентно увеличению емкости исходного рюкзака. Эта вариация используется во многих задачах загрузки и планирования в исследовании операций и имеет схему аппроксимации с полиномиальным временем . [34]
Квадратичная задача о рюкзаке максимизирует квадратичную целевую функцию с учетом бинарных и линейных ограничений по емкости. [35] Задача была представлена Галло, Хаммером и Симеоне в 1980 году, [36] однако первое рассмотрение задачи относится к Вицгаллу в 1975 году. [37]
Задача о сумме подмножества является частным случаем задач о решении и 0-1, где каждый вид элемента, вес равен значению: . В области криптографии термин задача о ранце часто используется для обозначения именно задачи о сумме подмножества. Задача о сумме подмножества является одной из 21 NP-полных задач Карпа . [38]
Обобщение проблемы суммы подмножества называется проблемой суммы множественного подмножества, в которой существует несколько ячеек с одинаковой емкостью. Было показано, что обобщение не имеет FPTAS . [ 39]
В геометрической задаче о рюкзаке есть набор прямоугольников с различными значениями и прямоугольный рюкзак. Цель состоит в том, чтобы упаковать наибольшее возможное значение в рюкзак. [40]