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

MCOptimiser.cpp

Go to the documentation of this file.
00001 // //////////////////////////////////////////////////////////////////////
00002 // Import section
00003 // //////////////////////////////////////////////////////////////////////
00004 // C
00005 #include <assert.h>
00006 // STL
00007 #include <iostream>
00008 #include <cmath>
00009 // RMOL
00010 #include <rmol/bom/VariateList.hpp>
00011 #include <rmol/bom/Gaussian.hpp>
00012 #include <rmol/bom/Bucket.hpp>
00013 #include <rmol/bom/BucketHolder.hpp>
00014 #include <rmol/bom/PartialSumHolder.hpp>
00015 #include <rmol/bom/PartialSumHolderHolder.hpp>
00016 //#include <rmol/bom/Resource.hpp>
00017 #include <rmol/bom/MCOptimiser.hpp>
00018 
00019 namespace RMOL {
00020 
00021   // //////////////////////////////////////////////////////////////////////
00022   void MCOptimiser::
00023   optimalOptimisationByMCIntegration(const int K, 
00024                                      const ResourceCapacity_T iCabinCapacity,
00025                                      BucketHolder& ioBucketHolder,
00026                                      PartialSumHolderHolder& ioPSHolderHolder){
00027     // Retrieve the BucketHolder
00028     // BucketHolder& ioBucketHolder = ioResource.getBucketHolder();
00029 
00030     // Number of classes/buckets: n
00031     const short nbOfClasses = ioBucketHolder.getSize();
00032 
00040     ioPSHolderHolder.begin();
00041     PartialSumHolder& firstPartialSumHolder = 
00042       ioPSHolderHolder.getCurrentPartialSumHolder();
00043     firstPartialSumHolder.initSize (K);
00044 
00045     for (int k=1 ; k <= K; k++) {
00046       firstPartialSumHolder.addPartialSum (0.0);
00047     }
00048 
00054     ioBucketHolder.begin();
00055     ioPSHolderHolder.iterate();
00056     int Kj = K;
00057     int lj = 0;
00058     for (short j=1 ; j <= nbOfClasses - 1; 
00059          j++, ioBucketHolder.iterate(), ioPSHolderHolder.iterate()) {
00061       Bucket& currentBucket = ioBucketHolder.getCurrentBucket();
00062       Bucket& nextBucket = ioBucketHolder.getNextBucket();
00063 
00064       // STEP 1.
00069       const FldDistributionParameters& aDistribParams = 
00070         currentBucket.getDistributionParameters();
00071       const Gaussian gaussianDemandGenerator (aDistribParams);
00072 
00083       VariateList_T aVariateList;
00084 
00085       PartialSumHolder& previousPartialSumList = 
00086         ioPSHolderHolder.getPreviousPartialSumHolder();
00087       PartialSumHolder& currentPartialSumList = 
00088         ioPSHolderHolder.getCurrentPartialSumHolder();
00089       currentPartialSumList.initSize (Kj);
00090       for (int k=1; k <= Kj; k++) {
00091         const double djk = gaussianDemandGenerator.generateVariate();
00092         aVariateList.push_back (djk);
00093 
00103         const double spjm1lpk = 
00104           previousPartialSumList.getPartialSum (lj + k - 1);
00105         const double sjk = spjm1lpk + djk;
00106         currentPartialSumList.addPartialSum (sjk);
00107 
00108         /* DEBUG
00109            std::cout << "d(" << j << ", " << k << "); " << djk 
00110            << "; S'(" << j-1 << ", " << lj+k << "); " << spjm1lpk
00111            << "; S(" << j << ", " << k << "); " << sjk << std::endl;
00112         */
00113       }
00114 
00115       // STEP 2.
00119       currentPartialSumList.sort ();
00120 
00122       const double pj = currentBucket.getAverageYield();
00123       const double pj1 = nextBucket.getAverageYield();
00124 
00127       assert (pj > pj1);
00128 
00133       const double ljdouble = std::floor (Kj * (pj - pj1) / pj);
00134       lj = static_cast<int> (ljdouble);
00135 
00143       assert (lj >= 1 && lj < Kj);
00144 
00146       Kj = Kj - lj;
00147 
00152       const double sjl = currentPartialSumList.getPartialSum (lj - 1);
00153       const double sjlp1 = currentPartialSumList.getPartialSum (lj + 1 - 1);
00154       const double yj = (sjl + sjlp1) / 2;
00155 
00161       // Set the cumulated protection for Bucket(j) (j ranging from 1 to n-1)
00162       currentBucket.setCumulatedProtection (yj);
00163 
00167     }
00168 
00169     // Set the protection of Bucket(n) to be equal to the capacity
00170     Bucket& currentBucket = ioBucketHolder.getCurrentBucket();
00171     currentBucket.setCumulatedProtection (iCabinCapacity);
00172 
00177     ioBucketHolder.recalculate ();
00178   }
00179 
00180 }
SourceForge Logo

Generated on Fri Sep 11 06:31:59 2009 for RMOL by Doxygen 1.5.8