我正在寻找一种好的算法或技术来找到以下问题的最佳解决方案。首先,我将介绍上下文,然后介绍问题。
我在一家拥有2000多名员工的公司工作;他们所有人都采用模式转变,这意味着任何员工都有一种模式来指定工作日和休息日的顺序。我们有以下模式:
5-2-5-2(5天工作,2天免费,5天工作,2天免费)等等。
5-2-4-3
5-4-5-3
5-3-5-3
此刻,我们拥有所有这些模式以及不同的开始次数,也就是说,某个模式可以在某个日期从该模式内的特定部分开始,例如模式5-4-5-3有17个可能的起始序列,这个数字是5 + 4 + 5 + 3 = 17个可能的序列的总和。
https://en.wikipedia.org/wiki/Shift_plan
现在是问题,
每位员工每6个月可以更改模式并以该模式的任何序列号开始。 但是我们必须分析所有要求并接受或拒绝才能获得公司运营的更好组合,因为我们需要每天都有相同的劳动力,但是我们知道这是不可能的,但是算法将帮助我们找到一个好的方法。解决方案,不是完美的。
我正在用Nurse scheduling problem阅读有关“ Google Or-Tool”的信息,但我不知道如何设置模式序列来创建此问题的解决方案。我阅读了关于GA (genetic algorithms)的一些意见,并且所有人都说,这种解决方案不适用于此类问题。
有人有类似的问题吗?有人可以给我一个比GitHub中的示例更准确的Google OR工具示例。
没有必要找到严格的最佳解决方案;该花名册目前是手动完成的,我可以肯定大多数情况下结果是次优的。
答案 0 :(得分:0)
有人有类似的问题吗?
听起来很像OptaWeb Employee Rostering,它是约束求解器OptaPlanner之上的垂直线。看一下the source code。全部都是开源的。
答案 1 :(得分:0)
我认为可以将其建模为MIP模型。
大声思考:
引入一个二进制决策变量:
δ(i,p) = 1 if pattern i is selected for person p
0 otherwise
这包括当前模式(例如i=0
)。这将允许以下情况:
i=0
这位员工)我们有约束条件
sum(i, δ(i,p)) = 1 ∀p
sum((i,p), pattern(i,p,t)*δ(i,p)) ≈ requiredlevel(t) ∀t
δ(i,p) ∈ {0,1}
这里pattern(i,p,t)
描述了模式i
:如果使用模式(i,p),则如果覆盖了周期t,则为1,否则为0。在这里,我用≈表示“大约”。 (这很容易在目标中使用松弛和惩罚项来建模)。
现在我们最大化
maximize sum((i,p), weight(i,p) * δ(i,p))
其中weight(i,p)
表示对某个模式的偏好(例如weight(0,p)=0
,即当未选择新的首选模式时没有奖励积分)。
这样的设置应该不会太困难。当然,许多改进是可能的。这些类型的模型倾向于很快解决。
答案 2 :(得分:0)
什么是工作流程?
如果您有固定的花名册,并且有人提议一种新的花样。只需删除此人的贡献,测试新模式的所有(17)起点并对其评分即可。
如果可以更改模式或多个员工的起点,请在每个起点创建一个整数变量。从这个起点出发,很容易计算出每个轮班日的人员贡献。然后,您可以优化服务质量每种模式的起点,总结每位员工一周中每天的潜在贡献。
很清楚吗?