Or-Tools CpSolver 获取最小和最大总和或绝对值
Posted
技术标签:
【中文标题】Or-Tools CpSolver 获取最小和最大总和或绝对值【英文标题】:Or-Tools CpSolver Get Minimum and Maximum Sum or absolute 【发布时间】:2020-06-30 21:33:38 【问题描述】:我是混合整数编程的新手。我之前使用过 gurobi 工具来构建这个模型。但由于成本原因,我想切换到 or-tools,但我无法执行相同的逻辑。
我要解决的问题是最小化变量总和的差异。
换句话说,我有员工,我想按时间表平均分配他们,以确保他们的分配对每个人都公平。
所以我按照以下步骤构建了我的模型:
1- 为每天每个班次的每位员工创建 IntVar。 2- 我添加了一个约束,即每个员工每天都应该轮班
现在我希望我的模型能够解决每个员工参加的便便次数的总和,并尝试最小化员工参加的最小轮班和最大轮班之间的差异。
这可以通过多种方式实现
1-得到linearExpr的最小值和最大值(雇员的总和)并最小化差异 2- 或 , 平均班次与每位员工参加的每个班次之间差异的绝对总和。
很遗憾,我无法为此找到最大、最小或绝对实现。
如果你们有一个建议我可以做到这一点,请解释一下。
谢谢
【问题讨论】:
【参考方案1】:您正在寻找的功能是:
AddMaxEquality AddMinEquality AddAbsEquality但在这个官方示例中,他们将 delta 最小化为平均值:
https://github.com/google/or-tools/blob/master/examples/python/reallocate_sat.py
这是一个简化版:
from ortools.sat.python import cp_model
model = cp_model.CpModel()
total = 35
n = 5
avg = total // n
ints = [model.NewIntVar(0, 10, str(i)) for i in range(n)]
delta = model.NewIntVar(0, total, "delta")
for i in ints:
model.Add(i >= avg - delta)
model.Add(i <= avg + delta)
model.Minimize(delta)
solver = cp_model.CpSolver()
solver.Solve(model)
print([solver.Value(i) for i in ints])
【讨论】:
AddMaxEquality 和 AddMinEquality 和 AddAbsEquality 将 IntVar 作为参数,在我的情况下,我有 SumArray 的 LinearExp。经过我的搜索,我发现在 C++ 中它支持接受 LinearExpr 的 AddLinMinEquality 和 AddLinMaxEquality 和 AddLinAbsEauality。但不确定为什么它在 C# 中不可用你能帮我解决这个问题吗? 我认为这可能是使用python的解决方案,***.com/questions/53356121/fair-shift-distribution 是的,我相信你必须创建中间变量并将它们与每个线性表达式相等 AddLinMaxEquality 是实验代码。它尚未准备好以所有语言导出。以上是关于Or-Tools CpSolver 获取最小和最大总和或绝对值的主要内容,如果未能解决你的问题,请参考以下文章