//private int invalidCombinationResults = 0; private void BruteForceSearch(List <ISolverWrapper> searchSeq, int n, HashSet <StructurePosition> strOut, HashSet <TextPosition> txtOut, Dictionary <StructurePosition, TextPosition> result, double sumDist) { ISolverWrapper w = searchSeq[n]; List <Relation> priorityList = w.RelationsPriority; bool possiblePairFound = false; int i = 0; //перебрать все конкурирующие варианты, //если допустимая пара не найдена, то все оставшиеся //до тех пор пока допустимая пара не будет найдена while ( //( i < w.CompCount //+ invalidCombinationResults && i < priorityList.Count) || (!possiblePairFound && i < priorityList.Count ) ) { Relation relation = priorityList[i]; StructurePosition str = relation.StructurePosition; TextPosition txt = relation.TextPosition; if (!txtOut.Contains(txt) && !strOut.Contains(str)) { possiblePairFound = true; HashSet <StructurePosition> strOutNextStep = new HashSet <StructurePosition>(strOut); HashSet <TextPosition> txtOutNextStep = new HashSet <TextPosition>(txtOut); Dictionary <StructurePosition, TextPosition> resultNextStep = new Dictionary <StructurePosition, TextPosition>(result); strOutNextStep.Add(str); txtOutNextStep.Add(txt); resultNextStep.Add(str, txt); double sumDistNextStep = sumDist + relation.Distance; if (n != searchSeq.Count - 1) { BruteForceSearch(searchSeq, n + 1, strOutNextStep, txtOutNextStep, resultNextStep, sumDistNextStep); } else { CheckCandidateResult(resultNextStep, sumDistNextStep); } } i++; } //if (!possiblePairFound) //{ // //данный проход завершен // CheckCandidateResult(result, sumDist); //} }
private void BruteForceSearch(List <ISolverWrapper> searchSeq, int n, HashSet <NetworkEdge> edgesOut, HashSet <TextPosition> txtOut, HashSet <int> txtContentOut, Dictionary <NetworkEdge, TextPosition> result, double sumDist) { //NetworkEdgeWrapper newr = searchSeq[n]; ISolverWrapper w = searchSeq[n]; List <Relation> priorityList = w.RelationsPriority; bool possiblePairFound = false; int i = 0; //перебрать все конкурирующие варианты, //если допустимая пара не найдена, то все оставшиеся //до тех пор пока допустимая пара не будет найдена while ((i < w.CompCount + invalidNumberCombinationResults && i < priorityList.Count) ||//если какие-то варианты были отбракованы из-за неправильного сочетания цифр, то прибавлять их количество к CompCount (!possiblePairFound && i < priorityList.Count)) { Relation relation = priorityList[i]; NetworkEdge edge = relation.NetworkEdge; TextPosition txt = relation.TextPosition; int txtContent = Convert.ToInt32(txt.TextContent.Trim()); if (!txtOut.Contains(txt) && //не допускать один и тот же текст !txtContentOut.Contains(txtContent) &&//не допускать 2 одинаковые цифры !edgesOut.Contains(edge) //не допускать повторение ребер ) { possiblePairFound = true; HashSet <NetworkEdge> edgesOutNextStep = new HashSet <NetworkEdge>(edgesOut); HashSet <TextPosition> txtOutNextStep = new HashSet <TextPosition>(txtOut); HashSet <int> txtContentOutNextStep = new HashSet <int>(txtContentOut); Dictionary <NetworkEdge, TextPosition> resultNextStep = new Dictionary <NetworkEdge, TextPosition>(result); edgesOutNextStep.Add(edge); txtOutNextStep.Add(txt); txtContentOutNextStep.Add(txtContent); resultNextStep.Add(edge, txt); double sumDistNextStep = sumDist + relation.Distance; if (n != searchSeq.Count - 1) { BruteForceSearch(searchSeq, n + 1, edgesOutNextStep, txtOutNextStep, txtContentOutNextStep, resultNextStep, sumDistNextStep); } else { CheckCandidateResult(resultNextStep, sumDistNextStep); } } i++; } if (!possiblePairFound) { //данный проход завершен CheckCandidateResult(result, sumDist); } }