根据布尔限制计算将项目放入箱中

时间:2010-08-09 18:00:17

标签: algorithm combinatorics

我们有一个项目池。每个项目都有一组特征。每个特征都是字符串,整数或浮点数。每个项目也是特定类型。类型是分层的。

我们还有一套垃圾箱。每个bin都有一个需求,它是一个布尔表达式,包含有关项目特征的原子表达式。这些原子表达式可以是字符串,整数或浮点比较和类型比较。

我们希望将物品放在箱子中,使放置在箱子中的每个物品满足该箱子的要求。每个bin还必须包含指定数量的项目。

例如,我们可能有以下类型层次结构:

  • 形状
    • 三角形
      • 等边三角形
    • 矩形

我们可以有以下项目:

             
  • LargeRedTriangle
  •     
               
    • type = triangle
    •          
    • color =“red”
    •          
    • area = 1000
    •     
     
  • SmallShape
  •     
       
    • type = shape
    •  
    • area = 5
    •     
  • LargeBlueSquare     
       
    • type = square
    •  
    • color =“blue”
    •  
    • area = 2000

这是一个示例bin:

  • LargeRectangles
    • (type == rectangle)和(area> 750)
    • item count = 5

我们可以将LargeBlueSquare放在LargeRectangles bin中。我们想要这个箱子中的5个项目。

这是另一个示例bin:

  • NonBlueTriangles
    • (type == triangle)和(not(color ==“blue”))
    • 项目数= 10

LargeRedTriangle可以进入NonBlueTriangles bin。我们想要这个箱子中的10个物品。

因此,我们有一组物品和一组箱子。问题是找出在满足约束条件(即,箱中物品的要求和每个箱中的物品数量)的同时将物品放入箱中的方式。 (我们不需要列举所有这些方法;我们只需要知道有多少不同的方法。)

有没有一种有效的方法来确定这个数字?或者我们是否只需要“暴力”并尝试各种可能的组合?

1 个答案:

答案 0 :(得分:3)

如果我理解正确,您的问题归结为在二分图中找到Perfect Matchings的数量的问题。

项目形成左侧组。箱子形成了权利。如果bin需要k个项目,则可以制作该bin的k个副本。

现在,如果项目可能是bin的候选者,则在项目和bin之间形成边缘。

现在你需要在这张图中找到完美匹配的数量。

不幸的是,这是一个难题。计算图表中完美匹配的数量等同于找​​到关联矩阵的Permanent,即#P-Complete。见:Computation of the Permanent

您最好的选择可能是随机/近似算法。