匈牙利算法学习笔记

news2024/11/13 9:56:01

匈牙利算法学习笔记

  • 1. 前言
    • 1.1 二分图
    • 1.2 二分图匹配
  • 2. 匈牙利算法(Hungarian Algorithm)
    • 2.1 基础概念
    • 2.2 实现步骤

参考链接:
1. 14-4:匈牙利算法 Hungarian Algorithm

1. 前言

1.1 二分图

在这里插入图片描述
二分图通常针对无向图问题。假设 G = ( V , E ) G=(V,E) G=(V,E)是一个无向图,节点集合 V V V可以分割为两个互不相交的子集,并且图中每条边依附的两个节点都分属于这两个互不相交的子集,两个子集内的节点不相邻。

1.2 二分图匹配

给定二分图的边集 M M M F F F是边集 M M M中的一个子集,如果 F F F中的每条边的两个节点只有该条边与这两个节点相连,则 F F F称为一个匹配。
在这里插入图片描述

2. 匈牙利算法(Hungarian Algorithm)

2.1 基础概念

匈牙利算法(Hungarian algorithm),主要用于解决一些与二分图匹配有关的问题,例如无权重二分图的最大匹配问题和有权值二分图的最小权值匹配问题等。

2.2 实现步骤

以一个有权值二分图的最小权值匹配问题为例。首先定义一个有权二分图(如下图),每个集合中都包含3个节点。匈牙利算法中要求两个集合中的节点数量相同。
在这里插入图片描述
根据二分图构建邻接矩阵,矩阵中的元素表示两个节点之间的权值。
在这里插入图片描述
步骤一: 找到邻接矩阵中每一行的最小元素,并且将每一行中的元素都减去该行中的最小元素。
在这里插入图片描述
步骤二: 在剩下的矩阵中找到每一列的最小元素,并且将每一列中的元素都减去该列中的最小元素。
在这里插入图片描述
步骤三: 用最少的横线或竖线来覆盖矩阵中的所有零元素。如果线条的最少数量等于 n n n,则停止运行;如果线条的最少数量小于 n n n,则继续下一步。(在本案例中 n = 3 n=3 n=3
在这里插入图片描述
步骤四: 在没有被覆盖的元素中找到最小值,并且将没有被覆盖的元素减去这个最小值,同时将不同线条交叉位置上的元素加上这个最小值。
在这里插入图片描述
在这里插入图片描述
步骤五: 回到步骤三,即继续用最少的横线或竖线来覆盖矩阵中的所有零元素。如果线条的最少数量等于 n n n,则停止运行;如果线条的最少数量小于 n n n,则执行步骤四。
在这里插入图片描述
步骤六: 最后从剩余的矩阵元素中找到最合适的零元素作为匹配结果。这里每个零元素对应筛选后的两个节点之间的边。
在这里插入图片描述

  1. 节点 u 3 u_3 u3只能与节点 v 1 v_1 v1匹配。

在这里插入图片描述
2. 节点 u 2 u_2 u2能够与节点 v 2 v_2 v2 v 3 v_3 v3匹配,但是考虑到节点 v 2 v_2 v2只能与节点 u 2 u_2 u2匹配,因此将节点 u 2 u_2 u2分配给节点 u 2 u_2 u2

在这里插入图片描述
3. 最后只剩下节点 u 1 u_1 u1与节点 v 3 v_3 v3匹配。

在这里插入图片描述
4. 因此最小权值匹配为 { ( u 3 , v 1 ) , ( u 1 , v 3 ) , ( u 2 , v 2 ) } \{(u_3,v_1), (u_1,v_3), (u_2,v_2)\} {(u3,v1),(u1,v3),(u2,v2)},最小的权值之和为 50 + 35 + 22 = 107 50+35+22=107 50+35+22=107

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux搭建gitlab服务器

第一步:切换到root用户 sudo root或者 sudo -i第二步:执行以下命令 yum install curl openssh-server openssh-clients postfix cronie -y​systemctl start postfix.servicechkconfig postfix onlokkit -s http -s ssh第三步:添加Gitlab&…

如何理解 Python 的赋值逻辑

摘要: 如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲。 本文比较并解释了这种赋值逻辑上的差异。回答了为什么需要这种赋值逻辑以及如何使用这种赋值逻辑…

Acer新蜂鸟Swift3电脑开机总是蓝屏错误怎么办?

Acer新蜂鸟Swift3电脑开机总是蓝屏错误怎么办?有用户使用的Acer新蜂鸟Swift3电脑一开机的时候,没过几秒电脑桌面就变成了蓝屏的了,通过强制重启之后依然会重复这个问题,那么这个问题要怎么去进行解决了,今天将你怎么重…

Android 反序列化漏洞攻防史话

Java 在历史上出现过许多反序列化的漏洞,但大部分出自 J2EE 的组件。即便是 FastJSON 这种漏洞,似乎也很少看到在 Android 中被实际的触发和利用。本文即为对历史上曾出现过的 Android Java 反序列化漏洞的分析和研究记录。 序列化和反序列化是指将内存数…

k8s-kubectl命令

文章目录一、kubectl 基本命令1、陈述式资源管理方法:2、声明式资源管理办法二、基本信息查看三、项目的生命周期创建kubectl run命令四、金丝雀发布(Canary Release)——陈述式管理方法五、声明式管理方法kubectl create 和 kubectl apply区别一、kubectl 基本命令 1、陈述式…

交叉验证 | 机器学习

1、交叉验证 1.1概念 交叉验证的核心思想:对数据集进行多次划分,对多次评估的结果取平均,从而消除单次划分时数据划分得不平衡而造成的不良影响。因为这种不良影响在小规模数据集上更容易出现,所以交叉验证方法在小规模数据集上更…

Profinet转ModbusTCP网关连接昆仑通态触摸屏配置案例

本案例是模拟将Modbus TCP 设备数据接入到西门子PROFINET 网络中。 使用设备为西门子 S7-1500 型 PLC, Profinet转ModbusTCP网关。MODBUS 从站昆仑通态触摸屏。 配置方法: 打开博图,新建项目并添加站点。 添加1513PLC。 设置好IP并处于联网状态 导入Pr…

【前端】小程序开发入门:安装开发工具、目录结构与项目配置

文章目录前期准备目录结构app.jsonpageswindow其他前期准备 开发小程序要先申请一个对应的AppID:微信小程序 (qq.com) 微信官方小程序开发文档:微信开放文档 (qq.com) 然后安装一个小程序开发工具: 选择稳定版: 安装后打开&…

组合由于继承

目录 前言: 1.什么是继承? 2.继承的劣势、问题? 3.组合相比继承有哪些优势? 4、如何判断该用组合还是继承? 参考资料 前言: 我们在平时日常开发设计的过程中,经常会有人提到一条经典的设…

音视频基础之封装格式与音视频同步

封装格式的概念 封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于播放软件播放。 一般来说,视频文件的后缀名就是它的封装格式。 封装的格式不一样,后缀名也就不一样。 比如&a…

MMPBSA结合自由能计算原理

MMPBSA结合自由能计算原理 计算结合自由能的方法有很多,例如,热力学积分(Thermodynamic Integration,TI)、自由能微扰(Free Energy Perturbation,FEP)、MM/PB(GB)SA、线性相互作用能…

安科瑞消防应急照明和疏散指示系统在城市隧道的应用分析

【摘要】:随着城市的发展,交通量越来越大,交通状况越来越复杂,城市隧道的修建也随之变多。当隧道照明正常时,隧道内路面有足够的照度,隧道中快速行驶的汽车,大部分司机不用打开车灯或只需打开车…

Swift 周报 第二十三期

前言 本期是 Swift 编辑组自主整理周报的第十四期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。 勇敢是即便知道好结局不会每每降临在…

项目中异常信息的统一处理以及JSR03校验

在项目中,我们经常会对前端传过来的数据判断是否有一些错误,比如:id是否为空,传过来的名称是否合格,如果不符合我们通常会抛出异常,那么小的项目可能每次抛出异常也不是很麻烦,但是对于一个大型…

详解HashMap

目录 1.hash code 2.数据结构 3.初始化 4.存取 4.1.put 4.2.get 5.迭代 6.扩容 7.JDK1.7版本存在的问题 7.1.性能跌落 7.2.循环链表 8.散列运算 9.扰动函数 1.hash code hash code是使用hash函数运算得到的一个值,是对象的身份证号码,用于…

将项目从 SVN 迁移到 GIT

场景 项目开发中,项目原本是用的SVN,已经用了一年了,现在公司要抛弃SVN用Git,要求把SVN的代码直接搬过去Git,并保留之前的历史提交记录。 操作步骤 找到已经被svn管理的项目的根目录 WinFarm,右键 Git Ba…

手把手教你将微信小程序放到git上

背景 首先,要创建一个自己的git仓库,这里默认大家都能够自己创建了git仓库了。如果不会创建仓库的话,百度一下,很容易就能够创建了!(后续,如有不知道在哪里,怎么创建仓库的话&#…

群晖-第4章-Docker安装redis

群晖-第4章-Docker安装redis 本章介绍群晖docker安装redis的方法。如果你需要外网访问,可以参考我的群晖第1章。 参考 群晖使用 docker部署 Redis - 编程之家 Redis设置密码_惜惜然的博客-CSDN博客 在本地新建一个文本文件,命名为redis.conf&#xff…

GEE学习笔记 六十四:绿色中国报告(个人版)

2019年上半年在遥感圈里最火的一篇文章莫过于这篇《China and India lead in greening of the world through land-use management》(China and India lead in greening of the world through land-use management | Nature Sustainability),…

Idea搭建Spring5.3.x源码阅读环境

1. 概述 Spring是一个轻量级Java开源框架,在Java项目开发过程中已经离不开Spring全家桶了,包括Spring、SpringBoot、SpringCloud等,学习好Spring基础源码也有助于更好在项目中使用Spring相关组件,在学习源码前需要搭建好源码学习…