浅析指派问题的匈牙利解法成稿
浅析指派问题的匈牙利解法
胡小芹
数学科学学院 数学与应用数学 学号:040414057
指导教师:苏孟龙
摘要:对于指派问题,可以利用许多理论进行建模并加以解决,但匈牙利解法是解决指派问题的一种非常简单有效的方法,并且可以解决多种形式的指派问题,但匈牙利算法本身存在着一些问题,本文主要介绍了匈牙利算法的基本思想,基本步骤,以及它的改进方法.在匈牙利算法的基础上,本文还介绍了两种更简便实用的寻找独立零元素的方法——最小零元素消耗法和对角线法.
关键词:指派问题;匈牙利解法;最小零元素消耗法;对角线法 0 引言
在现实生活中经常会遇到把几个任务分派给几个不同的对象去完成,由于每个对象的条件不同,完成任务的效率和效益亦不同.指派问题的目标就是如何分派使所消耗的总资源最少(或总效益最优),如给工人分派工作,给车辆分配道路,给工人分配机床等等,同时许多网络问题(如旅行问题,任务分配问题,运输问题等),都可以演化成指派问题来解决.在现实生活中,指派问题是十分常见的问题,而匈牙利解法是解决指派问题的一种非常简单有效的方法.本文主要介绍匈牙利解法的基本原理及思想,解题步骤,不足与改进,以使匈牙利法更能有效地解决指派问题.
1 指派问题及其数学模型
指派问题是指由m项任务,需要n个人来承担,每人只能承担一项任务,且每项任务只能有一人来承担,由于各人的专长不同,各人完成的任务不同,导致其效率也各不相同.因此,就产生怎样科学地指派任务,才能使完成各项任务所消耗的总资源最少(或总成本最低等),由于m,n不同,指派问题可分为以下三种情况:
第一、当mn时,即为每人指派一项任务.
第二、当mn时,即任务数〉人数,这时可虚设(mn)个人构成mm的 效率矩阵,并且这(mn)个人在执行这m项任务时的效率应该是效率最高. 第三、当mn时,即配置人数〉任务数,这时应虚设(nm)项任务,并且这n个人在执行这(nm)项任务时的成本最低.
通过虚设任务或人,指派问题的效率矩阵都可以转化成方阵.匈牙利解法要求指派问题最小化,其数学模型为
设用cij0(i,j1,2,,n)表示指派第i个人去完成第j项任务时所用的时间,定义决策变量
1
xij
0
表示第i个人完成第j项任务, 表示不指派第i个人完成第j项任务.
则问题可转化为0-1线性规划问题:
n
n
ij
minZ
c
i1
j1
n
xij1,i1n
st xij1,
j1
x0或1,ij
j1,2,,n,i1,2,,n, i,j1,2,,n.
如果指派问题要求的是最大化问题如maxF,则可以转化为最小化问题,一般方法是:取Mmaxcij(i,j1,2n),令bijMcij(i,j1,2,n),则
n
n
ij
minf
b
i1
j1
,有FnMf,从而求maxF.
2 指派问题的解法——匈牙利解法
“匈牙利解法”最早是由匈牙利数学家D.Konig用来求矩阵中0元素的一种方法,由此他证明了“矩阵中独立0元素的最大个数等于能覆盖所有0元素的最少直线数”.1955年由W.W.Knhu在求解著名的指派问题时引用了这一结论,并对具体解法做了改进,仍称为匈牙利解法.
2.1 匈牙利解法的基本原理和解题思想
从根本上讲,求指派问题的最优解就是要在n阶方阵中找到n个这样的元素,它们分布在不同行不同列上,并且这些元素之和为最小,而要使这些元素之和为最小,就要使其中的每一个元素尽可能的小——最好这些元素都是其所在行所在列上的最小元素.
而指派问题的最优解又具有这样的性质(定理1):若从系数矩阵(cij)的每行(列)各元素中分别减去该行(列)的最小元素,得到的新矩阵(bij),那么以(bij)为系数矩阵求得的最优解与用(cij)求得最优解相同.
由于新矩阵(bij)中每行每列都有最小元“0”,因此,求原指派问题的最优解转化为在(bij)中指出n个分布在不同行不同列上的“0”元素(简称为独立0元素),而根据考尼格(Konig)证明的定理(定理2):矩阵中独立元素的0最多个数等于能覆盖所有零元素的最少直线数,利用这一定理,就可以通过寻找“能覆盖所有零元素的最少直线数”来确定(bij)中独立元0素的具体数量.若(bij)中独立0元素的个数少于矩阵的阶数n,就要继续对矩阵(bij)进行化简,直到找到n个独立0元素为止,这就是匈牙利解法的基本原理和解题思想. 2.2 匈牙利解法的解题步骤
第一步:变换效益矩阵,使新矩阵中的每行每列至少有一个0.
(1)行变换:找出每行最小元素,再从该行各元素中减去这个最小元素. (2)列变换:从所得新矩阵中找出每列中的最小元素,再从该列各元素中减去这个最小元素.
第二步:进行试指派,以寻找最优解. (1)逐行检查
从第一行开始,如果该行只有一个零元素,就对这个零元素打上括号,划去与打括号零元素同在一列的其他零元素,如果该行没有零元素,或有两个或多个零元素(已划去的不计在内),则转下行.
打括号的意义可理解为该项任务已分配给某人.如果该行只有一个0,说明只能有唯一分配.划掉同列括号零元素可理解为该任务已分配,此后不再考虑分配给
他人.当该行有两个或更多的零元素时,不计括号内的,其理由是至少有两个分配方案,为使以后分配时具有一定的灵活性,故暂不分配.
(2)逐列检查
在行检查的基础上,由第一列开始检查,如果该列只有一个零元素,就对这个零元素打括号,再划去与打括号零元素同行的其它零元素.若该列没有零元素或有两个以上零元素,则转下一列.
(3)重复(1)、(2)两步后,可能出现以下三种情况:
① 每行都有一个零元素标出括号,显然打括号的零元素必然位于不同行不同列,因此得到最优解.
② 每行每列都有两个或两个以上的零,这表示对这个人可以分配不同任务中的任意一个.这时可以从所剩零元素最少的行开始,比较这行各零元素所在列中元素的个数,选择零元素少的那列这个零元素打括号,划掉同行同列的其他它零元素,然后重复前面的步骤,直到所有0都作了标记.
③ 矩阵中所有零都作了标记,但标有(0)的元素个数少于m个,则转下步. 第三步:做最少的直线覆盖所有零元素,以确定该系数矩阵中能找到最多的独立0元素.
· 对没有()的行打√;
· 对打√的行上所有含0元素的列打√; · 再对打√的列上有()的行打√; · 重复上两步,直到过程结束;
· 对没有打√的行划横线,对所有打√的列划垂线.
这就得到了能覆盖矩阵中所有0元素的最少直线数.
第四步:非最优阵的变换——零元素的移动.
(1)在没有被直线覆盖的所有元素中,找出最小元素; (2)所有未被直线覆盖的元素都减去这个最小元素; (3)覆盖线十字交叉处的元素都加上这个最小元素; (4)只有一条直线覆盖的元素的值保持不变.
第五步:回到第二步,反复进行,直到矩阵中每行每列都有一个打()的0元素为止,即找到最优解.
2.3 匈牙利算法的一点注记
(1)匈牙利算法第一步变换效益矩阵使每行每列都出现零元素,一般方法是先行变换,再列变换,但先列变换再行变换最优解不变.
(2)有些时候先行后列变换后不能得到最优解,但先列后行变换时却能直接找到最优解,从而减少了计算步骤,使计算简明.如下所示:
先行变换,再列变换得
215B
134
1041415
9141613
7(0)811B
211
98(0)311
25(0)4
5
4 5
只找到三个独立0元素,不是最优解.那么先列变换,后行变换得
215B
134
1041415
9141613
7
138
B
711
9(0)
6(0)69
(0)532
1 (0)
每行每列都有“(0)”,得到最优解. 3 匈牙利法的不足与改进 3.1 不足和改进(一)
以上是匈牙利法的常规解题方法,虽然能有效地解决指派问题,但是其解题过程中还存在以下两点不足:
第一、在匈牙利算法的第二步中用“试指派”的方法寻找独立0元素,道理简单,也能很快找到独立0元素,但对于一个n阶方阵,这些独立0元素在矩阵中可能有n种排列方式,这样在矩阵中标出来的独立0元素排列很乱,没有规律.另外,对于某些矩阵0元素排列的比较有规律,本可以用别的更简单的方法寻找独立0元素,而用这种“一般性”的方法比较麻烦.
第二、在匈牙利算法的第三步“做最少的直线覆盖所有0元素”过程中,一会儿针行,一会儿针对列,一会儿对没有()的打√,一会儿又对有()的打√,一会对没有打√号的(行)划线,一会又对打√号的(列)划线,这样变来变去令人晕头转向,稍不注意就会出错,特别是对于这种画法每一步的意图以及内在原理,大多数人难以理解,具体步骤很难记住,难以掌握,这就影响了这一理论在实际工作
中的应用. 算法的改进:
第一、寻找独立0元素的一种新方法——对角线法.
对角线法的原理:根据要在指派问题化简后的系数矩阵(bij)中找出n个独立0元素,而这些独立0元素又分布在方阵的不同行不同列上,利用这一特点,我们可以对矩阵(bij)的行(或列)进行某种调换,就一定可以使这些独立0元素按矩阵的对角线排列,这样凡是出现在对角线上的零元素一定是独立0元素,而非对角线上的零元素也一定是非独立0元素,这样我们既能很快找到所有独立0元素,又能直观地发现矩阵中独立0元素的个数.
方法:从0元素数量最少的行开始,选择该列第一个0元素,根据该0元素所在行的位置确定该列元素在新矩阵中列的位置(若该0元素所在行是第i行,那么就将该0元素所在列放在新矩阵的第i列),并在原矩阵中划去这一列,并划掉同行其它
元素,再在剩下的矩阵中重新比较各列0元素的数量,并按前面方法进行,直至完
成.
这样就可以将所有独立0元素集中放在新矩阵的对角线上,当对角线上全为0时,就得到了指派问题的最优解,如果对角线上某一处不为0,说明该矩阵中独立0元素数量不足,这时需要对矩阵作进一步化简.
应用示例: 寻找矩阵B中的独立0元素
5
2B=
00
0044
5040
05
23
B=
00
10
031
540
044
044
540
030B
1
4
14
540
031
5
20(第一列与第四
52
列交换)或B2
0(第二列与第四列交换)
第二、最少直线的一种简单画法.
画法原理:根据定理“矩阵中独立0元素的最多个数恰好等于能覆盖所有0元素的最少直线数”,也就是说矩阵中有多少个独立0元素,就需要多少条直线将所有
元素覆盖,而从匈牙利法解题步骤看矩阵中独立0元素的数量m及位置,在划线
前是已知,所以覆盖0元素的最少直线数m也是已知的.
由于任意两个独立0元素“(0)”都不同行且不同列,而盖0线也只能按矩阵的行或列来划,因此,一条盖0线只能覆盖一个“(0)”,要覆盖m个“(0)”就需要m个直线.基于“盖0线”与独立0元素“(0)”之间数量的一对一关系,只要我们始终围绕着独立0元素“(0)”来画线,首先就能用最少的直线覆盖所有的独立0元素.另外,由于矩阵中的非独立0元素总是和某个独立0元素在同一行或同一列,因此画盖“(0)”线时,只要我们能使每条盖0线都尽可能多的附带非独立0元素,那我们就能实现用最少的直线覆盖所有0元线.
具体画法:
(1)标记——对“(0)”所在行和列上的0元素数量在行列旁予以标注,对没有“(0)”的行与列的打×号予以标记.
(2)画线——从有“(0)”的行与列中找出0元素最多的行(或列)画一横(或纵)线覆盖这些0元素.
(3)修正——从“(0)”所在行与列上的0元素数量减去已被覆盖的0元素数. (4)重复上述过程,直至覆盖所有0元素.
上述方法的关键是紧紧抓住独立0元素其所在行与列上的0元素的多少决定盖0线的画法(即画线的先后和方向,横向还是纵向),使每条线都能覆盖尽可能多的0元素.另外,因某些非独立0元素处在可被两条盖0线同时覆盖的交叉点上,为减少重复性覆盖,每画一条线后都要对各行各列0元素数予以修正(从中减去已被覆盖的0元素数).
示例: 试用最少的直线覆盖下列矩阵中的所有0元素
5
2B(0)
90
(0)31086
205(0)3
0(0)706
25
022 B(0)49
50
(0)31086
205(0)3
0(0)706
22
0321 425
2 1 2 3 ×
52B(0)
90
(0)31086
205(0)3
0(0)706
225
00221 B(0)429
50
(0)31086
205(0)3
0(0)706
20
00
21 425
2 1 1 × × 2 × 1 × ×
5
2
B(0)
90
(0)31086
205(0)3
0(0)706
20
0021 405
2 × × × ×
注意:当矩阵中的行和列旁标的0元素的数量相等时,我们从中任意选择一个画线,但是当此行(或列)中的0元素所对列(或行)中无“(0)”时,只能先划去此行(或列).比如上面的矩阵B中,第二行和第四列中0元素相等,都是最多(3个),若先划去第四列,则第二行中第五列中的0元素用这种方法无法划去,若要划去这个0元素,则直线增多. 3.2 不足和改进(二)
用于解决指派问题的匈牙利解法,在运算过程中存在着两个问题:第一、算法不完善.从未标零元素最少的行取定0元素,不能保证0元素所在的列未标零元素最少.因此,系数矩阵已存在最大匹配,但无法取得最大匹配,而算法中途停止.第二、计算步骤烦琐.当0元素不够又没有未标零元素时,作直线覆盖,移动零元素,然后再取定0元素,反复进行. 一 改进算法 1 完善匈牙利算法
选取零元素时,若被划行未标零元素多于一个,则要保证所标的零元素所在的列未标零元素最少.利用此方法可以解决问题一. 2 改进算法步骤
(1)利用匈牙利算法,由系数矩阵(cij)得到各行各列都有零元素的等效矩阵
(bij).
(2)若有未划零元素,则选有未划零元素最多的行或列作直线覆盖,直到没有未划零元素为止.
(3)若直线数目小于n,则在未划元素中选取最小元素,未划的各元素减去最小元素,直线交叉处的元素均加最小元素,转2.否则转4.
(4)选取有未标零元素最少的行(或列)取未标零元素,记(0),同行同列的未标零元素记 ;若该行(或列)未标零元素多于一个,则选列(或行)中未标零元素最少的本行未标零元素为(0),直到(0)元素个数等于n为止.
(5)结束算法,得到最大匹配.令对应于(0)的xij1,其余的xij0,并计算目标函数值. 二 定义及定理
定义1 作直线覆盖时,被直线覆盖的元素,称为已划元素.未被直线覆盖的元素,称为未划元素.
定义2 求最大匹配时,已作记号(0)和的零元素称为已标元素,未作记号的零元素称为未标零元素.
定理 矩阵(bij)中已存在最大匹配的充要条件是直线覆盖其中全部零元素的最少数目为n.
证明 必要性 若(bij)中有最大匹配,则(bij)中存在n个不同行不同列的零元素,故至少n条直线才能覆盖全部元素.
充分性 若覆盖全部零元素的最少直线数目为n,则(bij)中有n个不同行不同列的零元素.否则可以用少于n条的直线能覆盖全部元素.
此算法的优点是,先求具有最大匹配的等效矩阵,再求最大匹配.求解过程中可以减少迭代次数,降低计算量,并且对某些用匈牙利算法无法得到最大匹配的矩
0
阵利用此改进的算法可以得到最大匹配,例如效益矩阵(bij)0
0
100
0
2. 3
3.3 不足和改进(三) 3.3.1 匈牙利法存在的问题
我们用“匈牙利法”处理了许多与分配问题相关的运输、调度问题,大多数情况下算法是收敛的,得到了最优解,而处理一些特殊数据时算法不收敛,无法找出最优解,矩阵阶数越大的分配问题,不收敛的情况越多.
试验中,发现了一个较小阶不收敛的系数矩阵,下面用“匈牙利法”对该矩阵进行分析
2 2 4 1 4 4 4 4 1 2 2 1 1 2 3 3 3 1 2 3 1 4 4 2 4 3 4 2 1 1 4 1 3 1 1 2 3 1 1 1 2 2 1 3 1 1 3 1 4 2 2 3 1 3 3 4 2 1 1 1 3 3 1 3 2 4 1 3 1 4 1 2 1 4 1 2 1 4 3 1 4
经过算法第一步,得到修正的系数矩阵
1 1 3 0 3 3 3 3 0 1 1 0 0 1 2 2 2 0 1 2 0 3 3 1 3 2 3 1 0 0 3 0 2 0 0 1 2 0 0 0 1 1 0 2 0 0 2 0 3 1 1 2 0 2 2 3 1 0 0 0 2 2 0 2 1 3 0 2 0 3 0 1 0 3 0 1 0 3 2 0 3
进行算法第二步,做分配方案,最终第2行无(0)标记,使得第2行第2列没有分配
1 1 3 (0) 3 3 3 3 × 1 1 × × 1 2 2 2 × 1 2 (0) 3 3 1 3 2 3
1 × × 3 (0) 2 × × 1
2 × × × 1 1 (0) 2 ×
(0) 2 × 3 1 1 2 × 2
2 3 1 × × × 2 2 (0)
2 1 3 × 2 × 3 × 1
× 3 × 1 × 3 2 (0) 3
进行算法第三步,最终所有的行和所有的列都有∨标记,所有的行末画一条横线,所有的列都画上了竖线,各行列作标记的顺序如下
∨ ∨ ∨ ∨ ∨ ∨ ∨ ∨ ∨
⒄ ⑿ ⑵ ⑶ ⑻ ⑼ ⒀ ⒁ ⑷
1 1 3 (0) 3 3 3 3 × ⑹∨
1 1 × × 1 2 2 2 × ⑴∨
1 2 (0) 3 3 1 3 2 3 ⑸∨
1 × × 3 (0) 2 × × 1 ⑽∨
2 × × × 1 1 (0) 2 × ⒂∨
(0) 2 × 3 1 1 2 × 2 ⒅∨
2 3 1 × × × 2 2 (0) ⑺∨
2 1 3 × 2 (0) 3 × 1 ⑾∨
× 3 × 1 × 3 2 (0) 3 ⒃∨
进行算法第四步,没有找到未被直线覆盖的元素,所以也就无法找到最小的元素,也就不能产生新的效能矩阵,算法进入死循环.这就否定了“匈牙利法”主要过程的算法基础.若算法第二步未完成一个完全分配时,则一定能生成一个新的效能矩阵,出现新的零元素,再重新进行完全分配,最终一定能得到一个完全的最优解.
3.3.2 匈牙利算法的改进
为了使“匈牙利法”对任意数据都能有效的找到最优解,我们在原算法的基础上增加第六步,以及在第三步后面增加判断功能:若生成n条直线,无法生成新的效能矩阵,则退出“匈牙利法”,进行第六步.
第六步:产生新的小系数矩阵,使原矩阵分解.
(1)从第二步算法中,记下有(0)标记的行号和列号,作为部分解进行保存.
(2)从系数矩阵中抽取行列都没有(0)标记的数据,组成一个新的小系数矩 阵:[Eij],i1,2,,m,j1,2,,m,mn.
(3)将小系数矩阵再代入“匈牙利法”, 继续计算, 得到小系数矩阵的分配解, 把它添加到部分解的结果中去,组合得到一个新的解,如果新的解仍然不是完全解,则转(1)继续处理.
(4)对已分配的元素,两两一对组成任意一个矩形的斜对角顶点, 相加后生成一个基础量, 再将矩形的另一对斜对角顶点的元素相加,生成一个改变量,有n个已分配的元素将产生123n2n1对基础量和改变量.
(5)对于每对基础量和改变量,如果存在基础量大于改变量的情况,则找出基础量与改变量差值最大的一对,由改变量取代基础量,转(4)继续处理.
(6)得到整个分配的最优解,输出分配结果.
在上例中,新的小系数矩阵仅为第2行和第2列,m为1.另外,也没有找到改变量小于基础量的两对值,所以无须进行优化,直接将该元素添加到部分解中去,通常新的小系数矩阵的阶数都很小.
文献5中给出了一个2222的系数矩阵,存在上述问题,利用改进的匈牙利算法最终得到最优解.
3.4 匈牙利算法的推广
匈牙利算法的关键是在变换后的系数矩阵中找出n个分布在不同行不同列的独立0元素,而匈牙利算法计算过程比较麻烦,文献8,文献9在匈牙利算法的基础上提出了两种比较简单的寻找独立0元素的方法:最小零元素消耗法及对角线法.
3.4.1 最小零元素消耗法
基本思想:对于一个给定的矩阵,其中0元素的数目是一定的,这一定的0元素最多能分配出多少个0元素来?当分配出一个0元素时,该0元素所在行和列上的其它0元素就无法再分配,失去了作用,也就是说,分配出该0元素要用去0元素的个数为:该0元素本身+该0元素所在行上的其它0元素+该0元素所在列上的其它0元素,称此数为该0元素的0消耗数.对于给定矩阵中的所有0元素,可以很容易地找出其0消耗数,根据动态规划的最优化原理,如果第1次分配出0消耗数最少的0元素,将消耗的0元素去掉,在余下的0元素中再分配0消耗最少的0元素,重复
这样的过程,最终结果必将得到最多次数的分配即最大分配,这就是最小0元素消耗法.
基本方法:利用匈牙利算法变换系数矩阵,使每行每列出现0元素,计算出各个0元素的消耗数,分配处0消耗数最少的那个0元素,以(0)标记.此0元素所在行所在列以不起作用,再计算余下的个各个0元素的消耗数,重复上述步骤,直至每行每列的0元素都标记完,最终得到最大匹配,若标记(0)的个数等于矩阵阶数,得到最优解.
在应用此方法的时候,当遇到0消耗相同的0元素不止一个,此时应先分配哪个0元素呢?有以下三种情况:
(1)0消耗数相同,但0元素在同一行或同一列上,如下所示:
0(i,j2)
0(i1,j)0(i2,j)
0(i,j1)
现就0元素在同一行的情况说,如果分配其任何一个,另一个则被消耗掉,他们的0消耗数实际上是相同的,只能表示一个分配,要么分配0(i,j1),要么分配0(i,j2),但第i行则可以确定下来,等其它0元素分配完以后,如j1,j2列中有一列确定,则第
i行可以具体确定出0元素,若j1,j2列仍未确定,则说明最大分配小于n,或者有多
种最优分配方案.对于同一列的情况,可以确定第j列,具体分配哪一个,视其它0元素的分配而定.
(2)0消耗数相同且互相影响,但0元素不同行不同列,此时0元素的消耗数必共同消耗一个或两个0元素,如下所示:
0(i1,j1)
0
0(i2,j2)0(i1,j1)000(i2,j2)
0(i2,j2)的0消耗相同,设为q,他们的0消耗因共有0元素而相互影响, 0(i1,j1)、
若先分配0(i1,j1),则在余下的0元素中0(i2,j2)的0消耗数为q1或q2,必为最小,应予与分配.反之也是,因此这种情况两者应同时分配.
(3)0消耗数相同但互不影响,此时必为下图所示:
0(i1,j1)
0(i2,j2)
此时若先分配0(i1,j1),则在余下的0元素中,0(i2,j2)的0消耗必为最少,应予与
分配,反之也是.这种情况可将它们同时分配.
综合上述三种情况,当遇到0消耗数相同的0元素时,如果它们不在同一行同一列,可以将其同时分配;如果在同一行同一列上,可将该行或该列分配,分配数加1,具体分配视其它0元素分配结果而定.
3.4.2 对角线法
匈牙利算法的实质就是寻找n个分布在不同行不同列的零元素,而匈牙利算法本身计算过程较复杂,下面给出一种使系数矩阵对角线为零的算法——对角线法.
基本步骤:
第一步:变换系数矩阵使每行每列都出现零元素,同匈牙利算法第一步.
第二步:进行行排序,即
(1)在变换后的系数矩阵(bij)的第j列元素中(j1,2,,n),从第j,j1,,n行中选取最小元素,记为bij. 0
(2)将i0行元素与j行进行交换.
通过步骤二可使每列中的零元素或最小元素尽量出现在对角线上.
若这样选取的最小元素有两个以上时,则取这些最小元素所在行中第n个元素大者所对应的元素为最小元素;若第n个元素也相同,则取第n1个元素中大者对应的元素为最小元素,以此类推;若这些最小元素后各行对应元素都相同,则取这些最小元素所在行中第j1个元素小者对应元素为最小元素;若第j1个元素相同,则取再前一个元素中小者对应元素为最小元素,以此类推.若这些最小元素所
在行的对应元素均相同,则可任选一最小元素所在行与第j行元素交换.
第三步:检验——若bii0(i1,2,,n),则以得最优解,过程结束.否则进行第
四步.
第四步:进行行排序,排序过程类似于第二步,只须将第二步中的“列”改为“行”.而“行”改为“列”,“后”改为“下”,“前”改为“上”即可.
第五步:若bii0(i1,2,,n),则已得到最优解,迭代过程停止,否则进行第六
步.
第六步:bijbijbii,j1,2,,n.
第七步:若bij0,j1,2,,n,则返回第五步.否则,若bik0,则令
bjkbjkbik,j1,2,,n,返回第一步.
从上述过程来看,整个过程包括两个基本部分,第一部分是通过一系列矩阵的行列变换,把零元素排列在对角线上;第二部分是最解的检验,即所有bii0时,已
得到最优解.
对于此算法的收敛性分析,文献9中给出了几个定理,并进行了证明,可以看出此改进算法的收敛性极好,可以有效地解决指派问题.
4 对最大化指派问题的匈牙利解法的一点改进
对最大化的指派问题的解法,一般方法是找出系数矩阵(cij)中的最大元素,即
n
Mmaxcij(j1,2,,n)
i1,做矩阵B,其元素为bij(i1,2,,n;j1,2,,n)且
bijMcij,然后利用匈牙利解法最小化求B的最优解.下面我们在此基础上对其提出一点改进,直接在原系数矩阵上进行修改.
修改的原则是:在最小化问题中,系数矩阵不能出现负数,在最大化问题中,修改后的不能出现正元素,可出现零.
基本步骤:
第一步:修改系数矩阵.
每行都减去该行中最大元素,每列都减去该列中最大元素.
第二步:求最优解.
选取新矩阵的零元素,已得到问题的最优解.根据每个人只能完成一项任务,每项任务只能由一个人来完成的前提,则零元素只能选在不同行且不同列的元素,此时对应被选中的零元素打上括号(),其对应的xij等于1,其它的xij等于0,如此
划出的零元素为n个,则便可求得最优解.
如果划出的零元素少于n个,则转入第三步.
第三步:继续修改系数矩阵.
先找出无“(0)”号的行,然后找出该行有零的列;最后找出该列有“(0)”的行;重复后两步,直到找不出满足要求的列和行;对找到的行和没有找到的列的交叉元素加以比较,找出最大数,找到的行各元素分别减去此数,找到的列分别加上此数,转第二步.
利用这种方法来解最大化指派问题时,不需要用一个新矩阵代替原系数矩阵,可直接在原系数矩阵上进行修改,这种解法为在计算机上算法的实现提供了方便,由于此最大化问题的求解步骤的多少与先后同匈牙利最小化问题的求解步骤的多少与先后是相对应的,所以在编程时,可以用以实参代替形象的方法,用同一段参数的程序去解决最大化、最小化两个不同的问题.
5 结束语
指派问题是运筹学中的经典问题,它的主要目标是在解决问题时,如何分派使所消耗的总资源最少(或总体效益最优).如给工人分派工作,给车辆分配道路,给工人分配机床等等,同时许多网络问题(如旅行问题,任务分配问题,运输问题等),都可以演化成指派问题来解决.在现实生活中,指派问题是十分常见的问题,而匈牙利解法是解决指派问题的一种非常简单有效的方法,它能解决多种形式的指派问题,针对匈牙利算法存在一些不足,我们对其进行了改进和完善,利用改进后的匈牙利算法,不仅能更有效地解决指派问题,而且为计算机编程提供了方便. 6 致谢
这篇学位论文是在我的指导老师苏孟龙老师的亲切关怀和悉心指导下完成的.他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我.从课题的选择到项目的最终完成,苏老师都始终给予我细心的指导和不懈的支持.在此谨向苏老师致以诚挚的谢意和崇高的敬意.
另外,我还要感谢在一起愉快度过的老师和同学,正是由于你们的帮助和支持,我才能克服一个个的困难和疑惑,最终完成本论文,在此我想深深地对你们说一声谢谢!
参考文献:
[1]林齐宁.运筹学[M].北京邮电大学出版社,2002.
[2]施泉生.运筹学[M].中国电子出版社,2004.
[3]胡运权等.运筹学基础及应用[M].高等教育出版社,2004.
[4]张雷顺.对最大化指派问题匈牙利解法的一点改进[J].郑州工业大学学报,2001,22(2):57-59.
[5]金升灿.指派问题的一种改进算法[J].佳木斯工学院报,1998,16(1):118-119.
[6]王琼华,王刚.指派问题数学模型的匈牙利解法[J].昆明冶金高等专科学校学报,2006,22(5):82-84.
[7]顾大权,左莉,侯太平,王演虎.“匈牙利法”存在的问题及改进方法[J].微机发展,2003,13(14):76-78.
[8]赵升.对分配问题求解方法的改进[J].郑州工业大学学报,1998,19(3):92-95.
[9]卢崇华.分派问题的一种实用算法—对角线法[J].山东矿业学院学报,1993,12(3):240-244.
[10]张联名.对指派问题匈牙利解法的两点改进[J].西安航空技术高等专科学校学报,2007,25(1):64-66.
[11]焦吉成.对匈牙利算法的改进及应用实例[J].上东冶金,2000,22(2):55-57.
[12]李兴华.关于指派问题求解过程的改进[J].上东矿业学院报,1996,15(4):34-38.
[13]高振宇,刘群,陈迎欣.改进的匈牙利算法在小组软件过程中的应用[J].应用科技,2003,30(11):56-58.
[14]王增富.“人少任务多”最小分配问题的一种解法[J].燕山大学学报,2004,28(5):467-470.
[15]常庭懋,韩中庚.用“匈牙利算法”求解一类最优化问题[J].信息工程大学学报,2004,5(1):60-62.
Talking about Hungary Algorithm for Assign Issue
HU Xiao-qin
College of Mathematics Science No: 040414057
Tutor: SU Meng-long
Abstract: For assign issue, we can use many theories to model and solve it, and the Hungary algorithm is a very simple and effective method, it can solve many type assign issue. However, the Hungary algorithm has a lot of trouble, in this paper we mainly introduce the basic concept, the basic procedure and the modification of the Hungary algorithm. On the basis of the Hungary algorithm, we also introduce two more simple and applicable methods for finding separate zero element—the least zero element consumption method and the diagonal method.
Key Words: assign issue; hungary algorithm; least zero element consumption method; diagonal method