匈牙利算法matlab,匈牙利算法的matlab编程求助

小虫的自动真恶心表情

=========================================

function [Matching] = xiongyali(Perf)

Matching = zeros(size(Perf));

num_y = sum(~isinf(Perf),1);

num_x = sum(~isinf(Perf),2);

x_con = find(num_x~=0);

y_con = find(num_y~=0);

P_size = max(length(x_con),length(y_con));

P_cond = zeros(P_size);

P_cond(1:length(x_con),1:length(y_con)) = Perf(x_con,y_con);

if isempty(P_cond)

Cost = 0;

return

end

Edge = P_cond;

Edge(P_cond~=Inf) = 0;

cnum = min_line_cover(Edge);

Pmax = max(max(P_cond(P_cond~=Inf)));

P_size = length(P_cond)+cnum;

P_cond = ones(P_size)*Pmax;

P_cond(1:length(x_con),1:length(y_con)) = Perf(x_con,y_con);

%*************************************************

exit_flag = 1;

stepnum = 1;

while exit_flag

switch stepnum

case 1

[P_cond,stepnum] = step1(P_cond);

case 2

[r_cov,c_cov,M,stepnum] = step2(P_cond);

case 3

[c_cov,stepnum] = step3(M,P_size);

case 4

[M,r_cov,c_cov,Z_r,Z_c,stepnum] = step4(P_cond,r_cov,c_cov,M);

case 5

[M,r_cov,c_cov,stepnum] = step5(M,Z_r,Z_c,r_cov,c_cov);

case 6

[P_cond,stepnum] = step6(P_cond,r_cov,c_cov);

case 7

exit_flag = 0;

end

end

Matching(x_con,y_con) = M(1:length(x_con),1:length(y_con));

Cost = sum(sum(Perf(Matching==1)));

function [P_cond,stepnum] = step1(P_cond)

P_size = length(P_cond);

% Loop throught each row

for ii = 1

tongue.gif_size

rmin = min(P_cond(ii,:  ));

P_cond(ii,:  ) = P_cond(ii,:  )-rmin;

end

stepnum = 2;

function [r_cov,c_cov,M,stepnum] = step2(P_cond)

P_size = length(P_cond);

r_cov = zeros(P_size,1);

c_cov = zeros(P_size,1);

M = zeros(P_size);

for ii = 1

tongue.gif_size

for jj = 1

tongue.gif_size

if P_cond(ii,jj) == 0 && r_cov(ii) == 0 && c_cov(jj) == 0

M(ii,jj) = 1;

r_cov(ii) = 1;

c_cov(jj) = 1;

end

end

end

r_cov = zeros(P_size,1);

c_cov = zeros(P_size,1);

stepnum = 3;

function [c_cov,stepnum] = step3(M,P_size)

c_cov = sum(M,1);

if sum(c_cov) == P_size

stepnum = 7;

else

stepnum = 4;

end

function [M,r_cov,c_cov,Z_r,Z_c,stepnum] = step4(P_cond,r_cov,c_cov,M)

P_size = length(P_cond);

zflag = 1;

while zflag

row = 0; col = 0; exit_flag = 1;

ii = 1; jj = 1;

while exit_flag

if P_cond(ii,jj) == 0 && r_cov(ii) == 0 && c_cov(jj) == 0

row = ii;

col = jj;

exit_flag = 0;

end

jj = jj + 1;

if jj > P_size; jj = 1; ii = ii+1; end

if ii > P_size; exit_flag = 0; end

end

if row == 0

stepnum = 6;

zflag = 0;

Z_r = 0;

Z_c = 0;

else

M(row,col) = 2;

if sum(find(M(row,:  )==1)) ~= 0

r_cov(row) = 1;

zcol = find(M(row,:  )==1);

c_cov(zcol) = 0;

else

stepnum = 5;

zflag = 0;

Z_r = row;

Z_c = col;

end

end

end

function [M,r_cov,c_cov,stepnum] = step5(M,Z_r,Z_c,r_cov,c_cov)

zflag = 1;

ii = 1;

while zflag

rindex = find(M(:,Z_c(ii))==1);

if rindex > 0

ii = ii+1;

Z_r(ii,1) = rindex;

Z_c(ii,1) = Z_c(ii-1);

else

zflag = 0;

end

if zflag == 1;

cindex = find(M(Z_r(ii),:  )==2);

ii = ii+1;

Z_r(ii,1) = Z_r(ii-1);

Z_c(ii,1) = cindex;

end

end

for ii = 1:length(Z_r)

if M(Z_r(ii),Z_c(ii)) == 1

M(Z_r(ii),Z_c(ii)) = 0;

else

M(Z_r(ii),Z_c(ii)) = 1;

end

end

r_cov = r_cov.*0;

c_cov = c_cov.*0;

M(M==2) = 0;

stepnum = 3;

function [P_cond,stepnum] = step6(P_cond,r_cov,c_cov)

a = find(r_cov == 0);

b = find(c_cov == 0);

minval = min(min(P_cond(a,b)));

P_cond(find(r_cov == 1),:  ) = P_cond(find(r_cov == 1),:  ) + minval;

P_cond(:,find(c_cov == 0)) = P_cond(:,find(c_cov == 0)) - minval;

stepnum = 4;

function cnum = min_line_cover(Edge)

[r_cov,c_cov,M,stepnum] = step2(Edge);

[c_cov,stepnum] = step3(M,length(Edge));

[M,r_cov,c_cov,Z_r,Z_c,stepnum] = step4(Edge,r_cov,c_cov,M);

cnum = length(Edge)-sum(r_cov)-sum(c_cov);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值