Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }