运筹学指派问题Word文档下载推荐.docx

上传人:b****8 文档编号:22271629 上传时间:2023-02-03 格式:DOCX 页数:13 大小:108.77KB
下载 相关 举报
运筹学指派问题Word文档下载推荐.docx_第1页
第1页 / 共13页
运筹学指派问题Word文档下载推荐.docx_第2页
第2页 / 共13页
运筹学指派问题Word文档下载推荐.docx_第3页
第3页 / 共13页
运筹学指派问题Word文档下载推荐.docx_第4页
第4页 / 共13页
运筹学指派问题Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

运筹学指派问题Word文档下载推荐.docx

《运筹学指派问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《运筹学指派问题Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

运筹学指派问题Word文档下载推荐.docx

有若干班级需要安排在不同的教师里上课;

等等/诸如此类问题,它们的基本要求是来满足特定的指派要求时,使指派方案的总体效果最佳。

由于指派总是多样性的,有必要定义指派的特定问题的标准形式。

指派问题的标准形式(以人和事为例):

设有n个人和n件事,已知第i个人做第j件事的费用为cij(i,j=1,2,....n),求人与事之间一一对应的指派方案,使完成的这n件事的总费用最少。

一般称矩阵

c11c12c13c14……c1n

c21c22c23c24……c2n

c31c32c33c34……c3n

C=.....

.....

cn1cn2cn3cn4……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.算法源程序:

/*设计算法用匈牙利法求解指派问题:

比如:

4871512

79171410

C=691287

6714610

6912106

求出它的最优指派问题////////

*/

////////////////////////////

////////////////////////

///////////////////

////////////

#include<

stdio.h>

intmain(void)

{

inti,j,min,a[5][5],m=0,cnt1=0,cnt2=0;

printf("

请输入一个二维数组:

\n"

);

for(i=0;

i<

5;

i++)//输入目标矩阵

for(j=0;

j<

j++)

scanf("

%d"

&

a[i][j]);

for(i=0;

i++)//对每行进行减去行中最小值处理

min=a[i][0];

for(j=1;

if(a[i][j]<

min)

min=a[i][j];

}

j++)//对列进行减去减去列中最小值处理

a[i][j]=a[i][j]-min;

}

min=a[0][j];

for(i=1;

i++)

{

//while(m!

=5)

//{

/*for(i=0;

i++)//记录每行的零个数

if(a[i][j]==0)

//i1++;

cnt1++;

//记录输入的每行元素个数

c[i]=cnt1;

cnt1=0;

//清零

j++)//记录每列的零个数

{if(a[i][j]==0)

//j1++;

cnt2++;

d[j]=cnt2;

cnt2=0;

//}

输出变换后的矩阵:

{for(j=0;

%3d"

a[i][j]);

%5d"

c[i]);

d[i]);

printf("

///////通过边算边验证,此时给第二行和第三行减去它们行中除零的最小值////////

给第二行和第三行减去它们行中除零最小的数得:

for(j=0;

a[1][j]=a[1][j]-1;

a[2][j]=a[2][j]-1;

///继续通过边求边验证,此时给第一列加上1///

再给第一列加上1后的矩阵如下:

a[i][0]=a[i][0]+1;

//此时圈零进行调整让每行每列都保有一个零//

{for(j=0;

{if(a[i][j]!

=0)

a[i][j]=0;

else

a[i][j]=1;

//此时继续验证继续调整舍去第二行第一个的数和第四行第二列的数使它们等于0//

a[1][0]=0;

a[3][1]=0;

a[2][4]=0;

return0;

////////////////////////////////

5.算例与结果:

目标矩阵:

进行行列变换后处理的矩阵截图如下:

对没覆盖的行进行减去行中最小值处理截图:

///////////////////////////////////////

对列中的负数进行加上负数最小值处理截图:

/////////////////////////////////

//////////////////////

/////////////////////////////////////////

////////////////////////////////////////////////

//////////////////////////

///////////////////////////////////

//////////////////////////////////////////

////////////////////////////////////////////////////

///////////////////////////

对行列中不为零和是零的元素进行处理,使不为零变0,为零变1:

/////////////////////////////////////////////

////////////////////////////////////

/////////////////////////

///////////////////////////////////////////////

调整1的个数,使每行每列都保持有一个1:

/////////////////////////////////////

6.结论与总结:

本次课程设计主要运用了C语言去编写和实现它,通过本次的课程设计,使我在运用C语言的过程中更加体会到了运筹学这一本课程的实用性,运筹学主要的设计方向是使一个普通问题变为最优化问题,它是在研究在有限种或无限中可行方案中选择最优方案,构造寻求最优的计算方法。

本次的课程设计算法编写使为求最优的指派问题的程序,运用的方法是匈牙利方法,匈牙利是通过把一个指派问题设计成一个矩阵,然后通过化解求解最优矩阵去求出它的最优指派问题,而这个指派问题在我们的生活中非常的有用,设计一个这样的算法不仅可以解决一线简单的现实问题,而且可以使生活更加简单化。

本次的课程设计虽然只是对一般问题的实行简单的解决,但是在一些复杂的问题上也是非常的有用的。

通过这次的课程设计我也更加体会到了自己的一些编写程序能力的一些弱区和缺陷,更加懂得在以后的学习过程中要多练多动手,提高自己的编程能力和算法设计能力,可以更好的处理一些数学问题和实际问题。

一个好的算法设计离不开好的推敲和思考,因此也要在算法设计的过程中,放开自己的大脑去思考去设计一个完美算法,课程设计的目的就在于此,它引导我们驱使我们去思考和创新,去设计好的程序,因此,在设计过程中认真负责的对待也是非常重要的。

我相信在以后的学习和课设中我会做得更好,做的更加完美。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1