如何解决如何使用or-tools在布尔数组中制作K个不同的元素?
我想在布尔数组中使K个不同的元素,我使用代码:model.Add(len(set([[shifts [[i)] for range in(10)]))== 4),但不是工作!我该怎么办?
model = cp_model.CpModel()
solver = cp_model.cpsolver()
shifts = {}
ones = [model.NewBoolVar("") for _ in range(10)]
for i in range(10):
shifts[(i)] = model.NewIntvar(0,10,"shifts(%i)" % i)
for i in range(10):
model.Add(shifts[(i)] >0).OnlyEnforceIf(ones[(i)])
model.Add(shifts[(i)] == 0).OnlyEnforceIf(ones[(i)].Not())
model.Add(sum(ones[(i)] for i in range(10)) == 5)
# I want make 4 different but it not work!
#model.Add(len(set([shifts[(i)] for i in range(10)]))==4)
status = solver.solve(model)
print("status:",status)
res=[]
for i in range(10):
res.append(solver.Value(shifts[(i)]))
print(res)
解决方法
使用布尔值对您的整数进行编码,然后为每个值添加另一个布尔值以将其标记为已使用
from ortools.sat.python import cp_model
model = cp_model.CpModel()
solver = cp_model.CpSolver()
shifts = {}
used = [model.NewBoolVar("") for j in range(10)]
for i in range(10):
for j in range(10):
shifts[i,j] = model.NewBoolVar(f"shifts({i},{j})")
# shifts[i,j] => used[j]
model.AddImplication(shifts[i,j],used[j])
model.Add(sum(shifts[i,j] for j in range(10)) == 1)
model.Add(sum(shifts[i,0].Not() for i in range(10)) == 5)
for j in range(10):
# all(shifts[_,j] == 0) => used[j].Not()
model.AddBoolOr([shifts[i,j] for i in range(10)] + [used[j].Not()])
model.Add(sum(used) == 4)
status = solver.Solve(model)
print("status:",status)
res = []
for i in range(10):
for j in range(10):
if solver.Value(shifts[i,j]):
res.append(j)
print(res)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。