gpt4 book ai didi

python - CP-SAT 天花板

转载 作者:行者123 更新时间:2023-12-04 17:33:30 26 4
gpt4 key购买 nike

在调度问题中。我想按工作天数分配假期。现在我有一个使用多个 bool 标志的有效解决方案,但它的扩展性不是很好。

from ortools.sat.python import cp_model
from math import ceil

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

days = model.NewIntVar(0, 365, 'days')
vacations = model.NewIntVar(0, 30, 'vacations')

for i in range(365 + 1):
flag_bool = model.NewBoolVar(f'days == {i}')
model.Add(days == i).OnlyEnforceIf(flag_bool)
model.Add(days != i).OnlyEnforceIf(flag_bool.Not())
model.Add(vacations == ceil(i * 30 / 365)).OnlyEnforceIf(flag_bool)

# test
model.Add(days == 300)

status = solver.Solve(model)

print(solver.Value(days), solver.Value(vacations))

有什么建议吗?

编辑:一个更普遍的问题是,是否有更好的方法来实现一个变量到另一个变量的预先计算的任意映射。

最佳答案

按照 Laurent 的建议解决:

ceil(days * 30 / 365) == (days * 30 + 364) // 365

因此

from ortools.sat.python import cp_model

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

days = model.NewIntVar(0, 365, 'days')
vacations = model.NewIntVar(0, 30, 'vacations')
tmp = model.NewIntVar(364, 365 * 30 + 364, 'days*30+364')

model.Add(tmp == days * 30 + 364)
model.AddDivisionEquality(vacations, tmp, 365)

# test
model.Add(days == 300)

status = solver.Solve(model)

print(solver.Value(days), solver.Value(vacations))

关于python - CP-SAT 天花板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57671280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com