问题描述
我正在使用目前正在研究的分支定界算法来解决背包问题。在算法中,我想开始选择密度(值/重量)最高的项目。我创建了一个名为“密度”的列表,并进行了必要的计算。我需要每次从该列表中选择最大值。但是每次我尝试时,顺序都会变得复杂。我需要更新变量“ 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
解决方法
我认为,通过更改数据结构可以更轻松地解决您尝试解决的问题。除了构建密度数组,您还可以构建元组[(density,weight,value)...]
的数组,并将解决方案基于该数组。如果您不想使用过多的内存,并且可以更改输入数据,可以将索引标记为已删除-例如,可以将值,权重和密度设置为负数以了解数据已从该索引中删除。
您还可以查看一下heapq数据结构:https://docs.python.org/3/library/heapq.html。您可以使用堆来提取最大值,并将索引存储在该堆中。