KM算法学习笔记

2023-05-16

二分图定义

图的顶点恰好可以分成两个集合,同一个集合内的顶点间不允许有边,处在不同集合的顶点允许有边相连。

问题分类

  • 最大匹配问题:匈牙利算法、Hopcroft–Karp算法
  • 最优权值匹配问题:Kuhn-Munkras算法

关键思想

增广路(augmenting path):假设目前已有一个匹配结果,存在一组未匹配定点的OD,能够找到一条路径,这条路径上匹配和未匹配的定点交替出现,称为增广路

增广路上的匹配和未匹配取反,则匹配数增加1。

KM算法

基本思想:通过引入顶标,将最优权值匹配转化为最大匹配问题。

clipboard.png

步骤1:将边权值转化为顶标/标杆,一般来讲,初始化时,X集合的元素取对应权重的最大值,Y集合的元素取0。取出满足以下条件的边,构建二分图:weight(i,j) = label(i) + label(j);该二分图称为相等子图

clipboard.png

步骤2:寻找增广路,从X0开始,找到X0Y4;在X1,找不到增广路,需要调整顶标,扩大相等子图;当找不到增广路径时,对于搜索过的路径上的XY点,设该路径上的X顶点集为S,Y顶点集为T,对所有在S中的点xi及不在T中的点yj,计算d=min{(L(xi)+L(yj)-weight(xiyj))},从S集中的X标杆中减去d,并将其加入到T集中的Y的标杆中;本例寻找增广路的过程中,访问了X1、Y4、X0三个节点,因此对应的边是X1Y0,d为2(从贪心选边的角度看,我们可以为X0选择新的边而抛弃原先的二分子图中的匹配边,也可以为X1选择新的边而抛弃原先的二分子图中的匹配边,因为我们不能同时选择X0Y4和X1Y4,因为这是一个不合法匹配,这个时候,d=min{(L(xi)+L(yj)-weight(xiyj))}的意义就在于,我们选择一条新的边,这条边将被加入匹配子图中使得匹配合法,选择这条边形成的匹配子图,将比原先的匹配子图加上这条非法边组成的非法匹配子图的权重和(如果它是合法的,它将是最大的)小最少,即权重最大了);此时再次为X1寻找增广路,得到X1Y0.

clipboard.png

步骤3:对X2寻找增广路,搜索范围如上图蓝色路径所示,找不到增广路,需要扩大相等子图;按照步骤2同一规则,会将边X0Y2、X2Y1加入,d=1.

clipboard.png

步骤4:在新的相等子图上,对X2重新寻找增广路。如果是深度优先,得到的路线是X2Y0->Y0X1->X1Y4->Y4X0->X0Y2,此时将匹配结果取反,则得到X2Y0、X1Y4、X0Y2三个匹配;如果是宽度优先,得到的匹配结果是X0Y4、X1Y0、X2Y1,如下图:

clipboard.png

Python实现

import numpy as np

# 声明数据结构
adj_matrix = build_graph() # np array with dimension N*N

# 初始化顶标
label_left = np.max(adj_matrix, axis=1)  # init label for the left set
label_right = np.zeros(N)  # init label for the right set

# 初始化匹配结果
match_right = np.empty(N) * np.nan

# 初始化辅助变量
visit_left = np.empty(N) * False
visit_right = np.empty(N) * False
slack_right = np.empty(N) * np.inf

# 寻找增广路,深度优先
def find_path(i):
  visit_left[i] = True
  for j, match_weight in enumerate(adj_matrix[i]):
    if visit_right[j]: continue  # 已被匹配(解决递归中的冲突)
    gap = label_left[i] + label_right[j] - match_weight
    if gap == 0:
      # 找到可行匹配
      visit_right[j] = True
      if np.isnan(match_right[j]) or find_path(match_right[j]):  ## j未被匹配,或虽然j已被匹配,但是j的已匹配对象有其他可选备胎
        match_right[j] = i
          return True
        else:
      # 计算变为可行匹配需要的顶标改变量
      if slack_right[j] < gap: slack_right[j] = gap
     return False

# KM主函数
def KM():
  for i in range(N):
      # 重置辅助变量
      slack_right = np.empty(N) * np.inf
      while True:
        # 重置辅助变量
        visit_left = np.empty(N) * False
                visit_right = np.empty(N) * False
        
          # 能找到可行匹配
        if find_path(i):    break
          # 不能找到可行匹配,修改顶标
        # (1)将所有在增广路中的X方点的label全部减去一个常数d 
        # (2)将所有在增广路中的Y方点的label全部加上一个常数d
        d = np.inf
        for j, slack in enumerate(slack_right):
          if not visit_right[j] and slack < d:
            d = slack
        for k in range(N):
          if visit_left[k]: label_left[k] -= d
        for n in range(N):
          if visit_right[n]: label_right[n] += d
    res = 0
  for j in range(N):
    if match_right[j] >=0 and match_right[j] < N:
      res += adj_matrix[match[j]][j]
  return res

参考资料

http://blog.sina.com.cn/s/blo...

https://blog.csdn.net/mosquit...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KM算法学习笔记 的相关文章

  • centos 6.4配置samba+ldap认证

    原文地址 xff1a http www centoscn com image text config 2015 0716 5866 html 1 什么是samba Samba服务类似于windows上的共享功能 xff0c 可以实现在Lin
  • 三因素方差分析_Excel 方差分析的绘图攻略!

    更多内容可关注微信公众号 xff1a 邱宗满 工具可在公众号左下角菜单中下载 目录 1 简介 2 基本区域 3 折线图的基础使用步骤 4 如何隐藏多余图例 5 调整刻度线间距 6 调整刻度线的数字格式 7 调整横轴文字角度 8 设置柱状图的
  • 三菱st语言for_三菱ST学习之FOR循环(从小到大排序)

    一 从小到大排序 通过ST语言 xff0c 将一组乱序的数据 xff0c 按照从小到大的方式排列 1 建立全局标签 2 编写程序 3 程序监控 先进行数组数据赋值 xff0c 这里我们只排列6个数据 xff0c 若想排列更多 xff0c 更
  • python列表逐个输出_在python中打印列表输出的最佳方法

    我有一个列表和这样的列表列表 gt gt gt list2 61 34 1 34 34 2 34 34 3 34 34 4 34 34 5 34 34 6 34 34 7 34 34 8 34 34 9 34 34 10 34 34 11
  • arr取前五个对象 js_JS Array.slice 截取数组的实现方法

    slice定义和用法 slice 方法可从已有的数组中返回选定的元素 语法 arrayObject slice start end 参数 描述 start 必需 规定从何处开始选取 如果是负数 xff0c 那么它规定从数组尾部开始算起的位置
  • MySQL索引失效的原理是什么?

    前言 今天我们讲讲MySQL索引为什么会失效 xff0c 很多文章和培训机构的教程 xff0c 都只会告诉你 xff0c 在什么情况下索引会失效 在讲之前 xff0c 还是先把一些什么情况下索引会失效的结论罗列一下 xff0c 然后大家结合
  • 如何提高项目交付效率

    道法术出自老子 道德经 xff0c 道 xff0c 是规则 自然法则 xff0c 上乘 法 xff0c 是方法 法理 xff0c 中乘 术 xff0c 是行式 方式 xff0c 下乘 以道御术 即以道义来承载智术 xff0c 悟道比修炼法术
  • 注销app密码服务器时出错,苹果7注销id显示验证错误连接服务器出现问题是怎么回事...

    满意答案 创建ID步骤 xff1a 1 在 iPhone 主屏上找到 App Store 图标 xff0c 点击打开 2 打开 App Store 应用商店以后 xff0c 用手指向上滑动 xff0c 点击底部的 登录 按钮 3 在弹出的选
  • js ajax回调 return,js异步回调解决方法

    当一个接口需要依赖另一个接口的请求数据时 1 将请求数据的接口设为同步 xff0c 之后调另一个接口 2 在请求数据接口的成功回调里调另一个接口 但是当一个接口需要依赖很多个接口的请求数据 或者 一个依赖另一个 xff0c 另一个再依赖另一
  • 系统无法请求的服务器地址,没有可用的登录服务器处理地址请求

    没有可用的登录服务器处理地址请求 内容精选 换一换 会话保持 xff0c 指负载均衡器可以识别客户与服务器之间交互过程的关联性 xff0c 在实现负载均衡的同时 xff0c 保持将其他相关联的访问请求分配到同一台服务器上 会话保持有什么作用
  • Iterator接口用法

    1 所有实现Collection接口的容器类都有一个iteractor方法 xff0c 用于返回一个实现了Iteractor接口的对象 xff0c 2 Iteractor对象成为迭代器 xff0c 用以实现对容器内元素的遍历操作 3 Ite
  • 浅析 Hexo 搭建博客的原理

    一直在用 Hexo 写博客 xff0c 但是对其原理并不是很清晰 xff0c 在网上找了一些资料 xff0c 对 Hexo 有了新的认识 xff0c 现在就来记录一下 使用 Hexo 43 github pages 搭建博客 记得刚开始知道
  • c# listView

    使用listView时 xff0c 需要设置单元格背景色 首先设置item UseItemStyleForSubItems 61 false 再通过BackColor来设置 参考 xff1a http www liangshunet com
  • 解决Macbook网络连接成功但是图标一直显示正在查找网络问题

    看图 xff0c 一直显示正在连接网络 明明连接上去了 xff0c 解决办法 xff0c 打开网络偏好设置 新建位置 然后点击应用就搞定了 图标正常了
  • 官网下载到离线的Adobe Acrobat Reader DC

    Adobe 官方 FTP ftp ftp adobe com Adobe Acrobat Reader DC 下载目录 xff1a ftp ftp adobe com pub adobe reader win AcrobatDC 15007
  • Flutter之Dialog使用和踩坑

    简单介绍 最近使用了Flutter的展示对话框的功能 xff0c 踩了一点坑 xff0c 顺便做下总结 xff0c 方便各位以后少踩坑 xff0c 如果有说错的地方 xff0c 还请大家指出来 下面将介绍对话框的几种场景和踩坑 展示普通对话
  • 路径规划之 A* 算法

    算法介绍 A xff08 念做 xff1a A Star xff09 算法是一种很常用的路径查找和图形遍历算法 它有较好的性能和准确度 本文在讲解算法的同时也会提供Python语言的代码实现 xff0c 并会借助matplotlib库动态的
  • MongoDB中yaml模式配配置文件详解

    mongodb3 x版本后就是要yaml语法格式的配置文件 xff0c 下面是yaml配置文件格式如下 xff1a 官方yaml配置文件选项参考 xff1a https docs mongodb org manual configurati
  • java 正则表达式提取字符串

    参考文档 xff1a baijiahao baidu com s id 61 159862 如果需要提取的字符串没有好的规则 xff0c 则直接用点 其他部分剩下的就是自己需要提取的 Pattern p 61 Pattern compile
  • 【成功】qlv转MP4,超简单方法

    1 打开 www xxxbbbttt com 上传你的视频 xff08 腾讯qlv xff0c 爱奇艺qsv 优酷kux xff09 都可以 3 点击转换按钮 xff0c 转换好后 xff0c 我们把转换的视频下载到电脑里 xff0c 就可

随机推荐

  • cisco配置交换机管理地址和默认网关

    配置交换机远程管理地址和默认网关 拓扑图如下 xff1a 1 配置PC0 2 配置SW1交换机 Switch config no ip domain lookup 关闭域名解析 Switch config line exec timeout
  • 兄弟们,请求支援,怎么实现互通,全部都互通的

    转载于 https blog 51cto com 14155986 2337267
  • FIFO算法与LRU算法软考试题

    转载于 https www cnblogs com kungfupanda archive 2009 12 25 1632106 html
  • iOS 网络/本地 图片 按自定义比例缩放 不失真 方法

    我尝试了很多种方法 xff0c 终于 xff0c 设计了一个方法 xff0c 能按自己规定的大小压缩 还没失真 如果以后不好用 我再升级 分享给大家 xff1a 43 CGRect scaleImage UIImage image toSi
  • java 输入输出 函数对象构造

    输入输出 输入字符串 不包括最后的换行符 39 n 39 import java io BufferedReader import java io IOException 输入字符一个char import java io InputStr
  • Python 3 加密简介

    Python 3 的标准库中是没多少用来解决加密的 xff0c 不过却有用于处理哈希的库 在这里我们会对其进行一个简单的介绍 xff0c 但重点会放在两个第三方的软件包 xff1a PyCrypto 和 cryptography 上 xff
  • grep 命令的基本使用

    环境变量 xff1a 定义用户的工作环境某个方面的属性 文本文件的查看命令 xff1a cat 连接 能够将后面跟的多个文件的内容 xff0c 依次显示 cat n 在显示时出现行号 E 显示行结束符 v 显示非打印字符不显示制表符tab
  • innodb Cardinality学习笔记

    github 传送门 链接描述 欢迎过来star呀 背景 1 之前对innodb的Cardinality没概念 xff0c 只知道要高选择性的列上建索引 xff0c 比如用户名而不是性别 xff0c 因为性别区分度不高 xff0c 但是这过
  • K8S组件运行原理详解总结

    一 看图说K8S 先从一张大图来观看一下K8S是如何运作的 xff0c 再具体去细化K8S的概念 组件以及网络模型 从上图 xff0c 我们可以看到K8S组件和逻辑及其复杂 xff0c 但是这并不可怕 xff0c 我们从宏观上先了解K8S是
  • ubuntu中apt-get的常用命令。

    使用以下命令清理系统垃圾 sudo apt get autoclean 清理旧版本的软件缓存 sudo apt get clean 清理所有软件缓存 sudo apt get autoremove 删除系统不再使用的孤立软件 xff1d x
  • Qt之设置QWidget背景色

    简述 QWidget是所有用户界面对象的基类 xff0c 这意味着可以用同样的方法为其它子类控件改变背景颜色 Qt中窗口背景的设置 xff0c 下面介绍三种方法 使用QPalette 使用Style Sheet绘图事件 一般我不用QSS设置
  • 计算机机房英文术语,【数据中心】数据中心常见中英术语及解释

    原标题 xff1a 数据中心 数据中心常见中英术语及解释 一 常见中文术语 1 数据中心 为一个建筑群 建筑物或建筑物中的一个部分 xff0c 主要用于容纳设置计算机房及其支持空间 2 进线间 外部缆线引入和电信业务经营者安装通信设施的空间
  • C#学习之接口

    什么是接口 xff1f 其实 xff0c 接口简单理解就是一种约定 xff0c 使得实现接口的类或结构在形式上保持一致 个人觉得 xff0c 使用接口可以使程序更加清晰和条理化 xff0c 这就是接口的好处 xff0c 但并不是所有的编程语
  • neo1973 audio subsystem

    fhttp wiki openmoko org wiki Neo 1973 audio subsystem using Bluetooth headset with GSM NOTE none of this works with GTA0
  • 程序员面试必备书单

    点击关注异步图书 xff0c 置顶公众号 每天与你分享 IT好书 技术干货 职场知识 Tips 参与文末话题讨论 xff0c 即有机会获得异步图书一本 世上最快乐的事 xff0c 莫过于为理想奋斗 一个满意的工作 xff0c 便是为理想奋斗
  • vnc linux 终端打不开,vnc连接后只能看到终端

    我在windows安装了VNC Viewer xff0c 远程链接ubunt12 04服务器 xff0c 发现远程桌面只有一个终端 xff0c 没有桌面 从网上查了一些资料 xff0c 问题得以解决 xff0c 记录如下 xff1a 修改
  • ubuntu11.04下CUDA4.0的安装与配置

    ubuntu11 04下CUDA4 0的安装与配置 1 xff1a 下载CUDA 4 0 安装官网最新的显卡驱动 xff1a 安装方法可以参考 xff1a Ubuntu11 04下安装Nvidia显卡驱动的方法 然后从NVIDIA网站 xf
  • MySQL中如何定位DDL被阻塞的问题

    在生产环境中 xff0c 执行了一个DDL xff0c 发现很久都没有执行完 xff0c 是不是被阻塞了 xff1f 要怎么解决 xff1f 实际上 xff0c 如何解决DDL阻塞的问题 xff0c 是MySQL中一个共性且高频的问题 下面
  • oracle中的index函数,Oracle中的索引详解(整理)

    一 ROWID的概念 存储了row在数据文件中的具体位置 xff1a 64位 编码的数据 xff0c A Z a z 0 9 43 和 xff0c row在数据块中的存储方式 SELECT ROWID last name FROM hr e
  • KM算法学习笔记

    二分图定义 图的顶点恰好可以分成两个集合 xff0c 同一个集合内的顶点间不允许有边 xff0c 处在不同集合的顶点允许有边相连 问题分类 最大匹配问题 xff1a 匈牙利算法 Hopcroft Karp算法最优权值匹配问题 xff1a K