匈牙利算法

算法简介

算法原理

算法实现(附代码)

测试

算法简介

下面摘用百度百科中的解释。

匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。

简单来说,匈牙利算法就是为了解决匹配问题的一种算法。

可以设想这样一个问题,有三个工人要共同完成三件任务。每个人只能专注完成一件任务。且工人完成不同任务所需要的时间是不一样的。当然这里可以直接通过枚举的方式来遍历所有的分配方式来进行求解。但当求解的问题的维度变得比较大时,这样处理就显得不太明智了。所以,为了解决这一类问题,匈牙利算法得以提出。

算法原理

算法的输入时一个代价矩阵c c,其中cij c i j表示工人i在任务j上的工作时长。

算法总的来说分成几步。

step1

将矩阵c c化为每行每列都至少有一个0的矩阵。

例如输入矩阵c=(1243) c = ( 1 4 2 3 )

首先处理行

找到每行中的最小1元素,如第一行中找到的是1,第二行中是2。每行中所有元素都减去该最小元素得(0031) ( 0 3 0 1 )。

之后处理列

这里检查列发现第二列中没有0元素。故继续找到第二列总最小元素,并用第二列中的元素减去该最小元素,得(0020) ( 0 2 0 0 ).

step2

检查矩阵中是否有相互独立0的元素。也就是说能否找到与矩阵维度相同数目的0,它们占据不同的行列位置。如上的例子就可以找到这样的两个零元素,c11 c 11和c22 c 22。当然也有不是这种情况的例子。如[

⎛⎝⎜⎜⎜⎜⎜⎜02090531086005032070620542⎞⎠⎟⎟⎟⎟⎟⎟ ( 0 5 0 2 2 2 3 0 0 0 0 10 5 7 5 9 8 0 0 4 0 6 3 6 2 ) ]

如果在该步能找到独立零,则算法就可在此结束。如上的例子,可以输出

(1122) ( 1 2 1 2 ) .表示工人1完成任务1,工人2完成任务2。否则继续执行下面步骤。

step3

以每一个0元素为中心画十字架(即选中所有零元素所在的行元素和列元素)。找出没有被选中的元素。然后将没有被选中的元素所在的行进行标记。然后执行以下两个步骤

1. 对以标记的行中的零元素所在的列进行标记。

2. 对已标记的列中的零元素所在的行进行标记。

重复进行上述操作,直至不能再进行标记为止。

可以证明,没有标记的行以及标记了的列可以覆盖所有的零元素。

step4

对没有覆盖的元素,找到里面值最小的一个。将标记了的行中的所有元素减去这个值,将标记了的列中的元素加上这个值。这样的操作可以确保在未被覆盖的区域内至少产生一个0,且原本的0元素不会改变。

之后跳转到step2。

代码

传送门

简要说明一下。Hungarian.m文件是主程序。

两个辅助程序:

1. fix.m用于查找最佳分配,如果答案则可在all中得到所有最佳匹配。否则all为空,result中保存次最佳匹配。

2. findMin.m用于找到指定下标范围内的最小元素。

测试结果

输入

输出

输入

输出

edmonds算法matlab,匈牙利算法的matlab实现相关推荐

  1. 趣写算法之匈牙利算法

    [书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思 ...

  2. 算法题 匈牙利算法 求二分图最大匹配(Python)

    题目: 给定一个二分图,其中左半部包含n1n1个点(编号1~n1n1),右半部包含n2n2个点(编号1~n2n2),二分图共包含m条边. 数据保证任意一条边的两个端点都不可能在同一部分中. 请你求出二 ...

  3. 【老生谈算法】matlab实现匈牙利算法源码——匈牙利算法

    matlab匈牙利算法代码实现 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]matlab匈牙利算法.doc 2.算法详解: ...

  4. MATLAB优化模型例子,MATLAB优化算法案例分析与应用(进阶篇)

    导语 余胜威编著的<MATLAB优化算法案例分析与应用(进阶篇)>基本包括了所有常见的MATLAB优化算法及应用,包括贝叶斯分类器.期望最大化算法.K最近邻密度估计.朴素贝叶斯分类器.背景 ...

  5. 匈牙利算法——最大匹配问题详解

    2017年中兴提前批校招,就考了一题匈牙利算法. 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的 ...

  6. 匹配问题: 匈牙利算法 、最优指派、相等子图、库恩—曼克莱斯 (Kuhn-Munkres) 算法

    图&网络系列博文: [1]图与网络模型及方法:图与网络的基本概念 [2]图&网络模型应用-最短路径问题 [3]树:基本概念与最小生成树 [4]匹配问题: 匈牙利算法 .最优指派.相等子 ...

  7. 二分图匹配及匈牙利算法的全面讲解及python实现

    1.背景 在生活中常常遇到两组元素多对多匹配而又数目有限的情况,我们需要对其进行最大匹配数的分配,使效率最大化.例如,有一组压缩气缸和一组压缩活塞,每一个型号的压缩气缸有一个固定的内径大小,每一个型号 ...

  8. 二分图最大匹配-匈牙利算法

    今天介绍 匈牙利算法 : 匈牙利算法,是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,由匈牙利数学家Edmonds于1965年提出,因而得名. 先介绍一下 ...

  9. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

    网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...

最新文章

  1. (52 90) 简答 什么叫计算机网络,计算机网络期末复习试卷.doc
  2. jsp设置背景图片并使得图片扩大到整个屏幕
  3. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
  4. JavaScript学习(八十六)—运算符知识点总结
  5. maven netty 配置_网络编程(二)Netty编程之一
  6. dmidecode 硬件查看
  7. c 按输入的字母来输出对应效果
  8. 制定自动化测试实施计划
  9. php怎么上传视频和播放器,新增插件:视频音乐播放器(PHP版)
  10. 水星无线网卡代理服务器端口,水星(Mercury)MW150U 3.0/4.0无线网卡AP模式设置
  11. 数据挖掘思维和实战20 Apriori 与 FP-Growth:不得不再说一遍啤酒与尿布的故事
  12. 滴滴AI负责人叶杰平:你的每一次出行,都已有AI落地的助力
  13. typhon自带base64函数
  14. 网上不需要实名的物联卡能用吗?有什么安全隐患?
  15. java下载网络文件至本地
  16. 4A(统一安全管控平台)解析
  17. for循环 for循环嵌套
  18. 【JavaScript】关于手机中的触摸手势操作实现过程详解
  19. c++ 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈数组的尺寸由常量SIZE确定。栈的基本操作为Push()和Pop()。
  20. masory 刷新约束方法 释义

热门文章

  1. 使用Oracle验证外部数据
  2. cglib_cglib:缺少的手册
  3. apache camel_探索Apache Camel Core –文件组件
  4. 使用Servlet和Bootstrap上传Ajax文件
  5. Spring JPA数据+Hibernate+ MySQL + Maven
  6. 如何在几分钟内安装Red Hat Container Development Kit(CDK)
  7. Java的20年:重大事件的时间表
  8. merge语句使用_使用SQL:2003 MERGE语句的奥术魔术
  9. 使用jOOQ的MockDataProvider破解简单的JDBC ResultSet缓存
  10. 使用spring-session外部化Spring-boot应用程序的会话状态