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

Проблема рюкзака в Python С 3 Уникальными способами решения

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

Автор оригинала: Team Python Pool.

Проблема рюкзака в Python С 3 Уникальными способами решения

Здравствуйте Программисты, в этой статье мы обсудим способы решения проблемы рюкзака в python с использованием различных подходов. Существуют различные подходы к решению проблемы рюкзака – жадный метод, динамическое программирование и подход грубой силы. Прежде чем мы начнем с примеров проблемы рюкзака, позвольте мне кратко рассказать вам о проблеме рюкзака.

Для заданных весов и значений n предметов мы должны выбрать наборы весов, которые могут заполнить максимальную емкость w в мешке емкости W. Этот набор должен содержать максимальное количество элементов. Ожидаемый результат-это целое число с максимальным числом

Что такое проблема рюкзака в Python?

Алгоритм задачи ранца – это конструктивный подход к комбинаторной оптимизации. Проблема в основном заключается в заданном наборе предметов, каждый из которых имеет определенный вес и ценность. Поэтому программист должен определить номер каждого элемента для включения в коллекцию таким образом, чтобы общий вес был меньше или равен заданному пределу. И кроме того, общее значение является максимальным. Он получил свое название от рюкзака фиксированного размера, который должен быть до предела заполнен самыми ценными предметами.

Практическое применение ранцевой задачи Python

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

Примечание: 0/1 задача рюкзака – это частный случай задачи рюкзака, которая не заполняет рюкзак дробными предметами.

Ограничения Для задачи рюкзака в Python

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

  • 3 ≤ N ≤ 100000;
  • 1 ≤ W ≤ 2, для каждого элемента;
  • 1 ≤ C ≤ 109, для каждого элемента.
  • 1 ≤ C ≤ 109, для каждого элемента.
  • Ограничение по времени: 1 Сек.

Где N означает количество предметов, W – вес предмета, а C-стоимость предмета.

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

Различные подходы к решению проблемы рюкзака Python

Следующие 3 способа являются единственными доступными способами решения проблемы рюкзака в Python –

  • Жадный метод
  • Динамическое программирование
  • Динамическое программирование

Жадный метод

Жадный метод

class KnapsackPackage(object): 
      
    """ Knapsack Package Data Class """
    def __init__(self, weight, value): 
        
        
        / weight 
  
    def __lt__(self, other): 
        return self.cost < other.cost

if __name__: 
    W = [15, 10, 2, 4] 
    V = [30, 25, 2, 6] 
   
   
    
   ()
    proc.knapsackGreProc(W, V, M, n)

class FractionalKnapsack(object):
    def __init__(self):
        
    def knapsackGreProc(self, W, V, M, n):
        packs = []
        for i in range(n): 
            packs.append(KnapsackPackage(W[i], V[i]))
            
       )
        
       
       
        
       
       
        
  while (stopProc):
            if (packs[i].weight):
                remain[i].weight;
                result[i].value;
                
  print("Pack ", i, " - Weight ", packs[i].weight, " - Value ", packs[i].value)
            
            if (packs[i].weight > remain):
                i
                
            if (i):
                           
        
 print("Max Value:\t", result)

ВЫХОД:

Pack  0  - Weight  10  - Value  25
Pack  0  - Weight  10  - Value  25
Pack  0  - Weight  10  - Value  25
Pack  2  - Weight  4  - Value  6
Pack  3  - Weight  2  - Value  2
Max Value:	 83

Объяснение:

Жадные алгоритмы используются для решения оптимизационных задач, то есть поиска наилучшего решения по заданным критериям. Жадные алгоритмы реализуют оптимальные локальные выборки в надежде, что эти выборки приведут к наилучшему решению. Однако решение жадного метода всегда не является оптимальным. Жадные методы хорошо работают для дробной задачи рюкзака. Однако для задачи о рюкзаке 0/1 выход не всегда оптимален.

В заключение, идея жадного метода состоит в том, чтобы вычислить соотношение (значение/вес). Сортируйте коэффициенты в порядке убывания. Выберите первое соотношение, которое является максимальным пакетом. Вместимость рюкзака может содержать этот пакет (остаток > вес). Каждый раз, когда пакет помещается в рюкзак, это также уменьшает его вместимость.

Динамическое программирование

Динамическое программирование

def knapSack(W, wt, val, n): 
    K = [[0 for x in range(W + 1)] for x in range(n + 1)] 
  
    # Build table K[][] in bottom up manner 
    for i in range(n + 1): 
        for w in range(W + 1): 
            if i or w: 
               
            elif wt[i-1]: 
               (val[i-1] 
                          + K[i-1][w-wt[i-1]],   
                              K[i-1][w]) 
            else: 
               [i-1][w] 
  
    return K[n][W] 
  
  
# Driver code 
val = [60, 100, 120] 
wt = [10, 20, 30] (val) 
print(knapSack(W, wt, val, n))

ПРИМЕР:

220

Объяснение:

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

В таблице все возможные веса от ” 1 ” до ” W ” служат столбцами, а веса хранятся в виде строк. Состояние DP[i][j] в приведенном выше примере обозначает максимальное значение “j-веса” с учетом всех значений от “1 до i-го”. Поэтому, если мы рассмотрим ” wi “(вес в “i-й” строке), он будет помещен во все столбцы, которые имеют “значения веса > wi”. Возникают две возможности – заполнить или не заполнить “wi” в данном столбце. Если мы не заполняем “i-й” вес в столбце “j-й”, то состояние DP[i][j] будет таким же, как DP[i-1][j].Но если мы заполняем вес, то DP[i][j] будет равно значению “wi”+ значению столбца с весом “j-wi” в предыдущей строке. Поэтому мы берем максимум из этих двух возможностей, чтобы заполнить текущее состояние.

Подход Грубой Силы Для Решения Проблемы Рюкзака Python

ПРИМЕР:

def knapSack(W, wt, val, n):
   # initial conditions
   if n or W :
      return 0
   # If weight is higher than capacity then it is not included
   if (wt[n-1] > W):
      return knapSack(W, wt, val, n-1)
   # return either nth item being included or not
   else:
      return max(val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
         knapSack(W, wt, val, n-1))
# To test above function
val = [60, 100, 120]
wt = [10, 20, 30](val)
print (knapSack(W, wt, val, n))

ВЫХОД:

220

ОБЪЯСНЕНИЕ:

Грубая сила-это очень простой подход к решению проблемы рюкзака. Для n предметов на выбор, то будет 2n возможных комбинаций предметов для рюкзака. Предмет либо выбран, либо нет. A href=”https://en.wikipedia.org/wiki/Bit#:~:text=The%20bit%20is%20a%20basic,one%20of%20two%20possible%20values.”>bit генерируется строка из 0 и 1, длина которой равна количеству элементов, то есть n. Если i-й символ битовой строки равен 0, то этот элемент не выбирается. И если он равен 1, то элемент выбирается. href=”https://en.wikipedia.org/wiki/Bit#:~:text=The%20bit%20is%20a%20basic,one%20of%20two%20possible%20values.”>bit генерируется строка из 0 и 1, длина которой равна количеству элементов, то есть n. Если i-й символ битовой строки равен 0, то этот элемент не выбирается. И если он равен 1, то элемент выбирается.

Надо Читать

  • Надо Читать
  • Функция справки Python
  • Почему Python sys.exit лучше других функций выхода?
  • Python Bitstring: Классы и другие примеры | Модуль

Вывод

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

Если у вас все еще есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.

Счастливого Пифонирования!