【问题标题】:How to derive all solutions from knapsack DP matrix如何从背包 DP 矩阵导出所有解
【发布时间】:2015-05-31 05:46:32
【问题描述】:

我正在研究背包问题的 DP 解决方案。拥有一个包含重量和价值的项目列表,我需要找到最大总价值小于某个预定义重量的项目。没什么特别的,只是0-1 knapsack

我使用DP生成矩阵:

def getKnapsackTable(items, limit):
    matrix = [[0 for w in range(limit + 1)] for j in xrange(len(items) + 1)]
    for j in xrange(1, len(items) + 1):
        item, wt, val = items[j-1]
        for w in xrange(1, limit + 1):
            if wt > w:
                matrix[j][w] = matrix[j-1][w]
            else:
                matrix[j][w] = max(matrix[j-1][w], matrix[j-1][w-wt] + val)

    return matrix

其中项目是元组列表(name, weight, value)。现在有了一个 DP 矩阵,他的最大可能值是右下位置的数字。我还可以回溯矩阵以找到提供最佳解决方案的项目列表。

def getItems(matrix, items):
    result = []
    I, j = len(matrix) - 1, len(matrix[0]) - 1
    for i in range(I, 0, -1):
        if matrix[i][j] != matrix[i-1][j]:
            item, weight, value = items[i - 1]
            result.append(items[i - 1])
            j -= weight

    return result

太好了,现在我可以得到结果了:

items = [('first', 1, 1), ('second', 3, 8), ('third', 2, 5), ('forth', 1, 1), ('fifth', 1, 2), ('sixth', 5, 9)]
matrix = getKnapsackTable(items, 7)
print getItems(matrix, items)

将会看到:[('fifth', 1, 2), ('third', 2, 5), ('second', 3, 8), ('first', 1, 1)]


问题在于这不是一个独特的解决方案。代替'first' 元素,我可以使用'forth' 元素(这完全一样,但有时解决方案可能不同)。我试图弄清楚如何获得所有解决方案,而不仅仅是一个。我知道这需要更多时间,但我可以接受。

【问题讨论】:

  • 您最终找到解决此问题的方法了吗?我正在研究类似的东西,并试图确定一种有效的方法来递归地确定给定背包问题的所有可能解决方案。

标签: python algorithm dynamic-programming knapsack-problem


【解决方案1】:

您可以照常计算原始 DP 矩阵(即使用 DP),但要找到所有最佳解决方案,您需要在从最终状态返回矩阵时递归。这是因为矩阵中的任何给定状态 (i, j) 至少有一个最优前驱状态,但 它可能有两个: 状态 (i, j) 的最大值可能是通过选择将第 i 项添加到状态 (i-1, j-w(i)) 的最优解中,或者通过将第 i 项排除在外并仅保留 (i-1, j) 的最优解来实现。这恰好发生在这两个选择产生相等的总值时,即当

matrix[i-1][j] == matrix[i-1][j-w(i)]+v(i),

其中 w(i) 和 v(i) 分别是对象 i 的权重和值。每当您检测到这样的分支时,您都需要跟踪每个分支。

请注意,可能存在大量最优解:例如,考虑所有项目的权重为 1 的情况。在这种情况下,所有 (n 选择 w) 解都是最优的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多