• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-18
  • 语言: Matlab
  • 标签: tag  

资源简介

匈牙利算法的基本思想是修改效益矩阵的行或列,使得每一行或列中至少有一个为零的元素,经过修正后,直至在不同行、不同列中至少有一个零元素,从而得到与这些零元素相对应的一个完全分配方案。 当它用于效益矩阵时,这个完全分配方案就是一个最优分配,它使总的效益为最小。这种方法总是在有限步内收敛于一个最优解

资源截图

代码片段和文件信息

function [MatchingCost] = Hungarian(Perf)
% [MATCHINGCOST] = Hungarian_New(WEIGHTS)
% 匈牙利算法
% 给定一个n x n矩阵的边权矩阵,使用匈牙利算法求解最小边权值和问题,类似最小树问题
% 如果矩阵中出现inf,则表示没有边与之相连
% 输出:
%       Matching 为一个 n x n的矩阵,只有0 和 1
%        COST 为对应Matching处为1所在位置的元素和

 % 初始化变量
 Matching = zeros(size(Perf));

  % 移除Inf,加速算法执行效率
  % 针对每一列找inf
    num_y = sum(~isinf(Perf)1);
  % 针对每一行找inf
    num_x = sum(~isinf(Perf)2);
    
  % Find the columns(vertices) and rows(vertices) that are isolated
    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_cony_con);
    if isempty(P_cond)
      Cost = 0;
      return
    end

      % 计算边权矩阵
      Edge = P_cond;
      Edge(P_cond~=Inf) = 0;
      % 修正权效矩阵
      cnum = min_line_cover(Edge);
    
      % 对未标记的行和已标记的列画纵、横线P
      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_cony_con);
   
%*************************************************
% 主要求解步骤
%*************************************************
  exit_flag = 1;
  stepnum = 1;
  while exit_flag
    switch stepnum
      case 1
        [P_condstepnum] = step1(P_cond);
      case 2
        [r_covc_covMstepnum] = step2(P_cond);
      case 3
        [c_covstepnum] = step3(MP_size);
      case 4
        [Mr_covc_covZ_rZ_cstepnum] = step4(P_condr_covc_covM);
      case 5
        [Mr_covc_covstepnum] = step5(MZ_rZ_cr_covc_cov);
      case 6
        [P_condstepnum] = step6(P_condr_covc_cov);
      case 7
        exit_flag = 0;
    end
  end

% 移除所有的虚拟节点
Matching(x_cony_con) = M(1:length(x_con)1:length(y_con));
Cost = sum(sum(Perf(Matching==1)));

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   STEP 1:找每行最小元素
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [P_condstepnum] = step1(P_cond)

  P_size = length(P_cond);
  
  % Loop throught each row
  for ii = 1:P_size
    rmin = min(P_cond(ii:));
    P_cond(ii:) = P_cond(ii:)-rmin;
  end

  stepnum = 2;
  
%**************************************************************************  
%   STEP 2: 寻找P_cond中的0元素
%**************************************************************************
function [r_covc_covMstepnum] = step2(P_cond)

% 定义变量
  P_size = length(P_cond);
  r_cov = zeros(P_size1);  % 记录 元素为0 所在的行
  c_cov = zeros(P_size1);  % 记录 元素为0 所在的列
  M = zeros(P_size);        % A mask that shows if a position is starred or primed
  
  for ii = 1:P_size
    for jj = 1:P_size
      if P_cond(iijj) == 0 && r_cov(ii) == 0 && c_cov(jj) == 0
        M(iijj) = 1;
        r_cov(ii) = 1;
        c_cov(jj) = 1;
      end
    end
  end
  
% 重新初始化操作
  r_cov = zeros(P_size1);  % A vector that shows if a row is covered
  c_cov = 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       7369  2018-06-29 12:59  第26章\Hungarian.m

     文件       3798  2018-06-29 12:59  第26章\Hungarian_algorithm.m

     文件        147  2018-06-29 12:59  第26章\ysw1.m

     目录          0  2018-08-20 17:45  第26章

----------- ---------  ---------- -----  ----

                11314                    4


评论

共有 条评论