/// <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()); }
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); }