1

这是一个具体的问题,所以我会先快速解释一下背景。我正在开发一种软​​件,可以将员工分配到当天的特定“工作”。为了让他们从事这项工作,他们必须接受培训,这样系统才能知道每个员工都接受过哪些培训,哪些还没有接受过培训。

现在我正在做的是这样的:

foreach ($jobs as $job){
   foreach($employees as $emp){
       if (job doesn't have employee && employee isn't assigned to job && employee has been trained on job){
          assign them;
          break;
       }
   }
}

这有点工作,但是有一个问题。考虑以下简化示例。

有 2 个工作:“结帐”和“客户服务”

有 2 名员工:“Bill”和“Lucy”。比尔知道这两种工作,露西只知道结帐。

当循环运行时,它会首先寻找工作结帐的人。它将首先查看比尔,看看他是否可以工作,然后分配给他。他们将继续寻找客户服务。它跳过账单,因为他已经被分配,并检查露西,但她不能工作!这会导致不必要的培训。

我可以很容易地对其进行编码,这样如果它遍历所有员工并且找不到任何人,它会像这样进行:

//We didn't find anyone, let's look for a potential swap
foreach($employees as $emp){
   if (emp has been trained on job && emp is already assigned something else){
      //Find someone else to work their assigned job, so they can work this one
      foreach($employees as $emp2){
         if ($emp != $emp2 && emp2 can work emp's job && emp2 isn't already assigned anything){
            swap the two;
         }
      }
   }
}

相当简单。但这仅适用于与 2 名员工打交道的交换。如果交换如此复杂以至于需要移动四个人怎么办?理想情况下,我想提出一个递归解决方案,我可以设置一个值 $maxDepth = 5 或其他东西。

如果它不能立即找到某人,它会进入 2 深度,寻找我上面描述的两人交换。如果仍然不能,它会进入深度 3 寻找三人交换等。

4

1 回答 1

2

具体来说,这是一个二分图,其中您需要最大匹配数,这可以简化为网络流问题并使用 Ford-Fulkerson 算法解决。这在这里得到了很好的解释。

于 2013-05-26T05:32:22.343 回答