资源简介
匈牙利算法的基本思想是修改效益矩阵的行或列,使得每一行或列中至少有一个为零的元素,经过修正后,直至在不同行、不同列中至少有一个零元素,从而得到与这些零元素相对应的一个完全分配方案。
当它用于效益矩阵时,这个完全分配方案就是一个最优分配,它使总的效益为最小。这种方法总是在有限步内收敛于一个最优解
代码片段和文件信息
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
- 上一篇:人脸检测与MATLAB实现
- 下一篇:细菌觅食算法的函数优化-matlab
相关资源
- 细菌觅食算法的函数优化-matlab
- 人脸检测与MATLAB实现
- 指纹图像特征提取与matlab实现
- 线性系统基于观测器的状态反馈控制
- 万有引力搜索算法的函数优化-matlab
- bp模型优化预测与matlab仿真,pid参数优
- three phase voltage rectifier 三相电压型S
- Femtocell-Interference-management-using-FFR
- Outage Probability noma
- VOC2012devkit pascal voc2012工具
- STATCOM_PI 采用载波移相和PI控制器的(
- DCcontantvoltage 直流微电网恒压控制
- Outage
- powerquality MATLAB
- hvdc_vsc_4_terminals 技术是当今世界电力
- Staggered-grid-finite-difference 很简单的交
- 布谷鸟的搜索算法
- 计算Mittag-Leffler函数的MATLAB程序
评论
共有 条评论