【问题标题】:Algorithm for picking items from sets从集合中挑选项目的算法
【发布时间】:2021-08-19 07:20:52
【问题描述】:

我有一组集合S[i],我需要从每个对应集合中挑选C[i] 项目。有些物品可能同时属于多个套装,不允许两次选择同一个物品。

这里有一个更好解释的例子:

Set #1 [b, c, d, e], pick 2
Set #2 [a, b, c], pick 2
Set #3 [w, x, y, z], pick 1
Set #4 [a, d, e], pick 1

其中一个解决方案是:

Set #1 [b, d]
Set #2 [a, c]
Set #3 [x]
Set #4 [e]

我不需要找到所有可能的解决方案,只要满足上述条件的任何一个即可。

我的问题是:除了暴力破解所有可能的组合直到我找到一个之外,还有更好的方法吗?显然,贪心算法不起作用(为 set #1 选择 [b, c] 将无法从 set #2 中选择 2 个项目)。是否存在其他选择?我的问题是否等同于某个众所周知的问题?

如果蛮力是唯一的选择,那么实施它以避免陷入死胡同的最佳方法是什么?例如。如果我选择:

Set #1 [b, e]
Set #2 [a, d]

尝试第 3 组的所有可能组合是没有用的,因为从第 4 组中选择任何组合已经不可能了。

【问题讨论】:

  • 递归+回溯可以工作。如,递归地尝试检查所有组合,并在每个步骤中检查是否有可能的解决方案。如果不是,则返回上一步并继续下一个组合。
  • 这基本上是蛮力,对吧?不知道有没有更好的方法
  • 看起来像这里描述的广义二分匹配simons.berkeley.edu/sites/default/files/docs/831/…,其中集合和元素是分区。
  • 是的,这可以变成一个简单的二分匹配问题,只需复制你必须从中选择两个的集合。
  • @n.'pronouns'm。您为什么不发布答案以便我接受?听起来我可以用这个? en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm

标签: algorithm computer-science


【解决方案1】:

这可以建模为二分体matching problem:左侧的节点是单个元素(a、b、c...),右侧的节点是要从中选择的集合,具有多个节点表示应该从多次中选择的每个集合。如果该元素是该集合的成员,则从一个元素(左侧)到一个集合(右侧)存在一条边。

然后目标是计算一个匹配(即一组独立的边),其中包括右侧的每个节点;这必然是最大基数匹配,因此您可以对maximum cardinality bipartite matching 使用任何算法。有几个在低次多项式时间内运行,因此这些将击败大输入的回溯搜索。 (从技术上讲,这将是pseudopolynomial,因为转换为二分图涉及复制应该从多次中选择的集合;但同样的问题可能会影响回溯搜索。)

【讨论】:

  • 谢谢,我尝试使用 Edmonds–Karp 算法,它成功了!如果我还为集合的每个元素(即左侧的顶点)分配了一个权重,并且我想最小化或最大化总权重怎么办?
  • 维基百科也应该有一个关于最大权重匹配的页面或部分;对于最小化,您可以转换权重以将其转换为最大化问题。
  • 谢谢!我最终使用了带有 Edmonds–Karp 的匈牙利算法来“找到覆盖零的最小行数”步骤(通过将零变成边缘,以便 E-K 找到匹配项)。非常适合我的情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
相关资源
最近更新 更多