public int SampleIntermediateStopDestinations(ISamplingUtilities samplingUtilities) { var sampleItems = new IntermediateStopSampleItem[_sampleSize]; var sampleSize1 = _sampleSize / 2; var sampleSize2 = _sampleSize - sampleSize1; for (var i = 0; i < _sampleSize; i++) { IntermediateStopSampleItem sampleItem; var randomUniform01 = new RandomUniform01(samplingUtilities.SeedValues[i]); int count = 0; // draw repeatedly until a sample item is drawn do { sampleItem = i < sampleSize1 ? GetDestination<IntermediateStopSampleItem>(randomUniform01, _tourOriginParcel, _tourOriginSegmentZone, _tripOriginParcel, _tripOriginSegmentZone) : GetDestination<IntermediateStopSampleItem>(randomUniform01, _tripOriginParcel, _tripOriginSegmentZone, _tourOriginParcel, _tourOriginSegmentZone); if (sampleItem != null) { sampleItems[i] = sampleItem; } count++; } while (sampleItem == null && count < 1000); if (sampleItem == null) return -1; } var sample = new Dictionary<IntermediateStopSampleItem, int>(); foreach (var sampleItem in sampleItems) { // SetAlternative will store the associated alternative for the sample item and calculate the sampling probabilities sampleItem.SetAlternative(this, sample, _chosenParcel != null && _chosenParcel.Id == sampleItem.ParcelId); } if (_choiceProbabilityCalculator.ModelIsInEstimationMode && _chosenParcel != null) { // creates a intermediate stop sample item that represents the chosen alternative var chosenSampleItem = new IntermediateStopSampleItem(); chosenSampleItem.Initialize(this, _chosenParcel.Id, _chosenParcel.Sequence, _chosenSegmentZone); chosenSampleItem.SetAlternative(this, sample, true, AlternativeType.Chosen); } foreach (var sampleItem in sample) { // calculates adjustment factor for each intermediate stop sample item if (sampleItem.Key.Probability1 < Constants.EPSILON && sampleItem.Key.Probability2 < Constants.EPSILON) { sampleItem.Key.Probability1 = 2 * Constants.EPSILON; sampleItem.Key.Probability2 = 2 * Constants.EPSILON; } sampleItem.Key.AdjustmentFactor = -Math.Log((sampleSize1 * sampleItem.Key.Probability1 + sampleSize2 * sampleItem.Key.Probability2) / sampleItem.Value); samplingUtilities.SetUtilities(sampleItem.Key, sampleItem.Value); } return sample.Count; }
private TSampleItem GetDestination <TSampleItem>(RandomUniform01 randomUniform01, IParcel originParcel, SegmentZone originSegmentZone, IParcel excludedParcel, SegmentZone excludedSegmentZone) where TSampleItem : ISampleItem, new() { int destinationZoneId = 0; SegmentZone destinationSegmentZone = null; int destinationParcelSequence = 0; int destinationParcelId = 0; bool destinationParcelIsValid = false; double random = randomUniform01.Uniform01() * originSegmentZone.TotalWeight; if (random > .001) { double total = 0D; // draw the zone foreach (WeightSegmentItem weight in originSegmentZone.RankedWeights) { total += weight.Value; if (total <= random) { continue; } destinationZoneId = weight.Id; destinationSegmentZone = _segmentZones[weight.Id]; break; } } if (destinationSegmentZone != null && destinationSegmentZone.Key == 0) { } if (destinationSegmentZone == null) { destinationZoneId = originParcel.ZoneId; destinationSegmentZone = originSegmentZone; } double excludedSize = 0D; if (Global.Configuration.DestinationScale == Global.Settings.DestinationScales.Parcel) { if (destinationZoneId == originParcel.ZoneId) { excludedSize += originSegmentZone.GetSize(originParcel.Sequence); } if (excludedParcel != null && destinationZoneId == excludedParcel.ZoneId) { excludedSize += excludedSegmentZone.GetSize(excludedParcel.Sequence); } } if (Global.Configuration.DestinationScale == Global.Settings.DestinationScales.Zone) { if (destinationSegmentZone.Key == 0) { } destinationParcelId = destinationSegmentZone.Key; destinationParcelSequence = 0; destinationParcelIsValid = true; } else { // if (destinationSegmentZone.TotalSize - excludedSize < Constants.EPSILON) { // Console.WriteLine(originSegmentZone.Id); // Console.WriteLine(originSegmentZone.TotalWeight); // Console.WriteLine(originSegmentZone.TotalSize); // Console.WriteLine(destinationSegmentZone.Id); // Console.WriteLine(destinationSegmentZone.TotalWeight); // Console.WriteLine(destinationSegmentZone.TotalSize); // Console.WriteLine(excludedSize); // } random = randomUniform01.Uniform01() * (destinationSegmentZone.TotalSize - excludedSize); if (random > .001) { double total = 0D; // draw the parcel within zone foreach (SizeSegmentItem size in destinationSegmentZone.RankedSizes) { if (Global.Configuration.DestinationScale == Global.Settings.DestinationScales.MicroZone || (originParcel.Id != size.Id && (excludedParcel == null || excludedParcel.Id != size.Id))) { total += size.Value; } if (total <= random) { continue; } // don't include the drawn parcel if the parcel has no size if (size.Value >= Global.Configuration.MinParcelSize) { destinationParcelId = size.Id; destinationParcelSequence = size.Sequence; destinationParcelIsValid = true; } break; } } } if (Global.Configuration.DestinationScale != Global.Settings.DestinationScales.Zone && !destinationParcelIsValid) { return(default(TSampleItem)); } TSampleItem sampleItem = new TSampleItem(); sampleItem.Initialize(this, destinationParcelId, destinationParcelSequence, destinationSegmentZone); if (destinationParcelIsValid) { sampleItem.ExcludedSize = excludedSize; } return(sampleItem); }
public Dictionary <TourSampleItem, int> SampleAndReturnTourDestinations(ISamplingUtilities samplingUtilities) { TourSampleItem[] sampleItems = new TourSampleItem[_sampleSize]; for (int i = 0; i < _sampleSize; i++) { TourSampleItem sampleItem; RandomUniform01 randomUniform01 = new RandomUniform01(samplingUtilities.SeedValues[i]); int nullDestinationCounter = 0; // draw repeatedly until a sample item is drawn do { sampleItem = GetDestination <TourSampleItem>(randomUniform01, _originParcel, _originSegmentZone, _excludedParcel, _excludedSegmentZone); if (sampleItem != null) { sampleItems[i] = sampleItem; } else { ++nullDestinationCounter; if ((nullDestinationCounter % NULL_DESTINATION_WARNING) == 0) { OutputDebugForFailedDestination (samplingUtilities, nullDestinationCounter); if (nullDestinationCounter >= NULL_DESTINATION_ERROR) { throw new Exception(OutputDebugForFailedDestination (samplingUtilities, nullDestinationCounter)); } } } //end else got null returned } while (sampleItem == null); } //end loop for _sampleSize Dictionary <TourSampleItem, int> sample = new Dictionary <TourSampleItem, int>(); bool skipChoiceProbabilityCalculator = true; foreach (TourSampleItem sampleItem in sampleItems) { // SetAlternative will store the associated alternative for the sample item and calculate the sampling probabilities sampleItem.SetAlternative(this, sample, _chosenParcel != null && _chosenParcel.Id == sampleItem.ParcelId, AlternativeType.Default, skipChoiceProbabilityCalculator); } //JLB 20120329 // if (_choiceProbabilityCalculator.ModelIsInEstimationMode) { if (_choiceProbabilityCalculator.ModelIsInEstimationMode && _chosenParcel != null) { // creates a tour sample item that represents the chosen alternative if (_usualParcel == null || _usualParcel.Id != _chosenParcel.Id) { TourSampleItem chosenSampleItem = new TourSampleItem(); chosenSampleItem.Initialize(this, _chosenParcel.Id, _chosenParcel.Sequence, _chosenSegmentZone); chosenSampleItem.SetAlternative(this, sample, true, AlternativeType.Chosen, skipChoiceProbabilityCalculator); } else if (_usualParcel.Id == _chosenParcel.Id) { TourSampleItem chosenSampleItem = new TourSampleItem(); chosenSampleItem.Initialize(this, _chosenParcel.Id, _chosenParcel.Sequence, _chosenSegmentZone); chosenSampleItem.SetAlternative(this, sample, true, AlternativeType.Usual, skipChoiceProbabilityCalculator); } if (_usualParcel != null && _usualParcel.Id != _chosenParcel.Id) { TourSampleItem usualSampleItem = new TourSampleItem(); usualSampleItem.Initialize(this, _usualParcel.Id, _usualParcel.Sequence, _usualSegmentZone); usualSampleItem.SetAlternative(this, sample, false, AlternativeType.Usual, skipChoiceProbabilityCalculator); } } else if (_usualParcel != null) { // creates a tour sample item that represents the usual alternative TourSampleItem usualSampleItem = new TourSampleItem(); usualSampleItem.Initialize(this, _usualParcel.Id, _usualParcel.Sequence, _usualSegmentZone); usualSampleItem.SetAlternative(this, sample, false, AlternativeType.Usual, skipChoiceProbabilityCalculator); } foreach (KeyValuePair <TourSampleItem, int> sampleItem in sample) { // calculates adjustment factor for each tour sample item if (sampleItem.Key.Probability >= Constants.EPSILON) { sampleItem.Key.AdjustmentFactor = -Math.Log(_sampleSize * sampleItem.Key.Probability / sampleItem.Value); } //not called in this version //samplingUtilities.SetUtilities(sampleItem.Key, sampleItem.Value); } return(sample); }
public Dictionary <TourSampleItem, int> SampleAndReturnTourDestinations(ISamplingUtilities samplingUtilities) { var sampleItems = new TourSampleItem[_sampleSize]; for (var i = 0; i < _sampleSize; i++) { TourSampleItem sampleItem; var randomUniform01 = new RandomUniform01(samplingUtilities.SeedValues[i]); // draw repeatedly until a sample item is drawn do { sampleItem = GetDestination <TourSampleItem>(randomUniform01, _originParcel, _originSegmentZone, _excludedParcel, _excludedSegmentZone); if (sampleItem != null) { sampleItems[i] = sampleItem; } } while (sampleItem == null); } var sample = new Dictionary <TourSampleItem, int>(); bool skipChoiceProbabilityCalculator = true; foreach (var sampleItem in sampleItems) { // SetAlternative will store the associated alternative for the sample item and calculate the sampling probabilities sampleItem.SetAlternative(this, sample, _chosenParcel != null && _chosenParcel.Id == sampleItem.ParcelId, AlternativeType.Default, skipChoiceProbabilityCalculator); } //JLB 20120329 // if (_choiceProbabilityCalculator.ModelIsInEstimationMode) { if (_choiceProbabilityCalculator.ModelIsInEstimationMode && _chosenParcel != null) { // creates a tour sample item that represents the chosen alternative if (_usualParcel == null || _usualParcel.Id != _chosenParcel.Id) { var chosenSampleItem = new TourSampleItem(); chosenSampleItem.Initialize(this, _chosenParcel.Id, _chosenParcel.Sequence, _chosenSegmentZone); chosenSampleItem.SetAlternative(this, sample, true, AlternativeType.Chosen, skipChoiceProbabilityCalculator); } else if (_usualParcel.Id == _chosenParcel.Id) { var chosenSampleItem = new TourSampleItem(); chosenSampleItem.Initialize(this, _chosenParcel.Id, _chosenParcel.Sequence, _chosenSegmentZone); chosenSampleItem.SetAlternative(this, sample, true, AlternativeType.Usual, skipChoiceProbabilityCalculator); } if (_usualParcel != null && _usualParcel.Id != _chosenParcel.Id) { var usualSampleItem = new TourSampleItem(); usualSampleItem.Initialize(this, _usualParcel.Id, _usualParcel.Sequence, _usualSegmentZone); usualSampleItem.SetAlternative(this, sample, false, AlternativeType.Usual, skipChoiceProbabilityCalculator); } } else if (_usualParcel != null) { // creates a tour sample item that represents the usual alternative var usualSampleItem = new TourSampleItem(); usualSampleItem.Initialize(this, _usualParcel.Id, _usualParcel.Sequence, _usualSegmentZone); usualSampleItem.SetAlternative(this, sample, false, AlternativeType.Usual, skipChoiceProbabilityCalculator); } foreach (var sampleItem in sample) { // calculates adjustment factor for each tour sample item if (sampleItem.Key.Probability >= Constants.EPSILON) { sampleItem.Key.AdjustmentFactor = -Math.Log(_sampleSize * sampleItem.Key.Probability / sampleItem.Value); } //not called in this version //samplingUtilities.SetUtilities(sampleItem.Key, sampleItem.Value); } return(sample); }