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 获取最小和最大总和或绝对值的主要内容,如果未能解决你的问题,请参考以下文章

Google OR-Tools:最小化总时间

OR-Tools:向最小成本流类添加约束?

自定义约束OR-Tools //约束编程

在 C# 中使用 Google OR-Tools 寻找目标?

OR-Tools - 最小化每条路线覆盖的区域

Google 用于 CVRP 的 OR-Tools,同时最小化全局跨度