浅析指派问题的匈牙利解法成稿讲解

浅析指派问题的匈牙利解法成稿讲解
浅析指派问题的匈牙利解法成稿讲解

浅析指派问题的匈牙利解法

胡小芹

数学科学学院数学与应用数学学号:040414057

指导教师:苏孟龙

摘要:对于指派问题,可以利用许多理论进行建模并加以解决,但匈牙利解法是解决指派问题的一种非常简单有效的方法,并且可以解决多种形式的指派问题,但匈牙利算法本身存在着一些问题,本文主要介绍了匈牙利算法的基本思想,基本步骤,以及它的改进方法.在匈牙利算法的基础上,本文还介绍了两种更简便实用的寻找独立零元素的方法——最小零元素消耗法和对角线法.

关键词:指派问题;匈牙利解法;最小零元素消耗法;对角线法

0 引言

在现实生活中经常会遇到把几个任务分派给几个不同的对象去完成,由于每个对象的条件不同,完成任务的效率和效益亦不同.指派问题的目标就是如何分派使所消耗的总资源最少(或总效益最优),如给工人分派工作,给车辆分配道路,给工人分配机床等等,同时许多网络问题(如旅行问题,任务分配问题,运输问题等),都可以演化成指派问题来解决.在现实生活中,指派问题是十分常见的问题,而匈牙利解法是解决指派问题的一种非常简单有效的方法.本文主要介绍匈牙利解法的基本原理及思想,解题步骤,不足与改进,以使匈牙利法更能有效地解决指派问题.

1 指派问题及其数学模型

指派问题是指由m项任务,需要n个人来承担,每人只能承担一项任务,且每项

任务只能有一人来承担,由于各人的专长不同,各人完成的任务不同,导致其效率也各不相同.因此,就产生怎样科学地指派任务,才能使完成各项任务所消耗的总资源最少(或总成本最低等),由于n m ,不同,指派问题可分为以下三种情况:

第一、当n m =时,即为每人指派一项任务.

第二、当n m >时,即任务数〉人数,这时可虚设)(n m -个人构成m m ?的 效率矩阵,并且这)(n m -个人在执行这m 项任务时的效率应该是效率最高. 第三、当n m <时,即配置人数〉任务数,这时应虚设)(m n -项任务,并且这n 个人在执行这)(m n -项任务时的成本最低.

通过虚设任务或人,指派问题的效率矩阵都可以转化成方阵.匈牙利解法要求指派问题最小化,其数学模型为

设用0ij c >(,1,2,

,)i j n =表示指派第i 个人去完成第j 项任务时所用的时间,

定义决策变量 10ij i j x i j ?=??表示第个人完成第项任务, 表示不指派第个人完成第项任务.

则问题可转化为0-1线性规划问题:

∑∑===n j ij n i c Z 11min

t s ? 1

1

1,1,2,,,

1,1,2,,,01,i,j 1,2,,n n

ij i n

ij j ij

x j n x i n x ==?==???==???==??

∑∑或.

如果指派问题要求的是最大化问题如F max ,则可以转化为最小化问题,一般方法是:取max (,1,2

),ij M c i j n ==令(,1,2,)ij ij b M c i j n =-=,则11

min ,n n ij i j f b ===∑∑,max F nM f F =-有从而求. 2 指派问题的解法——匈牙利解法

“匈牙利解法”最早是由匈牙利数学家 D.Konig 用来求矩阵中0元素的一种方法,由此他证明了“矩阵中独立0元素的最大个数等于能覆盖所有0元素的最少直线数”.1955年由W.W.Knhu 在求解著名的指派问题时引用了这一结论,并对具体解法做了改进,仍称为匈牙利解法.

2.1 匈牙利解法的基本原理和解题思想

从根本上讲,求指派问题的最优解就是要在n 阶方阵中找到n 个这样的元素,它们分布在不同行不同列上,并且这些元素之和为最小,而要使这些元素之和为最小,就要使其中的每一个元素尽可能的小——最好这些元素都是其所在行所在列上的最小元素.

而指派问题的最优解又具有这样的性质(定理1):若从系数矩阵)(ij c 的每行(列)各元素中分别减去该行(列)的最小元素,得到的新矩阵()ij b ,那么以()ij b 为系数矩阵求得的最优解与用()ij c 求得最优解相同.

由于新矩阵()ij b 中每行每列都有最小元“0”,因此,求原指派问题的最优解转化为在()ij b 中指出n 个分布在不同行不同列上的“0”元素(简称为独立0元素),而根据考尼格(Konig )证明的定理(定理2):矩阵中独立元素的0最多个数等于能覆盖所有零元素的最少直线数,利用这一定理,就可以通过寻找“能覆盖所有零元素的最少直线数”来确定()ij b 中独立元0素的具体数量.若()ij b 中独立0元素的个数少于矩阵的阶数n ,就要继续对矩阵()ij b 进行化简,直到找到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)有些时候先行后列变换后不能得到最优解,但先列后行变换时却能直接找到最优解,从而减少了计算步骤,使计算简明.如下所示:

先行变换,再列变换得

2109715414813141611415139B ??????=→??????(0)82511(0)5423(0)001145B ??????=??????

只找到三个独立0元素,不是最优解.那么先列变换,后行变换得

2109715414813141611415139B ??????=→??????06(0)013(0)51763(0)(0)9

20B ??????=?????? 每行每列都有“(0)”,得到最优解.

3 匈牙利法的不足与改进

3.1 不足和改进(一)

以上是匈牙利法的常规解题方法,虽然能有效地解决指派问题,但是其解题过程中还存在以下两点不足:

第一、在匈牙利算法的第二步中用“试指派”的方法寻找独立0元素,道理简单,也能很快找到独立0元素,但对于一个n 阶方阵,这些独立0元素在矩阵中可能有n 种排列方式,这样在矩阵中标出来的独立0元素排列很乱,没有规律.另外,对于某些矩阵0元素排列的比较有规律,本可以用别的更简单的方法寻找独立0元素,而用这种“一般性”的方法比较麻烦.

第二、在匈牙利算法的第三步“做最少的直线覆盖所有0元素”过程中,一会

儿针行,一会儿针对列,一会儿对没有()的打√,一会儿又对有()的打√,一会对没有打√号的(行)划线,一会又对打√号的(列)划线,这样变来变去令人晕头转向,稍不注意就会出错,特别是对于这种画法每一步的意图以及内在原理,大多数人难以理解,具体步骤很难记住,难以掌握,这就影响了这一理论在实际工作中的应用.

算法的改进:

第一、寻找独立0元素的一种新方法——对角线法.

对角线法的原理:根据要在指派问题化简后的系数矩阵(

ij

b)中找出n个独立0元素,而这些独立0元素又分布在方阵的不同行不同列上,利用这一特点,我们可以

对矩阵(

ij

b)的行(或列)进行某种调换,就一定可以使这些独立0元素按矩阵的对角线排列,这样凡是出现在对角线上的零元素一定是独立0元素,而非对角线上的零元素也一定是非独立0元素,这样我们既能很快找到所有独立0元素,又能直观地发现矩阵中独立0元素的个数.

方法:从0元素数量最少的行开始,选择该列第一个0元素,根据该0元素所在行的位置确定该列元素在新矩阵中列的位置(若该0元素所在行是第i行,那么就将该0元素所在列放在新矩阵的第i列),并在原矩阵中划去这一列,并划掉同行其它0元素,再在剩下的矩阵中重新比较各列0元素的数量,并按前面方法进行,直至完成.

这样就可以将所有独立0元素集中放在新矩阵的对角线上,当对角线上全为0时,就得到了指派问题的最优解,如果对角线上某一处不为0,说明该矩阵中独立0元素数量不足,这时需要对矩阵作进一步化简.

应用示例: 寻找矩阵B中的独立0元素

B=

5050

2003

0440

0401

??

??

??

??

??

??

→B=

5050

2003

0440

0401

??

??

??

??

??

??

1

0505

0032

4400

4010

B

??

??

??

=

??

??

??

(第一列与第四

列交换)或

25050 2300 0044 0104

B

??

??

??

=

??

??

??

(第二列与第四列交换)

第二、最少直线的一种简单画法.

画法原理:根据定理“矩阵中独立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(0)202230(0)0(0)1057298(0)0406365B ????????=????????→ 5(0)2022230(0)03(0)10572198(0)042

06365B ????????=???????

??

2 1 2

3 ×

5(0)2022230(0)00(0)10572198(0)04206365B ????????=?????????→ 5(0)2020230(0)00(0)10572198(0)042

06365B ????????=???????

??→ 2 1 1 × × 2 × 1 × ×

5(0)2020230(0)00(0)10572198(0)040

06365B ????????=???????

?? 2 × × × ×

注意:当矩阵中的行和列旁标的0元素的数量相等时,我们从中任意选择一个画线,但是当此行(或列)中的0元素所对列(或行)中无“(0)”时,只能先划去此行(或列).比如上面的矩阵B 中,第二行和第四列中0元素相等,都是最多(3个),若先划去第四列,则第二行中第五列中的0元素用这种方法无法划去,若要划去这个0元素,则直线增多.

3.2 不足和改进(二)

用于解决指派问题的匈牙利解法,在运算过程中存在着两个问题:第一、算法不完善.从未标零元素最少的行取定0元素,不能保证0元素所在的列未标零元素最少.因此,系数矩阵已存在最大匹配,但无法取得最大匹配,而算法中途停止.第

二、计算步骤烦琐.当0元素不够又没有未标零元素时,作直线覆盖,移动零元素,然后再取定0元素,反复进行.

一 改进算法

1 完善匈牙利算法

选取零元素时,若被划行未标零元素多于一个,则要保证所标的零元素所在的列未标零元素最少.利用此方法可以解决问题一.

2 改进算法步骤

(1)利用匈牙利算法,由系数矩阵()ij c 得到各行各列都有零元素的等效矩阵

()ij b .

(2)若有未划零元素,则选有未划零元素最多的行或列作直线覆盖,直到没有未划零元素为止.

(3)若直线数目小于n ,则在未划元素中选取最小元素,未划的各元素减去最小元素,直线交叉处的元素均加最小元素,转2.否则转4.

(4)选取有未标零元素最少的行(或列)取未标零元素,记(0),同行同列的未标零元素记 φ;若该行(或列)未标零元素多于一个,则选列(或行)中未标零元素最少的本行未标零元素为(0),直到(0)元素个数等于n 为止.

(5)结束算法,得到最大匹配.令对应于(0)的1ij x =,其余的0ij x =,并计算目标函数值.

二 定义及定理

定义1 作直线覆盖时,被直线覆盖的元素,称为已划元素.未被直线覆盖的元素,称为未划元素.

定义2 求最大匹配时,已作记号(0)和φ的零元素称为已标元素,未作记号的零元素称为未标零元素.

定理 矩阵()ij b 中已存在最大匹配的充要条件是直线覆盖其中全部零元素的最少数目为n .

证明 必要性 若()ij b 中有最大匹配,则()ij b 中存在n 个不同行不同列的零元素,故至少n 条直线才能覆盖全部元素.

充分性 若覆盖全部零元素的最少直线数目为n ,则()ij b 中有n 个不同行不同列的零元素.否则可以用少于n 条的直线能覆盖全部元素.

此算法的优点是,先求具有最大匹配的等效矩阵,再求最大匹配.求解过程中可以减少迭代次数,降低计算量,并且对某些用匈牙利算法无法得到最大匹配的矩

阵利用此改进的算法可以得到最大匹配,例如效益矩阵010()002003ij b ????=??????

. 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)标记的数据,组成一个新的小系数矩 阵:[]ij E ,1,2,,,1,2,,,i m j m m n ==<.

(3)将小系数矩阵再代入“匈牙利法”, 继续计算, 得到小系数矩阵的分配解, 把它添加到部分解的结果中去,组合得到一个新的解,如果新的解仍然不是完全解,则转(1)继续处理.

(4)对已分配的元素,两两一对组成任意一个矩形的斜对角顶点, 相加后生成一个基础量, 再将矩形的另一对斜对角顶点的元素相加,生成一个改变量,有n 个已分配的元素将产生12321n n ++++-+-对基础量和改变量.

(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元素在同一行或同一列上,如下所示:

120(,)0(,)i j i

j

120(,)

0(,)i j i

j

现就0元素在同一行的情况说,如果分配其任何一个,另一个则被消耗掉,他们的0消耗数实际上是相同的,只能表示一个分配,要么分配10(,)i j ,要么分配20(,)i j ,但第i 行则可以确定下来,等其它0元素分配完以后,如12,j j 列中有一列确定,则第i 行可以具体确定出0元素,若12,j j 列仍未确定,则说明最大分配小于n ,或者有多种最优分配方案.对于同一列的情况,可以确定第j 列,具体分配哪一个,视其它0元素的分配而定.

(2)0消耗数相同且互相影响,但0元素不同行不同列,此时0元素的消耗数必共同消耗一个或两个0元素,如下所示:

11220(,)00(,)i j i

j 11220(,)0

00(,)i j i

j

110(,)i j 、

220(,)i j 的0消耗相同,设为q ,他们的0消耗因共有0元素而相互影响,若先分配110(,)i j ,则在余下的0元素中220(,)i j 的0消耗数为1q -或2q -,必为最小,应予与分配.反之也是,因此这种情况两者应同时分配.

(3)0消耗数相同但互不影响,此时必为下图所示:

11220(,)

0(,)i j i

j

此时若先分配110(,)i j ,则在余下的0元素中,220(,)i j 的0消耗必为最少,应予与分配,反之也是.这种情况可将它们同时分配.

综合上述三种情况,当遇到0消耗数相同的0元素时,如果它们不在同一行同一列,可以将其同时分配;如果在同一行同一列上,可将该行或该列分配,分配数加1,具体分配视其它0元素分配结果而定.

3.4.2 对角线法

匈牙利算法的实质就是寻找n 个分布在不同行不同列的零元素,而匈牙利算法本身计算过程较复杂,下面给出一种使系数矩阵对角线为零的算法——对角线法.

基本步骤:

第一步:变换系数矩阵使每行每列都出现零元素,同匈牙利算法第一步.

第二步:进行行排序,即

(1)在变换后的系数矩阵()ij b 的第j 列元素中(1,2,

,)j n =,从第,1,,j j n +行中选取最小元素,记为0b i j .

(2)将0i 行元素与j 行进行交换.

通过步骤二可使每列中的零元素或最小元素尽量出现在对角线上.

若这样选取的最小元素有两个以上时,则取这些最小元素所在行中第n 个元素大者所对应的元素为最小元素;若第n 个元素也相同,则取第1n -个元素中大者对应的元素为最小元素,以此类推;若这些最小元素后各行对应元素都相同,则取这些最小元素所在行中第1j -个元素小者对应元素为最小元素;若第1j -个元素相

同,则取再前一个元素中小者对应元素为最小元素,以此类推.若这些最小元素所在行的对应元素均相同,则可任选一最小元素所在行与第j 行元素交换.

第三步:检验——若0ii b =(1,2,

,)i n =,则以得最优解,过程结束.否则进行第四步.

第四步:进行行排序,排序过程类似于第二步,只须将第二步中的“列”改为“行”.而“行”改为“列”,“后”改为“下”,“前”改为“上”即可.

第五步:若0ii b =(1,2,

,)i n =,则已得到最优解,迭代过程停止,否则进行第六步.

第六步:,1,2,

,ij ij ii b b b j n =-=. 第七步:若0,1,2,

,ij b j n ≥=,则返回第五步.否则,若0ik b <,则令,1,2,,jk jk ik b b b j n =-=,返回第一步.

从上述过程来看,整个过程包括两个基本部分,第一部分是通过一系列矩阵的行列变换,把零元素排列在对角线上;第二部分是最解的检验,即所有0ii b =时,已得到最优解.

对于此算法的收敛性分析,文献[]9中给出了几个定理,并进行了证明,可以看出此改进算法的收敛性极好,可以有效地解决指派问题.

4 对最大化指派问题的匈牙利解法的一点改进

对最大化的指派问题的解法,一般方法是找出系数矩阵()ij c 中的最大元素,即1n

ij i M max c ==∑),,2,1(n j =,做矩阵B ,其元素为),,2,1;,,2,1(n j n i b ij ==且

ij ij c M b -=,然后利用匈牙利解法最小化求B 的最优解.下面我们在此基础上对其提出一点改进,直接在原系数矩阵上进行修改.

修改的原则是:在最小化问题中,系数矩阵不能出现负数,在最大化问题中,修改后的不能出现正元素,可出现零.

基本步骤:

第一步:修改系数矩阵.

每行都减去该行中最大元素,每列都减去该列中最大元素.

第二步:求最优解.

选取新矩阵的零元素,已得到问题的最优解.根据每个人只能完成一项任务,每项任务只能由一个人来完成的前提,则零元素只能选在不同行且不同列的元素,此时对应被选中的零元素打上括号(),其对应的ij x 等于1,其它的ij x 等于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

指派问题的匈牙利解法

指派问题的匈牙利解法 1、 把各行元素分别减去本行元素的最小值;然后在此基础上再把每列元素减去本列中的最小值。 ???????? ??????????? ? ?0 4 3 2 04 0 5 0 01 2 3 2 03 7 7 1 08 11 0 3 06 10 12 9 610 6 14 7 67 8 12 9 610 14 17 9 712 15 7 8 4 此时每行及每列中肯定都有0元素了。 2、 确定独立零元素,并作标记。 (1)、首先逐行判断是否有含有独立0元素的行,如果有,则按行继续处理;如没有,则要逐列判断是否有含有独立0元素的列,若有,则按列继续处理。若既没有含有独立0元素的行,也没有含有独立0元素的列,则仍然按行继续处理。 (2)在按行处理时,若某行有独立0元素,把该0元素标记为a ,把该0所在的列中的其余0元素标记为b ;否则,暂时越过本行,处理后面的行。把所有含有独立0元素的行处理完毕后,再回来处理含有2个以及2个以上的0元素的行:任选一个0做a 标记,再把该0所在行中的其余0元素及所在列中的其余0元素都标记为b 。

(3)在按列处理时,若某列有独立0元素,把该0元素标记为a ,把该0所在的行中的其余0元素标记为b ;否则,暂时越过本列,处理后面的列。把所有含有独立0元素的列处理完毕后,再回来处理含有2个以及2个以上的0元素的列:任选一个0做a 标记,再把该0所在列中的其余0元素及所在行中的其余0元素都标记为b 。 (4)、重复上述过程,即得到独立零元素(标记a 的“0”) ???????? ??a b b a b b a 0 4 3 2 04 0 5 0 01 2 3 2 03 7 7 1 08 11 0 3 0a b 3、 若独立零元素等于矩阵阶数,则已经得到最优解,若小于矩阵阶数,则继续以下步骤: (1)、对没有标记a 的行作标记c (2)、在已作标记c 的行中,对标记b 所在列作标记c (3)、在已作标记c 的列中,对标记a 所在的行作标记c (4)、对没有标记c 的行划线,对有标记c 的列划线 ??????? ? ??04320405001232037710 811030 / / / / / \/ \/

运筹学指派问题的匈牙利法实验报告

运筹学 课 程 设 计 报 告 专业: 班级: 学号: : 2012年6月20日

目录 一、题目。 二、算法思想。 三、算法步骤。 四、算法源程序。 五、算例和结果。 六、结论与总结。

一、题目:匈牙利法求解指派问题。 二、算法思想。 匈牙利解法的指派问题最优解的以下性质: 设指派问题的系数矩阵为C=()c ij n n?,若将C的一行(或列)各元素分别减去一个常数k(如该行或列的最小元素),则得到一个新的矩阵C’=()'c ij n n?。那么,以C’位系数矩阵的指派问题和以C位系数矩阵的原指派问题有相同最优解。 由于系数矩阵的这种变化不影响约束方程组,只是使目标函数值减少了常 数k,所以,最优解并不改变。必须指出,虽然不比要求指派问题系数矩阵中无 负元素,但在匈牙利法求解指派问题时,为了从以变换后的系数矩阵中判别能否 得到最优指派方案,要求此时的系数矩阵中无负元素。因为只有这样,才能从总 费用为零这一特征判定此时的指派方案为最优指派方案。 三、算法步骤。 (1)变换系数矩阵,使各行和各列皆出现零元素。 各行及各列分别减去本行及本列最小元素,这样可保证每行及每列中都有 零元素,同时,也避免了出现负元素。 (2)做能覆盖所有零元素的最少数目的直线集合。

因此,若直线数等于n,则以可得出最优解。否则,转第(3)步。 对于系数矩阵非负的指派问题来说,总费用为零的指派方案一定是最优指派方案。在第(1)步的基础上,若能找到n个不同行、不同列的零元素,则对应的指派方案总费用为零,从而是最优的。当同一行(或列)上有几个零元素时,如选择其一,则其与的零元素就不能再被选择,从而成为多余的。因此,重要的是零元素能恰当地分布在不同行和不同列上,而并在与它们的多少。但第(1)步并不能保证这一要求。若覆盖所有零元素的最少数目的直线集合中的直线数目是n,则表明能做到这一点。 此时,可以从零元素的最少的行或列开始圈“0”,每圈一个“0”,同时把位于同行合同列的其他零元素划去(标记为),如此逐步进行,最终可得n个位于不同行、不同列的零元素,他们就对应了最优解;若覆盖所有零元素的最少数目的直线集合中的元素个数少于n,则表明无法实现这一点。需要对零元素的分布做适当调整,这就是第(3)步。 (3)变换系数矩阵,是未被直线覆盖的元素中出现零元素。回到第(2)步。 在未被直线覆盖的元素中总有一个最小元素。对未被直线覆盖的元素所在的行(或列)中各元素都减去这一最小元素,这样,在未被直线覆盖的元素中势必会出现零元素,但同时却又是以被直线覆盖的元素中出现负元素。为了消除负元素,只要对它们所在的列(或行)中个元素都加上这一最小元素(可以看作减去这一最小元素的相反数)即可。 四、算法源程序。

指派问题的解法

指派问题的解法总结 问题引入:在工作的时候,常常需要对一些人进行工作安排,由于某些条件的限制, 每个人只能进行一种工作,怎么安排才能使得总工作时间最小。我们把这一类问题称 为指派问题。在这里,我只对人和工作刚好一对一的指派问题的解法进行总结,而对 于不是一对一的,则可以通过文献1中的一些方法进行变换。 目前问题解法的总结。 1:最广泛应用的解法:匈牙利算法。 算法简介:库恩(fW.W.Kuhn)于1955年提出了指派问题的解法.他引用了匈牙利数学家康尼格一个关于矩阵中0元素的定理:系数矩阵中独立0元素的最多个数等 于覆盖所有0元素的最少直线数。这个解法称为匈牙利解法。 匈牙利算法虽是运用最广泛的算法,但其操作过程却过于复杂。在划0的时候也不方 便记忆,对于初学者来说掌握不便。于是国内很多学者对指派问题给出了几个较简单,方便易记的算法。 2:指派问题新解法——目标值子矩阵法。 算法描述:任取变量矩阵X某一行中的最小元素,为该行元素目标值的最优解(但 不一定是系统目标函数的最优解),应该是系统目标函数满意解中的一个元素,记作 a11 划去a11 所在的行和列,取剩下的子矩阵中某一行的最小元素,记作a22。依次 类推,直到最后一个元素a nn.这些元素相加得系统目标函数的一个满意解,此为一 次运算.第二次运算取变量矩阵X中含a 以外的任一行,做与上面相同运算,又可以 得到系统的第二个满意解.相同地,对于n行做n次运算,共得到系统的n个满意解,系统的最优解即应该是这 n个满意解当中的最小值.若第i的最小元素在前面以被取 用过,则在进行第i的运算时,不选取该元素,取该行中未被选用过的元素中最小的一个进行运算。 算法分析:相对于匈牙利算法,此算法简单,方便操作。但不能给出所有最优解,得出的最优解唯一,若要给出全部最优解,则算法的次数将大大增加。 当矩阵维数较大的时候,可以对矩阵进行划分,以更快计算。 算法举例:对于变量矩阵x;

匈牙利法解决人数及任务数不等的指派问题

匈牙利法解决人数与任务数不等的指派问题 于凯 重庆科技学院经济管理学院物流专业重庆沙坪坝区 摘要:本文将讨论运筹学中的指派问题,而且属于非标准指派问题,即人数与任务数不相等的指派问题,应当视为一个多目标决策问题,首先要求指派给个人任务数目两两之间相差不能超过1,其次要求所需总时间最少,并且给出了该类问题的求解方法。 关键词:运筹学指派问题匈牙利算法系数矩阵解矩阵 引言:在日常的生产生活中常遇到这样的问题:有n项任务,有n个人员可以去承担这n 项任务,但由于每位人员的特点与专长不同,各对象完成各项任务所用的时间费用或效益不同;有因任务性质要求和管理上需要等原因,每项任务只能由一个人员承担来完成,这就涉及到应该指派哪个人员去完成哪项任务,才能使完成n项任务花费总时间最短,总费用最少,产生的总效益最佳。我们把这类最优匹配问题称为指派问题或分配问题。 1.指派问题的解法——匈牙利法 早在1955年库恩(,该方法是以匈牙利数学家康尼格(koning)提出的一个关于矩阵中0元素的定理为基础,因此得名匈牙利法(The Hungonrian Method of Assignment) 1.1匈牙利解法的基本原理和解题思路 直观的讲,求指派问题的最优方案就是要在n阶系数矩阵中找出n个分布于不用行不同列的元素使得他们的和最小。 而指派问题的最优解又有这样的性质:若从系数矩阵C(ij)的一行(列)各元素都减去该行(列)的最小元素,得到新矩阵CB(ij),那么以CB(ij)为系数矩阵求得的最优解和原系数矩阵C(ij)求得的最优解相同。 由于经过初等变换得到的新矩阵CB(ij)中每行(列)的最小元素均为“○”,因此求原指派问题C(ij)的最优方案就等于在新矩阵CB(ij)中找出n个分布于不同行不同列的“○”元素(简称为“独立○元素”),这些独立○元素就是CB(ij)的最优解,同时与其对应的原系数矩阵的最优解。 1.2匈牙利法的具体步骤 第一步:使指派问题的系数矩阵经过变换在各行各列中都出现○元素。 (1)先将系数矩阵的每行中的每个元素减去本行中的最小元素。 (2)再从系数矩阵的每列中的每个元素减去本列的最小元素。 第二步:进行试指派,以寻求最优解。 (1)从含有○元素个数最少的行(列)开始,给某个○元素加圈,记作◎,然后划去与◎所在同行(列)杂其他○元素,记作?。(注:从含元素 少的开始标记◎的原则) (2)重复进行(1)的操作,直到所有○元素都记作◎或?,称作“礼让原则”。 (3)按以上方法操作后,若◎元素数目m’等于矩阵阶数n,那么指派问题最优解已得到。若m﹤n,则转入下一步。 第三步:做最少的直线覆盖所有的○元素,以确定该系数矩阵中能找到最多的独立○元素。 (1)对没有◎的行打√号; (2)对已打√号的行中含有?元素所在的列打√号; (3)对已打√号的列中含有◎元素所在的行打√号; (4)重复(2)、(3)直到得不到新√号的行和列为止; (5)对没有√号的行画一横线,有√号的列画一竖线。如此便可以覆盖所有

匈牙利解法的步骤

指派问题的匈牙利法求解步骤: 1) 变换指派问题的系数矩阵(c ij)为(b ij),使在(b ij)的各行各列中都出现0元素,即 从(cij)的每行元素都减去该行的最小元素; 再从所得新系数矩阵的每列元素中减去该列的最小元素。 2) 进行试指派,以寻求最优解。 在(bij)中找尽可能多的独立0元素,若能找出n个独立0元素,就以这n个独立0 元素对应解矩阵(xij)中的元素为1,其余为0,这就得到最优解。 找独立0元素,常用的步骤为: 从只有一个0元素的行开始,给该行中的0元素加圈,记作◎。然后划去◎所 在列的其它0元素,记作?;这表示该列所代表的任务已指派完,不必再考虑别人了。依次进行到最后一行。 从只有一个0元素的列开始(画?的不计在内),给该列中的0元素加圈,记作◎; 然后划去◎所在行的0元素,记作?,表示此人已有任务,不再为其指派其他任务了。依次进行到最后一列。 若仍有没有划圈的0元素,且同行(列)的0元素至少有两个,比较这行各0元素所 在列中0元素的数目,选择0元素少这个0元素加圈(表示选择性多的要“礼让” 选择性少的)。然后划掉同行同列的其它0元素。可反复进行,直到所有0元素都已圈出和划掉为止。 若◎元素的数目m 等于矩阵的阶数n(即:m=n),那么这指派问题的最优解已 得到。若m < n, 则转入下一步。 3) 用最少的直线通过所有0元素。其方法: 对没有◎的行打“√”; 对已打“√”的行中所有含?元素的列打“√”; 再对打有“√”的列中含◎元素的行打“√”; 重复①、②直到得不出新的打√号的行、列为止; 对没有打√号的行画横线,有打√号的列画纵线,这就得到覆盖所有0元素的最 少直线数l 。 注:l 应等于m,若不相等,说明试指派过程有误,回到第2步,另行试指派;若 l=m < n,表示还不能确定最优指派方案,须再变换当前的系数矩阵,以找到n 个独立的0元素,为此转第4步。 4) 变换矩阵(b ij)以增加0元素 在没有被直线通过的所有元素中找出最小值,没有被直线通过的所有元素减去这 个最小元素;直线交点处的元素加上这个最小值。新系数矩阵的最优解和原问题仍相同。转回第2步。

指派问题的算法

指派问题的算法分析与实现 摘要 在企业、公司的运营与管理中,管理者总是希望把人员最佳分派以发挥其最大工作效率,从而降低成本、提高效益。然而,如果没有科学的方法是很难实现优化管理的,由此我们引入了指派问题。指派问题多是求项目的工时最少,而很多情况下人们并不关心项目总工时的多少,而只关心项目能否在最短的时间内完成,即历时最少的指派问题。这类问题研究的是n个人执行n项任务,执行每项任务的人数以及总的指派人项数均有限制,要求最优指派。在运筹学中求解整数规划的指派问题通常是通过匈牙利算法来求解,但指派问题也可以归结为一个0-1整数规划问题,本文先对指派问题进行陈述,引出对实际问题的求解。在指派问题的背景、描述中充分理解该问题,先运用匈牙利算法实现指派问题,然后再建立一个0-1整数规划模型,并运用matlab和lingo编译程序对问题进行编译,运用软件解决模型问题,最终实现指派问题在实际问题中的运用。通过运用匈牙利算法和0-1整数规划同时对指派问题求解,我们发现用0-1整数规划的方法来求解可以更简单,也更方便程序的阅读和理解。与此同时,我们还对0-1整数规划问题由整数数据深入研究到小数数据。最后通过实例来说明运用matlab,lingo编译程序来解决整数规划问题的简便和有效性。 关键词:指派问题;匈牙利算法;0-1整数规划;matlab模型;lingo模型1. 问题陈述 指派问题又称分配问题,其用途非常广泛,比如某公司指派n个人去做n 件事,各人做不同的事,如何安排人员使得总费用最少?若考虑每个职工对工作效率(如熟练程度等),怎样安排会使总销量达到最大?这些都是一个企业经营

管理者必须考虑的问题,所以该问题有重要的应用价值。 假设有n 件工作分派给n 个人来做,每项工作只能由一人来做,每个人只能做一项工作。若给出各人对各项工作所具有的工作效率。问应该如何安排人选,及发挥个人特长又能使总的效率最大。为此用0-1整数规划来实现指派问题即如何安排人选。 2.背景 在现实生活中,有各种性质的指派问题(Assignment Problem )。例如,在生产管理中,总希望把人员进行最佳分配,以发挥最大的工作效率;某部门有n 项任务要完成,而该部门正好有n 个人可以分别去完成其中任何一项,但由于任务性质和个人的专长不同,因此各人完成各项不同任务的效益(所费时间或所花费用)也有差别,如果分配每个人完成一项任务且仅为一项任务,则把每项任务分配给哪个人去完成,使完成所有n 项任务的总效益为最高(总时间、总费用为最小或创造的价值最大)?这是典型的分配问题或指派问题。又如有n 项加工任务,怎样指定n 台机器分别去完成,以使总的加工时间最少或总收入最大;有n 条航线,怎样指定n 艘船分别航行,使总收入最大,等等,都属于指派问题。 3. 指派问题的描述 3.1 指派问题的一般形式 指派问题的标准形式(以人和事为例)如下。有n 个人和n 项任务,已知第i 个人做第j 件事的费用为 ij c ,要求确定人和事之间的一一对应的指派方案,使 完成这n 项任务的费用最少。 一般把目标函数的系数写为矩阵形式,称矩阵 ? ? ? ? ?? ? ? ? ? ??????????==?nn n n n n n n ij c c c c c c c c c c C ..................)(212222111211 为系数矩阵(Coefficient Matrix ),也称为效益矩阵或价值矩阵。矩阵的元

浅析指派问题的匈牙利解法成稿讲解

浅析指派问题的匈牙利解法 胡小芹 数学科学学院数学与应用数学学号:040414057 指导教师:苏孟龙 摘要:对于指派问题,可以利用许多理论进行建模并加以解决,但匈牙利解法是解决指派问题的一种非常简单有效的方法,并且可以解决多种形式的指派问题,但匈牙利算法本身存在着一些问题,本文主要介绍了匈牙利算法的基本思想,基本步骤,以及它的改进方法.在匈牙利算法的基础上,本文还介绍了两种更简便实用的寻找独立零元素的方法——最小零元素消耗法和对角线法. 关键词:指派问题;匈牙利解法;最小零元素消耗法;对角线法 0 引言 在现实生活中经常会遇到把几个任务分派给几个不同的对象去完成,由于每个对象的条件不同,完成任务的效率和效益亦不同.指派问题的目标就是如何分派使所消耗的总资源最少(或总效益最优),如给工人分派工作,给车辆分配道路,给工人分配机床等等,同时许多网络问题(如旅行问题,任务分配问题,运输问题等),都可以演化成指派问题来解决.在现实生活中,指派问题是十分常见的问题,而匈牙利解法是解决指派问题的一种非常简单有效的方法.本文主要介绍匈牙利解法的基本原理及思想,解题步骤,不足与改进,以使匈牙利法更能有效地解决指派问题. 1 指派问题及其数学模型 指派问题是指由m项任务,需要n个人来承担,每人只能承担一项任务,且每项

任务只能有一人来承担,由于各人的专长不同,各人完成的任务不同,导致其效率也各不相同.因此,就产生怎样科学地指派任务,才能使完成各项任务所消耗的总资源最少(或总成本最低等),由于n m ,不同,指派问题可分为以下三种情况: 第一、当n m =时,即为每人指派一项任务. 第二、当n m >时,即任务数〉人数,这时可虚设)(n m -个人构成m m ?的 效率矩阵,并且这)(n m -个人在执行这m 项任务时的效率应该是效率最高. 第三、当n m <时,即配置人数〉任务数,这时应虚设)(m n -项任务,并且这n 个人在执行这)(m n -项任务时的成本最低. 通过虚设任务或人,指派问题的效率矩阵都可以转化成方阵.匈牙利解法要求指派问题最小化,其数学模型为 设用0ij c >(,1,2, ,)i j n =表示指派第i 个人去完成第j 项任务时所用的时间, 定义决策变量 10ij i j x i j ?=??表示第个人完成第项任务, 表示不指派第个人完成第项任务. 则问题可转化为0-1线性规划问题: ∑∑===n j ij n i c Z 11min t s ? 1 1 1,1,2,,, 1,1,2,,,01,i,j 1,2,,n n ij i n ij j ij x j n x i n x ==?==???==???==?? ∑∑或. 如果指派问题要求的是最大化问题如F max ,则可以转化为最小化问题,一般方法是:取max (,1,2 ),ij M c i j n ==令(,1,2,)ij ij b M c i j n =-=,则11 min ,n n ij i j f b ===∑∑,max F nM f F =-有从而求. 2 指派问题的解法——匈牙利解法

匈牙利算法在企业员工指派问题的应用(最终版)

闽江学院 本科毕业论文 题目匈牙利算法在企业员工指派问题的应用学生姓名张雯 学号120080901139 系别数学系 年级2008级 专业数学与应用数学 指导教师林耿 职称讲师 完成日期2012年4月10日

闽江学院毕业论文诚信声明书 本人郑重声明: 兹提交的毕业论文(设计)《匈牙利算法在企业员工指派问题的应用》,是本人在指导老师林耿的指导下独立研究、撰写的成果;论文(设计)未剽窃、抄袭他人的学术观点、思想和成果,未篡改研究数据,论文(设计)中所引用的文字、研究成果均已在论文(设计)中以明确的方式标明;在毕业论文(设计)工作过程中,本人恪守学术规范,遵守学校有关规定,依法享有和承担由此论文(设计)产生的权利和责任. 声明人(签名): 2012年4月10日

摘要 在当今社会,竞争无处不在,企业的竞争也是如此.而员工指派问题又是企业不得不面对的问题.因此,企业员工指派问题就显得非常重要了,谁能够在这方面做的好,谁就能在竞争中多一分胜算.企业员工指派问题是指企业安排若干人员去完成若干项任务(任务和人数不一定相等),并且要求完成的效率最高.对于这一问题,匈牙利算法就是一个很好的解法.本文首先给出企业员工指派问题的数学模型,它分为两大类,一类是标准指派问题(即企业指派员工数与任务数相等),另一类是非标准指派问题(即企业指派员工数与任务数不相等),其次,在对匈牙利算法及其原理深入理解的基础上,利用匈牙利算法对企业员工指派问题的数学模型进行求解.其中,用标准的匈牙利算法求解标准的指派问题,对于非标准的指派问题,先把它进行适当的变换,然后用标准的匈牙利算法求解.再次,讲述了匈牙利算法的一些缺点及其改进,把匈牙利算法用C语言表示出来,并把它运用到实际的企业员工指派问题当中.最后,讲述了匈牙利算法的应用推广. 关键词:匈牙利算法;员工指派问题;运筹学;效益矩阵

求解指派问题的匈牙利算法.doc

3.2 求解指派问题的匈牙利算法 由于指派问题的特殊性,又存在着由匈牙利数学家D.Konig 提出的更为简便的解法—匈牙利算法。算法主要依据以下事实:如果系数矩阵)(ij c C =一行(或一列)中每一元素都加上或减去同一个数,得到一个新矩阵)(ij b B = ,则以C 或B 为系数矩阵的指派问题具有相同的最优指派。 利用上述性质,可将原系数阵C 变换为含零元素较多的新系数阵B ,而最优解不变。若能在B 中找出n 个位于不同行不同列的零元素,令解矩阵中相应位置的元素取值为1,其它元素取值为零,则所得该解是以B 为系数阵的指派问题的最优解,从而也是原问题的最优解。 由C 到B 的转换可通过先让矩阵C 的每行元素均减去其所在行的最小元素得矩阵D ,D 的每列元素再减去其所在列的最小元素得以实现。 下面通过一例子来说明该算法。 例7 求解指派问题,其系数矩阵为 ????? ???????=16221917171822241819211722191516C 解 将第一行元素减去此行中的最小元素15,同样,第二行元素减去17,第三行元素减去17,最后一行的元素减去16,得 ????? ???????=06310157124074011B 再将第3列元素各减去1,得 ????? ???????=****20531005711407301B 以2B 为系数矩阵的指派问题有最优指派 ??? ? ??43124321 由等价性,它也是例7的最优指派。 有时问题会稍复杂一些。 例8 求解系数矩阵C 的指派问题

??????? ?????????=61071041066141512141217766698979712C 解:先作等价变换如下 ∨∨ ∨????????????????→????????????????----- 26360 40*089 57510*00*0032202*056107104106614151214121776669897971246767 容易看出,从变换后的矩阵中只能选出四个位于不同行不同列的零元素,但5=n ,最优指派还无法看出。此时等价变换还可进行下去。步骤如下: (1) 对未选出0元素的行打∨; (2) 对∨行中0元素所在列打∨; (3) 对∨列中选中的0元素所在行打∨; 重复(2)、(3)直到无法再打∨为止。 可以证明,若用直线划没有打∨的行与打∨的列,就得到了能够覆盖住矩阵中所有零元素的最少条数的直线集合,找出未覆盖的元素中的最小者,令∨行元素减去此数,∨列元素加上此数,则原先选中的0元素不变,而未覆盖元素中至少有一个已转变为0,且新矩阵的指派问题与原问题也等价。上述过程可反复采用,直到能选取出足够的0元素为止。例如,对例5变换后的矩阵再变换,第三行、第五行元素减去2,第一列元素加上2,得 ??????? ?????????0414******* 353800003420207 现在已可看出,最优指派为???? ??5314254321。

关于几种不平衡指派问题的修正匈牙利解法

龙源期刊网 https://www.360docs.net/doc/a88927283.html, 关于几种不平衡指派问题的修正匈牙利解法作者:杜金玲;周杰 来源:《价值工程》2010年第13期 摘要:本文利用实例验证了在用匈牙利算法求解指派问题时,不平衡的指派问题转化为平衡指派问题的必要性;总结对于几种不平衡的指派问题转化为平衡指派问题的方法,从理论上作出解释,并给出了相应的例题,特别对于任务数多于人数的指派问题,本文提出了新的更有针对性的转化方法,如“一人化成p人法”、“加边补小法”、“加边补零(M)法”等。 Abstract: In this paper, the necessity of the transformation of the unbalanced assignment problem to the balanced assignment problem is tested with examples. The methods of transformation are summarized and explained from theory; and gived an example of the problem, especially, the methods of the transformation are brought up. For example, the method of "one to p persons", the method of "the adding rows with zero or M",the method of "the adding rows with min" and so on. 关键词:指派问题;匈牙利算法;一人化成p人法;加边补小法;加边补零(M)法 Key words: assignment problem;the Hungaryalgorithm;the method of "one to p persons";the method of "the adding rows with min";the method of “the adding rows with zero or M” 中图分类号:TP301.6文献标识码:A文章编号:1006-4311(2010)13-0120-03 0引言 在实际生活和生产安排中,经常遇到要指派不同的工作人员去完成不同的工作。由于每个 人的专长不同,不同的人去完成各项任务的效率(或所花时间或成本等)一般地也不同。这样,就 产生了指派何人去完成何任务,使总效率最高(或所花时间最少或成本最低等)的问题。这类问题称为指派问题(Assignment Problem),又称为分配问题。 1平衡指派问题的数学模型 对于有n项任务且恰好有n个人去完成的指派问题(称为平衡指派问题),规定每人只完成一项任务,且每项任务只能由一个人去完成。已知aij表示第i个人完成第j项任务时的效率(所用时间或成本等),[aij]称为效率矩阵。设决策变量: xij=1,第i个人完成第j项任务0,否则(i,j=1,2,…,n),于是指派问题的数学模型为: min z=aijxij

相关文档
最新文档