You are on page 1of 4

作业问题是在学生生活中常见的挑战,尤其是在高等教育阶段。它们可能会让你感

到压力和焦虑,但不要担心,因为我们有解决问题的方法 - 匈牙利方法。
匈牙利方法是一种用于解决作业问题的数学算法。它可以帮助你有效地解决分配
问题,比如如何将作业任务分配给不同的学生。它是由匈牙利数学家Dénes Kőnig和Jenő
Egerváry在20世纪30年代发明的。

这种方法的主要思想是通过不断地进行匹配来找到最佳解决方案。它的步骤包括:
创建一个任务矩阵,其中包含每个学生和每项任务的成本。
找到矩阵中的最小值,并从每一行和每一列中减去该值。
使用最小数量的行和列来覆盖所有的零元素,这些行和列被称为零覆盖。
如果零覆盖的数量等于任务的数量,则找到最佳解决方案。否则,进入下一步。
找到未被零覆盖的最小值,并从所有未被零覆盖的元素中减去该值。
使用最小数量的行和列来覆盖所有的零元素,并重复上述步 骤,直到找到最佳
解决方案。
匈牙利方法已被证明是一种高效的解决作业问题的方法。它可以帮助你节省时间和
精力,并为你提供最佳的任务分配方案。
如果你正在寻找一个可靠的解决作业问题的方法,我们强烈推荐你访问HelpWriting.net
。这个网站提供高质量的作业帮助和解决方案,包括匈牙利方法。你可以轻松地提交
你的作业问题,并得到专业的帮助,确保你的作业得到最佳的解决方案。
不要再让作业问题成为你的负担,访问HelpWriting.net并尝试匈牙利方法解决你的作业
问题吧!
if (!sndVisited[j]) { 其中,令ni=q[i,j]-pj,若|q[i,j]-pj|≥0 ,则ni=1,反之ni=0; 步骤6、对任务
进行预分配,获得初始分配矩阵t,并进一步简化效益值矩阵; 第一步、对表1所示的
机器人任务分配系统进行建模,可知,机器人数量m =20,任务数量n=4,其任务范围
向量l =[7,3,5,4]。 } 进一步地,步骤6对任务进行预分配,获得初始分配矩阵t,并进一步
简化效益值矩阵具体为: } else { 本发明所解决的技术问题在于提供一种预分配结合匈
牙利算法的多机器人任务分配方法。 } 显然,我们可以使用染色法,即用黑白两种颜
色来标记图中的节点,当一个节点被标记后,我们将所有与之相邻的节点都标记为
相反的颜色。若在此染色过程中出现了冲突,那么就不是二分图,否则是二分图。 int
sndMatch[SIZE], sndNeed[SIZE]; sndVisited[i] = true; } cntFst = sndMatch[cntSnd]; for (int i = 0; i
< sndNum; i++) { for (int i = 0; i < sndNum; i++) { 技术所有人:南京理工大学所以…… 本文
很大程度上借鉴了巨佬出的新书和网络上几篇优秀文章(具体列表可见文末)。本人
向这些文章的作者们表示衷心感谢! int fstEx[SIZE], sndEx[SIZE]; 如您需求助技术
专家,请点此查看客服电话进行咨询。 bool sndVisited[SIZE]; 对于每个左部节点,寻找
增广路最多遍历一次整张二分图,因此该算法的复杂度为 \(\mathcal{O}(NM)\)。 匈牙利
算法实际上基于贪心策略。它的一个重要特点是:当一个节点成为匹配点后,至多因
为找到增广路而更换匹配对象,但是绝对不会从匹配点变成非匹配点。 下面我们举
一个例子来演示匈牙利算法的大致过程(请配合图片下方的一段文字说明食用): 4、
王老师:1.计算机网络安全 2.计算机仿真技术 if (sndMatch[i] == -1 || canFind(sndMatch[i])) {
3、袁老师:1.计算机视觉 2.无线网络及物联网 上一篇:一种可变断面的隧道养护台车
的制作方法 在上面提到的算法中,如果从某个左部节点出发寻找匹配失败,那么在
DFS 的过程中,所有访问过的节点以及为了访问这些节点而经过的边可以构成一
棵树。 进一步地,步骤7利用匈牙利算法处理步骤6简化后的效益值矩阵进行任务
分配,获得最终的分配矩阵t ,完成任务分配具体为: } fstEx[i] = arr[i][0]; 下面我们举一
个例子来演示匈牙利算法的大致过程(请配合图片下方的一段文字说明食用): 步骤7-
2-2、将所在行和列0元素总数最少的0元素选为独立0元素,将该独立0元素所在行和列
的其他0元素记为重复执行该步骤,直到处理完所有0元素; 显而易见,对于一个二分
图来说,可能会有很多种匹配。如果某二分图的某一个匹配包含的边的数量在该二
分图所有匹配中最大,那么称这个匹配为最大匹配。例如,下图 Fig.4 就是 Fig.2 的最大
匹配。 在代码样例中 \(\text{fst}\) 代表左部元素(first 的缩写),\(\text{snd}\) 代表右部元
素(second 的缩写)。 2、毕老师:机构动力学与控制 for (int i = 0; i < sndNum; i++) { } } } }
memset(sndVisited, false, sizeof(sndVisited)); 步骤6-2、对于已分配给机器人a的任务b,将其
在效益值矩阵m中对应的行与列均删除,由此获得简化后新的效益值矩阵m' 。 } } for
(int i = 0; i < sndNum; i++) { fstVisited[fstId] = true;
} cntFst = fstId; int fstEx[SIZE], sndEx[SIZE]; 二分图 (Bipartite graph) 是一种特殊的简单图,
它的顶点可以被分为两个不相交的集合(\(U\) 和 \(V\)),并且同属一个集合的点两两不
相连 (\(E_U = E_V = \varnothing\))。也就是说,如果一个图是二分图,它要么没有
圈 (cycle),要么所有圈包含边的个数均为偶数。 } for (int i = 0; i < sndNum; i++) { sndEx[i]
+= minDelta; continue; } 实现本发明目的的技术解决方案为:一种预分配结合匈牙利算
法的多机器人任务分配方法,包括以下步骤: 进一步地,步骤5根据每个任务所需机
器人的数量对效益值矩阵进行变形具体为: } int sndNum, fstNum; 注:DFS 版本最坏时间
复杂度可能高达 \(\mathcal{O}(N^4)\),所以一般建议使用下文中的 BFS 版本(该结论引
用自:【原创】KM算法的Bfs 写法)。 所以…… 本文很大程度上借鉴了巨佬出的新书和网
络上几篇优秀文章(具体列表可见文末)。本人向这些文章的作者们表示衷心感谢!
return ans; 匈牙利算法是一个经典的解决二部图最小权值匹配问题的算法。网上也有不
少资料,但是看完之后总觉得有两个核心问题没有解决:算法为什么一定能得到最优
匹配?算法复杂度为什么不再是指数级了? fstVisited[fstId] = true; minDelta = sndNeed[i];
由上可知,本发明采用的预分配结合匈牙利算法进行的任务分配,清除了建模过程
中的无关变量,有效地简化了模型表示方式。此外,由于引入预分配步骤,进入匈牙
利算法的矩阵维度显著变小,既加快了模型的分析速度,又可以避免效益矩阵复杂
时运用单一匈牙利算法可能造成的时间消耗过大、甚至进入无限循环的问题,比匈
牙利算法更高效、更适应实际需要。 至于如何再相等子图中寻找完备匹配,我们可以
采用上一节“无权二分图的最大匹配”中提到的算法来寻找该相等子图的最大匹配。
如果最大匹配不完备,则说明至少有一个左部节点匹配失败。而节点匹配失败那次
所进行的 DFS 并形成了一颗交错树,我们记之为 \(T\)。 for (int i = 0; i < fstNum; i++) { 该
技术已申请专利。仅供学习研究,如用于商业用途,请联系技术所有人。 结合图1,本
发明一种预分配结合匈牙利算法的多机器人任务分配方法,包括以下步骤: if
(pre[cntSnd] == -1) int hungarian() {

You might also like