Открыть сервис

Задача о рюкзаке

Задача о рюкзаке (англ. Knapsack problem) — это задача комбинаторной оптимизации, заключающаяся в выборе подмножества предметов с заданными весами и стоимостями таким образом, чтобы общий вес не превышал заданной вместимости рюкзака, а общая стоимость была максимальной. Относится к классу NP-трудных задач и является одной из классических задач дискретной оптимизации, широко используемой в теории алгоритмов, криптографии и логистике.

История

Впервые задача о рюкзаке в её современной формулировке была описана в 1957 году американским математиком Джорджем Данцигом, который также предложил один из первых алгоритмов её решения — метод динамического программирования. Однако предшествующие постановки встречались ещё в работах XIX века, например, в задачах о загрузке судов или распределении ресурсов.

В 1970-х годах задача о рюкзаке стала объектом активного изучения в связи с развитием теории NP-полноты. В 1972 году Ричард Карп показал, что задача о рюкзаке (в варианте с целыми весами) является NP-полной, что означает отсутствие известного полиномиального алгоритма для её точного решения. Это стимулировало разработку приближённых алгоритмов и методов эвристики.

В 1978 году Ральф Меркль и Мартин Хеллман предложили криптосистему на основе задачи о рюкзаке (ранцевая криптосистема), которая, однако, была взломана в 1982 году Ади Шамиром с помощью метода линейной алгебры. Несмотря на это, задача остаётся важной для криптографии, в частности, в постквантовых схемах.

Формальная постановка

Пусть имеется n предметов, каждый из которых характеризуется весом w_i (целое или вещественное число) и стоимостью v_i (целое или вещественное число). Вместимость рюкзака задана числом W (максимальный допустимый вес). Необходимо найти подмножество предметов S ⊆ {1,2,…,n}, такое что:

  • ∑(i∈S) w_i ≤ W
  • ∑(i∈S) v_i → max

Переменные решения x_i ∈ {0,1} указывают, включён ли предмет i в рюкзак. Тогда задача формулируется как:

Максимизировать ∑(i=1..n) v_i · x_i при условии ∑(i=1..n) w_i · x_i ≤ W, x_i ∈ {0,1}.

Классификация

Задача о рюкзаке имеет несколько разновидностей, различающихся по условиям на предметы и целевую функцию:

По типу предметов

  • 0-1 рюкзак (бинарный) — каждый предмет можно взять не более одного раза (классическая постановка).
  • Ограниченный рюкзак (bounded) — для каждого предмета задано максимальное количество копий, которые можно взять.
  • Неограниченный рюкзак (unbounded) — каждый предмет можно брать любое количество раз.
  • Дробный рюкзак (fractional) — предметы можно делить, задача решается жадным алгоритмом за полиномиальное время и не является NP-трудной.

По характеру весов и стоимостей

  • Целочисленный рюкзак — веса и стоимости — целые числа (классический случай).
  • Вещественный рюкзак — веса и стоимости — вещественные числа, что усложняет точное решение.
  • Многомерный рюкзак — предметы имеют несколько параметров (например, вес, объём, время), и ограничения накладываются по каждому из них.

По целевой функции

  • Максимизация стоимости — стандартная постановка.
  • Минимизация веса при заданной минимальной стоимости (обратная задача).
  • Многокритериальный рюкзак — несколько целевых функций (например, стоимость и надёжность).

Методы решения

Точные алгоритмы

  • Динамическое программирование — для целочисленных весов строится таблица размером (n+1)×(W+1), где ячейка [i][w] хранит максимальную стоимость для первых i предметов при весе не более w. Временная сложность — O(n·W), что является псевдополиномиальным.
  • Метод ветвей и границ — рекурсивный перебор с отсечением заведомо неоптимальных ветвей. Эффективен для небольших n (до 50–100).
  • Метод Гомори — для целочисленного линейного программирования, применим к задаче о рюкзаке.

Приближённые алгоритмы

  • Жадный алгоритмсортировка предметов по убыванию отношения стоимости к весу (v_i/w_i) и последовательное добавление, пока позволяет вместимость. Не гарантирует оптимальность, но даёт приближение с коэффициентом 1/2 для 0-1 рюкзака.
  • Схема полиномиальной аппроксимации (FPTAS) — для любого ε > 0 находит решение с относительной ошибкой не более ε за время O(n·1/ε). Пример — алгоритм Ибарры и Кима (1975).

Эвристические методы

Применение

  • Логистика и транспорт — загрузка грузовиков, контейнеров, самолётов с учётом веса и объёма.
  • Финансы — портфельная оптимизация (выбор акций с ограничением на бюджет).
  • Криптография — ранцевые криптосистемы (например, Меркля-Хеллмана), хотя большинство из них взломаны.
  • Производство — раскрой материалов (например, резка листов металла или ткани).
  • Управление проектамираспределение ресурсов между задачами с ограничением бюджета.
  • Машинное обучение — выбор признаков (feature selection) с ограничением на количество признаков.

Пример

Дано: 3 предмета с весами (2, 3, 4) и стоимостями (3, 4, 5), вместимость рюкзака W = 5.

  • Возможные подмножества:
  • {1}: вес 2, стоимость 3
  • {2}: вес 3, стоимость 4
  • {3}: вес 4, стоимость 5
  • {1,2}: вес 5, стоимость 7 (оптимальное)
  • {1,3}: вес 6 > W — недопустимо
  • {2,3}: вес 7 > W — недопустимо

Оптимальное решение — взять предметы 1 и 2, общая стоимость 7.

Интересные факты

  • Задача о рюкзаке является одной из 21 NP-полной задачи, перечисленных Ричардом Карпом в 1972 году.
  • В 1998 году был предложен алгоритм, решающий задачу о рюкзаке с n до 10 000 и W до 1 000 000 за приемлемое время с использованием динамического программирования и оптимизации памяти.
  • Существует вариант задачи, называемый «задача о рюкзаке с ограничением на количество предметов», который используется в теории кодирования.
  • В 2010 году группа исследователей из MIT показала, что для случайных данных задача о рюкзаке может быть решена за полиномиальное время с высокой вероятностью.

Критика и ограничения

  • NP-трудность делает точное решение невозможным для больших размеров (n > 1000) за разумное время без специальных структур данных.
  • Алгоритмы динамического программирования требуют памяти O(n·W), что при больших W (например, 10^9) становится неприемлемым.
  • Приближённые алгоритмы дают гарантии только для худшего случая, на практике их точность может быть ниже ожидаемой.
  • В реальных задачах часто присутствуют дополнительные ограничения (многомерность, временные окна, зависимости между предметами), что усложняет модель.

Источники

  • Данциг, Дж. (1957). «Discrete-Variable Extremum Problems». Operations Research.
  • Карп, Р. (1972). «Reducibility Among Combinatorial Problems». Complexity of Computer Computations.
  • Меркль, Р., Хеллман, М. (1978). «Hiding Information and Signatures in Trapdoor Knapsacks». IEEE Transactions on Information Theory.
  • Шамир, А. (1982). «A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosystem». Advances in Cryptology.
  • Ибарра, О., Ким, Ч. (1975). «Fast Approximation Algorithms for the Knapsack and Sum of Subset Problems». Journal of the ACM.
  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. (2009). «Алгоритмы: построение и анализ».

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →