将N名员工置于具有角色的M个职位的算法

时间:2014-08-05 10:34:46

标签: php algorithm math

我正在尝试使用算法解决数学问题,但我无法开发出合适的算法。

问题是:

  

我有一份员工名单(Jack,John,Al,......)。

     

我有一个角色列表(R1,R2,R3,...)。

     

我有一份工作职位清单(W1,W2,W3,......)。

每个员工都有一组角色,比如Jack有R1和R2,Al有R2和R3,John只有R1。

每个工作岗位都有一组可以支持的角色,比如在W1位置需要R1或R2,在W2位置你需要R3,在W3位置你需要R1或R3。

因此,我需要找到最佳的员工配置 - 工作岗位,以确保每个工作岗位都有一名具有合适职责的员工在那里工作。

我在PHP开发了几个解决方案,这些解决方案效果很好,但不时地根据放置的顺序,不要选择最佳配置并留下未占用的工作位置。

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

对于多项式算法,我将继续这样做。

首先,让我们简化输入。如果我们直接将员工与他们可以占用的工作岗位联系起来,我们就可以摆脱角色。为此,您可以构建一个表角色 - >具有此角色的员工,然后是表位 - >适当的员工(将员工放在另一个表中的相应角色单元格中)。

这会给你一个位置< - >员工关系。

然后,您可以将其视为最大匹配问题。如果您将每个员工和每个职位视为一个节点,您希望匹配尽可能多的节点(即最好的情况下为2 * |位置)。

这是一个二分图(员工与职位之间存在链接,如果该员工可以占据此职位,员工之间或职位之间没有联系),您可以使用多项式算法解决它,例如使用流(例如,在每个链接上放置1个容量,与员工链接的接收器和具有位置的源。请在这里查看详细解决方案http://www.geeksforgeeks.org/maximum-bipartite-matching/(AFAIK,基于BFS的解决方案也可以很好地工作)。