RMOL Logo Get Revenue Management Optimisation Library at SourceForge.net. Fast, secure and Free Open Source software downloads

EmsrUtils.cpp

Go to the documentation of this file.
00001 // //////////////////////////////////////////////////////////////////////
00002 // Import section
00003 // //////////////////////////////////////////////////////////////////////
00004 // GSL Random Number Generation (GSL Reference Manual, version 1.7, Chapter 19)
00005 #include <gsl/gsl_cdf.h>
00006 // C
00007 #include <math.h>
00008 #include <assert.h>
00009 // RMOL
00010 #include <rmol/bom/EmsrUtils.hpp>
00011 #include <rmol/bom/Bucket.hpp>
00012 
00013 namespace RMOL {
00014   // ////////////////////////////////////////////////////////////////////
00015   void EmsrUtils::computeAggregatedBucket (Bucket& ioAggregatedBucket,
00016                                               Bucket& ioCurrentBucket) {
00017     // Retrieve the demand mean, demand standard deviation and average
00018     // yield of the classes/buckets.
00019     const double lAggregatedMean = ioAggregatedBucket.getMean();
00020     const double lCurrentMean = ioCurrentBucket.getMean();
00021     const double lAggregatedSD = ioAggregatedBucket.getStandardDeviation();
00022     const double lCurrentSD = ioCurrentBucket.getStandardDeviation();
00023     const double lAggregatedAverageYield = ioAggregatedBucket.getAverageYield();
00024     const double lCurrentAverageYield = ioCurrentBucket.getAverageYield();
00025 
00026     // Compute the new demand mean, new demand standard deviation and
00027     // new average yield for the new aggregated class/bucket.
00028     const double lNewMean = lAggregatedMean + lCurrentMean;
00029     const double lNewSD =
00030       sqrt(lAggregatedSD*lAggregatedSD + lCurrentSD*lCurrentSD);
00031     double lNewAverageYield = lCurrentAverageYield;
00032     if (lNewMean > 0) {
00033       lNewAverageYield = (lAggregatedAverageYield*lAggregatedMean +
00034                           lCurrentAverageYield*lCurrentMean)/lNewMean;
00035     } 
00036     // Set the new yield range for the new aggregated class/bucket.
00037     ioAggregatedBucket.setYieldRange(lNewAverageYield);
00038 
00039     // Set the new demand for the new aggregated class/bucket.
00040     ioAggregatedBucket.setDemandParameters (lNewMean, lNewSD);
00041   }
00042 
00043   // ////////////////////////////////////////////////////////////////////
00044   const double EmsrUtils::computeProtectionLevel (Bucket& ioAggregatedBucket,
00045                                                   Bucket& ioNextBucket) {
00046     // Retrive the mean & standard deviation of the aggregated
00047     // class/bucket and the average yield of all the two
00048     // classes/buckets.
00049     const double lMean = ioAggregatedBucket.getMean();
00050     const double lSD = ioAggregatedBucket.getStandardDeviation();
00051     const double lAggreatedYield = ioAggregatedBucket.getAverageYield();
00052     const double lNextYield = ioNextBucket.getAverageYield();
00053     assert (lAggreatedYield != 0);
00054     
00055     // Compute the protection for the aggregated class/bucket
00056     const double lProtection = 
00057       lMean + gsl_cdf_gaussian_Qinv (lNextYield/lAggreatedYield, lSD);
00058     
00059     return lProtection;
00060   }
00061 
00062   // ////////////////////////////////////////////////////////////////////
00063   const double EmsrUtils::computeEmsrValue (double iCapacity, Bucket& ioBucket) {
00064     // Retrive the average yield, mean and standard deviation of the
00065     // demand of the class/bucket.
00066     const double lMean = ioBucket.getMean();
00067     const double lSD = ioBucket.getStandardDeviation();
00068     const double lYield = ioBucket.getAverageYield();
00069 
00070     // Compute the EMSR value = lYield * Pr (demand >= iCapacity).
00071     const double emsrValue = lYield * gsl_cdf_gaussian_Q(iCapacity-lMean, lSD);
00072 
00073     return emsrValue;
00074   }
00075 }
SourceForge Logo

Generated on Tue Apr 14 17:57:51 2009 for RMOL by Doxygen 1.5.8