匈牙利法及其最优性分析
本文介绍求解指派问题的匈牙利法,并证明该算法的最优性。
算法流程
算法步骤:
- 对成本表中每一行的数值,减去该行的最小值
- 对成本表中每一列的数值,减去该列的最小值
- 在 000 元素中找到可行解
例 1:
某指派问题的成本表如下:
任务 1 | 任务 2 | 任务 3 | |
---|---|---|---|
人员 1 | 15 | 10 | 9 |
人员 2 | 9 | 15 | 10 |
人员 3 | 10 | 12 | 8 |
步骤 1:
任务 1 | 任务 2 | 任务 3 | |
---|---|---|---|
人员 1 | 6 | 1 | 0 |
人员 2 | 0 | 6 | 1 |
人员 3 | 2 | 4 | 0 |
步骤 2:
任务 1 | 任务 2 | 任务 3 | |
---|---|---|---|
人员 1 | 6 | 0 | 0 |
人员 2 | 0 | 5 | 1 |
人员 3 | 2 | 3 | 0 |
步骤 3:步骤 2 的表格中,加粗的 000 元素即为最优解。
在步骤 3 中,若在 000 元素中找不到可行解,则作如下操作:
- 画出可以覆盖所有 000 元素的最小行列
- 对于未画到的元素所构成的子矩阵,所有元素减去该子矩阵中的最小值,然后在被画到的区域的交叉点加上该最小值
- 回到步骤 3 寻找可行解,如果仍然无法找到,重复前述步骤
例 2:
某指派问题的成本表如下:
任务 1 | 任务 2 | 任务 3 | 任务 4 | |
---|---|---|---|---|
人员 1 | 1 | 4 | 6 | 3 |
人员 2 | 9 | 7 | 10 | 9 |
人员 3 | 4 | 5 | 11 | 7 |
人员 4 | 8 | 7 | 8 | 5 |
步骤 1, 2:
任务 1 | 任务 2 | 任务 3 | 任务 4 | |
---|---|---|---|---|
人员 1 | 0 | 3 | 2 | 2 |
人员 2 | 2 | 0 | 0 | 2 |
人员 3 | 0 | 1 | 4 | 3 |
人员 4 | 3 | 2 | 0 | 0 |
可行性处理:
任务 1 | 任务 2 | 任务 3 | 任务 4 | |
---|---|---|---|---|
人员 1 | 0 | 2 | 1 | 1 |
人员 2 | 3 | 0 | 0 | 2 |
人员 3 | 0 | 0 | 3 | 2 |
人员 4 | 4 | 2 | 0 | 0 |
求解结果:
任务 1 | 任务 2 | 任务 3 | 任务 4 | |
---|---|---|---|---|
人员 1 | 0 | 2 | 1 | 1 |
人员 2 | 3 | 0 | 0 | 2 |
人员 3 | 0 | 0 | 3 | 2 |
人员 4 | 4 | 2 | 0 | 0 |
最优性证明
指派问题的数学模型如下:
决策变量:
xi,jx_{i, j}xi,j | 0-1 | 人员 iii 安排到任务 jjj |
约束条件:
每个人刚好分配一项任务 | ∑j=1nxi,j=1i=1,2,...,n\sum^{n}_{j=1} x_{i, j} = 1 \quad i = 1, 2, ..., n∑j=1nxi,j=1i=1,2,...,n |
每项任务刚好分配给一个人 | ∑i=1nxi,j=1j=1,2,...,n\sum^{n}_{i=1} x_{i, j} = 1 \quad j = 1, 2, ..., n∑i=1nxi,j=1j=1,2,...,n |
目标函数:
minz=∑i=1n∑j=1nci,j⋅xi,j\min \ z = \sum^{n}_{i=1} \sum^{n}_{j=1} c_{i, j} \cdot x_{i, j} min z=i=1∑nj=1∑nci,j⋅xi,j
根据该问题的约束条件的特征,对于成本矩阵中任何一行或列同时加减一个常数,不影响最优解的取值,即:
∑i∑jci,j′⋅xi,j=∑i∑j(ci,j−pi−qj)⋅xi,j=∑i∑jci,j⋅xi,j−∑ipi⋅(∑jxi,j)−∑jqj⋅(∑ixi,j)=∑i∑jci,j⋅xi,j−∑ipi−∑jqj=∑i∑jci,j⋅xi,j−C\begin {aligned} \sum_{i} \sum_{j} c^{\prime}_{i, j} \cdot x_{i, j} &= \sum_{i} \sum_{j} (c_{i, j} - p_{i} - q_{j}) \cdot x_{i, j} \\ &= \sum_{i} \sum_{j} c_{i, j} \cdot x_{i, j} - \sum_{i} p_{i} \cdot (\sum_{j} x_{i, j}) - \sum_{j} q_{j} \cdot (\sum_{i} x_{i, j}) \\ &= \sum_{i} \sum_{j} c_{i, j} \cdot x_{i, j} - \sum_{i} p_{i} - \sum_{j} q_{j} \\ &= \sum_{i} \sum_{j} c_{i, j} \cdot x_{i, j} - C \end {aligned} i∑j∑ci,j′⋅xi,j=i∑j∑(ci,j−pi−qj)⋅xi,j=i∑j∑ci,j⋅xi,j−i∑pi⋅(j∑xi,j)−j∑qj⋅(i∑xi,j)=i∑j∑ci,j⋅xi,j−i∑pi−j∑qj=i∑j∑ci,j⋅xi,j−C
对于前述的特殊情况,即步骤 3 中无法找到可行解时的操作(例 2),对未画到的子矩阵减去最小值时,相当于对其所在行或列的已画线的单元格也减去了该数值,而为了保持已画线的单元格数值不变,相当于把该数值再加回来,故直接在交叉点加上该数值即可。
综上所述,匈牙利法所得解为最优解。
参考文献
Hamdy A. Taha. Operations Research an Introduction 初级篇 Chapter 5
匈牙利法及其最优性分析相关推荐
- 最优化建模、算法与理论(四)—— 最优性理论
参考书籍<最优化:建模.算法与理论> 文章目录 1 最优化问题解的存在性 1.1 Weierstrass 定理 1.2 强拟凸函数 1.3 唯一性定理 2 无约束可微问题的最优性理论 2. ...
- KDD 2020 开源论文 | 稀疏优化的块分解算法
©PaperWeekly 原创 · 作者|袁淦钊 单位|鹏城实验室 研究方向|数值优化.机器学习 这次向大家分享的工作是鹏城实验室牵头,联合腾讯 AI 实验室和中山大学在 SIGKDD 2020 上发 ...
- QEBA:基于类边界查询访问的黑盒攻击
关注公众号,发现CV技术之美 今日分享一篇"老"论文,收录于CVPR2020『QEBA: Query-Efficient Boundary-Based Blackbox Attac ...
- 【论文笔记】具有反馈控制的自主优化
文章目录 写在前面 问题描述 最优性分析 稳定性分析 LaSalle函数 不变性原理 严格极小值的渐进稳定性 写在前面 原论文标题:Timescale Separation in Autonomous ...
- 高级人工智能课程笔记
课程部分笔记,依据<人工智能 一种现代化方法>第三版 目录 智能概述 搜索search Uninformed Search Informed Search 约束满足问题CSP MDP 值迭 ...
- 论文阅读:Understanding Doubly Stochastic Clustering
ICML 2022 丁天骄, Derek Lim, Rene Vidal, Benjamin D. Haeffele 摘要 将矩阵投影到双随机矩阵空间上的问题在机器学习中有几个应用.例如,在谱聚类中, ...
- 【运筹学】匈牙利法 ( 匈牙利法步骤 | 试指派调整矩阵原理分析 | 打 √ | 直线覆盖 )
文章目录 一.指派问题求解步骤 二.打 √ 三.直线覆盖 一.指派问题求解步骤 指派问题求解步骤 : 1 . 使行列出现 000 元素 : 指派问题系数矩阵 (cij)(c_{ij})(cij) 变 ...
- 经典贪心法:时间序列问题及其全局最优性证明
贪心算法是指在对问题求解时,总做出在当前看来是最好的选择.也就是说,不从整体上加以考虑,它所作出的仅仅是在某种意义上的局部最优解.一旦贪心算法求出了一个可行解,就要确定这个算法是否找到了最优解.为此, ...
- 揭秘深度学习成功的数学原因:从全局最优性到学习表征不变性
来源:机器之心 本文长度为4900字,建议阅读7分钟 本文为深层网络的若干属性,如全局最优性.几何稳定性.学习表征不变性,提供了一个数学证明. 近年来,深度学习大获成功,尤其是卷积神经网络(CNN)在 ...
最新文章
- Spring Cloud Alibaba基础教程:Nacos配置的多环境管理
- Symbian c++ MCameraObserver类的方法解释
- 一天搞定CSS: 浮动(float)的副作用--12
- python获得命令行参数的方法
- 如何关闭window10自动更新
- 在VS 2010上搭建Windows Phone 7开发平台
- (王道408考研数据结构)第五章树-第三节2:二叉树构造和重建
- python中path的用法,python中path的用法
- vue-element-admin 设置默认语言
- 《『若水新闻』客户端开发教程》——11.代码编码(3)
- mysql ip 访问_MySql通过ip地址进行访问的方法
- 计算机二级基础知识栈的计算,计算机二级考试公共基础知识点:栈及其基本运算.doc...
- 云南建投安二司的数字化创新之路:建筑行业里的样本力量
- DID 起步:图说去中心化身份 | ArcBlock 博客
- 错误 LNK1104 无法打开文件“C:\Users\Administrator\Desktop\新建文件夹\ConsoleApplication1\x64\Debug\ConsoleApplicat
- 龙腾世纪审判一直连接服务器,【1.7.2】【rpg】我的世界龙腾世纪群组服务器
- N点虚拟主机管理系统 企业版稳定亲测
- flutter 图形验证码
- 2021SC@SDUSC山东大学软件学院软件工程应用与实践--Ebiten代码分析 源码分析(四)
- cesium实时获取卫星的动态信息,包括经纬度和名称(onTick)
热门文章
- 连续十日票房日冠,《人生大事》带热了电影大盘!它凭何突出重围?
- 我的本科回忆录:从迷茫自卑到保送华科
- 苹果手机app应用显示未受信任打不开怎么办
- python生存曲线_用户行为与生存分析
- 软件测试周刊(第78期):你对未来越有信心,你对现在越有耐心。
- 看什么看!你的学习与就业我包了!!!
- Coursera | Andrew Ng (01-week-2-2.5)—导数
- Altium designer如何实现原理图和PCB交互式布局
- 一张图玩转 XMind 思维导图软件
- 计算机所有计算都是在内存,计算机的所有计算都是在内存中进行的