【问题标题】:Or-Tools CpSolver Get Minimum and Maximum Sum or absoluteOr-Tools CpSolver 获取最小和最大总和或绝对值
【发布时间】:2020-06-30 21:33:38
【问题描述】:

我是混合整数编程的新手。我之前使用过 gurobi 工具来构建这个模型。但由于成本原因,我想切换到 or-tools,但我无法执行相同的逻辑。

我要解决的问题是最小化变量总和的差异。

换句话说,我有员工,我想按时间表平均分配他们,以确保他们的分配对每个人都公平。

所以我按照以下步骤构建了我的模型:

1- 为每天每个班次的每位员工创建 IntVar。 2- 我添加了一个约束,即每个员工每天都应该轮班

现在我希望我的模型能够解决每个员工参加的便便次数的总和,并尝试最小化员工参加的最小轮班和最大轮班之间的差异。

这可以通过多种方式实现

1-得到linearExpr的最小值和最大值(雇员的总和)并最小化差异 2- 或 , 平均班次与每位员工参加的每个班次之间差异的绝对总和。

很遗憾,我无法为此找到最大、最小或绝对实现。

如果你们有一个建议我可以做到这一点,请解释一下。

谢谢

【问题讨论】:

    标签: python c# linear-programming or-tools mixed-integer-programming


    【解决方案1】:

    您正在寻找的功能是:

    但在这个官方示例中,他们将 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的解决方案,stackoverflow.com/questions/53356121/fair-shift-distribution
    • 是的,我相信你必须创建中间变量并将它们与每个线性表达式相等
    • AddLinMaxEquality 是实验代码。它尚未准备好以所有语言导出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2020-08-16
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多