如何解决如何在or-tools 1-D bool数组中获取第一个1的索引和最后一个1的索引? 或工具
我想在 or-tools 1-D bool array 中找出第一个 1 的索引和最后一个 1 的索引,它看起来像这样:如果 array=[0,1,0],我希望得到 first_one_index = 2 和 last_one_index=6,我该怎么办?
from ortools.sat.python import cp_model
model = cp_model.CpModel()
solver = cp_model.cpsolver()
work={}
for i in range(8):
work[i]=model.NewBoolVar("work(%i)" % (i))
model.Add(work[0]==0)
model.Add(work[1]==0)
model.Add(work[2]==1)
model.Add(work[3]==0)
model.Add(work[4]==1)
model.Add(work[5]==0)
model.Add(work[6]==1)
model.Add(work[7]==0)
first_one_index = model.NewIntvar(0,7,"")
las_one_index = model.NewIntvar(0,"")
# how to find first 1 and last 1 index
#####################################
status = solver.solve(model)
print("status:",status)
print("first_one_index:",solver.Value(first_one_index))
print("las_one_index:",solver.Value(las_one_index))
解决方法
改编自 Laurent 的回答 here
对于每一天 d,创建两个变量 v1[d] = d * working_var[d] 和 v2[d] = horizon + working_var * (d - horizon)。然后model.AddMinEquality(first_day_worked,v2),model.AddMaxEquality(last_day_worked,v1)
from ortools.sat.python import cp_model
if __name__ == "__main__":
model = cp_model.CpModel()
solver = cp_model.CpSolver()
work = {}
days = 8
horizon = 7
for i in range(days):
work[i] = model.NewBoolVar("work(%i)" % (i))
model.Add(work[0] == 0)
model.Add(work[1] == 0)
model.Add(work[2] == 1)
model.Add(work[3] == 0)
model.Add(work[4] == 1)
model.Add(work[5] == 0)
model.Add(work[6] == 1)
model.Add(work[7] == 0)
first_one_index = model.NewIntVar(0,7,"")
las_one_index = model.NewIntVar(0,"")
v1 = [model.NewIntVar(0,horizon,"") for _ in range(days)]
v2 = [model.NewIntVar(0,"") for _ in range(days)]
for d in range(days):
model.Add(v1[d] == d * work[d])
model.Add(v2[d] == horizon + work[d] * (d - horizon))
model.AddMinEquality(first_one_index,v2)
model.AddMaxEquality(las_one_index,v1)
status = solver.Solve(model)
print("status:",status)
print("first_one_index:",solver.Value(first_one_index))
print("las_one_index:",solver.Value(las_one_index))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。