我对这个调度示例有一个概念性的问题:
https://github.com/google/or-tools/blob/master/examples/python/shift_scheduling_sat.py
它将域问题建模为布尔标志的 3 维张量 [employee, shift, day],表示特定员工在特定日期分配到特定班次。
几乎没有传达关于轮班本身的信息(除了是休息日、上午、下午还是夜班)。
然后,它add_soft_sequence_constraint
与 一起使用negated_bounded_span
,例如,将连续休假的天数限制为最多 1 或 2 天。
对于我的问题,我有未预定义的可变班次长度——解决方案的关键部分是每次班次的长度。总体思路是,全天都有不同的覆盖要求,例如从上午 8 点到上午 10 点只需要 1 名员工,从上午 10 点到下午 4 点需要 2 名员工,从下午 4 点到晚上 8 点需要 1 名员工。还有一份员工名单及其要求:他们每天的最小和最大工作时间是多少,他们可以分配到的最小和最大轮班时间,每天可以分配的最大轮班数,最短时间间隔班次等。不同员工的班次可以完全或部分重叠。
我可以用与上面示例类似的方式对此进行建模,在该示例中,我通过将每天分成 24 个时间窗口,每 1 小时长来增加班次维度的大小。员工被分配到这些固定的时间窗口。移位是分配给 True 的连续变量序列。为了使轮班符合一些常识(例如,早上 1 小时没有人进来,然后在午夜前又 1 小时),我可以使用与上述示例类似的方法,其中我需要特定的最小和最大轮班持续时间(分配给员工的连续时间窗口数)。
这可行,但感觉力适合这个 is-this-employee-assigned-to-this-shift 布尔张量模型。
我的问题是 - 是否有更自然的方法来使用整数、间隔或其他东西对约束进行建模,例如建模为每天的班次列表,其中“班次”是开始和结束时间以及分配的员工?