匈牙利算法实现步骤

6 篇文章 0 订阅
6 篇文章 0 订阅

匈牙利算法

  1. 算法概述

匈牙利算法是一比较常见的求解指派模型或分配模型的算法。

  1. 实现步骤

1). 统计每行中最小元素;

2). 每行所有元素减去最小元素;

3). 根据条件不同行不同列,查询每行中是否有满足的0(统计每行都有一个满足条件的0,对应位置就是分配信息);

4). 判断每行中都有一个统计到的0信息;

5). 检索到没有符合条件的行ColIndex;

6). 检索行ColIndex中0(第一个)的位置RowIndex;

7). 根据检索列RowIndex中0的统计RowIndexs;

8). 统计RowIndexs行中最小的值fMinValue(排除0);

9). 将RowIndexs对应的行减去最小值fMinValue(RowIndex需要减去,其余列排除0);

10). 将RowIndex列加上fMinValue;

11). 转到第3步。

具体流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ORhDDRej-1593659710109)(media/a531dbffd7105326640cc17b60c06f55.png)]

  1. 接口文件
#pragma once
class CHungarianArith
{
public:
 CHungarianArith();
 ~CHungarianArith();
public:
 //对Mat每一行减去减去最小值
 void  SubRowsMinValue( cv::Mat & src ,cv::Mat & dest );
 //检索每行中检索的0统计:满足条件TRUE
 BOOL  AlyConditionsColsZeroToLeft(cv::Mat  & src, std::vector<BOOL> & vecMark,std::vector<int> & EventPos);
 //检索每行中检索的0统计:满足条件TRUE
 BOOL  AlyConditionsColsZeroToRight(cv::Mat  & src, std::vector<BOOL> & vecMark, std::vector<int> & EventPos);
 //检索Mat中最小值
 float FindMinValue(cv::Mat & src);
 //检索行中0的位置
 int   FindColZeroPos(cv::Mat & src, int  iRowIndex);
 //检索列中0的统计
 BOOL  FindRowZeroCount(cv::Mat & src, int iColIndex, std::vector<int> & outRows);
 //统计出去RowZeroIndexs对应行中(踢去0列)中最小值
 float FindRowZerosNoColIndexMinValue(cv::Mat  & src, int  ColIndex, std::vector<int> & RowIndexs);
 //根据统计情况,迭代处理Mat(+-最小值)
 void  IterationMat(cv::Mat & src, std::vector<BOOL> & vecMark);
    //在上述列中统计出0的行上减去最小值
 void  SubMinValueInRowsCountZero(cv::Mat & src,float  fMinValue ,int  iColIndex, std::vector<int> & InRows);
    //在0的列上加上最小值
 void  AddMinValueInColIndexZero(cv::Mat & src, float  fMinValue, int  ColIndex);
    //统计最优值
 float CountlastValue(cv::Mat  & src, std::vector<int> &Index);
public:
 //分析最优结果
 float   AlyRes(cv::Mat  & src, std::vector<int> &Index);
 //模拟数据
 cv::Mat InitData();
};```

[4.  源文件](https://download.csdn.net/download/qq_31401483/12569481)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值