运筹学指派问题的匈牙利法实验报告.docVIP

运筹学指派问题的匈牙利法实验报告.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
运 筹 学 课 程 设 计 报 告 专业: 班级: 学号: 姓名: 2012年6月20日 目录 题目。 算法思想。 算法步骤。 算法源程序。 算例和结果。 结论与总结。 题目:匈牙利法求解指派问题。 算法思想。 匈牙利解法的指派问题最优解的以下性质: 设指派问题的系数矩阵为C=,若将C的一行(或列)各元素分别减去一个常数k(如该行或列的最小元素),则得到一个新的矩阵C’=。那么,以C’位系数矩阵的指派问题和以C位系数矩阵的原指派问题有相同最优解。 由于系数矩阵的这种变化不影响约束方程组,只是使目标函数值减少了常数k,所以,最优解并不改变。必须指出,虽然不比要求指派问题系数矩阵中无负元素,但在匈牙利法求解指派问题时,为了从以变换后的系数矩阵中判别能否得到最优指派方案,要求此时的系数矩阵中无负元素。因为只有这样,才能从总费用为零这一特征判定此时的指派方案为最优指派方案。 算法步骤。 (1)变换系数矩阵,使各行和各列皆出现零元素。 各行及各列分别减去本行及本列最小元素,这样可保证每行及每列中都有零元素,同时,也避免了出现负元素。 (2)做能覆盖所有零元素的最少数目的直线集合。 因此,若直线数等于n,则以可得出最优解。否则,转第(3)步。 对于系数矩阵非负的指派问题来说,总费用为零的指派方案一定是最优指派方案。在第(1)步的基础上,若能找到n个不同行、不同列的零元素,则对应的指派方案总费用为零,从而是最优的。当同一行(或列)上有几个零元素时,如选择其一,则其与的零元素就不能再被选择,从而成为多余的。因此,重要的是零元素能恰当地分布在不同行和不同列上,而并在与它们的多少。但第(1)步并不能保证这一要求。若覆盖所有零元素的最少数目的直线集合中的直线数目是n,则表明能做到这一点。 此时,可以从零元素的最少的行或列开始圈“0”,每圈一个“0”,同时把位于同行合同列的其他零元素划去(标记为),如此逐步进行,最终可得n个位于不同行、不同列的零元素,他们就对应了最优解;若覆盖所有零元素的最少数目的直线集合中的元素个数少于n,则表明无法实现这一点。需要对零元素的分布做适当调整,这就是第(3)步。 (3) 变换系数矩阵,是未被直线覆盖的元素中出现零元素。回到第(2)步。 在未被直线覆盖的元素中总有一个最小元素。对未被直线覆盖的元素所在的行(或列)中各元素都减去这一最小元素,这样,在未被直线覆盖的元素中势必会出现零元素,但同时却又是以被直线覆盖的元素中出现负元素。为了消除负元素,只要对它们所在的列(或行)中个元素都加上这一最小元素(可以看作减去这一最小元素的相反数)即可。 算法源程序。 #includeiostream.h #includestdlib.h #define m 5 int input(int M[m][m]) { int i,j; for(i=0;im;i++) { cout请输入系数矩阵第i+1行元素:endl; for(j=0;jm;j++) cinM[i][j]; } cout系数矩阵为:endl; for(i=0;im;i++) { for(j=0;jm;j++) coutM[i][j]\t; coutendl; } return M[m][m]; } int convert(int M[m][m]) { int x[m],y[m]; int i,j; for(i=0;im;i++) { x[i]=M[i][0]; for(j=1;jm;j++) { if(M[i][j]x[i]) x[i]=M[i][j]; } } for(i=0;im;i++) for(j=0;jm;j++) M[i][j]-=x[i]; for(j=0;jm;j++) { y[j]=M[0][j]; for(i=0;im;i++) { if(M[i][j]y[j]) y[j]=M[i][j]; } } for(i=0;im;i++) for(j=0;jm;j++) M[i][j]-=y[j]; cout对系数矩阵各行各列进行变换得:endl; for(i=0;im;i++) { for(j=0;jm;j++) coutM[i][j]\t; coutendl; } return M[m][m]; } int exchange(int M[m][m]) { int i,j,n; cout进行行变换输入0,进行列变换输入其他任意键:endl; cinn; if(n==0) cout分别输入要变换的行及该

文档评论(0)

smashing + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档