指派问题匈牙利解法以及其优化
来源:互联网 发布:c语言四大圣经先后顺序 编辑:程序博客网 时间:2024/06/14 04:22
指派问题匈牙利解法以及其优化
本人第一次写blog,难免有不足之处,还请大家不吝指正。
1、问题的提出
简单的说,n个人恰好分别承担n个任务,每个人对于不同的任务效率不同;我们的目的就是为使任务完成效率尽可能的高。
例如:有4个工人,要分别指派他们完成4项不同的工作,每人做各项工作所消耗的时间如下表所示,问应如何指派工作,才能使总的消耗时间为最少。
若用0-1整数规划问题的常规思路来解,即:
解:令 xij = 1(第 i人完成第j项工作)或0(第 i人不进行第j项工作).于是得到一个0–1整数规划问题
Min z=15*X11+18*X12+21*X13+24*X14+19*X21+23*X22+22*X23+18*X24+26*X31
+17*X32+16*X33+19*X34+19*X41 +21*X42+23*X43+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、匈牙利解法相关概念与证明
定理1与2则为匈牙利法的根基所在,他通过一定的操作将效率矩阵的部分元素化为0,如果存在一组0,这组0满足:1、0的个数等于矩阵的阶数(即等于任务数);2、这组0中任意两个0不同行不同列;那么这组0所对应的分配方式即为最优解
证明过程如下:
个人理解:按照指派问题的定义,在效率矩阵中每行每列都有且仅有一个数,他相对于其他数小,则最终所耗最小
这里给一个简单的例子:
例:效率矩阵
第1,2,3,4行分别减去2,2,5,2,得到:
再对第四列减去3,得到:
则显然X11=X23=X34=X42=1,是最优解,最小费用为2+2+8+2=14
4、匈牙利解法步骤
在这之前先解释一下什么是独立0元素个数,设矩阵C中含有0元素,那么划去C中所有0元素所需的最少直线数等于C中独立0元素的个数。通俗的讲就是最多能选多少不同行不同列的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),则先从系数矩阵的每行减去该行的最小元素,再从所得系数矩阵的每列元素中减去该列 的最小元素。
其他步骤同匈牙利法。
以上例作为参考:
在执行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)
- 指派问题匈牙利解法以及其优化
- 指派问题与匈牙利解法
- 指派问题的匈牙利解法
- 指派问题匈牙利算法
- 匈牙利指派问题
- 匈牙利算法解决指派问题清晰流程
- java编写匈牙利算法解决最优指派问题
- Hungarian method (匈牙利算法)----解决指派问题(转)
- 指派问题
- SPFA以及其优化
- SPFA以及其优化
- 指派问题、回溯法
- 解决指派问题
- 运动员指派问题
- poj 2175--指派问题
- 指派问题 MATLAB实现
- 指派问题的数学模型
- matlab指派问题 线性规划
- ACM2-1003
- PHP是什么
- 测试总结
- HttpClient + Jsoup 网页数据抓取
- 暴搜 bnu51645 ACM Battle
- 指派问题匈牙利解法以及其优化
- Android学习(41) -- 自定义控件(5)图片轮播(伪循环)
- Adobe Photoshop CS5如何调出标尺和网格
- HDU2871Memory Control(线段树)
- Linux环境下MySQL报Table 'xxx' doesn't exist错误解决方法
- 欢迎使用CSDN-markdown编辑器
- 【图文详解】scrapy安装与真的快速上手——爬取豆瓣9分榜单
- C语言中,为什么字符串可以赋值给字符指针变量
- angular2 will be kiiled by react in the future?