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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

胡小芹

数学科学学院数学与应用数学学号: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)所有未被直线覆盖的元素都减去这个最小元素;

相关文档
最新文档