我希望将物品放入垃圾箱中,其中每个物品必须来自不同的类别,每个垃圾箱必须包含唯一的物品集合,并且对哪些物品可以放在同一个箱子中存在限制。我不知道这是哪种类型的问题。这似乎类似于多个背包问题,但没有"最佳"解决方案。可能有许多同样有效的解决方案,或者可能只有一个,或者可能没有。
问题的更详细描述:
考虑我有 5 类项目:["Fruit", "Vegetable", "Bread", "Meat", "Frozen"]
每个类别中有 100 个项目,其中每个项目都不是唯一的。例如,在水果中有20个苹果,50个橙子,10个梨,10个葡萄,10个香蕉。面包中有50个百吉饼,40个面包,10个法式长棍面包。其他类别相似,因为项目总数总计为 100,但每个项目都有重复项。
我正在尝试将每个类别中的一件物品放入垃圾箱。每个垃圾箱分别获得水果、蔬菜、面包、肉类、冷冻各 1 个。箱数将与每个类别中的项目数相同。因此,对于此示例,100 个箱。
约束条件包括:
每个- 箱从每个项目类别中获取一个项目
- 每个箱必须是唯一的。任何箱子都不能与另一个箱具有相同的项目组合
- 有些物品不能放在同一个箱子里。例如,百吉饼不能与苹果在同一个垃圾箱中
我不确定如何构建这个问题。我正在寻找一些关于这是什么类型的问题的指导,以及什么方法适合使用 OR-Tools 解决它。
你在这里描述的问题的大小不是很大;有 5 个类别和 5 个项目,每个类别只有 5^5 = 3125 个项目组合。
如果您的实际问题也是这种大小,那么最简单的建模方法是制作一个包含所有允许组合的表格:
Id | Fruit | Bread | 蔬菜 | Meat | |
---|---|---|---|---|---|
apple = 1 |
loaf = 1 |
carrot = 1 |
sausage = 1 |
icecream = 1 |
|
apple = 1 | loaf = 1 | carrot = 1 | sausage = 1 | brokolli = 2 | |
apple = 1 | loaf = 1 | carrot = 1 | sausage = 1 | orangejuice = 3 | |
apple = 1 | loaf = 1 | carrot = 1 | chicken = 2 | icecream = 1 | |
apple = 1 | loaf = 1 | carrot = 1 | chicken = 2 | brokolli = 2 | |
apple = 1 | loaf = 1 | carrot = 1 | chicken = 2 | orangejuice = 3 | |
apple = 1 | loaf = 1 | carrot = 1 | steak = 3 | icecream = 1 | |
apple = 1 | loaf = 1 | carrot = 1 | steak = 3 | brokolli = 2 | |
apple = 1 | loaf = 1 | carrot = 1 | steak = 3 | orangejuice = 3 | |
apple = 1 | loaf = 1 | carrot = 1 | fish = 1 | icecream = 1 | |
... | ... | ... | ... | ... | ... |
orange = 2 | bagel = 2 | carrot = 1 | sausage = 1 | brokolli = 1 | |
orange = 2 | bagel = 2 | carrot = 1 | sausage = 1 | orangejuice = 2 |