【发布时间】: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