从集合中挑选项目的算法
Algorithm for picking items from sets
我有一组集合 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]
我不需要找到所有可能的解决方案,只要满足上述条件的任何一个即可。
我的问题是:除了暴力破解所有可能的组合直到找到一个组合之外,还有更好的方法吗?显然,贪心算法不会起作用(为集合 #1 选择 [b, c]
将无法从集合 #2 中选择 2 个项目)。还有其他选择吗?我的问题是否等同于某个众所周知的问题?
如果蛮力是唯一的选择,那么实施它以避免走入死胡同的最佳方法是什么?例如。如果我选择:
Set #1 [b, e]
Set #2 [a, d]
为第 3 组尝试所有可能的组合是没有用的,因为从第 4 组中挑选任何组合已经是不可能的。
这可以建模为二分matching problem:左边的节点是单个元素(a、b、c ...),右边的节点是要从中选择的集合,多个节点代表每个集合,应该从多个节点中选择。如果元素是该集合的成员,则存在从元素(左侧)到集合(右侧)的边。
目标是计算匹配(即一组独立边),其中包括右侧的每个节点;这必然是最大基数匹配,因此您可以对 maximum cardinality bipartite matching. There are several which run in low-degree polynomial time, so these will beat backtracking search for large inputs. (Technically this will be pseudopolynomial 使用任何算法,因为转换为二分图涉及复制应从多次中选择的集合;但同样的问题可能会影响回溯搜索。)
我有一组集合 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]
我不需要找到所有可能的解决方案,只要满足上述条件的任何一个即可。
我的问题是:除了暴力破解所有可能的组合直到找到一个组合之外,还有更好的方法吗?显然,贪心算法不会起作用(为集合 #1 选择 [b, c]
将无法从集合 #2 中选择 2 个项目)。还有其他选择吗?我的问题是否等同于某个众所周知的问题?
如果蛮力是唯一的选择,那么实施它以避免走入死胡同的最佳方法是什么?例如。如果我选择:
Set #1 [b, e]
Set #2 [a, d]
为第 3 组尝试所有可能的组合是没有用的,因为从第 4 组中挑选任何组合已经是不可能的。
这可以建模为二分matching problem:左边的节点是单个元素(a、b、c ...),右边的节点是要从中选择的集合,多个节点代表每个集合,应该从多个节点中选择。如果元素是该集合的成员,则存在从元素(左侧)到集合(右侧)的边。
目标是计算匹配(即一组独立边),其中包括右侧的每个节点;这必然是最大基数匹配,因此您可以对 maximum cardinality bipartite matching. There are several which run in low-degree polynomial time, so these will beat backtracking search for large inputs. (Technically this will be pseudopolynomial 使用任何算法,因为转换为二分图涉及复制应从多次中选择的集合;但同样的问题可能会影响回溯搜索。)