微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在or-tools 1-D bool数组中获取第一个1的索引和最后一个1的索引? 或工具

如何解决如何在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] = horizo​​n + working_var * (d - horizo​​n)。然后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 举报,一经查实,本站将立刻删除。