匈牙利算法解决指派问题

匈牙利算法主要用于解决指派问题,确保在n项任务与n个人之间找到最佳匹配,以达到总耗时最少的目标。算法通过调整效率矩阵,确保出现独立零元素,并通过圈零法和最少直线覆盖策略寻找最优解。算法步骤包括矩阵变换、行检验、列检验、最少直线覆盖和进一步交换,直至找到最优指派方案。
摘要由CSDN通过智能技术生成

匈牙利算法解决指派问题

  • 指派问题背景介绍
  • 算法原理
  • 算法实现

指派问题背景介绍

在实践中经常会遇到这样一种问题:有n项不同的工作或任务,需要n个人去完成,要求每人只完成一项工作。由于每人的知识、能力、经验等不同,故各人完成不同任务所需要的时间不同。问应指派何人完成何项工作,使完成n项工作总耗时最少
这就是所谓的指派问题,指派问题也是整数规划问题

算法原理

定理1
设指派问题的效率矩阵为 ,若将该矩阵的某一行或列的各元素都减去同一个常数t,得到新的效率矩阵 ,则以C’为效率矩阵的新指派问题与原指派问题的最优解相同,但其最优值比原最优值减少t

定理2
若将指派问题的效率矩阵每一行及每一列分别减去各行及各列的最小元素,则得到的新指派问题与原指派问题有相同的最优解

  • 将效率矩阵的每一行减去各行最小元素,所得矩阵的每一列再减去当前列中最小元素,最后的新效率矩阵C’中必然会出现一些零元素
  • 元素 =0表示第i个人去干第j项工作效率最好,或表示第j项工作由第i个人来干效率最高

定理3
效率矩阵C中独立零元素的最多个数等于能覆盖所有零元素的最小直线数

定义1
在效率矩阵C中,有一组处在不同行不同列的零元素,称为独立零元素组,此时其中每个元素称为独立零元素

算法实现

Step 1

变化效率矩阵,将各行各列都减去当前各行各列最小元素

function [P_cond,stepnum] = step1(M)

  size = length(M);
  for i = 1:size
    row_min = min(M(i,:));
    M(i,:) = M(i,:)-row_min;
  end
  stepnum = 2;

Step 2
用圈零法求出新矩阵C1中独立零元素

  • 进行行检验
    对C1进行逐行检查,每行只有一个未标记的零元素时,用O记号将该元素圈起,然后将被圈起的零元素所在列的其他未标记的零元素用记号×划去
    重复行检验,直到每一行都没有未被标记的零元素或至少有两个未被标记的零元素为止
  • 进行列检验,与进行行检验类似
function [r_cov,c_cov,C,stepnum] = step2(M)

% Define variables
  size = length(M);
  r_cov = zeros(size,1);  % 显示是否覆盖行的向量
  c_cov = zeros(size,1);  % 显示是否覆盖列的向量
  C = zeros(size);        %显示一个位置是O还是×
  
  for i = 1:size
    for j = 1:size
      if M(i,j) == 0 && r_cov(i) ==
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值