考勤打卡/轮班配对算法

时间:2018-02-16 11:09:13

标签: c# .net vb.net solver

我开发了一个考勤系统,员工使用该系统后来导入的终端记录他们的拳头。

当导入时间时,我需要将它们与预期的时间配对。

更清楚地说明:

员工每天的工作都有轮班。每个班次都有一个开始和结束时间。

所以一个典型的案例是2班: 8 - 13和14 - 18

现在员工开始工作并使用终端记录打卡时间。 在一天结束时,我可能会有这样的事情:

7:30,13:15,14:01,17:56

我现在需要将每个打卡时间分配给一个班次,以及该班次是否与开始或结束配对。

如果拳击正好是4,那么很容易但是:

  • 员工有时会不止一次(错误地)冲击,所以你有很多次冲刺时间相互接近
  • 员工有时会忘记打卡(这样你就会丢失拳头)
  • 员工有时候工作到很晚,所以你可能会有额外的实际转变(6次拳击而不是4次)但在这种情况下也许他们会忘记打击(你可能会打5次而不是6次)

目标是在考虑以上所有因素的情况下将打卡时间分配到正确的换档开始或换班结束。

我正在考虑使用微软求解器基础库来解决这个问题,但我从未使用它,也许有人可以指导我使用哪个求解器以及如何对问题进行建模。

或者,如果你有其他的想法,那也可以。

- 示例场景 -

Shift 1: 9 (A) - 13 (B)
Shift 2: 14 (C) - 18 (D)

Times: 8:45, 13:20, 18:15
Solution: 8:45 --> A, 13:20 --> B, none --> C, 18:15 --> D 

Times: 8:45, 13:30, 18:15 
Solution 1: 8:45 --> A, 13:20 --> B, none --> C, 18:15 --> D
Solution 2: 8:45 --> A, none --> B, 13:20 --> C, 18:15 --> D

Times: 8:45, 13:45, 14:12, missing, 19:00, 21:00
Solution: 8:45 --> A, 13:45 --> B, 14:12 --> C, none --> D
19:00 --> E , and 21:00 --> F (E and F being start and end of an additional 'unexpected' shift)

提前致谢。

1 个答案:

答案 0 :(得分:0)

我一直在寻找与您完全一样的算法,但找不到,因此我决定创建自己的算法,所以我做的如下:

  1. 获取fromdate and的最新信息,
  2. 获取期间的punchTimes(在上述范围内)-创建两个列表,一个用于打孔,另一个用于打孔,
  3. 创建两个嵌套的for循环;第一个迭代将在fromdatetodate之间的每一天进行迭代,因此您将获得每次迭代的当前日期。第二个循环将遍历打入列表,以便您可以按员工编号,打入日期和当天时间进行过滤;具有此特定记录(如果不为null);您将滤除同一日期的最大值...

您可以包括轮班标准并获得更具体的记录...