Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 不同大小的代理和任务集之间的最佳匹配_Algorithm_Language Agnostic_Matching - Fatal编程技术网

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

Algorithm 不同大小的代理和任务集之间的最佳匹配,algorithm,language-agnostic,matching,Algorithm,Language Agnostic,Matching,问题是: 我有一组大小为a的代理a,一组大小为T的任务T 利润函数p(代理、任务)。每个代理只能是 分配了一个任务,每个任务只能由一个代理处理 我需要找到一组(代理、任务)对,它们的总利润 是最大的 我从一个简单的解决方案开始,它可以递归地找到利润最高的(代理、任务)对。结果证明是次优的。然后我尝试了较大集合的所有排列-程序从未完成。:) 我认为这是某种类型的问题,但到目前为止,我只找到了代理和任务数量相等的线性分配问题的解决方案 你能给我指出一个解决这个问题的有效算法吗?或者建议一个解决这个问

问题是:

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

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

我从一个简单的解决方案开始,它可以递归地找到利润最高的(代理、任务)对。结果证明是次优的。然后我尝试了较大集合的所有排列-程序从未完成。:)

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

你能给我指出一个解决这个问题的有效算法吗?或者建议一个解决这个问题的方法吗?

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

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

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

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

这样我们就可以执行munkres算法了。然而,该矩阵意味着(1,2,3,4)的每个元素将被分配,即使该分配的成本非常高。(在本例中,元素4的成本很高,将获取虚拟行。但是,如果元素3的成本类似,那么我将以错误匹配告终)

因此,矩阵被进一步填充:

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


我切换到了容克-沃根算法,它在更短的时间内解决了同样的问题。(尽管在某些情况下可能不会产生完全相同的结果)
我得到了它(显然)是基于它的。

延迟了很多,但你的解决方案终于来了!虽然您试图解决线性赋值问题部分是正确的,但您特别试图解决二部图

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

第一个是贪心搜索,这正是您第一次实现的,它迭代地查找最佳匹配。虽然它可能提供次优解决方案,但大多数情况下,它接近最优。这是最快的

第二种是暴力搜索。正如您所提到的,该程序所需的时间比9x9映射要长,但对于较小的数字,这就足够了,而且是最佳的

第三种是蛮力的变体,但是使用了阿尔法-贝塔树修剪。平均速度提高约20%,但如果超过13x13,内存就会耗尽

第四个是LAPJV,它是最优的,速度非常快。我的意思是1秒内2000x2000快!这是你应该做的,不要动手

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


这个图书馆看起来正是你想要的,只是晚了一年。我想迟做总比不做强。

假设利润为正,你可以添加利润为0的虚拟代理/任务。@Davidisenstat:好主意!你会使用哪种算法?匈牙利人?嗨@dberm22,这真是太棒了-很棒的作品。不过,我在回购协议中找不到许可证?@Andy,谢谢!你想用它做什么就做什么!如果你赚了很多钱,请给我买杯啤酒。否则,享受吧!哈哈,现在我能提供的只是网络积分+1Hey@dberm22!再次感谢您的帮助:)您有没有可能像回购协议一样申请许可证?我觉得在我的代码中引用您的回购url是一种不好的做法,并且没有license@Andy完成。享受:)