问题描述
工具,我试图用它来为高中生成时间表。 变量是课程、房间和时间段,当然目标是将所有课程分配到某个房间和时间段,同时尊重给定的约束。
问题是在文档中我没有看到它在谈论软约束和硬约束,我添加的所有约束肯定都是硬约束,有没有办法为这个例子实现软约束,只是一个简单的方法。
提前致谢。
解决方法
可能是 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())