根据员工日程安排生成最近的团队C#

时间:2017-06-07 21:41:34

标签: c# algorithm schedule c#-7.0

我获得了一份带有列的员工日程表csv:

employee ID, first last name, sunday schedule, monday schedule, ... , saturday schedule

每位员工1周的时间表。我附上了部分csv文件的屏幕截图。总文件大约有300行。

schedules.csv

我需要根据员工生成15人的团队。时间表(地点不重要),以便每个团队的员工彼此之间的时间表最接近。我尝试过的伪代码:

  • 将csv文件解析为日程表数组(我自己的结构定义)

  • 将具有相同时间表的员工匹配到团队中(创建~5个全尺寸团队,20 - 25个半满团队,留下50个不与任何人匹配的时间表)

    < / LI>
  • 对于i = 1到14,对于大小为i的团队的每个成员,找到具有最接近的时间表(作为整体)的团队并将该成员添加到该团队。一旦团队达到15级,将其标记为&#34;完成&#34;。

这有点奏效,但绝对没有给我最好的球队。我的问题是,是否有人知道更好的方法来做到这一点?伪代码或只是一般性的想法会有所帮助,谢谢。

编辑:这是比较公式的一个例子 该比较基于代理商时间表之间的半小时差异块。特工25的得分为16,因为他与特工23和24的差距为8个半小时。团队的总得分为32,基于每个人的得分加在一起。

Comparison

并非所有代理人都工作8小时,许多代理人休假不同,这对他们的亲密关系影响最大。得分了。此外,一些代理商在某一天的日程安排与正常日程安排不同。例如,一个代理人可能在星期一上午7点到下午3点工作,但周五周五上午8点到下午4点工作。

2 个答案:

答案 0 :(得分:1)

无法确定日程安排,但在字符串算法中,您可以找到edit distance计算。我们的想法是定义从另一个字符串中获取一个字符串所需执行的操作数。例如,kittensitting之间的距离为3,取代为2,删除为1。我认为您可以在两个员工之间定义一个指标&#39;以类似的方式安排。

现在,在你有一个距离函数后,你可以开始一个聚类。 k-means算法对您来说可能是一个好的开始,但它的主要缺点是组的数量最初是固定的。但我认为您可以轻松调整一般逻辑以满足您的需求。之后,您可以尝试一些其他方法来对数据进行分组,但您真的应该从距离函数开始,然后在员工记录上进行优化。

答案 1 :(得分:1)

除非你找到一种方法可以得到一个确切的最佳答案,否则我会在最后添加一个爬山阶段,反复检查是否在团队之间交换任何一对代理会改善事情,如果是在这种情况下,只有在重新检查每对代理时停止,并且没有更多的改进。

我会这样做有两个原因:

1)这种爬山经常发现相当不错的解决方案。

2)人们善于发现这样的改进。如果你制作一个计算机生成的时间表,人们可以找到简单的改进(可能是因为他们注意到他们经常与另一个团队的某个人同时安排),那么你会看起来很傻。

考虑(2)寻找本地改进的另一种方法是寻找同时安排来自不同团队的少数人的情况,看看你是否可以将他们全部交换到同一个团队。