如何改善这种两方匹配解决方案?

时间:2018-07-03 08:10:12

标签: ruby algorithm matching bipartite

我正在通过代码斗争进行工作,并且正在尝试Instacart公司挑战带来的busyHolidays挑战。

挑战提供了三个阵列。购物者所包含的字符串代表了他们上班的开始时间和结束时间。订单包含代表订单开始时间和结束时间的字符串,而LeadTime包含代表完成工作所需分钟数的整数。

目标是确定订单是否可以与购物者匹配,以使每个购物者只有一个订单,每个订单都有一个购物者。如果购物者可以在订单时间内开始并完成订单,则该订单只能与该购物者匹配。

我有一个通过19/20测试的解决方案,但是由于看不到上一个测试,所以我不知道出了什么问题。我最初花了几天时间尝试学习诸如Edmond算法和匈牙利算法之类的算法,但是由于缺乏CS背景和数学上的弱点,我有点不知所措,而且似乎无法全神贯注于如何实际实现这些方法,所以我想出了一种解决方案,涉及根据图的可能连接数对图的每一侧的每个节点加权。如果有人可以帮助我看一下我的解决方案,并指出可能会搞砸的地方,或者以某种方式提供更标准的解决方案(对于未经正规算法训练的人来说更容易理解),我将不胜感激。预先感谢。

我会把代码放进去,因为它相当长

代码:https://gist.github.com/JakeTompkins/7e1afc4722fb828f26f8f6a964774a25

1 个答案:

答案 0 :(得分:1)

好吧,我看不出有任何理由认为您正在编写的算法确实可以正常工作,因此有关如何将其弄乱的问题似乎无关紧要。

您已正确地将其标识为分配问题的一个实例。更具体地说,这是“最大二分匹配”问题,而Edmonds-Karp算法是解决该问题的最简单方法(https://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm

但是,这是一种用于在网络中查找最大流量的算法,这比简单的二部匹配要大得多,并且该算法的说明实际上比您需要的复杂得多。可以理解,您从文献中很难实现这一点,但是实际上,当问题简化为简单的(未加权的)二部匹配时,该算法很容易理解:

  1. 进行初始分配
  2. 尝试找到改进
  3. 重复直到找不到更多改进为止。

对于二分匹配,“改进”始终具有相同的形式,这使得此问题易于解决。要寻求改进,您必须遵循以下规则找到一条将未分配的购物者连接到未分配的订单的路径:

  • 这条路可以从任何购物者到他/她可以履行但不能履行的任何订单
  • 该路径只能从任何订单转到当前任务中满足它的购物者。

您可以使用面包优先搜索来找到最短路径,这与更改现有分配的最小数量的改进相对应。

您找到的路径必须具有奇数个边,而偶数个边将是分配。要实现改进,请删除这些分配,然后将其替换为奇数边。其中还有更多,这就是它的一项改进。看起来像这样:

PREVIOUS       PATH FOUND      IMPROVED ASSIGNMENT

    1              1                  1
                 /                  /
A              A                  A
  \              \     
    2              2                  2
                 /                  /
B              B                  B           
  \              \       
    3              3                  3
                 /                  /
C              C                  C
相关问题