繁体   English   中英

OR-Tools (C#) 中的护士调度问题(配对分布)

[英]Nurse scheduling Problem (Pair Distribution) in OR-Tools (C#)

这是关于护士调度问题。 如何在 OR-Tools (C#) 中实现护士配对? 即:

  1. Nurse-1 不得与 Nurse-2 一起工作。
  2. 如果nurse-1 工作,那么nurse-2 也必须工作。

先感谢您。

你可以看看这个更完整的例子: https://github.com/google/or-tools/blob/stable/examples/dotnet/ShiftSchedulingSat.cs

您有两个 Boolean 变量,指示nurse_a 或nurse_b 是否正在工作。

问题 1 是:nurse_a 暗示 not(nurse_b) 而nurse_b 暗示 not(nurse_a)

问题 2 是:nurse_1 表示护士 2

我有超过 3 个班次 - 总共 17 个。下面的代码部分有效,但我没有为所有班次(早上 + 下午)管理“允许”分支,只有早上班次或下午班次。 #`

        //// Employee Pairs
        ///
        List<ILiteral> employee_pair = null;
        List<ILiteral> employee_pair_MorningShifts = null;
        List<ILiteral> employee_pair_AfternoonShifts = null;

        foreach (var (e1, e2, allowed) in EmployeePairs)
        {
            foreach (int d in Range(numDays))
            {
                // Pair is allowed
                if (allowed)
                {
                    //foreach (var s in MorningShifts)
                    //{
                    //    employee_pair_MorningShifts = new List<ILiteral>()
                    //    {
                    //        work[e1, s.Index, d],
                    //        work[e2, s.Index, d]
                    //    };
                    //    IntVar employee_pairVar_MorningShifts = model.NewBoolVar($"employee_pairVar_MorningShifts (employee {e1}, shift {s}, day={d}");
                    //    employee_pair_MorningShifts.Add(employee_pairVar_MorningShifts);
                    //    model.AddBoolOr(employee_pair_MorningShifts);
                    //    objBoolVars.Add(employee_pairVar_MorningShifts);
                    //    objBoolCoeffs.Add(4);
                    //}

                    foreach (var s in AfternoonShifts)
                    {
                        employee_pair_AfternoonShifts = new List<ILiteral>()
                        {
                            work[e1, s.Index, d],
                            work[e2, s.Index, d]
                        };
                        IntVar employee_pairVar_AfternoonShifts = model.NewBoolVar($"employee_pairVar_AfternoonShifts (employee {e1}, shift {s}, day={d}");
                        employee_pair_AfternoonShifts.Add(employee_pairVar_AfternoonShifts);
                        model.AddBoolOr(employee_pair_AfternoonShifts);
                        objBoolVars.Add(employee_pairVar_AfternoonShifts);
                        objBoolCoeffs.Add(4);
                    }
                }
                else
                {
                    // Pair is forbidden
                    foreach (var s in shifts) 
                    {
                        employee_pair = new List<ILiteral>()
                        {
                            work[e1, s.Index, d],
                            work[e2, s.Index, d]
                        };
                        IntVar employee_pairVar = model.NewBoolVar($"employee_pair (employee {e1}, shift {s}, day={d}");
                        employee_pair.Add(employee_pairVar);
                        model.AddBoolOr(employee_pair);
                        objBoolVars.Add(employee_pairVar);
                        objBoolCoeffs.Add(4);
                    }
                }
            }
        }

`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM