【问题标题】:Selecting items with highest value in a list with the right order以正确的顺序选择列表中价值最高的项目
【发布时间】:2020-08-18 19:22:45
【问题描述】:

我正在使用我正在研究的分支定界算法来解决一个背包问题。在算法中,我想开始选择密度(值/重量)最高的项目。我创建了一个名为“密度”的列表并进行了必要的计算。我每次都需要从该列表中选择最大值。但是每次我尝试时,订单都会变得混乱。我需要更新变量“a”,因为每次我删除一个项目时,列表都会变小。但是不知道怎么更新。我需要帮助以正确的顺序选择项目。

重量、价值、密度是列表。 capacity 和 room 是问题中给出的整数值。 这是密度列表。

我想要的是,获取此列表中最大项目的索引。然后,从“容量”中减去它的“重量”,以找出还剩下多少“空间”。并将“价值”添加到“最高”,以便达到最高价值可以添加到背包中。在我为第一个项目执行此操作后,对其进行迭代,直到没有剩余空间或剩余空间非常少。

    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.pop(a)weight.pop(a)value.pop(a),而不是del density[a], ... 行,每个行都在自己的行上。
  • 另外,如果您提供示例数据和预期输出,以及您得到的结果和错误原因,我们将能够更好地为您提供帮助。
  • @Engineero 我确实尝试过,但不幸的是没有奏效。我添加了额外的评论以使其更加清晰。

标签: python list for-loop knapsack-problem branch-and-bound


【解决方案1】:

我认为您尝试解决的问题可以通过更改数据结构来更轻松地解决。您可以构建一个元组数组[(density, weight, value)...],而不是构建密度数组,并将您的解决方案基于该数组。如果您不想使用太多额外的内存并假设您可以更改输入数据,则可以将索引标记为已删除 - 例如,您可以将值、重量和密度设置为负值以了解该数据已从该索引中删除。

你也可以看看 heapq 数据结构:https://docs.python.org/3/library/heapq.html。您可以使用堆来提取最大值,并将索引存储在该堆中。

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多