不同大小的代理和任务集之间的最佳匹配

时间:2014-02-27 17:59:21

标签: algorithm language-agnostic matching

问题:

  

我有一组大小为A的代理a,一组大小为T的任务t   和利润函数p(agent, task)。每个代理人只能是   分配了一个任务,每个任务只能由一个代理处理。

     

我需要找到一组(代理,任务)对的总利润   是最大的。

我已经开始使用一种天真的解决方案,以递归方式找到具有最高利润的(代理,任务)对。结果证明是不理想的。然后我尝试了更大集合的所有排列 - 程序从未完成。 :)

我认为这是某种assignment problem但我到目前为止只找到了线性分配问题的解决方案,其中代理和任务的数量是相等的。

您能指出一个有效的算法来解决这个问题,或者为这个问题提出建议吗?

2 个答案:

答案 0 :(得分:2)

很多延迟,但你的解决方案终于来了!虽然DasKrumelmonster部分正确,但您尝试解决线性分配问题,但您正在尝试解决二分图

看看这个名为Bipartite Solver的GitHub存储库。它不仅为您提供了另一个答案中建议的 Jonker-Volgenant 算法的java实现,还有4种算法可供选择。

第一个是贪心搜索,这正是您刚才提到的 - 它迭代地找到了最佳匹配。虽然它可能提供次优解决方案,但大多数时候它接近最优。这是最快的一群。

第二个是暴力搜索。就像你提到的那样,程序需要花费很多时间才能完成9x9映射,但对于小数字,这是足够的,也是最佳的。

第三种是蛮力的变种,但是使用 alpha-beta树修剪。你的平均速度提高了约20%,但是超过13x13,你的内存耗尽。

第四个是 LAPJV ,这是最佳和疯狂的快速。我的意思是 2000x2000 in 1s 快!这是你应该去的,放下手。

如果您希望在不从源代码构建算法的情况下尝试算法,那么库中会有大量executables

这个库看起来就像你要求的那样,只有一年太晚了。我想,迟到总比没有好。

答案 1 :(得分:1)

这个问题被称为“线性分配问题”。

虽然通常用两组具有相同数量的元素来描述,但这不是必需的。您可以将矩阵填充为二次矩阵。此外,如果没有必要完全分配较大的集合,您可能需要进一步填充矩阵(=每个维度加倍)。

我做了类似的事情,但这是一个成本矩阵(即虚拟元素具有高值)这是原始矩阵K:

enter image description here

不是二次的。然后用虚拟值填充:

enter image description here

这样我们就可以执行munkres算法了。但是,此矩阵表示(1,2,3,4)的每个元素都将分配,即使该分配的成本非常高。 (在这种情况下,元素4的成本很高,并且会获取虚拟行。但是如果元素3具有相似的成本,那么我最终会得到一个不好的匹配)

因此,矩阵进一步填充:

enter image description here

在您的情况下可能不需要最后一步。如果利润不能变为负数,那么任何匹配都会好于没有,对吗?


我切换到 Jonker-Volgenant算法,它在更短的时间内解决了同样的问题。 (虽然在某些情况下可能不会产生完全相同的结果) 我是从MATLAB FileExchange获得的,显然是基于this paper