匈牙利算法是一比较常见的求解指派模型或分配模型的算法。
实现步骤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)