algorithm - 这是NP完全的吗?如果是,背包、MIS、设置填充或调度?

标签 algorithm dynamic-programming combinatorics knapsack-problem np-complete

我有一种“直觉”,我在我的应用程序中面临的问题是 NP 完全的,但我正在寻求帮助对其进行分类。

问题

  • 我们有一个包含 n 个异构槽的包
  • 我们可以在每个插槽中放置一个项目(具有关联值),或者将其留空。一个插槽最多可以包含一个项目。
  • 由于插槽是异构的,插槽 #2 的项目不能放入插槽 #3
  • 我们有一组有限的插槽填充操作
  • 每个 Action 最多可以调用一次
  • 调用给定的 Action 将用固定值(特定于 Action )填充一些(1-n)槽,但前提是所有请求的槽都可用(否则无法调用 Action ),即所有请求的槽或没有。

我们如何确定要调用的操作集以最大化包中的总值(value)?

一个例子:

  • 我们有 5 个位置,编号为#1-#5
  • 我们有三个 Action ,A1、A2 和 A3
  • A1 想把值(value) $30 放在 #1 到 #5 的位置
  • A2 想将 50 美元放入插槽 #1 和 #2
  • A3 想将 50 美元放入插槽 #4 和 #5

此示例的最佳解决方案是调用操作 A2 和 A3(总值(value)为 200 美元,将插槽 #3 留空)——而不是调用 A1(这将填满所有插槽,但只给出总计 150 美元) .

后续问题 - 我应该如何暴力破解?

一些想法:

  • 如果插槽值 ($) 与 A[y] 相关联,我们将要修剪掉与另一个 Action A[x] 覆盖完全相同插槽的任何 Action A[y] ] 小于或等于 A[x]。

  • 除此之外,我认为评估解决方案空间归结为迭代所有剩余操作的幂集

  • 在所有 Action 的幂集中的集合 {S1, S2...} 中,如果 S2 是 S1 的子集并且所有 Action 都成功应用于 S1,那么我们可以忽略 S2(及其所有子集! ) 而不评估它们,因为它们永远无法给出更好的结果。换句话说,如果我们能在早期找到一个成功应用的集合,我们就可以忽略它的所有子集(显着减少我们必须测试的内容)

有兴趣了解您能想到的任何其他优化。

最佳答案

NP 完全性与决策问题有关,而您的问题是优化问题。如果我们将其更改为可行性(“是否存在 ≥ m 的解决方案?”),那么我们可以简单地减少 set packing到你的问题,你的问题到 0-1 integer linear programming ,这两者都被认为是 NP 完全的。恭喜,你是 NP 完全的!

我不确定是哪个NPO-complete不过,您的问题属于什么类别。

关于algorithm - 这是NP完全的吗?如果是,背包、MIS、设置填充或调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268548/

相关文章:

database - 为什么数据库中不使用 trie 索引来进行字符串索引?

algorithm - 随机提前终止的游戏中元素的最佳顺序

c++ - 将两个数组排序为组合数组

c++ - 如何解决 0-1 背包算法的这些变体?

haskell - Haskell 中的 Memoize 项目 Euler 116

algorithm - 使用 Welford 方法计算单程方差时删除先验样本

python - 能源消耗最大化

python - 如何根据元素转换成本排序对集合进行排序,以使连续集合之间的更改最小化?

haskell - 组合学:圣彼得博弈算法

r - 将集合分为n个不相等的子集,关键决定因素是该子集中的元素聚合并等于预定量吗?