在 or-tools python 中为调度问题添加软约束

Adding soft constraints to a scheduling problem in or-tools python

工具,我正在尝试使用它为高中生成时间表。 变量是课程、房间和时间段,目标当然是在遵守给定约束的情况下将所有课程分配到某个房间和时间段。

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

提前致谢。

可能与 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, 5, "")
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())