匈牙利算法的MATLAB代码_第1页
匈牙利算法的MATLAB代码_第2页
匈牙利算法的MATLAB代码_第3页
匈牙利算法的MATLAB代码_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序文件 fenpei.mfunction z,ans=fenpei(marix)%/%输入效率矩阵marix 为方阵 ;%若效率矩阵中有M, 则用一充分大的数代替 ;%输出 z 为最优解, ans 为 最优分配矩阵;%/a=marix;b=a;%确定矩阵维数s=length(a);%确定矩阵行最小值,进行行减ml=min(a);for i=1:sa(i,:)=a(i,:)-ml(i);end%确定矩阵列最小值,进行列减mr=min(a);for j=1:sa(:,j)=a(:,j)-mr(j);end% start workingnum=0;while(num=s)% 终止条件是“ ( 0)

2、”的个数与矩阵的维数相同%index 用以标记矩阵中的零元素,若 a(i,j)=0 ,则 index(i,j)=1, 否则 index(i,j)=0 index=ones(s);index=a&index;index=index;%flag 用以标记划线位, flag=0 表示未被划线,%flag=1 表示有划线过, flag=2 表示为两直线交点%ans 用以记录 a 中“(0)”的位置%循环后重新初始化 flag,ansflag = zeros(s);ans = zeros(s); %一次循环划线全过程,终止条件是所有的零元素均被直线覆盖,%即在 flag0 位 ,index=0 whil

3、e(sum(sum(index)%按行找出“(0)”所在位置,并对“ ( 0)”所在列划线,%即设置flag,同时修改index,将结果填入ansfor i=1:st=0;l=0;for j=1:sif(flag(i,j)=0&index(i,j)=1)l=l+1;t=j;endendif(l=1) flag(:,t)=flag(:,t)+1; index(:,t)=0; ans(i,t)=1;endend %按列找出“(0)”所在位置,并对“ ( 0)”所在行划线,%即设置flag,同时修改index,将结果填入ansfor j=1:st=0;r=0;for i=1:s if(flag(i,

4、j)=0&index(i,j)=1) r=r+1; t=i;endendif(r=1) flag(t,:)=flag(t,:)+1; index(t,:)=0; ans(t,j)=1;endendend %对 while(sum(sum(index)%处理过程%计数器:计算ans中1的个数,用num表示 num=sum(sum(ans);% 判断是否可以终止,若可以则跳出循环if(s=num)break;end%否则,进行下一步处理 %确定未被划线的最小元素,用 m 表示m=max(max(a);for i=1:sfor j=1:sif(flag(i,j)=0) if(a(i,j) a=37.732.938.83743.433.142.234.741.833.328.538.930.433.629.226.429.628.531.10 0000; z,ans=fenpei(a)z =127.8000ans =100000 0 0 00 0 0 10 1 0 01 0 0 00 0 1 01 1 1 2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论