Php 将N名员工放置在具有角色的M个职位中的算法

Php 将N名员工放置在具有角色的M个职位中的算法,php,algorithm,math,Php,Algorithm,Math,我试图用一种算法来解决一个数学问题,但我无法开发出正确的算法 问题是: 我有一份员工名单(杰克、约翰、艾尔……) 我有一个角色列表(R1、R2、R3等) 我有一份工作岗位清单(W1、W2、W3等) 每个员工都有一套角色,比如杰克有R1和R2,艾尔有R2和R3,约翰只有R1 每个工作岗位都有一组可以支持的角色,比如在W1岗位工作需要R1或R2,在W2岗位工作需要R3,在W3岗位工作需要R1或R3 因此,我需要找到员工的最佳配置——工作岗位,以确保每个工作岗位都有一名具有合适角色的员工在那里工作 我

我试图用一种算法来解决一个数学问题,但我无法开发出正确的算法

问题是:

我有一份员工名单(杰克、约翰、艾尔……)

我有一个角色列表(R1、R2、R3等)

我有一份工作岗位清单(W1、W2、W3等)

每个员工都有一套角色,比如杰克有R1和R2,艾尔有R2和R3,约翰只有R1

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

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

我在
PHP
中开发了两个解决方案,效果很好,但有时会根据放置顺序,不选择最佳配置,让工作位置空置


有人知道如何解决这个问题吗?

对于多项式算法,我会这样做

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

这就给你留下了一个职位-员工关系

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


这是一个二部图(如果员工可以占据此职位,则员工和职位之间存在链接,员工之间或职位之间没有链接),您可以使用多项式算法解决它,例如使用流(在每个链接上放置1个容量,例如,一个与员工链接的接收器和一个带职位的来源)。请在这里查找详细的解决方案(AFAIK,一个基于BFS的解决方案也会很好地工作).

一名员工可以担任多个职位吗?不可以。一名员工一个职位谢谢你有趣的回答。我希望避免使用福特-富尔克森算法,也许可以找到一个轻量级的捷径。我将尝试最大二部匹配。再次感谢!如果你对效率下降感到满意,并且更喜欢这种算法,你可以使用匈牙利算法rithm我想你可以在有链接时将成本设置为1,否则设置为无穷。我将尝试匈牙利算法,我需要确定每个职位是否可以由一名员工担任,以检查当天的员工列表是否有效。谢谢!