private void BruteForceMapping(int jlmIndex, HashSet <int> txtOut, HashSet <int> txtOut2, Dictionary <JunctionLabelMapping, int> mapping, double sumDist) { JunctionLabelMapping jlm = mappingsToSolve[jlmIndex]; bool possiblePairFound = false; for (int i = 0; i < jlm.CompatitorMappingsCount && i < jlm.MappingPriorityList.Count; i++) { possiblePairFound = CheckLabelRelation(jlmIndex, txtOut, txtOut2, mapping, sumDist, jlm, i); } if (!possiblePairFound) { needReverseBruteForceSearch = true;//выполнить поиск сочетаний в обратном порядке //проверить оставшиеся варианты если есть пока не найдется возможная пара for (int i = jlm.CompatitorMappingsCount; i < jlm.MappingPriorityList.Count; i++) { possiblePairFound = CheckLabelRelation(jlmIndex, txtOut, txtOut2, mapping, sumDist, jlm, i); if (possiblePairFound) { break; } } } if (!possiblePairFound) { //текстов меньше чем присодинений if (jlmIndex != mappingsToSolve.Count - 1) { //тем не менее перейти к следующему присоединению если это не последнее BruteForceMapping(jlmIndex + 1, txtOut, txtOut2, mapping, sumDist); } else { //завершить проход если это последнее if (CheckCandidateMapping(mapping, sumDist)) { mappingResult = mapping; mappingDistance = sumDist; } } } }
private bool CheckLabelRelation(int jlmIndex, HashSet <int> txtOut, HashSet <int> txtOut2, Dictionary <JunctionLabelMapping, int> mapping, double sumDist, JunctionLabelMapping jlm, int i) { bool possiblePairFound = false; JunctionLabelMapping.LabelRelation lr = jlm.MappingPriorityList[i]; int currLrHashCode = lr.GetHashCode(); int currLrContent = Convert.ToInt32(lr.TextPosition.TextContent.Trim()); if (!txtOut.Contains(currLrHashCode) && //не допускать один и тот же текст !txtOut2.Contains(currLrContent)) //не допускать 2 одинаковые цифры { possiblePairFound = true; Dictionary <JunctionLabelMapping, int> mappingNextStep = new Dictionary <JunctionLabelMapping, int>(mapping); HashSet <int> txtOutNextStep = new HashSet <int>(txtOut); HashSet <int> txtOut2NextStep = new HashSet <int>(txtOut2); double sumDistNextStep = sumDist + lr.Distance /* + lr.DistanceToNode*/; txtOutNextStep.Add(currLrHashCode); txtOut2NextStep.Add(currLrContent); mappingNextStep.Add(jlm, i); if (jlmIndex != mappingsToSolve.Count - 1) { //переход к следующему отрезку BruteForceMapping(jlmIndex + 1, txtOutNextStep, txtOut2NextStep, mappingNextStep, sumDistNextStep); } else { //это последний отрезок в этом проходе if (CheckCandidateMapping(mappingNextStep, sumDistNextStep)) { mappingResult = mappingNextStep; mappingDistance = sumDistNextStep; } } } return(possiblePairFound); }