当前位置: 首页 > article >正文

图论(16)匈牙利算法与最优匹配算法实战解析

1. 匈牙利算法偶图匹配的魔法棒第一次听说匈牙利算法时我误以为它和匈牙利这个国家有什么关系。后来才知道这个算法之所以叫这个名字是因为它基于匈牙利数学家Dénes Kőnig的定理。不过名字不重要重要的是它确实像魔法棒一样能轻松解决偶图中的匹配问题。什么是偶图简单来说偶图就是把图中的顶点分成两组所有边都连接两组中的顶点组内顶点不相连。比如相亲活动现场男生一组女生一组每个人只和异性配对这就是典型的偶图模型。匈牙利算法的核心思想可以用一个生活场景来理解假设你是个红娘手头有几位单身男女他们之间有些互相有好感存在边有些则没有。你的任务是尽可能多地促成配对且每个人只能配对一次。这时候匈牙利算法就是你的最佳助手。1.1 增广路径算法的灵魂我第一次实现匈牙利算法时最困惑的就是这个增广路径概念。后来发现它其实很简单——就是一条起点和终点都未匹配的路径路径上的边交替出现在匹配和非匹配中。举个例子假设当前匹配是A-1和B-2字母代表男生数字代表女生现在发现路径C-1-A-2C-1是非匹配边1-A是匹配边A-2是非匹配边这条路径就是增广路径。对它进行操作把匹配边变非匹配边非匹配边变匹配边就能得到更大的匹配C-1和A-2。def find_augmenting_path(graph, u, match_to, visited): for v in graph[u]: if not visited[v]: visited[v] True if match_to[v] -1 or find_augmenting_path(graph, match_to[v], match_to, visited): match_to[v] u return True return False def hungarian(graph, num_vertices): match_to [-1] * num_vertices result 0 for u in range(num_vertices): visited [False] * num_vertices if find_augmenting_path(graph, u, match_to, visited): result 1 return result1.2 实战任务分配问题去年我帮朋友公司解决过一个实际任务分配问题有5个项目和5个工程师每个工程师有擅长的项目。用匈牙利算法可以完美解决构建偶图工程师是一组顶点项目是另一组添加边工程师擅长某个项目就添加边运行匈牙利算法最终得到的最大匹配就是最优分配方案。记得当时有个工程师特别抢手三个项目都想要他算法很好地平衡了这种冲突。2. 库恩算法带权匹配的最优解匈牙利算法解决了能不能匹配的问题但现实中我们更常遇到的是怎样匹配更好的问题。比如不仅考虑能不能做还要考虑做得好不好这时候就需要库恩算法Kuhn-Munkres算法。2.1 可行顶点标号算法的基石库恩算法最巧妙的部分就是可行顶点标号。这个概念听起来高大上其实就像给每个人贴标签对左边的顶点比如员工标签是他们的最高能力值对右边的顶点比如任务标签初始为0这些标签需要满足对于任何边两端的标签和 ≥ 边的权重。这就像说员工能力任务基础分 ≥ 实际得分。def initialize_labels(graph, label_u, label_v): # 初始化左部顶点标号为相连边的最大权值 for u in range(len(graph)): label_u[u] max(graph[u]) if graph[u] else 0 label_v[:] [0] * len(label_v)2.2 相等子图关键转换有了可行标号后我们构建相等子图——只保留那些满足标签和边权的边。神奇的是这个子图中的完美匹配就是原图的最佳匹配这就像在相亲中我们只考虑综合评分相等的组合男方自我评分女方自我评分他们之间的匹配度这样的组合一定是最优的。2.3 实战项目奖金分配我曾用库恩算法解决过一个项目奖金分配问题。公司有5个项目完成不同项目组合的奖金不同如何分配项目使总奖金最大构建完全偶图员工vs项目边权就是奖金数额运行库恩算法算法不仅找到了最大奖金分配方案还通过标号的调整过程直观展示了为什么这样分配最优。3. 算法实现中的坑与技巧3.1 匈牙利算法的优化原始匈牙利算法的时间复杂度是O(n³)在大规模数据下会很慢。经过实践我发现这些优化很有效DFS改为BFS用队列实现避免递归深度过大贪心初始匹配先快速找到一个初始匹配减少后续处理邻接表优化对于稀疏图特别有效def hungarian_bfs(graph): n len(graph) match_to [-1] * n result 0 for u in range(n): if match_to[u] ! -1: continue prev [-1] * n root u queue [root] found False while queue and not found: v queue.pop(0) for to in graph[v]: if prev[to] -1 and to ! root: prev[to] v if match_to[to] -1: found True break queue.append(match_to[to]) if found: result 1 while v ! -1: match_to[v], v prev[v], match_to[prev[v]] return result3.2 库恩算法的注意事项实现库恩算法时我踩过几个坑标号调整要小心每次只能调整S中的左顶点和T中的右顶点slack数组的维护这是算法效率的关键浮点数精度问题对于浮点权重要特别处理4. 从理论到实践经典例题解析4.1 例题1棋盘覆盖问题描述在一个N×N的棋盘上有些格子被禁止放置。问最多能放多少个1×2的多米诺骨牌解法将棋盘黑白染色黑色格子作为左部顶点白色作为右部顶点。相邻且未被禁止的格子间连边然后求最大匹配。def max_dominoes(N, forbidden): # 构建邻接表 graph [[] for _ in range(N*N)] directions [(0,1),(1,0),(0,-1),(-1,0)] for i in range(N): for j in range(N): if (i,j) in forbidden: continue u i*N j for di,dj in directions: ni, nj idi, jdj if 0niN and 0njN and (ni,nj) not in forbidden: v ni*N nj graph[u].append(v) return hungarian_bfs(graph) // 24.2 例题2最优任务分配有N个工人和N个任务每个工人完成不同任务的效率不同。如何分配使总效率最高解法这就是典型的加权二分图匹配问题直接用库恩算法解决。我曾经用这个问题测试不同实现方式的性能发现对于N500的情况优化后的库恩算法能在1秒内解决而暴力方法可能需要几个小时。

相关文章:

图论(16)匈牙利算法与最优匹配算法实战解析

1. 匈牙利算法:偶图匹配的魔法棒 第一次听说匈牙利算法时,我误以为它和匈牙利这个国家有什么关系。后来才知道,这个算法之所以叫这个名字,是因为它基于匈牙利数学家Dnes Kőnig的定理。不过名字不重要,重要的是它确实像…...

ThinkPHP5防跨目录访问报错?手把手教你如何安全解除LNMP的open_basedir限制

ThinkPHP5跨目录访问难题:LNMP环境下open_basedir限制的深度解析与安全实践 当你在LNMP环境中部署ThinkPHP5应用时,是否遇到过这样的报错信息?那些红色的"Warning"和"Fatal error"不仅打断了安装流程,更让人对…...

实时手机检测-通用GPU算力优化:TensorRT加速后吞吐量提升3.2倍

实时手机检测-通用GPU算力优化:TensorRT加速后吞吐量提升3.2倍 1. 引言:当手机检测遇上性能瓶颈 想象一下,在一个大型活动现场,安保系统需要实时分析数百路监控视频,精准识别出每一部正在使用的手机,以防…...

Ostrakon-VL-8B在教育领域的应用:实现AI驱动的自动化作业批改与反馈

Ostrakon-VL-8B在教育领域的应用:实现AI驱动的自动化作业批改与反馈 1. 引言 想象一下,一位中学数学老师,晚上十点还在台灯下批改着两个班级、近百份的作业。每一份作业都需要仔细检查解题步骤是否正确、逻辑是否清晰、答案是否准确。这不仅…...

AIVideo进阶技巧:如何自定义视频模板和占位符系统

AIVideo进阶技巧:如何自定义视频模板和占位符系统 1. 为什么需要自定义视频模板 在内容创作领域,重复性工作占据了大量时间。以电商行业为例,每个新品发布都需要制作类似的视频结构:产品展示→功能讲解→价格促销→用户评价。传…...

实时手机检测-通用部署案例:中小企业监控场景中手机识别落地解析

实时手机检测-通用部署案例:中小企业监控场景中手机识别落地解析 1. 项目背景与价值 在现代企业管理中,手机使用管理一直是令人头疼的问题。特别是在生产车间、会议室、考场等场所,员工或学生违规使用手机不仅影响工作效率,还可…...

ooderAgent 龙虾时代的统一认证体系

当 Agent 从"工具"进化为"伙伴",账户体系如何重新定义人机协作的信任边界? ​ 协议版本:ooderAgent v1.0.0 | 发布日期:2026-04-08 | 维护团队:ooderAgent Team 一、引言:从 0.7.3 到 …...

SEER‘S EYE模型Dify平台集成指南:可视化AI应用搭建

SEERS EYE模型Dify平台集成指南:可视化AI应用搭建 你是不是觉得,把那些功能强大的AI模型用起来,总得写一堆代码,搞一堆复杂的配置,门槛太高了?特别是像SEERS EYE(预言家之眼)这样的…...

回文数. Leetcode

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 12…...

第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)

目录 一.密密摆放 1.题目讲解 2.代码实现 二.脉冲强度之和 1.题目讲解 2.代码实现 三.25 之和 1.题目讲解 2.代码实现 四.旗帜 1.题目讲解 2.代码实现 五.数列差分 1.题目讲解 2.代码实现 六.树上寻宝 1.题目讲解 2.代码实现 七.翻转硬币 1.题目讲解 2.代…...

避坑指南:Node-RED读取西门子PLC模拟量值,为什么你的DB块数据总是0?(附S7-1200配置全流程)

Node-RED与西门子S7-1200 PLC通信避坑实战:从DB块数据异常到稳定读取的完整解决方案 当工业物联网项目遇到Node-RED与西门子PLC通信时,DB块数据读取为0的问题就像一道无形的墙,让不少开发者陷入调试泥潭。上周深夜,我的工作站屏幕…...

GLM-OCR辅助Anaconda环境下的数据分析:自动识别图表中的数据标签

GLM-OCR辅助Anaconda环境下的数据分析:自动识别图表中的数据标签 你是不是也遇到过这种情况?从一份PDF报告或者一篇学术论文里,看到一张特别有价值的图表,上面有你想分析的数据趋势。但问题是,这些数据都“锁”在图片…...

vllm部署DeepSeek-R1-Distill-Qwen-1.5B:高并发推理性能评测教程

vllm部署DeepSeek-R1-Distill-Qwen-1.5B:高并发推理性能评测教程 1. 模型介绍与部署价值 DeepSeek-R1-Distill-Qwen-1.5B是DeepSeek团队基于Qwen2.5-Math-1.5B基础模型,通过知识蒸馏技术打造的轻量化版本。这个模型在保持强大能力的同时,专…...

Ostrakon-VL-8B模型微调入门:使用自定义餐饮数据集

Ostrakon-VL-8B模型微调入门:使用自定义餐饮数据集 你是不是也遇到过这样的情况?看到一个很棒的视觉语言模型,它能识别各种通用物体,但当你拿一张特色地方菜或者自家餐厅的新品图片给它看时,它却常常“答非所问”&…...

OpenClaw新手避坑:千问3.5-9B安装配置常见错误指南

OpenClaw新手避坑:千问3.5-9B安装配置常见错误指南 1. 为什么写这篇文章 上周我在本地部署OpenClaw对接千问3.5-9B模型时,连续踩了五个坑——从环境变量配置错误到模型地址拼写错误,甚至因为一个不起眼的端口冲突浪费了两小时。这种经历让我…...

2026年,教培机构不可错过的在线教学平台大盘点

一、在线教育的崛起与挑战随着互联网技术的飞速发展,在线教育迎来了爆发式增长,成为教育领域的重要力量。据艾瑞咨询数据显示,中国在线教育行业市场规模已突破 6000 亿元,并呈现持续增长趋势。特别是在疫情期间,在线教…...

打造沉浸式智能AI问答助手:Vue + UniApp 全端实战(支持 Markdown/公式/多模态交互)畔

OCP原则 ocp指开闭原则,对扩展开放,对修改关闭。是七大原则中最基本的一个原则。 依赖倒置原则(DIP) 什么是依赖倒置原则 核心是面向接口编程、面向抽象编程, 不是面向具体编程。 依赖倒置原则的目的 降低耦合度&#…...

Fish Speech-1.5中文语音惊艳案例:古诗词吟诵/方言童谣/戏曲念白生成

Fish Speech-1.5中文语音惊艳案例:古诗词吟诵/方言童谣/戏曲念白生成 你听过AI用抑扬顿挫的语调吟诵唐诗宋词吗?你听过AI用地道的方言念出童年歌谣吗?你听过AI模仿戏曲念白,字正腔圆、韵味十足吗? 今天,我…...

FLUX.1-dev驱动像素终端实战:API服务封装与Python脚本批量调用示例

FLUX.1-dev驱动像素终端实战:API服务封装与Python脚本批量调用示例 1. 像素幻梦工坊概述 Pixel Dream Workshop是一款基于FLUX.1-dev扩散模型的像素艺术生成终端,专为创作者设计。它采用16-bit像素风格的现代明亮界面,彻底改变了传统AI绘图…...

Wan2.1-T2V-1.3B-部署

基础环境 下载模型 modelscope download Wan-AI/Wan2.1-T2V-1.3B --local_dir ./Wan2.1-T2V-1.3Bgit clone https://github.com/Wan-Video/Wan2.1.git启动 cd gradio GRADIO_SERVER_NAME"0.0.0.0" DASH_API_KEY"sk-xxx" python t2v_1.3B_singleGPU.py --pr…...

Lingyuxiu MXJ LoRA效果惊艳展示:高清细腻真人人像生成作品集

Lingyuxiu MXJ LoRA效果惊艳展示:高清细腻真人人像生成作品集 1. 项目简介 Lingyuxiu MXJ LoRA是一款专门为生成唯美真人风格人像而设计的轻量级AI图像生成系统。这个项目最大的特点是能够创造出五官细腻、光影柔和、质感逼真的人像作品,而且完全不需要…...

关于 SSR,我承认我之前只是“会用”而已

SSR、Hydration 这些词在 Web 前端领域非常常见,开发者经常能接触到这个概念。但是,这些是什么?为什么?怎么用?过去我都没有深究下去,关于 SSR,我承认我之前只是“会用”而已。 一、区分 CSR 还…...

Z-Image-Turbo-辉夜巫女高性能部署:Xinference量化加载+Gradio并发优化实测

Z-Image-Turbo-辉夜巫女高性能部署:Xinference量化加载Gradio并发优化实测 1. 项目简介 Z-Image-Turbo-辉夜巫女是基于Z-Image-Turbo模型的Lora版本,专门用于生成高质量的辉夜巫女风格图片。这个镜像通过Xinference框架实现了高效的模型部署&#xff0…...

Ollama小白入门:从零开始使用Yi-Coder-1.5B,体验AI写代码

Ollama小白入门:从零开始使用Yi-Coder-1.5B,体验AI写代码 1. 为什么你需要Yi-Coder-1.5B 作为一个开发者,你是否经常遇到这些情况: 知道要实现什么功能,但写不出具体代码需要快速生成一些模板代码来节省时间学习新编…...

前端设计融合:忍者像素绘卷:天界画坊生成UI/UX素材实战

前端设计融合:忍者像素绘卷:天界画坊生成UI/UX素材实战 1. 像素艺术在前端设计中的独特价值 像素艺术作为一种复古又现代的设计风格,近年来在前端设计领域重新焕发生机。不同于传统设计工具需要手动绘制每个像素点,忍者像素绘卷…...

cv_unet_image-colorization实战案例:退役军人事务局荣誉影像AI修复工程

cv_unet_image-colorization实战案例:退役军人事务局荣誉影像AI修复工程 1. 项目背景与意义 在退役军人事务局的档案库中,保存着大量珍贵的历史照片。这些黑白影像记录着军人的荣誉时刻,但由于年代久远和技术限制,很多照片已经褪…...

科研助手实战:OpenClaw+Phi-3-vision自动整理文献图表数据

科研助手实战:OpenClawPhi-3-vision自动整理文献图表数据 1. 为什么需要自动化文献整理 作为一名经常需要阅读大量论文的研究者,我发现自己花费在整理文献数据上的时间越来越长。每次下载几十篇PDF,手动截图关键图表、复制数据表格、整理参…...

Filter下固定块半导体设备PP精密加工案例 | 莱图加工程师实录

本次案例来自一家半导体微电子设备制造企业的委托加工需求,零件为Filter下固定块,作为莱图加承接的半导体设备零件加工项目之一,该零件在湿法工艺设备、晶圆清洗设备或化学液过滤系统中承担Filter组件的下部固定与支撑功能。Filter下固定块&a…...

【开源】从设计文档到可交付技术交底书:专利.Skill

【开源】从设计文档到可交付技术交底书:专利.Skill 摘要 设计文档、代码都有了,专利点却还没梳清?交底书既要系统框图与流程图,又要代理人能直接改的 Word,多轮补材料还不能覆盖旧稿?本文介绍开源仓库 pat…...

深入解析dify中的TF-IDF与余弦相似度在RAG重排序中的应用

1. 理解RAG中的重排序问题 在检索增强生成(RAG)系统中,重排序(rerank)是一个关键环节。想象一下你在图书馆用搜索引擎找资料:系统先找到100本可能相关的书,但真正对你有用的可能只有前3本。重排…...