我正在尝试定义一个约束,该约束将限制求解器生成的唯一值的数量。它可以生成尽可能多的重复副本来解决问题,但是唯一值受到限制。
对于每个值,创建一个布尔变量selected_value
,如果至少为其分配了一个值,则为true。
为此,您需要2套约束:
[从左至右:selected_value
表示已选择值
model.AddBoolOr([var_i_equals_value, ...]).OnlyEnforcedIf(selected_value)
并且从右到左,选择该值表示selected_value
为真
for var_i_equals_value in ...:
model.AddImplication(var_i_equals_value, selected_value)
然后您只需要约束所选值的总和
model.Add(sum(selected_value_array) <= 10)
现在,您需要询问您是否真的需要整数变量,还是仅需要布尔变量矩阵。我建议后者。