运筹学作业
-----关于指派问题的求解算法设计
学院:计算机科学与技术学院
班级:信息与计算科学1202班
学号:20
姓名:韩雪平
1.问题描述与数
学模型:
在现实生活中,有各种各样的指派问题。
例如,有若干项工作(或者任务,事情)需要分配给若干人(或者部门,设备等)来完成;有若干项合同需要选择若干个投标者来承包;有若干条交通线(如航空线,航海线,公路线等)需要配置若干交通运输工具(如飞机,船只,汽车等)来运营;有若干班级需要安排在不同的教师里上课;等等/诸如此类问题,它们的基本要求是来满足特定的指派要求时,使指派方案的总体效果最佳。
由于指派总是多样性的,有必要定义指派的特定问题的标准形式。
指派问题的标准形式(以人和事为例):设有n个人和n件事,已知第i个人做第j 件事的费用为cij(i,j=1,2,....n),求人与事之间一一对应的指派方案,使完成的这n件事的总费用最少。
一般称矩阵
c11 c12 c13 c14 (1)
c21 c22 c23 c24 (2)
c31 c32 c33 c34 (3)
C= . . . . .
. . . . .
. . . . .
cn1 cn2 cn3 cn4……cn5
为指派问题的系数矩阵。
在实际问题中,根据cij的具体意义,矩阵C可以有不同的名称,如费用矩阵,成本矩阵,时间矩阵等。
系数矩阵C中,第i行各元素表示第i人做各事的费用,第j列各元素表示第j件事由各个人做的费用。
为建立标准的指派问题的数学模型,引入n^2个0-1变量
1 当指派第i人去做第i件事时
Xij={(i,j=1,2,3……,n)
0 当不指派第i人去做第j件事时
然后对矩阵进行化解,当然作为可行解,矩阵中每一列都有且只有一个1,每行有且仅有一个1,以满足约束条件
2.算法思想:
标准的指派问题是特殊的整数规划问题,也是特殊的0—1规划问题和特殊的运输问题。
因此它可以用很多相应的解法来求解。
匈牙利解法的依据是指派问题的最优解的一下性质:设指派问题的系数矩阵C=(cij)n*n.若将C的一行或列分别减去一个常数K,则得到一个新的矩阵C'=(c'ij)n*n,那么C’为系数矩阵的指派问题和以C为系数矩阵的原指派问题有相同的最优解。
虽然不要求指派问题系数矩阵中无负元素,但是匈牙利解法求解指派问题时,为了从已变换后的系数矩阵中判别能否得到最优指派方案,要求此时的矩阵中无负元素因为只有这样,才能使用总费用为零这一特征来判断指派问题是否为最优方案。
3.算法流程或步骤:
步骤1 变换系数矩阵,使各行和各列皆出现零元素。
如各行各列分别减去本行及本列最小元素,这样可以保证每行及每列都有零元素,同时也避免出现负元素。
步骤2 求能覆盖所有零元素的最少数目的直线集合。
若直线数等于n,则可得出最优解。
否则,转步骤3。
步骤3 变换系数矩阵,使未被直线覆盖的元素中出现零元素。
回到步骤2。
4.算法源程序:
/*设计算法用匈牙利法求解指派问题:
比如:
4 8 7 1
5 12
7 9 17 14 10
C= 6 9 12 8 7
6 7 14 6 10
6 9 12 10 6
求出它的最优指派问题例与结果:
目标矩阵:
进行行列变换后处理的矩阵截图如下:
对没覆盖的行进行减去行中最小值处理截图:
论与总结:
本次课程设计主要运用了C语言去编写和实现它,通过本次的课程设计,使我在运用C 语言的过程中更加体会到了运筹学这一本课程的实用性,运筹学主要的设计方向是使一个普通问题变为最优化问题,它是在研究在有限种或无限中可行方案中选择最优方案,构造寻求最优的计算方法。
本次的课程设计算法编写使为求最优的指派问题的程序,运用的方法是匈牙利方法,匈牙利是通过把一个指派问题设计成一个矩阵,然后通过化解求解最优矩阵去求出它的最优指派问题,而这个指派问题在我们的生活中非常的有用,设计一个这样的算法不仅可以解决一线简单的现实问题,而且可以使生活更加简单化。
本次的课程设计虽然只是对一般问题的实行简单的解决,但是在一些复杂的问题上也是非常的有用的。
通过这次的课程设计我也更加体会到了自己的一些编写程序能力的一些弱区和缺陷,更加懂得在以后的学习过程中要多练多动手,提高自己的编程能力和算法设计能力,可以更好的处理一些数学问题和实际问题。
一个好的算法设计离不开好的推敲和思考,因此也要在算法设计的过程中,放开自己的大脑去思考去设计一个完美算法,课程设计的目的就在于此,
它引导我们驱使我们去思考和创新,去设计好的程序,因此,在设计过程中认真负责的对待也是非常重要的。
我相信在以后的学习和课设中我会做得更好,做的更加完美。