如果我有一个多功能背包,但我想限制每个物品可以放入的背包的数量,那么从示例中看似乎不太清楚。例如,我有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)
我将如何创建这样的条件?
答案 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)]实际上是布尔值。所以您可以忽略第一部分