根据员工排班生成最接近的团队 C#
Generate closest teams based on employee schedules C#
我得到了一份包含以下列的员工时间表的 csv:
employee ID, first last name, sunday schedule, monday schedule, ... , saturday schedule
每个员工 1 周的时间表。我附上了 csv 文件的一部分的屏幕截图。整个文件大约有 300 行。
我需要根据员工的日程安排(位置无关紧要)生成 15 人的团队,以便每个团队中的员工的日程安排彼此最接近。我尝试过的伪代码:
将 csv 文件解析为时间表数组(我自己的结构定义)
将具有完全相同时间表的员工匹配到团队中(创建约 5 个完整团队,20 - 25 个半满团队,留下约 50 个时间表与任何人都不匹配)
对于 i = 1 到 14,对于大小为 i 的团队的每个成员,找到具有最接近时间表(作为一个整体)的团队并将该成员添加到该团队。一旦团队达到 15 人,将其标记为 "done".
这有点奏效,但绝对没有给我最好的团队。我的问题是有人知道更好的方法吗?伪代码或一般想法会有所帮助,谢谢。
编辑:这是比较公式的示例
比较基于代理时间表之间的半小时差异。特工25的分数是16,因为他和特工23、24相差8个半小时,大家的分数相加,全队总分是32。
并非所有代理人每天工作 8 小时,而且许多人有不同的休息日,这对他们的 "closeness" 分数影响最大。此外,一些代理在某一天的日程安排与正常日程安排不同。例如,一位代理可能在周一早上 7 点到下午 3 点工作,但在周二到周五早上 8 点到下午 4 点工作。
无法确定时间表,但在字符串算法中您可以找到 edit distance 计算。这个想法是定义从一个字符串中获取另一个字符串所需执行的操作数。例如,kitten
和 sitting
之间的距离为 3,替换为 2,删除为 1。我认为您可以用类似的方式在两个员工的日程安排之间定义一个指标。
现在,有了距离函数之后,就可以开始聚类了。 k-means 算法对您来说可能是一个好的开始,但它的主要缺点是组数最初是固定的。但我认为您可以根据自己的需要轻松调整一般逻辑。之后,您可以尝试一些其他方法来对数据进行聚类,但您真的应该从距离函数开始,然后简单地根据您的员工记录对其进行优化。
除非你找到一个能给你一个准确的最佳答案的方法,否则我会在最后添加一个爬山阶段,反复检查以查看在团队之间交换任何一对代理是否会改善事情,如果就是这样,只有当它重新检查了每一对代理并且没有更多的改进可以做时才停止。
我会这样做有两个原因:
1) 这种爬山法经常能找到相当好的解决方案。
2) 人们善于发现这样的改进。如果你制作了一个计算机生成的时间表并且人们可以找到简单的改进(也许是因为他们注意到他们经常与另一个团队的人同时安排)那么你会看起来很傻。
考虑 (2) 另一种找到局部改进的方法是寻找同时安排来自不同团队的少数人的情况,看看是否可以将他们全部调换到同一个团队。
我得到了一份包含以下列的员工时间表的 csv:
employee ID, first last name, sunday schedule, monday schedule, ... , saturday schedule
每个员工 1 周的时间表。我附上了 csv 文件的一部分的屏幕截图。整个文件大约有 300 行。
我需要根据员工的日程安排(位置无关紧要)生成 15 人的团队,以便每个团队中的员工的日程安排彼此最接近。我尝试过的伪代码:
将 csv 文件解析为时间表数组(我自己的结构定义)
将具有完全相同时间表的员工匹配到团队中(创建约 5 个完整团队,20 - 25 个半满团队,留下约 50 个时间表与任何人都不匹配)
对于 i = 1 到 14,对于大小为 i 的团队的每个成员,找到具有最接近时间表(作为一个整体)的团队并将该成员添加到该团队。一旦团队达到 15 人,将其标记为 "done".
这有点奏效,但绝对没有给我最好的团队。我的问题是有人知道更好的方法吗?伪代码或一般想法会有所帮助,谢谢。
编辑:这是比较公式的示例 比较基于代理时间表之间的半小时差异。特工25的分数是16,因为他和特工23、24相差8个半小时,大家的分数相加,全队总分是32。
并非所有代理人每天工作 8 小时,而且许多人有不同的休息日,这对他们的 "closeness" 分数影响最大。此外,一些代理在某一天的日程安排与正常日程安排不同。例如,一位代理可能在周一早上 7 点到下午 3 点工作,但在周二到周五早上 8 点到下午 4 点工作。
无法确定时间表,但在字符串算法中您可以找到 edit distance 计算。这个想法是定义从一个字符串中获取另一个字符串所需执行的操作数。例如,kitten
和 sitting
之间的距离为 3,替换为 2,删除为 1。我认为您可以用类似的方式在两个员工的日程安排之间定义一个指标。
现在,有了距离函数之后,就可以开始聚类了。 k-means 算法对您来说可能是一个好的开始,但它的主要缺点是组数最初是固定的。但我认为您可以根据自己的需要轻松调整一般逻辑。之后,您可以尝试一些其他方法来对数据进行聚类,但您真的应该从距离函数开始,然后简单地根据您的员工记录对其进行优化。
除非你找到一个能给你一个准确的最佳答案的方法,否则我会在最后添加一个爬山阶段,反复检查以查看在团队之间交换任何一对代理是否会改善事情,如果就是这样,只有当它重新检查了每一对代理并且没有更多的改进可以做时才停止。
我会这样做有两个原因:
1) 这种爬山法经常能找到相当好的解决方案。
2) 人们善于发现这样的改进。如果你制作了一个计算机生成的时间表并且人们可以找到简单的改进(也许是因为他们注意到他们经常与另一个团队的人同时安排)那么你会看起来很傻。
考虑 (2) 另一种找到局部改进的方法是寻找同时安排来自不同团队的少数人的情况,看看是否可以将他们全部调换到同一个团队。