匈牙利算法
- 算法概述
匈牙利算法是一比较常见的求解指派模型或分配模型的算法。
- 实现步骤
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步。
具体流程图:
- 接口文件
#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)