多背包,可放入物品的背包数量有限制

时间:2019-11-27 22:04:49

标签: or-tools

如果我有一个多功能背包,但我想限制每个物品可以放入的背包的数量,那么从示例中看似乎不太清楚。例如,我有10个背包,并且我有可以同时放入两个背包的物品。我有这样的代码:

x[(item, bag)] = model.NewIntVar(0, 1, 'x_%s_%s' % (item, bag))
model.Add(
    len(set(bag
        for item in data['all_items']
        for bag in data['all_bags']
        if x[(item, bag)] > 0
    )
) <= 2)

我将如何创建这样的条件?

1 个答案:

答案 0 :(得分:1)

您可以创建一个布尔值,指示是否在袋子中。

presence[(item, bag)] = model.NewBoolVar("")
model.Add(x[item, bag] > 0).OnlyEnforceIf(presence[item, bag])
model.Add(x[item, bag] == 0).OnlyEnforceIf(presence[item, bag].Not())

然后您可以约束该总和

for item in data["all_items"]:
    model.Add(sum(x[item, bag] for bag in data["all_bags"]) <= 2)

这里是一个示例:https://github.com/google/or-tools/blob/stable/examples/python/balance_group_sat.py#L102

编辑:刚刚意识到您的x [(item,bag)]实际上是布尔值。所以您可以忽略第一部分