我正在开发一个调度程序,它将根据他们允许工作的部门(或接受过工作培训的部门)自动安排员工到各个部门。
比方说,PCworld商店有四个部门:笔记本电脑,电视,相机,仓库。 EmployeeN受过培训,可以在笔记本电脑和相机中工作。
假设我必须根据他们受过培训的部门安排100名PCworld同事。我有一个员工班,其中列有允许员工工作的部门。我还有一个部门班,其中包括每个部门的标准,例如所需的最低员工数量。
假设我有一份员工实例的全局列表和一个部门实例列表。 因此,如果我有4个部门,那么我需要从全球员工列表中创建4个已分配员工的列表,以确保满足最低和最高员工数量等部门要求。我不知道那是否有意义抱歉。
解决此解决方案的最佳方法是什么,或者将员工分配到部门的最佳算法是什么?
谢谢你们。
答案 0 :(得分:2)
令人惊讶的是,这是一个经过充分研究的,非平凡的优化问题 - 例如,有一篇关于员工排班的有趣论文here(PDF)。 其中一个示例子集是Nurse Scheduling Problem。
最佳解决方案需要相当多的工作。相反,我首先只是手动优化这一点,例如按适用员工数量(升序)对您的部门进行排序,即首先处理最难的部门。然后,按技能数量(升序)对员工进行分类,即先与最不熟练的员工打交道。
然后开始将您的员工逐个分配到部门列表,循环直到所有内容都满意或者您最终得到一个破碎的解决方案 - 例如你没有工作人员分配到一个部门。然后,应用新的启发式方法 - 例如,将问题部门按原始排序顺序向上移动一个插槽,然后重新开始。
从那里,如果最佳解决方案非常重要,你可以研究遗传算法,线性规划等等 - 但我怀疑在这种情况下真的有点过分。 否则,只需手动调整分配算法。
就工作人员和部门名单的建模而言,这是相当直接的;您只需为每个员工/部门使用一个类或结构,并将它们存储在列表中。这使您可以访问所有LINQ功能,允许您按需生成排序列表和子集。网上有很多例子;对于一个讨论(以及对LINQPad的良好引用),请参阅this question。
答案 1 :(得分:0)
如果你使用Linq,你可以试试.contains()方法。
这是一个关于它的msdn页面的链接。
http://msdn.microsoft.com/en-us/library/bb352880(v=vs.110).aspx
您可以查看员工N是否包含PCWorld的某些字段。
假设员工的班级对象中有笔记本电脑和摄像头,PCWorld也是如此。
答案 2 :(得分:0)
在我看来,在部门级别拥有一组员工更为理想,而不是相反。您可以通过
配置此功能Dictionary<Department, List<Employee>>
或在Department类型中明确定义Employee集合属性。