匈牙利法解决人数及任务数不等的指派问题
- 格式:docx
- 大小:144.47 KB
- 文档页数:6
指派问题的求解方法嘿,咱今儿就来聊聊指派问题的求解方法。
你说这指派问题啊,就好像是给一群小伙伴分任务,得让每个人都能分到最合适的事儿,这可不容易嘞!咱先来说说啥是指派问题。
就好比有一堆工作,有几个人可以去做,每个人对不同工作的效率或者效果不一样。
那咱就得想办法,怎么把这些工作分配给这些人,才能让总的效果达到最好呀。
那咋求解呢?有一种方法叫匈牙利算法。
这就好比是一把神奇的钥匙,能打开指派问题的大门。
咱就把那些工作和人当成一个个小格子,通过一些计算和摆弄,找到最合适的搭配。
你想想啊,如果随便分,那可能就浪费了某些人的特长,或者让一些工作没被最合适的人去做,那不就亏大啦?用了这个匈牙利算法,就能一点点地把最合适的工作和人配对起来。
就像你去拼图,得找到每一块的正确位置,才能拼成一幅完整漂亮的图。
这匈牙利算法就是帮咱找到那些正确位置的好帮手呀!它能让那些工作和人都找到自己的“最佳搭档”。
还有啊,咱在生活中也经常会遇到类似的指派问题呢。
比如说,家里要打扫卫生,每个人擅长打扫的地方不一样,那怎么分配任务才能又快又好地打扫完呢?这不就是个小小的指派问题嘛。
或者说在公司里,有几个项目要分给不同的团队,哪个团队最适合哪个项目,这也得好好琢磨琢磨,才能让项目都顺利完成,取得好成果呀。
总之呢,指派问题的求解方法可重要啦,就像我们走路需要一双好鞋一样。
掌握了这些方法,咱就能在面对各种指派问题的时候,不慌不忙,轻松应对,找到那个最优解。
你说是不是很厉害呀?所以啊,可别小瞧了这指派问题的求解方法哦,说不定啥时候就能派上大用场呢!。
指派问题与匈⽛利解法指派问题概述:实际中,会遇到这样的问题,有n项不同的任务,需要n个⼈分别完成其中的1项,每个⼈完成任务的时间不⼀样。
于是就有⼀个问题,如何分配任务使得花费时间最少。
通俗来讲,就是n*n矩阵中,选取n个元素,每⾏每列各有1个元素,使得和最⼩。
如下图:指派问题性质:指派问题的最优解有这样⼀个性质,若从矩阵的⼀⾏(列)各元素中分别减去该⾏(列)的最⼩元素,得到归约矩阵,其最优解和原矩阵的最优解相同.匈⽛利法:12797989666717121491514661041071091.⾏归约:每⾏元素减去该⾏的最⼩元素502022300001057298004063652.列归约:每列元素减去该列的最⼩元素502022300001057298004063653.试指派:(1)找到未被画线的含0元素最少的⾏列,即,遍历所有未被画线的0元素,看下该0元素所在的⾏列⼀共有多少个0,最终选取最少个数的那个0元素。
(2)找到该⾏列中未被画线的0元素,这就是⼀个独⽴0元素。
对该0元素所在⾏和列画线。
50202230000105729800406365502022300001057298004063655020223000010572980040636550202230000105729800406365(3)暂时不看被线覆盖的元素,重复(1)(2)直到没有线可以画。
(4)根据(2)找到的0元素个数判断,找到n个独⽴0元素则Success,⼩于n个则Fail.(本例⼦中,n=5,可以看到,第⼀次试指派之后,独⽴0元素有4个,不符合)4.画盖0线:⽬标:做最少的直线数覆盖所有0元素,直线数就是独⽴0元素的个数。
注意:这跟3的线不同;不能⽤贪⼼法去画线,⽐如1 0 01 1 01 0 1若先画横的,则得画3条线,实际只需2条;若先画竖的,将矩阵转置后同理。
步骤3得出的独⽴0元素的位置50202230000105729800406365(1)对没有独⽴0元素的⾏打勾、(2)对打勾的⾏所含0元素的列打勾(3)对所有打勾的列中所含独⽴0元素的⾏打勾(4)重复(2)(3)直到没有不能再打勾(5)对打勾的列和没有打勾的⾏画画线,这就是最⼩盖0线。
指派问题的算法分析与实现摘要在企业、公司的运营与管理中,管理者总是希望把人员最佳分派以发挥其最大工作效率,从而降低成本、提高效益。
然而,如果没有科学的方法是很难实现优化管理的,由此我们引入了指派问题。
指派问题多是求项目的工时最少,而很多情况下人们并不关心项目总工时的多少,而只关心项目能否在最短的时间内完成,即历时最少的指派问题。
这类问题研究的是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整数规划来实现指派问题即如何安排人选。
匈牙利法解决人数与任务数不等的指派问题于凯重庆科技学院经济管理学院物流专业重庆沙坪坝区摘要:本文将讨论运筹学中的指派问题,而且属于非标准指派问题,即人数与任务数不相等的指派问题,应当视为一个多目标决策问题,首先要求指派给个人任务数目两两之间相差不能超过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)对没有√号的行画一横线,有√号的列画一竖线。
如此便可以覆盖所有的○元素(注:这里的○元素是指◎或∅)第四步:以上画线的目的是为了选取新的最小元素,以便增加○元素,最后达到◎元素个数m=n 。
(1) 为此在没有被直线覆盖的所有元素中找出最小元素,然后将没有被直线覆盖的每个元素都减去该最小元素,同时把打“√”的列中的每个元素加上该最小元素,以保证原○元素不变。
(2) 再按照第二步原则进行选取独立○元素。
若得到n 个◎元素,则已是该矩阵的最优解(同时也是原矩阵的最优解);否则,回到第三步重复进行。
第五步:在第四步得到的最优解情况下的系数矩阵变换为解矩阵。
将系数矩阵中的所有◎都变成元素1,而其他元素均变成0元素,得到的新矩阵便为原指派问题的解矩阵,根据解矩阵中1元素所在的行、列数,去确定派哪个人员去做哪项任务。
(注:在解矩阵(ij X )中,Xij=0元素表示不派第i 个人去完成第j 项任务,Xij=1表示指派第i 个人去完成第j 项任务)需要对匈牙利法的第二步画∅行的说明:当指派问题的系数矩阵经过变换得到了同行和同列中都有两个或两个以上○元素时,这时可以任选一行(列)中某个○元素,再划去同行(列)其他○元素。
这时会出现多重优化解,对应着多种最优的指派方案。
如果出现此种情况,各位读者不必疑惑。
2. 极大化指派问题以上讨论的均限于极小化的指派问题,对于极大化的问题,即求ijijMaxZ C X=∑∑(例如:如何安排n 个工程队去完成n 个项目才能使总收益最大) 以下是解决该问题的原理部分:可令 ij ij b M c =-(其中M 是原系数矩阵(ij c )中最大的元素)则原系数矩阵变换成新矩阵(ij b ),这时ij b ≥0,符合匈牙利法的条件,而且等式()ij ijijijijijb x Mc x =-∑∑∑∑恒成立,所以,当新的系数矩阵取到极小化指派问题的解矩阵时,就对应着原问题的最大化指派方案的最优指派方案。
3. 人员数不等于任务数的指派问题:以上我们讨论的问题均是标准型指派问题,但在实际生活中可能出现人手不够或者任务较少人员较多的情况,该类问题当然也可以利用匈牙利法求解。
从以上讨论了匈牙利法的原理可知匈牙利法适用于系数矩阵为方阵的指派问题,从这个基本原则出发,给系数矩阵并非方阵的问题,添加虚拟人员或任务使其构成标准型指派问题,从而进一步利用匈牙利法求解最优解,而且构造的方阵的最优解同时也是原问题的最优解。
3.1 人数大于任务数的指派问题下面结合例子说明人数m 大于任务数n 的指派问题的解法。
例1:设有三项任务1T 、2T 、3T ,可以安排的的人为1M 、2M 、3M 、4M 去完成,各人完成各项工作所花费的时间ij c 如表3.1所示,问应如何指派所用的总时间解:第一步:添加M-N 个虚拟任务,并赋予各人完成这些虚拟任务的时间为0.此时将问题转化为人数与任务相等的指派问题(注:本题M=4,N=3) 第二步:运用匈牙利法求解215130104140()91416078110ij C ⎛⎫ ⎪ ⎪= ⎪ ⎪⎝⎭→011208030710505400⎛⎫ ⎪ ⎪ ⎪ ⎪⎝⎭→min 2=−−−→已找出四个独立元素。
故例1的解矩阵为10000100()00010010ij X ⎛⎫⎪⎪= ⎪ ⎪⎝⎭所以最优指派方案为1M 完成1T ,2M 完成2T ,4M 完成3T ,而3M 没有任务。
花费总时间最少为min z=11C +22C +43C =2+4+11=17(小时)4. 任务数大于人数的指派问题下面结合例2说明任务数n 大于人数m 的指派问题的解法。
、例2 设有四项任务1T 、2T 、3T 、4T ,可以安排三个人1M 、2M 、3M 去完成,各人完成各项工作所需的时间ij c 如表4.1所示,问应该指派哪个人去完成哪项任务所用的总时间最少?解:第一步:添加N-M 个虚拟的人员,并赋予各虚拟人员完成各项任务所用的时间为+。
此时问题转化成人员与任务数相等的指派问题。
构造系数矩阵ij 0000000000000000000000000000=000000000000000000000000000000X ⎛⎫⎛⎫⎪⎪⎪ ⎪ ⎪ ⎪⎪⎪ ⎪ ⎪ ⎪ ⎪⎪ ⎪⎪ ⎪⎝⎭⎝⎭11111010()或111111第二步:运用匈牙利法求解2151341041415()9141613ij C ⎛⎫⎪⎪= ⎪ ⎪∞∞∞∞⎝⎭01311260101105740000⎛⎫⎪⎪→→ ⎪ ⎪⎝⎭min 2=−−−→119810113522∅⎛⎫ ⎪ ⎪ ⎪ ⎪∅∅⎝⎭◎◎◎◎=故解矩阵()ij C 的解矩阵为00010100()10000010ij X ⎛⎫⎪⎪= ⎪⎪⎝⎭对应的原指派问题的方案为:1M 完成4T ,2M 完成2T ,3M 完成1T 。
而任务3T 没有分配,为了使四项任务都完成,需要进行二次指派。
原系数矩阵为21513410414159141613⎛⎫⎪⎪ ⎪⎝⎭,显然3T 列最小元素位于第一行,即3T 任务让1M 做。
所以最终指派方案为1M 完成3T 、4T 两项,2M 完成2T ,3M 完成1T 。
所需要的总时间为min z=14223113C C C C +++=4+4+9+13=30 (小时)例3.(2006年北京大学考研题)某房地产公司计划在一住宅小区建5栋不同型号的楼房j B (j=1、2、···5),现有三个工程队i A (i=1、2、3),允许每个工程队承接1—2栋楼。
招投标得出工程队i A (i=1、2、3)对新楼j B (j=1、2、···5)的预算费用为ij C ,见表4-2,求总费用最小的分派方案。
各完成1项项目的最优费用,还有2项任务没有工程队承接。
接下来还要添加1项虚拟任务,然后进行第二次指派,确定第一次指派剩下来的2项任务由哪两个工程队再次承接。
考虑到以上做法较为繁琐,我们寻求一次性寻找出最优指派方案的解法。
由施工队数3与项目数5的关系考虑到,只有1个施工队承担单个任务,而其他两个施工队均承担2项项目。
因此我们可以添加一个虚拟项目,以便让每个工程队都可以承担2项项目。
但又考虑到要一次性指派完成求解,则不能有虚拟工程队,而且利用匈牙利法一定要是方阵才行。
于是构造如下新系数矩阵6*6[]ij C c =。
解:第一步:将工程队重排一次形成6支工程队,添加一项虚拟项目。
最终形成方阵。
构造的系数矩阵=0=ij ij c c ∞或第二步:匈牙利法求解该矩阵的指派问题38715110791014120691312170[]38715110791014120691312170ij c ⎛⎫⎪⎪ ⎪=⎪⎪ ⎪⎪⎪⎝⎭min 1=−−−→413222541322255∅∅∅⎛⎫⎪∅∅ ⎪ ⎪∅∅⎪∅∅∅ ⎪ ⎪∅∅ ⎪ ⎪∅∅⎝⎭◎◎◎5◎◎◎413222541322255∅∅∅⎛⎫ ⎪∅∅⎪ ⎪∅∅ ⎪∅∅∅ ⎪ ⎪∅∅ ⎪ ⎪∅∅⎝⎭◎◎◎5或◎◎◎对应的两个解矩阵为ij =X ()0000000000000000000000000000000000000000000000000000000000⎛⎫⎛⎫⎪⎪⎪ ⎪ ⎪ ⎪⎪⎪ ⎪ ⎪ ⎪ ⎪⎪ ⎪⎪ ⎪⎝⎭⎝⎭11111010或111111则原指派问题最佳的指派方案为113A →B B 和,225A →B B 和,34A →B 。
第二种方案:113A →B B 和,25A →B ,324A →B B 和。
其总费用最小为min z=3+7+12+9+12=43 (货币单位)5. 结束语在整篇论文中主要是讨论如何用匈牙利算法来求解最优指派的问题。
而且重点是人数与任务不等的问题的解决,更重要的方面是引进虚拟任务或人数构造方阵的思想。