【问题标题】:Knapsack problem with dependent selection依赖选择的背包问题
【发布时间】:2019-07-07 00:43:48
【问题描述】:

就像经典的背包问题一样,我们要最大化总价值,同时不要让总重量超过容量,并且它们的值和重量是独立的。但是,对于某些项目,如果要选择它,则必须选择其他一些项目。

例如:有 item_1, item_2, ..., item_n。如果要选择item_1,则必须选择item_3和item_5,如果要选择item_3,则必须选择item_2,item_7,item_9...等。

依赖是独立的,也就是说,如果我们绘制依赖图,它只是一个“有向图”。

首先,我注意到“优先约束背包问题”和“部分有序背包问题”,但在我的问题中,依赖关系不遵循反对称(即,依赖图可能包含循环)。

我发现的最接近的问题是“set-union knapsack problem

给定一组物品,选择总值最大的子集,条件是所选物品的总重量不超过固定容量。一组项目的总值是各个值的总和,总重量是各个权重的总和。在 Set-Union Knapsack Problem 中,每个项目都有一个值,但每个项目都对应一组元素,而不是重量。每个元素都有一个权重。一组项目的总值是各个值的总和,而总权重是对应集合并集中元素的权重之和。

但它只是联合“权重”,有些项目的值可能会累积多次。

有什么办法可以有效解决这个问题?


已编辑:

我找到了一种可以利用一些近似算法的方法

步骤 1. 制作有向依赖图

步骤2. 将此图转移到组件图(使用DFS寻找强连通组件)以去除循环

第 3 步。所以现在,这变成了“优先级约束背包问题”或“部分有序背包问题”。这些都是强NP完全的,但是有很多论文都在谈论这个,并且可以找到一个近似算法来解决。

【问题讨论】:

    标签: knapsack-problem


    【解决方案1】:

    在选择项目之前,您必须检查天气项目是否会创建周期,如果它创建周期然后丢弃它并移至下一个项目。为此,您可以使用 Kruskal 的算法。

    【讨论】:

    • Kruskal 的算法适用于“无向图”并找到最小生成树,它如何应用于我的问题?
    • 是的,它是最小生成树,因此它永远不会有循环,也不允许重复,因此您无法再次添加项目。根据您的要求使用 Bellman–Ford 算法或 Kruskal 算法。有关代码参考,请参阅“geeksforgeeks.com”
    • 我还是不明白。好吧,如果您将边缘的成本设置为我的问题中的重量(物品重量),那么物品的价值和背包的容量在哪里?
    • 为此,您必须应用背包的算法,这将是您可以保持物品价值和背包容量的主要算法。
    • 对不起,你能给我举个简单的例子吗?如果我有 4 个项目 A(重量:1/值:2),B(w:2/v:4),C(w:3/v:6),D(w:4/v:8)。如果选择A,则必须选择C,如果选择D,则必须选择B和C。所以依赖图 G=(V,E), V = {A,B,C,D} 和 E = {(A,C), (D,B), (D,C)}
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2017-06-05
    • 2012-04-04
    相关资源
    最近更新 更多