分配作业的递归

时间:2013-05-25 12:49:54

标签: php cakephp loops recursion logic

这是一个具体的问题,所以我会先快速解释一下背景。我正在开发软件,为员工分配当天的特定“工作”。为了使他们能够完成工作,他们必须接受培训,以便系统知道每个员工拥有和未接受过培训的内容。

现在我正在做的是:

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”。比尔知道这两份工作,露西只知道结账。

当循环通过时,它将首先寻找工作Checkout的人。它首先会看比尔,看他能不能工作,并指派他。他们将继续寻找客户服务。它跳过账单,因为他已被分配,并检查露西,但她无法工作!这会导致不必要的培训。

我可以很容易地对它进行编码,这样如果它贯穿所有员工并且没有找到任何人,那么就会这样:

//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寻找三人交换等等。

1 个答案:

答案 0 :(得分:2)

具体来说,这是一个Bipartite graph,其中您需要最大匹配数,这可以减少到网络流问题并使用Ford-Fulkerson算法解决。这很好地解释了here