Рубрики
Без рубрики

Решение рюкзака 0/1 с использованием динамического программирования в Python

В этой статье мы решим проблему knaxack 0/1, используя динамическое программирование.

Автор оригинала: Pankaj Kumar.

Решение рюкзака 0/1 с использованием динамического программирования в Python

В этой статье мы решим проблему knaxack 0/1, используя динамическое программирование.

Динамическое программирование Это алгоритмическая техника для решения проблемы оптимизации, нарушая ее в более простые подбпроблемы и используя тот факт, что оптимальное решение общей проблемы зависит от оптимального решения его субпроблемы Отказ

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

В этом уроке мы узнаем о том, что именно 0/1 Knaxackack и как мы можем решить его в Python, используя динамическое программирование.

Давайте начнем.

Заявление о проблеме на 0/1 рюкзак

Задача отчетности динамического программирования заключается в следующем:

Given weights and values of n items, put these items in a knapsack of capacity W to get the maximum total value in the knapsack.

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

Учитывая эту информацию, нам нужно найти максимальное значение, которое мы можем получить во время превышения веса.

Проблема называется 0/1 рюкзак, потому что мы можем либо включите элемент в целом или исключить его. То есть Мы не можем принять долю предмета.

Давайте возьмем пример, чтобы понять.

Возьмите следующие входные значения.

val = [50,100,150,200]
wt = [8,16,32,40]
W = 64

Здесь мы получаем максимальную прибыль, когда мы включаем предметы 1,2 и 4 давая нам в общей сложности 200 + 50+.

Поэтому общая прибыль выходит как:

350 

Как решить 0/1 Knaxackack с помощью динамического программирования?

Чтобы решить 0/1 Knaxackack, используя динамическое программирование, мы строим таблицу со следующими размерами.

[n + 1][W + 1]

Ряды стола соответствуют предметам 0 до n Отказ

Столбцы таблицы соответствуют ограничением веса от 0 до В.

Индекс самой последней клетки таблицы будет:

[n][W]

Значение ячейки с индексом [i] [j] представляет максимальную возможную прибыль при рассмотрении пунктов от 0 до i и общий предел веса как j.

После заполнения таблицы наш ответ будет в самой последней клетке таблицы.

Как заполнить стол?

Давайте начнем с помощью 0-й строки и столбца до 0. Мы сделаем это, потому что 0 ряд означает, что у нас нет объектов, а 0-й столбец означает, что максимальный возможной вес 0.

Теперь для каждой ячейки [I] [J] у нас есть два варианта:

  1. Либо мы включаем объект [I] в нашем окончательном выборе.
  2. Или мы не включаем объект [I] в нашем окончательном выборе.

Как мы решим, включаем ли мы объект [I] в нашем выборе?

Существует два условия, которые должны быть удовлетворены включать объект [I]:

  1. Общий вес после включения объекта [I] должен не превышать Максимальный вес.
  2. Прибыль После включения объекта [I] должно быть Большой по сравнению с когда объект не включен.

Давайте преобразом наше понимание рюкзака 0/1 в код Python.

Код Python для решения 0/1 knaxackack

Давайте создадим таблицу, используя следующий метод понимания списка:

table = [[0 for x in range(W + 1)] for x in range(n + 1)] 

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

Мы собираемся заполнить таблицу снизу вверх.

for i in range(n + 1): 
        for j in range(W + 1): 
            if i == 0 or j == 0: 
                table[i][j] = 0
            elif wt[i-1] <= j: 
                table[i][j] = max(val[i-1]  
+ table[i-1][j-wt[i-1]],  table[i-1][j]) 
            else: 
                table[i][j] = table[i-1][j] 
  

Давайте сломаем строку кода по линии.

  if i == 0 or j == 0: 
     table[i][j] = 0

Эта часть кода отвечает за настройку 0-й строки и столбца на 0.

 elif wt[i-1] <= j: 

Эта линия кода проверяет, что вес объекта I (TH) меньше, чем общий вес допустимой для этой ячейки (J).

 table[i][j] = max(val[i-1]  
+ table[i-1][j-wt[i-1]],  table[i-1][j]) 

Эта строка кода отвечает за выбор максимума из двух доступных нам вариантов. Мы можем включать объект или исключить его.

Здесь термин Таблица [I – 1] [J] означает, что i-й пункт не включен. Термин val [i – 1] + Таблица [I – 1] [J – WT [I – 1]] Представляет, что элемент ITH включен.

else:
  table[i][j] = table[i-1][j]

Эта часть петли доступна, когда вес объекта ITH больше, чем допустимый предел (j).

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

return table[n][W]

Полный код для решения функции knaxackack

Полный код для функции, который решает knaxackack, приведен ниже:

def knapSack(W, wt, val): 
    n=len(val)
    table = [[0 for x in range(W + 1)] for x in range(n + 1)] 

    for i in range(n + 1): 
        for j in range(W + 1): 
            if i == 0 or j == 0: 
                table[i][j] = 0
            elif wt[i-1] <= j: 
                table[i][j] = max(val[i-1]  
+ table[i-1][j-wt[i-1]],  table[i-1][j]) 
            else: 
                table[i][j] = table[i-1][j] 
  
    return table[n][W] 

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

val = [50,100,150,200]
wt = [8,16,32,40]
W = 64

print(knapSack(W, wt, val))

Полный код

Вот полный код для работы в вашей системе.

def knapSack(W, wt, val): 
    n=len(val)
    table = [[0 for x in range(W + 1)] for x in range(n + 1)] 

    for i in range(n + 1): 
        for j in range(W + 1): 
            if i == 0 or j == 0: 
                table[i][j] = 0
            elif wt[i-1] <= j: 
                table[i][j] = max(val[i-1]  
+ table[i-1][j-wt[i-1]],  table[i-1][j]) 
            else: 
                table[i][j] = table[i-1][j] 
  
    return table[n][W] 

val = [50,100,150,200]
wt = [8,16,32,40]
W = 64

print(knapSack(W, wt, val))

При запуске кода мы получаем следующий вывод:

350

Заключение

В этом руководстве было о решении 0/1 Knaxackack, используя динамическое программирование в Python. Мы надеемся, что вы веселились с нами!