随叫随到调度算法

On-call Scheduling Algorithm

第一个问题在这里发布,感谢您的帮助!

轮班 DS:

{
    hourStart: 0,
    hourEnd: 23,
    primaryOnCall: "dpeters@example.com",
    secondaryOnCall: "mfurgeson@example.com",
}

鉴于 0-23 小时总是有一个“默认”班次,n 个班次可能相互重叠,最早的班次具有最高优先级(默认除外)。轮班可能会重叠到第二天。 Return 涵盖一整天的一系列新班次。

示例输入:

[
    {
        hourStart: 0,
        hourEnd: 23,
        primaryOnCall: "dpeters@example.com",
        secondaryOnCall: "mfurgeson@example.com",
    },
    {
        hourStart: 18,
        hourEnd: 2,
        primaryOnCall: "mfrugal@example.com",
        secondaryOnCall: "ismith@example.com",
    },
    {
        hourStart: 07,
        hourEnd: 15,
        primaryOnCall: "jswanson@example.com",
        secondaryOnCall: "hcotel@example.com",
    }
]

示例输出(无需排序):

[
    {
        hourStart: 0,
        hourEnd: 2,
        primaryOnCall: "mfrugal@example.com",
        secondaryOnCall: "ismith@example.com",
    },
    {
        hourStart: 3,
        hourEnd: 6,
        primaryOnCall: "dpeters@example.com",
        secondaryOnCall: "mfurgeson@example.com",
    },
    {
        hourStart: 7,
        hourEnd: 15,
        primaryOnCall: "jswanson@example.com",
        secondaryOnCall: "hcotel@example.com",
    },
    {
        hourStart: 16,
        hourEnd: 17,
        primaryOnCall: "dpeters@example.com",
        secondaryOnCall: "mfurgeson@example.com",
    },
    {
        hourStart: 18,
        hourEnd: 23,
        primaryOnCall: "mfrugal@example.com",
        secondaryOnCall: "ismith@example.com",
    },
]

我的一位同事建议通过创建一天中每个小时的哈希图来强制执行它,然后在最后循环遍历它以重新创建时间表。如果有什么是固定的(一天总是只有 3 个班次,时间表不重叠,重叠的优先级无关紧要),这将有所帮助,但 none 在这里发挥作用。再次感谢您的阅读,期待您的回复!

有一件事是一天只有 24 小时,因此您可以创建一个具有 24 个槽的 table(以下称为 TimeSlot),每个槽都可以有一个条目有一个优先编号。这些条目是班次的较小组成部分。每个条目都按班次的开始时间标记为优先级。可以将默认班次设置为 +∞ 的优先级,以便它始终获得最低优先级。

例如

决定默认班次if hourStart == 0 && hourEnd == 23。现在遍历此班次的小时数并将它们逐小时插入 TimeSlot

[Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞)]

移动到下一个插槽,从 18 到 2,现在 TimeSlot 看起来像

[S1(18), S1(18), S1(18), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), Def(+∞), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18)]

因为所有默认插槽的优先级都低于 S1

移动到下一个插槽,从 7 到 15,现在 TimeSlot 看起来像

[S1(18), S1(18), S1(18), Def(+∞), Def(+∞), Def(+∞), Def(+∞), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), S2(7), Def(+∞), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18), S1(18)]

再次用 S2.

替换所有默认插槽(如果有这样的重叠,甚至 S1

就是这样。你有时间表。