向 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())