#python #list #for-loop #knapsack-problem #branch-and-bound
#python #Список #for-цикл #проблема с рюкзаком #переход с привязкой
Вопрос:
Я решаю проблему с рюкзаком, используя алгоритм ветвления и привязки, над которым я работаю прямо сейчас. В алгоритме я хотел начать выбирать элементы с наибольшей плотностью (значение / вес). Я создал список с именем «плотность» и произвел необходимые вычисления. Мне нужно каждый раз выбирать максимальное значение из этого списка. Но каждый раз, когда я пытаюсь, порядок смешивается. Мне нужно обновить переменную «a», потому что каждый раз, когда я удаляю элемент, список становится на один меньше. Но не смог понять, как его обновить. Мне нужна помощь в выборе элементов в правильном порядке.
вес, значение, плотность — это списки. вместимость и комната — это целочисленные значения, указанные в задаче. Это список плотности.
Я хочу получить индекс максимального элемента в этом списке. Затем вычтите его «вес» из «емкости», чтобы определить, сколько «места» осталось. И добавьте «значение» к «самому высокому», чтобы в рюкзаке можно было добавить наибольшее значение. После того, как я сделал это для первого элемента, повторяйте его до тех пор, пока не останется совсем мало места.
def branch_n_bound(value,weight,capacity):
global highest,size
size=0
room=capacity
density = [0] * len(items)
highest = 0
for i in range(n):
density[i] = val[i] / weight[i]
for i in range(n):
a=density.index(max(density))
if weight[a]<=room:
room-=weight[a]
highest =value[a]
size =weight[a]
taken[a]=1
del density[a], weight[a], value[a]
else:
break
Комментарии:
1. Вместо вашей
del density[a], ...
строки попробуйтеdensity.pop(a)
,weight.pop(a)
иvalue.pop(a)
, каждый в своей строке.2. Кроме того, если вы предоставите образцы данных и ожидаемый результат, а также то, что вы получаете и почему это неправильно, мы сможем вам лучше помочь.
3. @Engineero Я пробовал это, но, к сожалению, не сработало. Я добавил дополнительный комментарий, чтобы сделать его более понятным.
Ответ №1:
Я думаю, что проблема, которую вы пытаетесь решить, может быть решена проще с изменением структуры данных. Вместо построения массива плотности вы можете создать массив кортежей [(density, weight, value)...]
и основывать свое решение на этом массиве. Если вы не хотите использовать так много дополнительной памяти и предполагаете, что вы согласны с изменением входных данных, вы можете пометить свои индексы как удаленные — например, вы можете установить значение, вес и плотность во что-то отрицательное, чтобы знать, что данные были удалены из этого индекса.
Вы также можете взглянуть на структуру данных heapq: https://docs.python.org/3/library/heapq.html . Вы можете работать с кучей, чтобы извлечь максимум, и сохранять индексы в этой куче.