图像缩略图

线性分配问题的LAPJV - Jonker-Volgenant算法V3.0

版本1.14.0.0(4.35 kB) 易曹
MATLAB实施Jonker-Volgenant算法求解圈。
4.9
21级

9下载

更新2013年4月11日

视图版本历史

查看许可证

对于线性分配问题,Jonker-Volgenant算法比著名的匈牙利算法要快得多。这个Matlab实现是修改了原来的c++代码,由Roy Jonker,算法的发明者之一。它比作者的munkres代码(v2.2)快10倍。在普通英特尔迅驰处理器中,它可以在大约3秒内解决1000 x 1000的问题。

V1.1返回对偶变量和简化的成本矩阵。
V1.2可以处理非平方分配问题。
V2.0对于成本范围较大的问题更快。
V2.1包含更改成本解决方案以提高某些问题的性能的选项。
v2.2删除一个小bug以避免NaN为1x1案例。
v2.3删除一个小错误以处理所有inf的成本矩阵。
V2.4修复了一个与解决算法的已知问题相关的错误。
V3.0修复了自v2.0以来引入的一个bug。
参考:
R. Jonker和A. Volgenant,“用于密集和空闲线性分配问题的最短增广路径算法”,《计算》,第38卷,第325- 340,1987。

引用作为

易曹(2021)。线性分配问题的LAPJV - Jonker-Volgenant算法V3.0(//www.tianjin-qmedu.com/matlabcentral/fileexchange/26836-lapjv-jonker-volgenant-algorithm-for-linear-assignment-problem-v3-0),MATLAB中央文件交换。恢复.

意见及评分(58)

米哈尔·克瓦斯尼卡

@Kanchana Katta尝试使用Costmat输入矩阵运行LAPJV功能!没有任何输入,我不确定你的期望是什么:)

也许在你评论之前,你应该学习一些关于Matlab的东西…

勘察娜katta

很有用,
但无法运行此代码。。。最大成本=最小值(1e16,最大值(最大成本));错误,没有足够的输入参数..任何人都可以帮助。

文州段

法比奥

嗨,也许我发现了一只虫子。
以代价矩阵similmat =[4.267407110386034 4.996787836374375 4.992114261289878]为向量,得到如下输出:

[任务,成本]=lapjv(-similmat,1E-15)
numfree =
2.
赋值=
2.
成本=

因此,similmat的第二个元素被正确地选择了,但代价变成了Inf。
这里的问题是什么?
谢谢

珍娜·昆

这能处理多重指派问题吗(指派多人执行任务)

高斯

谁有能用simulink工作的版本?万博1manbetx当我们用simulink编译当前版本时,我们得到以下预期的标量值。万博1manbetx这个表达式有大小[:?x 1]。

功能'matlab函数'(#74.9298.9302),第269行,第21栏:
“i2-1”

广宁谭

很有用

杨大卫

玛丽·安·哈里森

太好了,正是我想要的。

Ozge Gurel

我正在寻找tsp或最短路径问题在matlab。谁有?

比尔奥托

杰伊,你应该选择一个成本矩阵和一个独特的解决方案。Magic(90)有几个解决方案,所有这些解决方案的成本都是134460。您应该通过检查几个不同算法的成本来验证这一点。底线:万博 尤文图斯Lapjv v。3.0给出了正确的解决方案,只是没有将其标记为非唯一性。比尔

假设我在Octave中运行这个,但我相当确定它给了我一个错误的对齐,使用以下代码“px = lapjv(magic(90))”

结果是
px=

第1列到第31列:(注意:注意换行)

72 23 73 74 75 76 77 78 79 71 24 88 86 84 85 83 87 82 89 90 81 80 1 45 44 43 42 41 40 39 38

第32至62栏:

37 36 35 34 33 32 31 30 29 28 27 26 70 25 68 22 21 67 66 18 20 65 64 19 63 57 62 17 61 16 60

第63至90栏:

15 59 14 58 13 46 12 56 11 10 55 54 9 53 8 52 7 51 6 50 5 49 4 3 48 47 2 69

当它应该这样做(使用Raparalignment包Linearassigmment函数中获取)

> px1
第1列至第37列(再次注意:小心包装线)
23 89 87 84 82 80 78 76 74 73 71 69 66 64 62 61 58 56 54 52 50 49 2 11 45 10 1 3 45 6 78 9 22 21 18

38号到74号
16 14 15 13 17 12 19 20 68 88 86 85 83 81 79 77 75 72 70 57 67 65 63 60 59 51 55 53 48 47 46 90 44 43 42 41 40

75到90号
39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24

庞奎

伟大的

唐纳塔莱

你好,

我正在运行代码注释中的示例:

%例2:1000 x 1000随机数据
%{
n = 1000;
A=兰特(n)。/rand(n);
抽搐
[a,b]=lapjv(a);
Toc %约0.5秒
%}

解决这个问题所需的时间远远超过几秒,更像是40秒。这是一款全新的Intel core i5-2400 3.10GHz处理器,配备64位Windows 7和16 Gb RAM。

在您丰富的代码优化经验中,您能给出一个为什么计算时间这么长的原因吗?

法比奥

你好,
此代码看起来非常有趣。
我使用的是v3.0,我可能遇到了一个bug/问题。在我看来,对于不同的成本矩阵(来自大小不同的潜在问题),解决方案在行模式和col模式之间切换。
我没有看到任何参数/切换来控制此行为,它是如此吗?如何在例如,始终获得解决方案。col indices?法比奥

比尔奥托

v3.0似乎每次都能给出正确的结果,100 × 100矩阵的速度比Munkres快4倍。谢谢你的精彩表演,易。

比尔奥托

易,它似乎失败了2x2(0.0022%)和3x3成本矩阵约0.014%的随机案例。对于4x4,它在超过100万个案件中没有失败,但这并不意味着它不会在一些更大的样本中。这意味着追踪的真正艰难的错误,我想猜测。账单

比尔奥托

易建联,我试过Jen下面的例子,它似乎是一个真正的bug。比尔

雅各布

我有以下错误,有人能帮我吗?

???错误:文件:lapjv.m线:146列:7
表达式或语句不正确——可能是不平衡的(、{或[。

代码似乎为该成本矩阵返回了错误的解决方案:

费用=
[0.2593 0.0697 0.7715;
0.1671 0.3699 0.0671;
0.1117 0.1462 0.0611]

[a, b] = lapjv(cost);
A = [2 1 3]
b = 0.2979

正确的解决方案是a=[2 3 1],b=0.2486。

Kristofer Kusano

谢谢你的帖子,这很棒。

约书亚福格斯坦

这是一段非常棒的代码,谢谢!
我注意到“更快的Jonker-Volgenant分配算法”似乎有一个很好的功能,尚未在此版本中实现?你有计划包括吗?非常感谢,Joshua

伟大的

易曹

谢谢你,德米特里,这个错误现在已经修复了。

Dmitri Kamenetsky

我认为我发现了一个错误在lapjv时Inf值被使用。在下面的lapjv给出了错误的答案(与munkres相比):

一个=魔法(5);
A(1,3)=Inf
[MUNKRESASSIGNMENT MUNKRESCOST] = MUNKRES(A)
[lapjvAssignment lapjvCost]=lapjv(A)

当Inf被替换为大值时,问题就消失了:

(1、3)= 1000
[MUNKRESASSIGNMENT MUNKRESCOST] = MUNKRES(A)
[lapjvAssignment lapjvCost]=lapjv(A)

安迪

我的帖子不知怎么被删除了

我的作业很差。我使用的数据是由(row,col)指定的两组8x2的质心。第一组数据是测量数据,第二组数据是通过alpha-beta滤波器预测的。我使用assignmtn算法来匹配被测数据与现有的过滤器管道,但即使是简单的场景,如:

量=
(122.9178, 122.9178, 122.9178, 202.9178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
pred=
(122.4879, 121.0182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

我得到
Rowsol = [2; 3; 6; 7; 8; 1; 4; 5],

维奇显然是不对的。即使是Munkres
rowsol_munkres = (2, 1, 3, 4, 5, 6, 7, 8),

它仍然是关闭的。

有什么建议吗?

安迪

抱歉,这是costmat代码:

costmat =零(n,n);

%填充NXN错误矩阵
%--------------------------------
对于j = 1:n
对于k = 1:n
costMat(j,k)=(x_pred(j)-x_meas(k))^2+(y_pred(j)-y_meas(k))^2;
结束
结束

埃里克·特劳特曼

我一直在使用你们的Munkres和JV LAP算法实现。正如预期的那样,对于单个矩阵,JV要快得多,但我还发现,当我在Murty k-best分配算法中使用JV算法时,它比Munkres的实现要慢得多。当我进行这个修改(从munkres.m中复制validRow/validCols行)时,它将算法的速度提高了~7倍。

安德鲁麦克法兰

亚历山大,
谢谢你的帮助……我尝试了这个方法,它确实帮了我很多,但与示例相比,我的数据集(例如,80X80成本矩阵需要大约150秒来解决)仍然需要更长的时间。你有什么想法,能不能正常化一下?

亚历山大·科森科夫

Andrew McFarland,你应该指定第二个参数-数据的最小分辨率。如果几个值非常接近,则由于编程中的一个小错误而挂起。

我做了一个补丁的功能-原来的EPS功能被错误地使用。我希望曹先生能在下一个版本中解决这个问题。

索引:lapjv.m.
@@ -68,7 +68,7 @@
如果nargin<2
-分辨率=每股收益;
+分辨率= 4 * EPS(MAX(MAX(a)));
结束
@@ -164,7 +164,7 @@
i0=colsol(j1);
-如果usubmin - umin > eps
+ if usubmin - umin >分辨率
%改变最小列的减少来增加

安德鲁麦克法兰

伟大的代码 - 我找到了一些有趣的行为。当我为成本矩阵运行像= rand(1000,1000)的“标准”示例时,以秒为单位解决。但是,我有一个分配问题(对于PCB分配),当我运行500x500成本矩阵时,需要花费超过一天才能解决。我尝试缩放矩阵值并随机随机地混合矩阵元素,并且仍然不会降低求解器时间。在成本矩阵的结构中是否存在固有的东西,这可能导致解决方案更长?

ks.

易曹

KS,

代码进行了更新,说明更加清晰。希望这可以帮助。

ks.

N在函数参数中代表什么?谢谢。

易曹

罗伯托,

谢谢你指出这一点。最初,不考虑完整的Inf成本矩阵。现在,这已经在v2.3中得到了纠正。

罗伯特·Olmi

我注意到了标量输入inf(lapjv(inf))的一个小错误。错误发生在线85。

罗伯特·Olmi

非常有用的代码! !与版本1.1相比,版本2.2似乎也能够管理成本矩阵中的Inf值。咦,对吗?

江民张

我认为matlab应该将此代码作为一个构建功能

阿米尔

有人看过lapjv v1.2吗?

伊曼努尔•韦伯

你好,
那很快!好的,这就是我想要避免的解决方案,因为我的案例中的任务非常关键并调整现有的2D数组似乎非常没有吸引力。然而,感谢您的信息和您的好代码。

以马内利

易曹

以马内利,

谢谢你指出错误。在v2.2中已经删除了它。对于矩形矩阵,我不知道你提到的这两个参考文献。我只是用了一个简单的方法用0填充代价矩阵,然后平方。

伊曼努尔•韦伯

你好,
正如我之前使用的匈牙利语代码,我想在C中实施Jonkers&Volgent的矩形矩阵算法,你的代码是一个很好的发现。您是否使用Volgent的论文“线性和半分配问题”中提供的任何算法修改,以核心为导向的方法“[1996]和/或”解决矩形分配问题和应用程序“[2010]来解决矩形矩阵?或者你用不同的,也许更简单了解方法?
我正试图实现上一篇文章中介绍的修改,但是我在处理伪代码中的一些行时遇到了困难。
此外,我想指出一些很少会发生的小虫,但如果使用1x1矩阵作为代码的输入,它将计算南部成本。

以马内利

易曹

嗨,Kishore,

不,这不是一个错误。这是Matlab自2009年(a?)以来的一个新特性,这表明不需要相应的输出参数。如果使用较旧的版本,则需要用哑变量替换~。

基肖尔Mosaliganti

你好,

在下载的代码的第85行有一个错误。它没有运行。
[~ c] = min (v1);

~应该是r吗?

阿米尔

这是一个很棒的代码。我有一些直接或间接与您的代码有关的问题。如果您能抽出时间回答我的问题,我将非常感激:

1.如果我想排除一些诸如i - > i分配的作业,我认为cii是大m。Big-M的值是否会影响计算时间?什么是最好的价值?
2.如果我有一个矩阵,其元素是以下区间[0 10000]中的随机整数,另一个矩阵的元素是[0 100],计算时间是否不同?我的经验是,第一个比较长。
3.您是否有稀疏矩阵的任何经验?
每个人都声称计算时间必须减少。然而,我有不同的经历。它或多或少还是一样的。我认为主要原因可以参考上述条款。我认为用LAPJV解一个更大元素的矩阵更长。
4.我可以有负元素吗?
5.LAPJV v1.1是否比LAPJV v1.2快?因为,在这个例子中,你不需要计算双变量和缩减成本矩阵。

Chaoran杜

嗨,易,我有m文件,非常感谢!!!

超然

易曹

超然,,

页面尚未更新。您可以查看“更新”列表其他22日72日项目以确保该文件已更新。

Chaoran杜

你好,

我仍然无法下载更新版本,我不知道这里是否有问题。你介意把更新后的m文件发电子邮件给我吗?非常感谢你的帮助!

电子邮件:C.Du@ed.ac.uk

易曹

超然,,

我现在重新加载了文件。希望这次能成功。

Chaoran杜

易,我下载了这个文件,但是m-file与V1.1相同,它显示m-file是在7月19日修改的,而license.txt是在今天修改的。你能检查一下档案吗?

真的很感激你的帮助!

超然

易曹

超然,,

是的,它已经发布,应该在一天内上线。

Chaoran杜

太棒了!
但是我找不到V1.2,你发布了吗?
再次感谢你的帮助!

超然

易曹

超然,,

新版本(V1.2)能够处理非方情况。

Chaoran杜

谢谢你的代码。它真的有用。
您是否知道如何通过使用Jonker-Volgenant算法来解决非对称分配问题?(将n人民分配给m职位和n

易曹

阿米尔,

在新版本(V1.1)中,返回双变量。

阿米尔

这是一个很棒的代码。如何得到对偶变量?

阿米尔·侯赛因

Turkay YILDIZ

谢谢你。伟大的算法和matlab代码。如果可能的话,我也非常喜欢看到这种算法的TSP和其他问题的解决方案。

Matlab释放兼容性
创建R2010a
与任何版本兼容
平台兼容性
视窗 苹果系统 Linux

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!