匈牙利算法的实现

本人在项目中,使用匈牙利算法,寻找最佳(损失最小)的完美匹配。即N匹配N。

参考以下了解匈牙利算法:

运筹学教学 | 十分钟教你求解分配问题(assignment problem) - 知乎

匈牙利解_百度百科

匈牙利算法详解-CSDN博客

有一个python的实现:

https://python.plainenglish.io/hungarian-algorithm-introduction-python-implementation-93e7c0890e15

按照常规的算法逻辑实现,遇到的问题是:寻找不到完美匹配,但是覆盖所有0的横竖线的条数总和已达到了输入方阵的阶数N。

问题出在:在进行“指派”的时候,方案有很多种,一般来说,先指派0最少的行,输入矩阵的每一行可以理解成一个工人做不同任务的时间,每一列则是每一项任务,不同工人来做需要的时间。遵循选择多的“礼让”选择少的的原则,先指派0最少的行,再指派0多的行,我们将此指派策略为策略A;

但是这样指派的话,并不是最大的指派,也就是说,可能存在能够指派更多工人的指派。而且,如果这时候寻找到的覆盖所有0的横竖线等于方阵阶数N的时候,算法就停滞了,因为没办法增加0了(整个矩阵都被横竖线划掉了,不存在未被覆盖的元素)。我想的办法是,当按照“优先指派0少的行”进行指派,得不到完美匹配的时候,穷举所有的指派(当然,可以提前结束穷举,当指派的行数跟策略A有增加的时候可提前结束穷举指派的情况),然后再往下走。

穷举所有的指派,代码上用了递归,思路大概是:当前一行确定了指派某个0的时候,递归对下一行进行指派,最后一行指派完之后,当前这一次指派就结束了,存到数组里。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值