我们有一个项目池。每个项目都有一组特征。每个特征都是字符串,整数或浮点数。每个项目也是特定类型。类型是分层的。
我们还有一套垃圾箱。每个bin都有一个需求,它是一个布尔表达式,包含有关项目特征的原子表达式。这些原子表达式可以是字符串,整数或浮点比较和类型比较。
我们希望将物品放在箱子中,使放置在箱子中的每个物品满足该箱子的要求。每个bin还必须包含指定数量的项目。
例如,我们可能有以下类型层次结构:
我们可以有以下项目:
这是一个示例bin:
我们可以将LargeBlueSquare放在LargeRectangles bin中。我们想要这个箱子中的5个项目。
这是另一个示例bin:
LargeRedTriangle可以进入NonBlueTriangles bin。我们想要这个箱子中的10个物品。
因此,我们有一组物品和一组箱子。问题是找出在满足约束条件(即,箱中物品的要求和每个箱中的物品数量)的同时将物品放入箱中的方式。 (我们不需要列举所有这些方法;我们只需要知道有多少不同的方法。)
有没有一种有效的方法来确定这个数字?或者我们是否只需要“暴力”并尝试各种可能的组合?
答案 0 :(得分:3)
如果我理解正确,您的问题归结为在二分图中找到Perfect Matchings的数量的问题。
项目形成左侧组。箱子形成了权利。如果bin需要k个项目,则可以制作该bin的k个副本。
现在,如果项目可能是bin的候选者,则在项目和bin之间形成边缘。
现在你需要在这张图中找到完美匹配的数量。
不幸的是,这是一个难题。计算图表中完美匹配的数量等同于找到关联矩阵的Permanent,即#P-Complete。见:Computation of the Permanent。
您最好的选择可能是随机/近似算法。