1、第5节 指派问题,在生活中经常遇到这样的问题,某单位需完成n项任务,恰好有n个人可承担这些任务。由于每人的专长不同,各人完成任务不同(或所费时间),效率也不同。于是产生应指派哪个人去完成哪项任务,使完成n项任务的总效率最高(或所需总时间最小)。这类问题称为指派问题或分派问题(assignment problem)。,例7 有一份中文说明书,需译成英、日、德、俄四种文字。分别记作E、J、G、R。现有甲、乙、丙、丁四人。他们将中文说明书翻译成不同语种的说明书所需时间如表5-7所示。问应指派何人去完成何工作,使所需总时间最少?,表5-7,类似有:有n项加工任务,怎样指派到n台机床上分别完成的问题;有
2、n条航线,怎样指定n艘船去航行问题。对应每个指派问题,需有类似表5-7那样的数表,称为效率矩阵或系数矩阵,其元素cij0(i,j=1,2,n)表示指派第i人去完成第j项任务时的效率(或时间、成本等)。解题时需引入变量xij,,其取值只能是1或0。并令,当问题要求极小化时数学模型是:,约束条件说明第j项任务只能由1人去完成;约束条件说明第i人只能完成1项任务。满足约束条件的可行解xij也可写成表格或矩阵形式,称为解矩阵。 如例7的一个可行解矩阵是,显然,解矩阵(xij)中各行各列的元素之和都是1。但这不是最优解。,指派问题是0-1规划的特例,也是运输问题的特例,即n=m,aj=bi=1 当然可用
3、整数线性规划,0-1规划或运输问题的解法去求解,这就如同用单纯形法求解运输问题一样是不合算的。利用指派问题的特点可有更简便的解法。指派问题的最优解有这样性质,若从系数矩阵(cij)的一行(列)各元素中分别减去该行(列)的最小元素,得到新矩阵(bij),那么以(bij)为系数矩阵求得的最优解和用原系数矩阵求得的最优解相同。,利用这个性质,可使原系数矩阵变换为含有很多0元素的新系数矩阵,而最优解保持不变,在系数矩阵(bij)中,我们关心位于不同行不同列的0元素,以下简称为独立的0元素。若能在系数矩阵(bij)中找出n个独立的0元素;则令解矩阵(xij)中对应这n个独立的0元素的元素取值为1,其他元
4、素取值为0。将其代入目标函数中得到zb=0,它一定是最小。这就是以(bij)为系数矩阵的指派问题的最优解。也就得到了原问题的最优解。,以下用例7来说明指派问题的解法。第一步:使指派问题的系数矩阵经变换,在各行各列中都出现0元素。(1) 从系数矩阵的每行元素减去该行的最小元素;(2) 再从所得系数矩阵的每列元素中减去该列的最小元素。若某行(列)已有0元素,那就不必再减了。例7的计算为,行列都有零元素,第二步:进行试指派,以寻求最优解。为此,按以下步骤进行。经第一步变换后,系数矩阵中每行每列都已有了0元素;但需找出n个独立的0元素。若能找出,就以这些独立0元素对应解矩阵(xij)中的元素为1,其余
5、为0,这就得到最优解。当n较小时,可用观察法、试探法去找出n个独立0元素。若n较大时,就必须按一定的步骤去找,常用的步骤为:,(1) 从只有一个0元素的行(列)开始,给这个0元素加圈,记作。这表示对这行所代表的人,只有一种任务可指派。然后划去所在列(行)的其他0元素,记作。这表示这列所代表的任务已指派完,不必再考虑别人了。(2) 给只有一个0元素列(行)的0元素加圈,记作;然后划去所在行的0元素,记作。(3) 反复进行(1),(2)两步,直到所有0元素都被圈出和划掉为止。(4) 若仍有没有划圈的0元素,且同行(列)的0元素至少有两个(表示对这个可以从两项任务中指派其一)。这可用不同的方案去试探
6、。从剩有0元素最少的行(列)开始,比较这行各0元素所在列中0元素的数目,选择0元素少的那列的这个0元素加圈(表示选择性多的要“礼让”选择性少的)。然后划掉同行同列的其他0元素。可反复进行,直到所有0元素都已圈出和划掉为止。(5) 若元素的数目m等于矩阵的阶数n,那么这指派问题的最优解已得到。若mn,则转入下一步。,现用例7的(bij)矩阵,按上述步骤进行运算。按步骤(1),先给b22加圈,然后给b31加圈,划掉b11,b41;按步骤(2),给b43加圈,划掉b44,最后给b14加圈,得到,注意:矩阵中符号即是文中的符号。以下同。,可见m=n=4,所以得最优解为,该矩阵表示:指定甲译出俄文,乙译
7、出日文,丙译出英文,丁译出德文。所需总时间最少,例8求表5-8所示效率矩阵的指派问题的最小解。,解 按上述第一步,将这系数矩阵进行变换。,经一次运算即得每行每列都有0元素的系数矩阵,,再按上述步骤运算,得到,这里的个数m=4,而n=5;所以解题没有完成,这时应按以下步骤继续进行。,第三步:作最少的直线覆盖所有0元素,以确定该系数矩阵中能找到最多的独立元素数。为此按以下步骤进行:(1) 对没有的行打号;(2) 对已打号的行中所有含元素的列打号;(3) 再对打有号的列中含元素的行打号;(4) 重复(2),(3)直到得不出新的打号的行、列为止。(5) 对没有打号的行画一横线,有打号的列画一纵线,这就
8、得到覆盖所有0元素的最少直线数。,令这直线数为l。若ln,说明必须再变换当前的系数矩阵,才能找到n个独立的0元素,为此转第四步:若l=n,而mn,应回到第二步(4),另行试探。 在例8中,对矩阵按以下次序进行: 先在第五行旁打,接着可判断应在第1列下打,接着在第3行旁打。经检查不再能打了。对没有打行,画一直线以覆盖0元素,已打的列画一直线以覆盖0元素。得,由此可见l=4n。所以应继续对矩阵进行变换。转第四步。,第四步:对矩阵进行变换的目的是增加0元素。为此在没有被直线覆盖的部分中找出最小元素。然后在打行各元素中都减去这最小元素,而在打列的各元素都加上这最小元素,以保证原来0元素不变。这样得到新
9、系数矩阵(它的最优解和原问题相同)。若得到n个独立的0元素,则已得最优解,否则回到第三步重复进行。在例8的矩阵中,在没有被覆盖部分(第3、5行)中找出最小元素为2,然后在第3、5行各元素分别减去2,给第1列各元素加2,得到新矩阵。按第二步,找出所有独立的0元素,得到矩阵。,已具有n个独立0元素。这就得到了最优解,相应的解矩阵为由解矩阵得最优指派方案:甲B,乙D,丙E,丁C,戊A还可以得到另一最优指派方案甲B,乙C,丙E,丁D,戊A所需总时间为min z=32,指派问题的匈牙利法第一步:各行元素该行行最小, 各列元素该列列最小 若有n个独立的0元素则已得最优解,否则转第二步第二步:1. 从只有一
10、个0元素的行(列)开始,把0元素记为 ,表示“确定”,然后划去所 在行(列)的其他0元素,记为,表示“不考虑” 2. 划去行(列)的新矩阵再回到:1 3. 若仍有没划圈的0元素,且同行(列)至少有两个0元素,则从0元素最少的行(列)开始试探 若 “确定”的数目m等于矩阵的阶n,则最优解得到第三步:1. 对没有 的行打 (对应的人没找到合适的工作) 2. 对已打 的行中的所含的列打 (没找到工作的人最适合的工作) 3. 对打 的列中的所含 的行打 (没有工作的人所适合的工作分给谁了),重复2 3 对没有打 的行划线(所有找到合适工作的人)对打 的列划线(没找到合适工作的人最适合的工作)如直线数任
11、务数,转第四步,如直线数=任务数, 的数n,工作,人,费用,1 2 j n,12im,n+1 n+2 m,用匈牙利法求解,例:现有4份工作,6个人应聘,他们承担各项工作所需时间如下表所示,且规定每人只能做一项工作,每一项工作只能由一个人承担,试求使总时间最少的分派方案。,工作,人,时间,1 2 3 4,123456,5 6,000000,000000,12 7 9 7,7 17 12 14,15 14 6 6,4 10 7 10,6 5 5 8,4 5 7 6,分派方案:,第3个人第4项工作,第4个人第1项工作,第5个人第3项工作,第6个人第2项工作,第1、2个人没工作,总时间=,6+4+5+5=20,工作,人,费用,1 2 j n,12im,m+1 m+2 n,(b)mn,用匈牙利法求解,思考,若人数少于工作数,需要某个人完成两件工作,怎么办?例:甲乙丙丁4人要完成5项任务,其中1人完成两项任务,其余3人每人完成1项。每人做各种工作所消耗的时间如下表所示。问应如何进行指派使总的消耗时间最小?,