1、1,4.5 指派问题及其应用,在实际工作中,我们经常会遇到这样的问题:有n项工作要由n个人去完成,要求每人刚好承担一项工作。由于任务性质和各个人的专长不同,不同的人完成同一项工作所需的资源(或工作效率)不同。那么,到底应分配哪一个人去完成哪一项工作才能使所需的资源总量最少(或总的效率最高)?这类问题就称为指派问题或分配问题。指派问题不仅仅是指人力资源的分配,也可以是其他资源(如物力资源)的分配问题。,2,一、指派问题的数学模型,例:某一单位,有4个工作人员,有4项任务。如果每个工作人员都有能力去完成n项任务中的任一项,只是完成任务所需时间cij不同(见下表),问应如何合理分配人力,才能使完成任
2、务所需的总工时最少?,3,指派问题的数学模型,这是一个有4个人和4项任务的完整指派问题,上表中的数据反映了每个人完成各项任务的效率(或效应),通常称为效率(或效应)矩阵。指派问题的所有原始数据均包含在其效率(或效应)矩阵中。,这个指派问题的特点是:每一项任务必须且只能由一个工作人员去完成,每一个工作人员也只能分配一项任务。,引入0-1变量xij,4,指派问题的数学模型,S表示完成所有任务所需的总工时,则该问题的数学模型为:,5,对于将n项资源分配给n项任务的完整指派问题,设资源i分配给任务j所产生的效应为cij,S表示总效应,引入0-1变量,指派问题的数学模型,6,指派问题的数学模型,则数学模
3、型为:,7,讨论: 1、问题中的效应系数cij可以有多种不同的实际意义,例如可以为时间、价值、资源消耗量或工作效率等。根据效应系数的具体含义,指派问题的目标函数可以取最小值,也可以取最大值,但最大化问题可以转化为最小化问题求解。 2、指派问题的数学模型是一个线性规划数学模型,约束系数矩阵的元素不是1就是0,且约束方程的右端常数均为1,其基本可行解必满足0-1变量的取值要求,故可以直接用单纯形法求解,但求解工作量较大。,指派问题的数学模型,8,3、指派问题的数学模型是一个特殊的运输问题数学模型,各个产地的产量和各个销地的销量均为1,可以采用运输问题的表上作业法求解。但由于该问题的特殊性,用表上作
4、业法求解时效率很低。 4、指派问题的数学模型是一个0-1线性规划问题,可以用上一节介绍的隐枚举法求解。但由于指派问题的变量和约束条件都较多,采用隐枚举法求解计算量很大。 5、指派问题可以推广到资源数和任务数不等的情况。为了把这类推广的指派问题转化为常规指派问题,只需对问题增加若干个虚拟的资源或若干个虚拟的任务即可。,指派问题的数学模型,9, 资源数多于任务数的情况。这时可引入若干个虚拟任务,并令效应矩阵中虚拟任务对应的列全为0元素。这种情况下,实际上将有某些资源分配不出去(某些人分配不到工作)。 任务数多于资源数。这时可引入若干个虚拟的资源,并令效应矩阵中虚拟资源对应的行全为0元素。这种情况下
5、,实际上将有某些任务分配不到资源(某些任务无人承担)。,指派问题的数学模型,10,匈牙利法是求解指派问题的有效算法。它是匈牙利数学家柯尼格(Konig)根据指派问题的独特性质而提出的一种巧妙而有效的算法,故称匈牙利法。,指派问题的数学模型,11,二、用匈牙利法求解指派问题,1、匈牙利法的基本思路,与大多数整数规划算法不同,求解指派问题的匈牙利法不是采用解迭代方式而采用了问题迭代的方式,其基本思路是:根据指派问题的性质对原问题做一系列同解变换,从而得到一系列等价(同解)的指派问题,最后可得到一个只需直接观察其效率矩阵就可得到最优解的派生指派问题,该问题的最优解即为原指派问题的最优解(但目标函数值
6、不同)。,12,匈牙利法,在介绍匈牙利法之前,我们先介绍指派问题的几个重要性质。,定理1:如果效率矩阵cijnn中的所有元素非负,且其中存在n个位于不同列、不同行的零元素,则只要令对应于这些零元素位置的xij=1,其余的xij0,这样得到的解即为指派问题的最优解。,这是因为,在目标函数表达式中xij=1的系数为0,可使目标函数达到最小;另外,还可以保证在约束方程组的每个方程中只有一个变量为1,故可满足约束条件的要求。因此,这样得到的解就是指派问题的最优解。,13,定理2:如果从效率矩阵 的每一行元素中分别减去一个常数ui,从每一列元素中分别减去一个常数vj,由此得到一个新的效率矩阵 ,,匈牙利
7、法,证:由于,由 确定的指派问题的目标函数为:,则 的最优解等价于 的最优解。,14,匈牙利法,由于上式后面两项均为常数,且指派问题的约束条件与效率矩阵无关,故由 确定的指派问题与 的指派问题有相同的最优解。证毕。,15,匈牙利法,该定理是对指派问题进行同解变换的依据。,定理3:若矩阵A的元素可分成0与非0两部分,则覆盖0元素的最少直线数等于位于不同行、不同列的0元素的最大个数。,所谓用直线覆盖是指用一条横线划去矩阵的一行元素或用一条竖线划去一列元素,划去的元素就称为被覆盖。这个定理实际上回答了这样一个问题:至少要多少条直线(横线和竖线)才能覆盖矩阵A中的所有0元素?,16,匈牙利法,根据定理
8、3,可以采用最少直线覆盖所有0元素的方法确定效率矩阵中位于不同行、不同列的0元素的最大数目。如果刚好有n个0元素位于不同行、不同列,则由定理1即可得到指派问题的最优解。否则应按定理2继续对效率矩阵作同解变换。,以上3个定理是匈牙利法的基础,但要实施这个算法还要解决以下两个问题:, 对于给定的效率矩阵,如何用最少的直线覆盖所有0元素? 若效率矩阵中位于不同行、不同列的0元素的最大数目小于n,如何对效率矩阵进一步作同解变换?,17,匈牙利法,例:数学教研室有四名教师讲四门不同的课,由于各位教师的专长、教学水平和教学经验不同,所需备课时间也分别不同,问教研室主任应如何分配这些教学任务,才能使总的备课
9、时间最省。各教师备各门课所需时间见下表。,18,匈牙利法,匈牙利法的变换方法如下:,(1) 第一步:变换效应矩阵C(即备课时间阵),使每行每列至少有一个元素为零,以期从这些对应的零元素能得到完整的分配方案,使总的备课时间为最省。为此,可先在每行中减去各行的最小元素,根据表中数据,第一、二、三、四行分别减去2、4、11、4,可得新一矩阵为:,19,匈牙利法,加减常数的代数和为:S12+4+11+421,因第三列中无零元素,因而再在第三列中减去其最小元素5,加减常数的代数和为:,S1+S221+526,20,匈牙利法,(2) 第二步:为了给每个教师分配一个任务,以实现完整的任务分配,希望每行每列只
10、有一个零元素,现在有的行或列多于一个零元素,如何分配呢?这需要用检验的办法决定取舍。,先进行行检验,如图l所示。碰到每行只有一个0元素的先打,有两个0元素不作记号,例如第一行只有一个0,就在0处打,这就表示把第一门课(微积分)分配给教师Al,因此,对第一列其它的0元素打;同理第二行打一个;第三行有两个0,不作记号。,21,匈牙利法,然后进行列检验,如图2所示,第一、二列已没有未作记号的0;第三列有一个0,打,表示教师A3已接受第三门课,因此对同一行的0打。,(3) 第三步,从检验出的矩阵可以看出,第四门课还未分配出去,教师A4也未分到任务。可见这不是最优方案。,22,匈牙利法,为过渡到最优方案
11、,需对以上的矩阵再进行变换,如图3所示。变换规则如下:,(a) 对所有没有分配任务的行打。如第四行。,(b) 在已打的行中,找出打的列打。如第一列。,(c) 在已打的列中找出打的行,打,如第一行。,(d) 再进行上述(b)、(c)项检验,直至无法打为止。并用以下调整办法找最优解。,23,匈牙利法,(e) 对所有打的列和未打的行划线,这些线至少可以把所有0覆盖一次。一般讲,如果是nn阵,又要使最优分配均在0上,最少线数就应等于n。而此例中现只有三根直线,因此,这不是最优解。还需进一步进行变换。,24,(f) 在变换后的检验矩阵中,从未经划线的元素中可以找出一个最小元素c13=2,从未全部划线的第
12、一行和第四行中各减去2,可得一新矩阵:,S1+S2 +S3 26+2+2=30,加减常数的代数和为:,25,匈牙利法,由于此矩阵中第一列有负数,因此再在第一列上加2,于是得一个所有元素均0的矩阵。,S1+S2 +S3 +S4 30-2=28,加减常数的代数和为:,26,对新得的矩阵进行行检验和列检验,如图4所示。第二、四行和第四列均只有一个0,很快打上,并对同列或同行的0打,剩下一个c13处为0,打。于是得一完整分配方案,也即最优分配方案。得最优解为:x13=1,x22=1,x34=1,x41=1,而其余的xij均等于0。,27,匈牙利法,对于这个完整分配方案,可得:,再看一下打处原效应矩阵的
13、元素值,得,由此可见,最优分配方案所对应的原效应矩阵中元素值之和,等于进行变换过程中行和列所加减数字的代数和(加为负,减为正) 。此例中目标函数S的最小值即为:,28,匈牙利法,2、匈牙利法的算法步骤,如有m个资源(如人力、机车或设备均为一种资源)分配到n个活动领域(如生产任务、运输路线或地区等均为一种活动对象或领域)上去。若对应的效应ci j均已知,那么,分配问题就是要确定各个资源如何分配到各个活动对象上去,才能使全局的效应最优。,29,匈牙利法,若资源的个数m大于分配对象的个数n,则在n个活动对象的列向量后加上m-n个虚构的列向量,而且这些列向量的所有元素cij均为0,这样效应矩阵C就是一
14、个包含0列向量的mm阶方阵。,m-n列,mn,30,匈牙利法,同理,若资源个数m小于分配对象个数n,则在m个资源的行向量下面加上n-m个虚构的行向量,这些行向量的元素也均为0,使效应矩阵C成为包含0行向量的nn方阵。,n-m行,mn,31,匈牙利法,我们用方阵进行匈牙利算法的运算,找出完整分配方案的最优解。若所得的结果中某一1元素在虚行或虚列上,这个结果可以不考虑,而其他行和列的结果就是最优解。,具体算法步骤如下:,第1步:如果是求目标函数Sf(X)的极大值,则应将所有 效应矩阵的元素改为负值,然后进行第2步。,如果求目标函数Sf(X)的极小值,则直接进行第2步。,第2步:若第i行的最小元素不
15、是0,则从该行的每个元素中减去此最小元素。(i1m)。,32,匈牙利法,第3步:若第j列的最小元素不是0,则从该列的每个元素中减去此最小元素。(j=1n)。,第4步:逐个检查每一行,看是否每一行只有一个未标注的0,如只有一个0存在,则在此元素上注以符号,表示一种分配,同时,对同一列的0元素打,以便下一个分配不落在此列上。重复这一过程,直到所有行上没有未标注的0或至少有两个0。,第5步:逐个检查每一列,查出单一的未标注的0,打上,对同一行的0元素打。重复这一过程,直到所有列上没有未标注的0或至少有两个0。,33,匈牙利法,第6步:反复进行第4、5步,直到下面三种情况之一发生为止:,(a) 每行均
16、标注有;,(b) 至少有两个未标注的0在各行或各列中;,(c) 没有剩下未标注的0,但还未形成一完整的分配。,第7步:如果上述(a)发生,则得一完整的分配方案;且是一最优分配方案,可停机。如果是(b)发生,可任意作一分配记号到一个0上,而将同行或同列的另一个0打,然后转到第4步。如果是(c)发生,则转到第8步。,34,匈牙利法,第8步:对所有没有标注的行打。,第9步:在打的行中如包含一个0元素,则给该元素所对应的(没有打的)列打上。,第10步:在打的列上,如有记号,则这些记号的对应的行均打。,第11步:重复第9、10步;直到所有能打的行和列都打完。,第12步:对所有未打的行和已打的列划线,这些
17、线至少有一次盖过每一个0元素,这是覆盖0元素所需的最少线数。,35,匈牙利法,第13步:检查所有没有线通过的元素,选择出其中最小者。在未完全划线的行中,对每一元素减去此最小数,再在有线通过的列上,对每一元素加上此最小数,得一新矩阵,再回到第4步。,36,三、匈牙利法的FORTRAN程序,该程序用于解n个资源、n个活动对象的分配问题,要求使目标函数f(X)为最优。可用以求目标函数的极大值;也可用以求目标函数的极小值。但要求其效应矩阵C的各元素cij必须是整数。,该程序由主程序和子程序组成。主程序包括数据输入、输出。子程序即为匈牙利算法,称为HUNGRY。,使用下面所列程序至多可解决15个资源、1
18、5个对象的问题。若所要求解的问题中资源的个数、对象的个数大于15,即n15,只需改变主程序中DIMENSION语句中的维数即可。,37,匈牙利法的FORTRAN程序,使用该程序时,应输入下列数据:,N资源、对象的个数。 KODE对于最小化问题,KODE =0;对于最大化问题,KODE =1。 MATRIX(I,J)初始效应矩阵。该程序将计算并打印出: IASMAT分配矩阵(ASSIGNMENT MATRIX)。 NCOST目标函数的最优值。,38,匈牙利法的FORTRAN程序,具体程序如下: CCCC 用于求解资源分配问题的匈牙利算法程序 CCCC 需要输入的数据为: CCCC N资源、对象的
19、个数。 CCCC KODE对于极小值问题,KODE =0;对于极大值问题,KODE =1。 CCCC MATRIX(I,J)初始效应矩阵,按行输入。DIMENSION MATRIX(15,15),IASMAT(15)OPEN(21,FILE=HUN.IN)OPEN(22,FILE=HUN.OUT)READ(21,*) N,KODEDO 2 I=1,N 2 READ(21,*) (MATRIX(I,J),J=1,N)CLOSE(21)WRITE(22,*) 初始效应矩阵为:DO 6 I=1,N 6 WRITE(22,5)(MATRIX(I,J),J=1,N),39,5 FORMAT(1X,10I
20、8)CALL HUNGRY(N,MATRIX,IASMAT,NCOST,KODE)WRITE(22,120) NCOST 120 FORMAT(/1X,最优目标函数值为:,I8)WRITE(22,*)最优分配方案为:DO 130 I=1,N 130 WRITE(22,135) I,IASMAT(I) 135 FORMAT(1X,资源,I2,分配给对象,I2)CLOSE(22)STOPEND,匈牙利法的FORTRAN程序,40,匈牙利法的FORTRAN程序,SUBROUTINE HUNGRY(N,IIF,IROW,TOTAL,KODE)DIMENSION IIF(15,15),IEFF(15,1
21、5),IROW(15),ICOL(15)DIMENSION ICHECK(15),JCHECK(15)INTEGER TOTALIF(KODE.EQ.1) GOTO 100DO 110 I=1,NDO 110 J=1,N 110 IEFF(I,J)=IIF(I,J)GOTO 200 100 DO 120 I=1,NDO 120 J=1,N 120 IEFF(I,J)=-IIF(I,J) 200 DO 210 I=1,NMINROW=IEFF(I,1)DO 220 J=1,NIF(IEFF(I,J).LE.MINROW) MINROW=IEFF(I,J) 220 CONTINUE,41,匈牙利法
22、的FORTRAN程序,DO 210 J1=1,NIEFF(I,J1)=IEFF(I,J1)-MINROW 210 CONTINUEDO 300 J=1,NMINCOL=IEFF(1,J)DO 310 I=1,NIF(IEFF(I,J).LE.MINCOL)MINCOL=IEFF(I,J) 310 CONTINUEDO 300 I1=1,NIEFF(I1,J)=IEFF(I1,J)-MINCOL 300 CONTINUE 400 DO 410 I=1,NIROW(I)=0 410 ICOL(I)=0NOMADE=0 420 LOOP=0NZEROS=0DO 430 I=1,NNOZR=0IF(I
23、ROW(I).NE.0)GOTO 430,42,匈牙利法的FORTRAN程序,DO 440 J=1,NIF(ICOL(J).NE.0)GOTO 440IF(IEFF(I,J).NE.0)GOTO 440NOZR=NOZR+1NZEROS=NZEROS+1NRPT=JNREFF=I 440 CONTINUEIF(NOZR.NE.1)GOTO 430IROW(I)=NRPTICOL(NRPT)=1NOMADE=NOMADE+1LOOP=LOOP+1 430 CONTINUEDO 500 I=1,NNOZC=0,43,匈牙利法的FORTRAN程序,IF(ICOL(I).NE.0)GOTO 500DO
24、 510 J=1,NIF(IROW(J).NE.0)GOTO 510IF(IEFF(J,I).NE.0)GOTO 510NOZC=NOZC+1NZEROS=NZEROS+1IRPT=J 510 CONTINUEIF(NOZC.NE.1)GOTO 500ICOL(I)=1IROW(IRPT)=INOMADE=NOMADE+1LOOP=LOOP+1 500 CONTINUEIF(NOMADE.EQ.N)GOTO 1500IF(LOOP.NE.0)GOTO 420IF(NZEROS.EQ.0)GOTO 800 700 IROW(NREFF)=NRPTNOMADE=NOMADE+1ICOL(NRPT)
25、=1GOTO 420,44,匈牙利法的FORTRAN程序,800 DO 810 I=1,NICHECK(I)=0JCHECK(I)=0IF(IROW(I).NE.0)GOTO 810ICHECK(I)=I 810 CONTINUE 900 NCHECK=0DO 910 I=1,NIF(ICHECK(I).EQ.0)GOTO 910DO 920 J=1,NIF(JCHECK(J).NE.0)GOTO 920IF(IEFF(I,J).NE.0)GOTO 920JCHECK(J)=JNCHECK=NCHECK+1 920 CONTINUE 910 CONTINUE IF(NCHECK.EQ.0)GO
26、TO 1300,45,匈牙利法的FORTRAN程序,DO 1010 I=1,NIF(JCHECK(I).LE.0)GOTO 1010DO 1020 J=1,NIF(JCHECK(I).NE.IROW(J)GOTO 1020ICHECK(J)=JNCHECK=NCHECK+1 1020 CONTINUE 1010 CONTINUEIF(NCHECK.NE.0) GOTO 900 1300 MINELM=99999999DO 1310 I=1,NIF(ICHECK(I).EQ.0) GOTO 1310DO 1320 J=1,NIF(JCHECK(J).NE.0)GOTO 1320IF(IEFF(I
27、,J).GE.MINELM)GOTO 1320MINELM=IEFF(I,J) 1320 CONTINUE 1310 CONTINUE,46,匈牙利法的FORTRAN程序,DO 1400 I=1,NDO 1400 J=1,NIF(ICHECK(I).LT.0)GOTO 1400IF(ICHECK(I).EQ.0)GOTO 1410IF(JCHECK(J).NE.0)GOTO 1400IEFF(I,J)=IEFF(I,J)-MINELMGOTO 1400 1410 IF(JCHECK(J).LE.0)GOTO 1400IEFF(I,J)=IEFF(I,J)+MINELM 1400 CONTINU
28、EGOTO 400 1500 TOTAL=0DO 1510 I=1,NK=IROW(I) 1510 TOTAL=TOTAL+IIF(I,K)RETURNEND,47,匈牙利法的FORTRAN程序,数据输入文件hun.in:4,02,10,9,715,4,14,813,14,16,114,15,13,9 结果输出文件hun.out: 初始效应矩阵为:2 10 9 715 4 14 813 14 16 114 15 13 9,给教师分配教学任务例题计算结果,48,匈牙利法的FORTRAN程序,最优目标函数值为:28 最优分配方案为:x( 1, 3) = 1x( 2, 2) = 1x( 3, 4)
29、= 1x( 4, 1) = 1,49,四、指派问题的推广应用,指派问题的一种很有意义的推广是:设有m个人和n项任务,其中每个人可承担的任务总数是给定的,应如何给每个人分配任务才能既保证完成n项任务,又使总体效率最高?这里没有限定一个人必须而且只能承担一项任务,但要求一项任务只能由一人完成,而且m个人必须完成n项任务。,设第i个人完成第j项任务所需的时间为cij,则以上推广指派问题的数学模型为:,50,指派问题的推广应用,51,显然该问题有解的充要条件是,指派问题的推广应用,经以下两步转换后,该问题可化成常规的指派问题。, 增加 项虚设任务,并令每个人完成虚设任务所需的时间均为0;, 如果第i个
30、人最多可承担ai项任务,则将其等价为ai个人,其中每个人刚好承担一项任务,且每个人完成各项任务(包括虚设任务)所需的时间与第i个人相同。,52,指派问题的推广应用,转换后得到的常规指派问题将包括 个人和 项任务。,下面以油气集输系统中油井与计量站的最优连接问题为例说明以上推广的指派问题的应用。该问题已在运输问题的拓广应用中讨论过,其数学模型与上面列出的推广的指派问题的数学模型完全相同。,53,指派问题的推广应用,例:某油田在调整一个区块的开发计划时,决定在这个区块打5口调整井,井的位置及计划产量已定。考虑到这个区块原有的3个计量站尚有富裕的处理能力,故决定不再新建计量站,而是将调整井分配给原有
31、的计量站管理。据测算,每口调整井到各计量站的集输管道的综合建设费用列于下表中,其中还列出了每个计量站最多可接收的井数(原来已管辖的老井除外)。,现要求确定调整井与各计量站之间的连接关系,使得每一口井刚好连接到一个站上并使集输管道的总建设费用最低。,54,指派问题的推广应用,集输管道预算建设费用(万元),55,指派问题的推广应用,解:首先对原问题作如下转换:, 增加2口虚设油井B6和B7,令其到各计量站的集输管道建设费均为0;, 将计量站A1分解为等价的2个站A11、A12,将A2分解为A21、A22,A3分解为A31、A32、A33。,转换后得到一个有7个计量站、7口油井的等价问题,其效率矩阵
32、为:,56,指派问题的推广应用,57,指派问题的推广应用,利用匈牙利法计算程序求解该指派问题得最优解为:,其余xij=0。集输管道的总建设费为54万元。,58,将这一结果还原到原问题即得到调整井与计量站之间的最优连接关系为:,59,指派问题的推广应用,油井与计量站之间最优连接关系问题计算机求解结果,初始效应矩阵为:15 10 13 14 18 0 015 10 13 14 18 0 08 12 11 14 13 0 08 12 11 14 13 0 020 16 15 10 17 0 020 16 15 10 17 0 020 16 15 10 17 0 0最优目标函数值为: 54最优分配方案为:x( 1, 2) = 1x( 2, 3) = 1x( 3, 1) = 1x( 4, 5) = 1x( 5, 4) = 1x( 6, 6) = 1x( 7, 7) = 1,