指派问题匈牙利解法以及其优化

本人第一次写blog,难免有不足之处,还请大家不吝指正。

1、问题的提出

简单的说,n个人恰好分别承担n个任务,每个人对于不同的任务效率不同;我们的目的就是为使任务完成效率尽可能的高。
例如:有4个工人,要分别指派他们完成4项不同的工作,每人做各项工作所消耗的时间如下表所示,问应如何指派工作,才能使总的消耗时间为最少。

若用0-1整数规划问题的常规思路来解,即:

解:令 xij = 1(第 i人完成第j项工作)或0(第 i人不进行第j项工作).于是得到一个0–1整数规划问题

Min z=15X11+18X12+21X13+24X14+19X21+23X22+22X23+18X24+26*X31
+17X32+16X33+19X34+19X41 +21X42+23X43+17*X44
使得:
Xij只能取0或者1,i,j = 1,2,3,4
最终变成一个线性规划的问题,最终将有4个x的值为1,其对应的下标便是最终的指派。

2、指派问题一般形式

设有 n 个资源(人或机器等)A1, A2, …, An,分配做 n 件事B1, B2, … Bn,要求每件事必须使用1个资源,且不同事件由不同资源完成。已知 Ai 做 Bj的效率(如劳动工时、成本、创造价值等)为cij 。问如何进行指派可使总工作效率最佳?
其中我们称Cij为效率矩阵,问题数学模型为:

3、匈牙利解法相关概念与证明

几个基础概念 解答
提出者及时间 1955年,库恩(W.W.Kuhn)利用匈牙利数学家康尼格(D.König)关于矩阵中独立零元素定理,提出了一种指派问题算法,被称为匈牙利解法。
定理1 设 C=(cij)是一个效率矩阵,若可行解x*=(xij)的 n个1所对应的 n个 C=(cij)均为0,则x* 是最优解。(若都为零,最终代价为0,定为最优)
定理2 设给定了以 C=(cij)为效率矩阵的指派问题 G,现将 C的元素cij 改变为:c′(ij)=c(ij)−ai−bi;ai与bi为常数c'(ij)=c(ij)-a_i-b_i;a_i与b_i为常数c′(ij)=c(ij)−ai​−bi​;ai​与bi​为常数则C’=c’ij为效率矩阵的指派问题G’与G有相同的最优解

定理1与2则为匈牙利法的根基所在,他通过一定的操作将效率矩阵的部分元素化为0,如果存在一组0,这组0满足:1、0的个数等于矩阵的阶数(即等于任务数);2、这组0中任意两个0不同行不同列;那么这组0所对应的分配方式即为最优解
证明过程如下:

个人理解:按照指派问题的定义,在效率矩阵中每行每列都有且仅有一个数,他相对于其他数小,则最终所耗最小

这里给一个简单的例子:
例:效率矩阵C=[2357352895782239]C= \begin{bmatrix} 2& 3 & 5&7 \\ 3&5&2&8 \\ 9&5&7&8 \\ 2&2&3&9\\ \end{bmatrix} C=⎣⎢⎢⎡​2392​3552​5273​7889​⎦⎥⎥⎤​
第1,2,3,4行分别减去2,2,5,2,得到:
C‘=[0135130640230017]C‘= \begin{bmatrix} 0& 1 & 3&5 \\ 1&3&0&6 \\ 4&0&2&3 \\ 0&0&1&7\\ \end{bmatrix} C‘=⎣⎢⎢⎡​0140​1300​3021​5637​⎦⎥⎥⎤​
再对第四列减去3,得到:
C‘′=[(0)13213(0)3402(0)0(0)14]C‘'= \begin{bmatrix} (0)& 1 & 3&2 \\ 1&3&(0)&3\\ 4&0&2&(0) \\ 0&(0)&1&4\\ \end{bmatrix} C‘′=⎣⎢⎢⎡​(0)140​130(0)​3(0)21​23(0)4​⎦⎥⎥⎤​
则显然X11=X23=X34=X42=1,是最优解,最小费用为2+2+8+2=14
##4、匈牙利解法步骤
在这之前先解释一下什么是独立0元素个数,设矩阵C中含有0元素,那么划去C中所有0元素所需的最少直线数等于C中独立0元素的个数。


这里独立0个数为3
step 1:每行减去该行的最小数, 每列减去该列的最小数,使矩阵每行每列均有0元素
step 2:从单个0元素的行(列)开始,给0加圈,记作,然后划去所在列(行)的其它0元素,记为;重复进行,直到处理完所有列(行)的单个0元素;
若还存在没有画圈的0元素(同行或同列中的0元素多于1个),则从剩余的0元素最少的行(列)开始,选0元素画圈,然后划掉同行同列的其它0元素,反复进行,直到所有0元素均被圈出或划掉为止;
元素的数目m=n,则该指派问题的最优解已经得到,否则转入Step 3;

step3 设有 m小于n 个, 找最少覆盖所有0的直线
1) 对没有的行打√
2) 对已打√行中含所在列打√
3)对已打√列中含◎所在行打√
4) 重复2)~3), 直至没有要打√的行和列为止 5) 对没有打√的行划横线, 对打√的列划竖线 得到最少覆盖所有0的直线数l。
若l小于n,则转Step 4;若l=n,则转Step 2重新派;
step 4 设未被这些直线覆盖的元素中的最小值为a。 对未划线的行减去a,划线的列加上a。转Step 2。

例:效率矩阵如下

step 1:每行减去该行最小元素

step 2和step 3:l<4,在没划线的元素里,最小元素为2

step 4:未划线行减去2,划线列加2,并执行step 2

所以我们得到2个最优指派方案: 1)甲—B ,乙—D,丙—E,丁—C,戊—A; 2)甲—B,乙—C,丙—E,丁—D,戊—A。所需总时间为 Min z=7+6+9+6+4=32单位时间。

5、匈牙利解法的优化

基本思想:
在进行step1时就使得step2出现的元素个数m等于矩阵阶数n的几率为1的函数值达到最大。
具体步骤如下:
step 0:观察每行最小元素个数总和r(sum)和每列最小元素个数总和c(sum)。注意:这里说的每行最小元素个数总和中最小元素是在每行的前提下!
step 1:当 r(sum)>=c(sum),则先从系数矩阵的每列减去该列的最小元素,再从所得系数矩阵的每行元素中减去该行的最小元素。反之如果当
r(sum)<=c(sum),则先从系数矩阵的每行减去该行的最小元素,再从所得系数矩阵的每列元素中减去该列 的最小元素。
其他步骤同匈牙利法。

以上例作为参考:
[1279798966671712149151466104107109]\begin{bmatrix} 12&amp; 7 &amp;9&amp;7&amp;9\\ 8&amp; 9 &amp;6&amp;6&amp;6 \\ 7&amp;17&amp; 12&amp;14&amp;9 \\ 15&amp; 14 &amp;6&amp;6&amp;10 \\ 4&amp; 10 &amp;7&amp;10&amp;9\\ \end{bmatrix} ⎣⎢⎢⎢⎢⎡​1287154​79171410​961267​7614610​969109​⎦⎥⎥⎥⎥⎤​
在执行step0时,第一行最小元素为7,并且有两个;第二行最小元素为6,并且有三个;第三行最小元素为7,并且有一个;第四行最小元素为6,并且有两个;第五行最小元素为4,并且有一个;所以r(sum)=2+3+1+2+1=9;同理,c(sum)=1+1+2+2+1=7;所以应该先从系数矩阵的每列元素中减去该列的最小元素,再从所得系数矩阵的每行元素中减去该行的最小元素。

通过step2,很容易得到:

所以我们得到2个最优指派方案: 1)甲—B ,乙—D,丙—E,丁—C,戊—A; 2)甲—B,乙—C,丙—E,丁—D,戊—A。所需总时间为 Min z=7+6+9+6+4=32单位时间。

经过1340次这种实例分析,有1267次是步骤优化后大大减少了计算量,73次是本身就无法优化的问题,计算量等于原计算量。

参考文献:
袁迁.刘舒燕.YUAN Qian.LIU Shu-yan 关于匈牙利法的优化[期刊论文]-武汉理工大学学报2007(3)

指派问题匈牙利解法以及其优化相关推荐

  1. 平衡运输问题及其表上作业法---指派问题及其匈牙利解法

    一.平衡运输问题及其表上作业法 平衡问题及数学建模  平衡运输问题: 就是生产数量与销售数量相等的运输问题.对总产量等于总需求量的运输问题,可直接采用表上作业法求最优运输方案  数学模型:  2.表上 ...

  2. 指派问题与匈牙利解法

    本文转载自: https://www.cnblogs.com/chenyg32/p/3293247.html 作者:chenyg32 转载请注明该声明. 指派问题概述: 实际中,会遇到这样的问题,有n ...

  3. Hungarian method 匈牙利算法 解决指派问题

    这个也讲得不错: https://blog.csdn.net/Wonz5130/article/details/80678410 from scipy.optimize import linear_s ...

  4. 学习匈牙利算法解决指派问题

    指派问题 指派问题的标准形式 指派问题的数学模型 非标准形式的指派问题 指派问题的匈牙利解法的一般步骤 以上步骤并不好理解下面进行一些实例展示方便理解 匈牙利解法的实例 这是一个比较友好的例子,一切按 ...

  5. 利用python解决指派问题(匈牙利算法)

    前言:最近在备战数模,看到了指派问题,饶有兴趣,百度上找了很多关于指派问题的解法,很明显用的是匈牙利算法,手工的计算,各种各种的博客都很详尽,大概都了解了具体原理(不懂的人可以自行百度),但是基本找不 ...

  6. 解题报告:luogu P2423 [HEOI2012]朋友圈【最大团转最大点独立集(匈牙利算法+时间戳优化)】

    图的最大团:"任意两点之间都有一条边相连"的子图被称为无向图的团,点数最多的团为图的最大团 朋友圈中任意两个点之间都有关系,既是图中的团. 答案就是图中的最大团. 我们如果把B国的 ...

  7. 【指派问题】基于matlab遗传算法求解指派优化问题【含Matlab源码 2292期】

    ⛄一.遗传算法求解指派优化问题简介 1 遗传算法 1.1 遗传算法简介 遗传算法是模拟生物在自然环境中的遗传和进化过程而形成的一种自适应全局优化概率搜索算法,它是一种多学科融合交叉的产物.遗传算法通过 ...

  8. 数学建模 匈牙利算法求解整数规划基本原理与编程实现

    投资问题(0-1规划) 匈牙利算法求解0-1规划问题 解答: 项目之间是互斥关系,所以使用x1+x2+x3=1; 项目5是以项目1为先验条件,所以x5<=x1,意味着x1=1时,x5=1或0 , ...

  9. (二)匈牙利算法简介

    1.历史 匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,广泛应用在运筹学领域, 美国数学家哈罗德·库恩于1955年提出该算法,之所以被称作匈牙利算法是因为算法很大一部分是基于以前匈牙利 ...

  10. 【LeetCode】1. 盛最多水的容器:C#三种解法

    题目:https://leetcode-cn.com/problems/container-with-most-water/ 盛最多水的容器 难度:中等 给你 n 个非负整数 a1,a2,...,an ...

最新文章

  1. android img标签属性_微信小程序 组件叠加效果(如 Android 中的添加蒙层)
  2. 什么是 PureMVC 框架(提供下载)
  3. java 调试 gdb_android gdb 调试实例演示(有源代码篇)
  4. Delphi 2009 新增的 Class Explorer
  5. ZOJ 2675 Little Mammoth(计算几何)
  6. sap权限激活_如何激活凭证流Fiori应用
  7. 2016年全国计算机技术与软件,2016年的上半年的全国计算机技术与软件专业技术资格(水平)考.doc...
  8. android 的各种文件类
  9. Office 2010导致 VS2008 页面设计器无响应
  10. mmap函数_Linux中的mmap映射 [二]
  11. verilog设计一个补码加减法运算器_一文搞懂:计算机中为什么用补码来存储数据?...
  12. 如何总结和整理学术文献?
  13. JS中height、clientHeight、scrollHeight、offsetHeight区别
  14. 【计算机毕业设计】题库管理系统的设计与实现
  15. 遥感数字图像处理学习 一、概念及组成
  16. 我是如何给妹子优化 Windows 的?
  17. 连续型随机变量及概率密度
  18. 四大国际反垃圾邮件组织介绍
  19. 钉钉在线课程开启屏幕共享时电脑蓝屏问题解决办法
  20. Git常用命令(汇总)

热门文章

  1. 用得上的商学课-老路
  2. 【数据库学习】数据库平台:Postgres(PG)与PostgreSQL
  3. 鼎捷鼎新E10ERP软件介绍及资料
  4. Autodesk AutoCAD 2018 for Mac 汉化破解版安装教程
  5. 弱电从业人员必须学习的一些CAD绘图技巧
  6. Spring 4.x vs Spring 5.x
  7. 适合新手入门—嵌入式C语言
  8. 非线性光纤光学_多模光纤中的非线性光学
  9. Postman下载及安装详细教程
  10. postman下载安装和基础使用教程(官网)