資源簡介
若能在系數(shù)矩陣(bij)中找出n個(gè)獨(dú)立的0元素;則令解矩陣(xij)中對應(yīng)這n個(gè)獨(dú)立的0元素取值為1,其它元素取值為0。將其代入目標(biāo)函數(shù)中得到zk=0,它一定是最小。這就是以(bij)為系數(shù)矩陣的指派問題的最優(yōu)解。也就得到了問題的最優(yōu)解。
代碼片段和文件信息
function?[zans]=success(marix)
count=0;
%//////////////////////////////////////////////////
????????????%輸入效率矩陣?marix?為方陣;
????????????%若效率矩陣中有?M則用一充分大的數(shù)代替;
????????????%輸出z為最優(yōu)解,ans為?最優(yōu)分配矩陣;
%//////////////////////////////////////////////////
[hl]=size(marix);
aamarix=marix;
if?h>l
????marix=zeros(h);
????for?i=1:h
????????for?j=1:l
????????????marix(ij)=aamarix(ij);
????????end
????end
elseif?l>h
????marix=zeros(l);
????for?i=1:h
????????for?j=1:l
????????????marix(ij)=aamarix(ij);
????????end
????end
end
a=marix;
b=a;
%確定矩陣維數(shù)
s=length(a);
%確定矩陣行最小值,進(jìn)行行減
ml=min(a‘);
for?i=1:s
????a(i:)=a(i:)-ml(i);
end
%確定矩陣列最小值,進(jìn)行列減
mr=min(a);
for?j=1:s
????a(:j)=a(:j)-mr(j);
end
%?start?working
num=0;
me=a;
while(num~=s)??%終止條件是“(0)”的個(gè)數(shù)與矩陣的維數(shù)相同
????%index用以標(biāo)記矩陣中的零元素,若a(ij)=0,則index(ij)=1否則index(ij)=0
????index=ones(s);
???%?sum(sum(index))
??%??sum(sum(a))
????me=a;
???%?index=a&index;
???index=me&index;
???%?sum(?sum(index))
????index=~index;
%????sum(sum(index))
????%flag用以標(biāo)記劃線位,flag=0?表示未被劃線,
????%flag=1?表示有劃線過,flag=2?表示為兩直線交點(diǎn)
????%ans用以記錄?a?中“(0)”的位置
????%循環(huán)后重新初始化flagans
????flag?=?zeros(s);
????ans0?=?zeros(s);
????%一次循環(huán)劃線全過程,終止條件是所有的零元素均被直線覆蓋,
????%即在flag>0位index=0
????
???
????
????while(sum(sum(index)))
????????%按行找出“(0)”所在位置,并對“(0)”所在列劃線,
????????%即設(shè)置flag同時(shí)修改index將結(jié)果填入ans
???????k?=0;?
???????p?=?0;
???????for?i=1:s
????????????t=0;
????????????
????????????l=0;
????????????for?j=1:s
????????????????if(flag(ij)==0&&index(ij)==1)
????????????????????l=l+1;
????????????????????t=j;
????????????????end
????????????end
????????????if(l==1)
????????????????k?=?1;
????????????????flag(:t)=flag(:t)+1;
????????????????index(:t)=0;
????????????????ans0(it)=1;
????????????else
????????????????k=0;
????????????end
????????end
????????%按列找出“(0)”所在位置,并對“(0)”所在行劃線,
????????%即設(shè)置flag同時(shí)修改index將結(jié)果填入ans
????????
????????for?j=1:s
????????????t=0;
????????????r=0;
????????????for?i=1:s
????????????????if(flag(ij)==0&&index(ij)==1)
????????????????????r=r+1;
????????????????????t=i;
????????????????end
????????????end
????????????if(r==1)
????????????????p?=?1;
????????????????flag(t:)=flag(t:)+1;
????????????????index(t:)=0;
????????????????ans0(tj)=1;
????????????else
????????????????p=0;
????????????end
????????end
????????
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
????????if?(0?==p?&&?k?==0)????%44?
????????????sto1?=?s+1;
???????????
????????????pos?=?1;
????????????for?numb?=?1:s;%55
????????????????sto?=0;
??
評論
共有 條評論