Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何改进此二部匹配解决方案?_Ruby_Algorithm_Matching_Bipartite - Fatal编程技术网

Ruby 如何改进此二部匹配解决方案?

Ruby 如何改进此二部匹配解决方案?,ruby,algorithm,matching,bipartite,Ruby,Algorithm,Matching,Bipartite,我正在进行代码战,正在尝试Instacart公司挑战中的“忙碌生活”挑战 挑战提供了三个阵列。购物者包含表示班次开始和结束时间的字符串。Orders包含表示订单开始和结束时间的字符串,leadTime包含表示完成作业所需分钟数的整数 目标是确定订单是否可以与购物者匹配,以便每个购物者只有一个订单,每个订单有一个购物者。只有购物者能够在订单时间内开始并完成订单,订单才能与购物者匹配 我有一个通过19/20测试的解决方案,但由于看不到最后一个测试,我不知道出了什么问题。我最初花了几天时间试图学习Ed

我正在进行代码战,正在尝试Instacart公司挑战中的“忙碌生活”挑战

挑战提供了三个阵列。购物者包含表示班次开始和结束时间的字符串。Orders包含表示订单开始和结束时间的字符串,leadTime包含表示完成作业所需分钟数的整数

目标是确定订单是否可以与购物者匹配,以便每个购物者只有一个订单,每个订单有一个购物者。只有购物者能够在订单时间内开始并完成订单,订单才能与购物者匹配

我有一个通过19/20测试的解决方案,但由于看不到最后一个测试,我不知道出了什么问题。我最初花了几天时间试图学习Edmond算法和匈牙利算法,但我缺乏计算机科学背景和数学方面的弱点,这让我有点头疼,我似乎无法思考如何实际实施这些方法,因此,我提出了一个解决方案,其中包括根据可能连接的数量对图的每一侧的每个节点进行加权。如果有人能帮我看一下我的解决方案,指出哪里可能会出错,或者提出一个更标准的解决方案,让没有接受过算法正式培训的人更容易理解,我将不胜感激。提前谢谢

我将把代码放在要点中,因为它相当长


代码:

好吧,我看不出有任何理由认为您正在编写的算法实际上会起作用,所以关于您可能会把它搞砸的问题似乎与此无关

您已正确地将其识别为分配问题的一个实例。更具体地说,这是最大二部匹配问题,埃德蒙斯-卡普算法是解决该问题的最简单方法

然而,这是一个在网络中寻找最大流的算法,这是一个比简单的二部匹配更大的问题,并且这个算法的解释比你需要的要复杂得多。从文献中可以理解,您在实现这一点时遇到了一些困难,但实际上,当问题归结为简单的未加权二部匹配时,算法很容易理解:

做一个初步的任务 试着找到一个改进 重复此步骤,直到无法找到更多改进。 对于二部匹配,改进的形式总是相同的,这使得这个问题很容易解决。要找到改进,您必须找到一条路径,将未分配的购物者连接到未分配的订单,遵循以下规则:

该路径可以从任何购物者到他/她能够完成但无法完成的任何订单 路径只能从任何订单转到当前分配中正在完成该订单的购物者。 您可以使用“面包优先”搜索来查找最短路径,该路径将对应于更改最小数量的现有作业的改进

找到的路径必须具有奇数条边,偶数条边将被指定。若要实施改进,请删除这些指定,并将其替换为奇数编号的边。还有一个,这就是它的改进之处。看起来是这样的:

PREVIOUS       PATH FOUND      IMPROVED ASSIGNMENT

    1              1                  1
                 /                  /
A              A                  A
  \              \     
    2              2                  2
                 /                  /
B              B                  B           
  \              \       
    3              3                  3
                 /                  /
C              C                  C

谢谢,我很感激。我所尝试的背后的逻辑是,如果一项工作只能由一名员工完成,那么就应该优先考虑人际关系,而后续的人际关系应该优先考虑需求最少的购物者,从而影响其他最少工作被填补的能力。再说一次,我在这方面没有正式的背景,所以我尽了最大的努力。谢谢你的解释,它澄清了一些事情,我想我现在应该能够实现它了。非常感谢。你可以通过使用这样的规则来选择你的初始任务来减少平均花费的时间,但是他们会被某些情况所愚弄,所以你仍然需要迭代改进。要找到规则失败的情况,请尝试想出一些方法来欺骗规则,使其创建N个未分配购物者的子集,这些购物者只能连接到N-1个未分配订单,或者创建一组N个未分配订单,这些订单只能连接到N-1个未分配购物者。