Вариант задачи о ранце

11

Как бы вы подошли к проблеме ранца в ситуации динамического программирования, если теперь вам нужно ограничить количество предметов в ранце константой п ? Это та же самая проблема (максимальный вес , каждый предмет имеет значение и вес ), но вы можете добавить только предмет (ы) в рюкзак и, очевидно, нужно оптимизировать значение рюкзака.WW Pvвесп

Нужно ли нам третье измерение или мы могли бы найти другой подход без него? Я попытался просто добавить номер элемента в рюкзаке в клетке и принимая максимальное значение в конце с числом п <= , но это не лучшее решение.п

user11536
источник
Это хорошее домашнее упражнение. Что вы пробовали? Вам удобно заниматься динамическим программированием? (Если нет, может быть , попробовать некоторые упражнения на практике с ней.) Изучали ли Вы стандартный алгоритм динамического программирования для задачи о рюкзаке? Ищите способ изменить этот стандартный подход. Ваша главная задача состоит в том, чтобы разработать то , что множество подзадач должно быть. В стандартном подходе подзадача характеризуется одним параметром (ограничение на вес предметов). Вы можете рассмотреть возможность использования двух параметров (таким образом, больший набор подзадач). Попробуйте различные возможности - что вы получаете?
DW

Ответы:

9

Очень хороший вопрос!

Вы дважды правы

  1. Распространение количества предметов в рюкзаке не приводит к оптимальным решениям.
  2. Одно решение состоит в добавлении третьего измерения. Это довольно просто, но при этом необходимо учитывать некоторые факты. Обратите внимание, что это не единственная альтернатива

Далее я предполагаю, что вы знакомы с решением, основанным на динамическом программировании. В частности, я не буду обсуждать, как пройти таблицу назад, чтобы определить решение .

Давайте сначала сосредоточимся на типичном случае: количество предметов не ограничено . В этом случае вы просто строите таблицу где T i , j содержит оптимальное значение, когда общая вместимость рюкзака равна i, и рассматриваются только первые j элементов. Отсюда:TTя,JяJ

Tя,Jзнак равноМаксимум{Tя,J-1,Tя-весJ,J-1+vJ}

где и v jвесJvJ обозначают вес и стоимость элемента соответственно. Если С является общая мощность котомке и есть в общей сложности N элементов оптимальное решение дается T C , N . Известно, что этот алгоритм работает в псевдополиномиальном времени, и одна из его прелестей заключается в том, что он рассматривает только те комбинации, которые соответствуют максимальной емкости.JСNTС,N

Однако этого недостаточно при добавлении ограничения: максимальное количество элементов . Причина в том, что предыдущая формула повторения не учитывает различные комбинации элементов:п

  1. Во-первых, если то T i , j = ( T i - wTя,J-1<(Tя-весJ,J-1+vJ)так чтоJ-й предмет добавляется в рюкзак, несмотря на максимальное количество рассматриваемых предметов,pTя,Jзнак равно(Tя-весJ,J-1+vJ)Jп--- чтобы вы могли нарушать свои ограничения. Что ж, у вас может возникнуть соблазн применить предыдущую формулу, отслеживая количество предметов, вставленных на каждом шаге, и не добавлять другие, если количество предметов в рюкзаке превышает но,п
  2. Во-вторых, если то T i , j = T i , j - 1, так что этот элемент не добавляется, но это может быть большой ошибкой в случае оптимального решения T i , j - 1Tя,J-1>(Tя-весJ,J-1+vJ)Tя,Jзнак равноTя,J-1Tя,J-1уже состоит из максимального количества предметов для вставки в рюкзак. Причина в том, что мы не сравниваем должным образом: с одной стороны, чтобы сохранить оптимальное решение, состоящее из элементов, выбранных среди предыдущих ( j - 1 ) ; с другой стороны, чтобы вставить j-й элемент и, дополнительно, рассмотреть наилучшее подмножество с ( p - 1 ) элементами среди предыдущих ( j - 1 ) .п(J-1)J(п-1)(J-1)

Так что первое решение состоит из добавления третьего измерения. Для вашего случая, пусть будет оптимальным решением, когда вместимость рюкзака равна i , учитываются только первые j предметов, и в рюкзак не разрешается помещать более k предметов. Сейчас,Tя,J,КяJК

  • Если вы вычисляете для количества элементов, строго меньшего или равного количеству элементов, которые можно вставить ( j k ), то продолжайте как обычно, но используя то же значение k : T i , j , k = max { T i , j - 1 , k , T i -Tя,J,КJККTя,J,Кзнак равноМаксимум{Tя,J-1,К,Tя-весJ,J-1,К+vJ}
  • Теперь, если вам нужно вычислить для количества элементов, строго превышающего количество элементов, которые можно вставить ( j > k ), то: T i , j , k = max { T i , j - 1 , k , T i - w j , j - 1 , k - 1 + v j }Tя,J,КJ>КTя,J,Кзнак равноМаксимум{Tя,J-1,К,Tя-весJ,J-1,К-1+vJ}

Первое выражение должно быть понятным. Второе работает, поскольку -й слой таблицы T отслеживает наилучшую комбинацию ( k - 1 ) элементов среди первого ( j - 1 ), как требуется выше.(К-1)T(К-1)(J-1)

Эффективная реализация этого алгоритма не должна вычислять для всех k . Обратите внимание, что предыдущие рекуррентные отношения относятся к слою kTя,J,ККК с и, таким образом, можно чередовать два последовательных слоя (например, если вас интересует оптимальное решение с k = 4, вы просто используете два последовательных слоя: 0 и 1, 1 и 2, 2 и 3, 3 и 4 и все готово). Другими словами, этот алгоритм занимает в два раза больше памяти, чем требует традиционный подход, основанный на динамическом программировании, и, таким образом, он все еще может выполняться за псевдополиномиальное время.(К-1)Кзнак равно4

Имейте в виду, однако, что это не единственное решение! И есть еще один, который вы можете найти более элегантным. В предыдущих формулах мы нашли оптимальное решение, которое состояло не более чем из элементов среди первых ( j - 1 ) как T i , j - 1 , k - 1 . Однако должно быть ясно, что это точно равно max p = 0 , j - 1 { T i , p }(К-1)(J-1)Tя,J-1,К-1Максимумпзнак равно0,J-1{Tя,п} просто с помощью исходной таблицы! оптимальное решение с не более К элементов, также может быть получено путем рассмотрения оптимальных решений с 1 элементом, 2 элементами, 3 элементами, ... элементами ... Чтобы эта формулировка работала, вам следует Также следите за количеством элементов, рассматриваемых в каждом частичном решении, так что вам потребуется два целых числа на ячейку. Это заполнение памяти приводит к точно таким же требованиям к памяти алгоритма, показанного выше (с использованием третьего измерения в форме слоев k ) .(J-1)К

Надеюсь это поможет,

Карлос Линарес Лопес
источник
Очень хороший ответ, спасибо. Я смог пройти через это до вашего поста, также реализовав третье измерение.
user11536
Ой, большое спасибо за закрытие вопроса и рад слышать, что вам понравился ответ. Чтобы уточнить мои идеи, я также попытался реализовать этот алгоритм в Python. Если вам интересно взглянуть на него, дайте мне знать, и я с радостью опубликую его (или отправлю вам). Ура,
Карлос Линарес Лопес
Удивительное объяснение проблемы многомерного ранца. Однако мне было интересно, если бы у нас был похожий случай, но с ровно k элементами, мы будем смотреть только на значения, возвращаемые k-м столбцом 3-го измерения. Если там нет значений, возвращаем 0.I я не уверен, прав ли я, потому что я все еще новичок в динамическом программировании.
SteveIrwin
@ CarlosLinaresLópez отличный ответ. Не могли бы вы также поделиться сценарием Python? Может быть, опубликовать его на gist.github.com?
Саад Малик
1
Привет, Карлос! Я отправил последующий вопрос с помощью альтернативной формулы здесь: Поиск N-лучшие элементы в 0/1 рюкзаке . Во всяком случае , я надеюсь , что вы наслаждаетесь отдыхом!
Саад Malik