Ejemplo n.º 1
0
        /// <summary>
        /// This method tries each variant of possible ambiguous fragment joins. On the first success it returns the variant found.
        /// </summary>
        private List <TravelFragment> tryMultivariantCombining()
        {
            HashSet <TravelFragment> results = new HashSet <TravelFragment>();

            foreach (TravelFragment sourceFragment in _travelFragments)
            {
                // search possible next stop
                IEnumerable <TravelFragment> matchedFragments = _travelFragments.Except(new[] { sourceFragment })
                                                                .Where(item => sourceFragment.EndPoint == item.StartPoint);

                foreach (var possibleNextStop in matchedFragments)
                {
                    // create copies of data
                    // join possible branch and try next level of merging

                    List <TravelFragment> fragmentsCopy        = _travelFragments.Except(new[] { sourceFragment, possibleNextStop }).Select(item => item.Clone() as TravelFragment).ToList();
                    TravelFragment        sourceCopy           = sourceFragment.Clone() as TravelFragment;
                    TravelFragment        possibleNextStopCopy = possibleNextStop.Clone() as TravelFragment;
                    sourceCopy.AddFragmentData(possibleNextStopCopy);

                    fragmentsCopy.Add(sourceCopy);

                    TravelSolution tsVariant = new TravelSolution(fragmentsCopy);
                    tsVariant.Solve();
                    if (tsVariant.Result != null)
                    {
                        results.UnionWith(tsVariant.AllResults);
                    }
                }
            }
            return(results.ToList());
        }
Ejemplo n.º 2
0
        private void combineFragments()
        {
            // combine all simple variants
            bool isDataCombined = false;
            int  processingIdx  = 0;

            do
            {
                isDataCombined = false;
                processingIdx  = 0;

                // cycle over fragments
                while (processingIdx < _travelFragments.Count())
                {
                    TravelFragment sourceFragment = _travelFragments[processingIdx];
                    // search possible next stop
                    List <TravelFragment> matchedFragments = _travelFragments.Except(new[] { sourceFragment })
                                                             .Where(item => sourceFragment.EndPoint == item.StartPoint).ToList();

                    // decise which fragment to add
                    TravelFragment fragmentToAdd = null;

                    // single fragment found - take it
                    if (matchedFragments.Count == 1)
                    {
                        fragmentToAdd = matchedFragments.First();
                    }
                    // different options - take any circle fragment if exists
                    else
                    {
                        fragmentToAdd = matchedFragments.FirstOrDefault(item => item.StartPoint == item.EndPoint);
                    }

                    if (fragmentToAdd != null)
                    {
                        sourceFragment.AddFragmentData(matchedFragments.First());
                        _travelFragments.Remove(matchedFragments.First());
                        isDataCombined = true;
                    }

                    processingIdx++;
                }
            }while (isDataCombined && _travelFragments.Count() > 1);
        }