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

向 or-tools python 中的调度问题添加软约束

如何解决向 or-tools python 中的调度问题添加软约束

工具,我试图用它来为高中生成时间表。 变量是课程、房间和时间段,当然目标是将所有课程分配到某个房间和时间段,同时尊重给定的约束。

enter image description here

enter image description here

问题是在文档中我没有看到它在谈论软约束和硬约束,我添加的所有约束肯定都是硬约束,有没有办法为这个例子实现软约束,只是一个简单的方法

提前致谢。

解决方法

可能是 Do Google Optimization Tools support Soft Constraints? 的副本,但我会添加一些 CP-SAT 示例。

这是一个简单的软限制示例:

from ortools.sat.python import cp_model

model = cp_model.CpModel()
solver = cp_model.CpSolver()

x = [model.NewBoolVar("") for i in range(10)]

# hard constraint: number of 1's >= 4
model.Add(sum(x) >= 4)

# soft constraint: number of 1's <= 5
delta = model.NewIntVar(-5,5,"")
excess = model.NewIntVar(0,"")
model.Add(delta == sum(x) - 5)
model.AddMaxEquality(excess,[delta,0])
model.Minimize(excess)

solver.Solve(model)
print([solver.Value(i) for i in x])
print(solver.Value(excess))

查看更复杂的示例 here

这里是关于完整请求的一个:

from ortools.sat.python import cp_model

model = cp_model.CpModel()
solver = cp_model.CpSolver()

x = [model.NewIntVar(0,10,"") for i in range(10)]

# request: sum() <= 10
req1 = model.NewBoolVar("")
model.Add(sum(x) <= 10).OnlyEnforceIf(req1)

# request: sum() >= 5
req2 = model.NewBoolVar("")
model.Add(sum(x) >= 5).OnlyEnforceIf(req2)

# request: sum() >= 100
req3 = model.NewBoolVar("")
model.Add(sum(x) >= 100).OnlyEnforceIf(req3)

model.Maximize(req1 + req2 + req3)
solver.Solve(model)
print(solver.Value(sum(x)))
print(solver.ObjectiveValue())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。