Beispiel #1
0
            //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);
                //}
            }
Beispiel #2
0
            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);
                }
            }