理学院最优化理论与应用课程设计学号:XXXXXXX专业:应用数学学生姓名:XXXXXX任课教师:XXXXXX教授2015年10月第一部分在最优化理论与应用这门课中,我对求指派问题及指派问题的一个很好的解法匈牙利算法的应用比较感应趣。
下面做出来讨论。
国内外的研究情况:“匈牙利算法”最早是由匈牙利数学家尼格(D.Koning )用来求矩阵中0元素个数的一种方法]3[,由此他证明了“矩阵中独立0元素的最多个数等于能覆盖所有0元素的最小直线数”。
1955年由库恩(W.W.Kuhn )在求解著名的指派问题时引用了这一结论]4[,并对具体算法做了改进,任然称为“匈牙利算法”。
解指派问题的匈牙利算法是从这样一个明显事实出发的:如果效率矩阵的所有元素≥ij a ,而其中存在一组位于不同行不同列的零元素,而只要令对应于这些零元素位置的1=ij x ,其余的=ij x ,则z=∑∑n injijij xa就是问题的最优解。
第二部分结合我的基础知识对匈牙利算法的分析与展望 一.基础知识运用企业员工指派问题的模型建立与求解1.标准指派问题(当m=n 时,即为每个人都被指派一项任务)假定某企业有甲乙丙丁戊五个员工,需要在一定的生产技术组织条件下,A ,B,C,D,E 五项任务,每个员工完成每项工作所需要耗费的工作时间如下:求出:员工与任务之间应如何分配,才能保证完成工作任务的时间最短?最短时间为多少? 模型建立设用C>0表示指派第i 个人去完成第j 项任务所用费时间,定义决策变量,{j i ,1j i ,0项任务个人去完成第当指派第项任务个人去完成第当不指派第=ij χ则指派问题的数学模型为:模型求解 由题意及匈牙利算法矩阵得0780022304306404001322740108032530700310430135210403111804363080020054013631140441380568309322018601376134051019146111517129185442314126191311189510⨯⨯⨯⨯⨯→→→→=和第二列划线并将第二三行C由此可知当员工甲负责任务A ,员工乙负责任务D ,员工丙负责任务B ,员工D 负责任务C ,员工E 负责任务E 时,才能保证完成工作任务的时间最短,最短时间为39个小时。
2.非标准指派问题当m<n 时,即企业员工数小于要求完成的任务数 假定某企业安5个员工,完成4项任务,每个员工完成每项任务的时间如下求如何分配任务才能保证工作时间最短? 模型建立设用C>0表示指派第i 个人去完成第j 项任务所用费时间,定义决策变量,{j i ,1j i ,0项任务个人去完成第当指派第项任务个人去完成第当不指派第=ij χ则指派问题的数学模型为:因为该模型不能直接运用匈牙利算法求解,故我们进行如下分析:五个员工负责四项任务则必有一个员工没有任务。
此时可增添一个虚任务E ,则个员工完成E 的时间均为0,上表变形为此时模型变为如下设用C>0表示指派第i 个人去完成第j 项任务所用费时间,定义决策变量,{j i ,1j i ,0项任务个人去完成第当指派第项任务个人去完成第当不指派第=ij χ则指派问题可转化为0-1线性规划问题模型求解如下即当甲分派C任务,乙分派A任务,丙分派B任务,戊分派D任务时,工作时间最短,最短时间为24小时。
二.匈牙利算法的缺点1.“匈牙利算法”在各种已发表的教材,专注和研究成果中,通常求解中小型分派问题,效能矩阵的阶数不超过20,故很难发现匈牙利算法”的缺点,匈牙利算法在处理一些特殊数据时并不有效,算法不收敛,无法找出最优解。
2.在匈牙利算法的求解步骤中,效率矩阵即可以先进行行减约也可以先进行列减约,但是,有时候先进行行减约比先进行列减约复杂,增加了许多步,有时却相反。
三.匈牙利算法的改进现对效率矩阵进行改进,这样就能知道先行减约还是先进行列减约,改进如下:第一步,简化效率矩阵。
(1)统计效率矩阵每行的最小元素的个数总和R (sum)和每列的最小元素的个数总和C(sum)。
(2)若R(sum)和C(sum)均大于n,且当R(sum)>C(sum)时,则先对效率矩阵的没咧减去该列的最小元素,在对所得效率矩阵的每行减去该行的最小元素。
反之当R(sum)<C(sum)时,则先对效率矩阵的每行减去该行的最小元素,在对所得效率矩阵的每列减去该列的最小元素。
(3)若R(sum)和C(sum)均不满足均大于n,且当R(sum)<C(sum)时,则先对效率矩阵的每列减去该行列的最小元素,在对所得效率矩阵的每行减去该行的最小元素。
反之,当R(sum)>C(sum)时,则先对效率矩阵的每行减去该行的最小元素,在对所得效率矩阵的每列减去该列的最小元素;第二步,检查矩阵C,若矩阵C的各行各列均有“0”,则跳过吃步,否则进行列(或行)约减。
得到新的矩阵C;第三步,画盖“0”线,即画最少的线讲矩阵C中的0全覆盖住,得新的矩阵C;第四步,数据转换。
若“盖0”线的数目等于矩阵的维数则直接跳到第六步,若“盖0”线的数目小于矩阵的维数则进行数据转换,步奏如下:(1)找到未被“盖0”线覆盖的数中的最小值λ(2)将未被“盖0”线覆盖住的数减去λ(3)将“盖0”线交叉的数加上λ第五部,重复第三步和第四步,直到“盖0”的数目等于矩阵的维数;第六步,求最优解对n维矩阵,找到不同行,不同列的n个“0”,每个“0”的位置代表一对配置关系,具体步骤如下:(1)先找只含有一个“0”的行(或列),将该行(或列)中的“0”打“ ”(2)将带“ ”的“0”所在列(或行)中的“0”打“×”(3)重复(1)步和(2)步结束,若所有行列均含有多个“0”,则从“0”的数目最少的行或列中任选一个“0”打“ ”;第七步,打“ ”即为员工所对应的指派任务。
第三部分匈牙利算法的C语言实现如下:#include<stdio.h>#include<malloc.h>//#define M 5//#define N 5#define MAXSIZE 10int M,N;int arrangement[999][999];int bestcost=999;int x[999];int bestx[999];void backtrackarrage(int i,int cost);void outputresult();void swap(int i,int j);main(){int i,j;printf("请输入行(人数):M=");scanf("%d",&M);printf("请输入列(人数):N=");scanf("%d",&N);printf("**************输入方式************\n");printf("* 手动输入(I) 文件读入(F) *\n");printf("**********************************\n");getchar();if(getchar()=='I'){printf("你选择的是手动输入\n");printf(请输入一个%d*%d矩(数字之间用空格间隔,换行按回车 )\n",M,N);for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&arrangement[i][j]);}else{printf("你选择的是文件读入\n");FILE *fp;fp=freopen("input.txt","r",stdin);for(i=0;i<M;i++)for(j=0;j<N;j++)scanf("%d",&arrangement[i][j]);}for(i=0;i<N;i++) /*初始化当前调度*/x[i]=i;backtrackarrage(0,0); /*回溯求解*/outputresult(); /*输出结果*/// getch();}/*递归回溯函数,确定最优调度方案,i是递归层数,cost是当前求得的解*/ void backtrackarrage(int i,int cost){int j;if(i==N){if(cost<bestcost){bestcost=cost;for(j=0;j<N;j++)bestx[j]=x[j];}}else{for(j=i;j<N;j++){cost+=arrangement[i][x[j]];if(cost<bestcost){swap(i,j);backtrackarrage(i+1,cost);swap(i,j);}cost-=arrangement[i][x[j]];}}}/*交换函数为了得到一个排序树的排序,即一个全排列*/void swap(int i,int j){int temp;temp=x[i];x[i]=x[j];x[j]=temp;}void outputresult(){int i;printf("计算结果是:\n");printf("event\tpeople");for(i=0;i<N;i++)printf("\n %d\t %d",i+1,bestx[i]+1); printf("\n\n\tbest cost:%d\n",bestcost);}第四部分课程评价:冯国峰老师课堂内容充实,线索清晰,重点突出,授课方式灵活多样,课堂气氛活跃,教学效果明显。
更是由于老师上课热情饱满使我在课堂上受益很多。
感谢老师让我对最优化理论与应用这门课有了新的认识。
参考文献[1] 中国就业培训技术指导中心组织编写,企业人力资源管理师(三级)[M].中国劳动社会保障出版社,2007.[2] 程红萍.简化匈牙利算法求解的思考[J].渭南师范学院学报,2007,22(5):32-34.[3] 张联朋.对指派问题匈牙利算法的两点改进[J].西安航空技术高等专科学校学报,2007,25(1):64-66.[4] 袁迁,刘舒燕.关于匈牙利算法的优化[J].武汉理工大学学报,2007,29(3):146-149.[5] 张联朋.寻找独立元素的一种新方法[J].重庆职业技术学院学报,2007,16(1):160-161.[6]彭静. 分配问题中匈牙利算法分析[J/OL]. /online read.asp?ID=34322021&SUID=EGBNBFDHDNCBCOPIBOLGEMCBCDOIPNFP、2010-01-31/2011-01-05。