【ML算法基础】匈牙利算法理解

前言

匈牙利算法是一种在多项式时间内求解任务分配问题组合优化算法,匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)是做多目标跟踪的小伙伴很容易在论文中见到的两种算法。他们都是用来解决多目标跟踪中的数据关联问题。匈牙利算法与KM算法都是为了求解二分图的最大匹配问题,Kuhn–Munkres算法在匈牙利算法的基础上解决加权二分图匹配问题。

矩形矩阵的分配问题;

递归算法,匈牙利算法的 DFS 和 BFS 版本的代码;

使用lap.lapjv实现线性分配(可以作为匈牙利算法的实现),官方文档使用lapjv实现指派问题的算法是Jonker-Volgenant algorithm。这个算法比匈牙利算法快得多。

分配问题的算法:Munkres算法\拍卖算法\lapjv算法\匈牙利算法等。匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法。

算法步骤

step1)row reduction:每一行减去该行的最小值;
step2)column resuction:每一列减去该列的最小值;
step3)test for an optimal assignment: 使用最少的直线覆盖矩阵中的所有数值零;如果满足最少直线数目,转step5)直接可以得到最终的分配方案;如果不满足则转step4).
step4)shift zeros:如果不满足最少直线数目,需要转移数值零到直线未覆盖的位置,来增加覆盖0的最少直线数目;
step4.1)找出没被直线覆盖的值中的最小值;
step4.2)未被直线覆盖的数值都减去这个最小值,然后在交叉的位置加上这个最小值;
step4.3)把直线移除,回到step3;
step5)making the final assignment:选择最少直线数目个不同行不同列的0即最终方案,可能会有不同的分配方案;

对于非方阵的问题,只需要用0填充缺失的行或列,然后在第五步确定最终分配方案时,把它们移除。

算法时间复杂度计算

第一步和第二步对矩阵中元素进行了扫描和更新。由于矩阵中一共有n^2个元素,则这两步的时间复杂度均为O(n^2);第三步是用直线覆盖所有零元素,因此该步需要访问所有零元素,其中零元素个数最多达n^2。第四步需要扫描和更新矩阵中的元素,最多n^2个。因此第三步,第四步均为O(n^2)。但是第三,四步需要迭代进行,直到最少直线数等于n时,停止迭代。每一次迭代,最少直线数都会至少增加1条,因此最多迭代次数为n次。因此,第三步,第四步时间复杂度最高为O(n^3)。第五步得到最终分配方案,时间复杂度为O(n)。因此匈牙利算法的时间复杂度为O(n^3)。

流程图

代码实现

matlab_lapjv

matlab_hungarian

matlab_Munkres 

  

  

 

 

参考

1. 目标跟踪初探(DeepSORT)

2. 趣写算法系列之--匈牙利算法

3. 带你入门多目标跟踪(三)匈牙利算法&KM算法

4. matlab_Hungarian;

5. 匈牙利演算法 (Hungarian Algorithm );

6. 演算法學習筆記:匈牙利演算法;

7. KM算法原理+证明

8. LAPJV_algorithm_c;

9. 使用lap.lapjv实现匈牙利算法的线性分配

10. matlab_lapjv

11. Munkres Assignment Algorithm;

12. Hungarian_Assignment Algorithms

13. Munkres’ Assignment Algorithm;

13. Hungarian Algorithm匈牙利算法-讲解通俗易懂

posted on   鹅要长大  阅读(1404)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
历史上的今天:
2017-08-31 m函数与m文件的命名

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示