RMOL Logo  0.25.3
C++ library of Revenue Management and Optimisation classes and functions
Optimiser.cpp
Go to the documentation of this file.
00001 // //////////////////////////////////////////////////////////////////////
00002 // Import section
00003 // //////////////////////////////////////////////////////////////////////
00004 // STL
00005 #include <cassert>
00006 #include <sstream>
00007 // StdAir
00008 #include <stdair/basic/BasConst_General.hpp>
00009 #include <stdair/basic/RandomGeneration.hpp>
00010 #include <stdair/bom/BomManager.hpp>
00011 #include <stdair/bom/FlightDate.hpp>
00012 #include <stdair/bom/LegDate.hpp>
00013 #include <stdair/bom/SegmentDate.hpp>
00014 #include <stdair/bom/LegCabin.hpp>
00015 #include <stdair/bom/SegmentCabin.hpp>
00016 #include <stdair/bom/FareFamily.hpp>
00017 #include <stdair/bom/BookingClass.hpp>
00018 #include <stdair/service/Logger.hpp>
00019 // RMOL
00020 #include <rmol/bom/MCOptimiser.hpp>
00021 #include <rmol/bom/Emsr.hpp>
00022 #include <rmol/bom/DPOptimiser.hpp>
00023 #include <rmol/command/Optimiser.hpp>
00024 
00025 namespace RMOL {
00026 
00027   // ////////////////////////////////////////////////////////////////////
00028   void Optimiser::
00029   optimalOptimisationByMCIntegration (const int K,
00030                                       stdair::LegCabin& ioLegCabin) {
00031     // Retrieve the segment-cabin
00032     const stdair::SegmentCabinList_T lSegmentCabinList =
00033       stdair::BomManager::getList<stdair::SegmentCabin> (ioLegCabin);
00034     stdair::SegmentCabinList_T::const_iterator itSC = lSegmentCabinList.begin();
00035     assert (itSC != lSegmentCabinList.end());
00036     const stdair::SegmentCabin* lSegmentCabin_ptr = *itSC;
00037     assert (lSegmentCabin_ptr != NULL);
00038     
00039     // Retrieve the class list.
00040     const stdair::BookingClassList_T lBookingClassList =
00041       stdair::BomManager::getList<stdair::BookingClass> (*lSegmentCabin_ptr);
00042     stdair::RandomGeneration lSeedGenerator (stdair::DEFAULT_RANDOM_SEED);
00043 
00044     // Generate the demand samples for the booking classes.
00045     for (stdair::BookingClassList_T::const_iterator itBC =
00046            lBookingClassList.begin(); itBC != lBookingClassList.end(); ++itBC) {
00047       stdair::RandomSeed_T lRandomSeed =
00048         lSeedGenerator.generateUniform01 () * 1e9;
00049       stdair::BookingClass* lBookingClass_ptr = *itBC;
00050       assert (lBookingClass_ptr != NULL);
00051       lBookingClass_ptr->generateDemandSamples (K, lRandomSeed);
00052 
00053       // DEBUG
00054       //STDAIR_LOG_DEBUG ("Generating " << K << " demand samples for the class "
00055       //                   << lBookingClass_ptr->describeKey());
00056     }   
00057     
00058     // Call the class performing the actual algorithm
00059     MCOptimiser::optimalOptimisationByMCIntegration (ioLegCabin);
00060   }
00061 
00062   // ////////////////////////////////////////////////////////////////////
00063   void Optimiser::optimalOptimisationByDP (stdair::LegCabin& ioLegCabin) {
00064     DPOptimiser::optimalOptimisationByDP (ioLegCabin);
00065   }
00066 
00067   // ////////////////////////////////////////////////////////////////////
00068   void Optimiser::heuristicOptimisationByEmsr (stdair::LegCabin& ioLegCabin) {
00069     Emsr::heuristicOptimisationByEmsr (ioLegCabin);
00070   }
00071 
00072   // ////////////////////////////////////////////////////////////////////
00073   void Optimiser::heuristicOptimisationByEmsrA (stdair::LegCabin& ioLegCabin) {
00074     Emsr::heuristicOptimisationByEmsrA (ioLegCabin);
00075   }
00076   
00077   // ////////////////////////////////////////////////////////////////////
00078   void Optimiser::heuristicOptimisationByEmsrB (stdair::LegCabin& ioLegCabin) {
00079     Emsr::heuristicOptimisationByEmsrB (ioLegCabin);
00080   }
00081 
00082   // ////////////////////////////////////////////////////////////////////
00083   void Optimiser::optimise (stdair::FlightDate& ioFlightDate) {
00084     // Browse the leg-cabin list and build the virtual class list for
00085     // each cabin.
00086     const stdair::LegDateList_T& lLDList =
00087       stdair::BomManager::getList<stdair::LegDate> (ioFlightDate);
00088     for (stdair::LegDateList_T::const_iterator itLD = lLDList.begin();
00089          itLD != lLDList.end(); ++itLD) {
00090       stdair::LegDate* lLD_ptr = *itLD;
00091       assert (lLD_ptr != NULL);
00092 
00093       //
00094       const stdair::LegCabinList_T& lLCList =
00095         stdair::BomManager::getList<stdair::LegCabin> (*lLD_ptr);
00096       for (stdair::LegCabinList_T::const_iterator itLC = lLCList.begin();
00097            itLC != lLCList.end(); ++itLC) {
00098         stdair::LegCabin* lLC_ptr = *itLC;
00099         assert (lLC_ptr != NULL);
00100 
00101         // Build the virtual class list.
00102         buildVirtualClassListForLegBasedOptimisation (*lLC_ptr);
00103 
00104         // Optimise using Monte-Carlo Integration method.
00105         optimalOptimisationByMCIntegration (10000, *lLC_ptr);
00106       }
00107     }
00108   }
00109 
00110   // ////////////////////////////////////////////////////////////////////
00111   void Optimiser::
00112   buildVirtualClassListForLegBasedOptimisation (stdair::LegCabin& ioLegCabin) {
00113     // The map holding all virtual classes to be created.
00114     stdair::VirtualClassMap_T lVirtualClassMap;
00115     
00116     // Retrieve the segment-cabin
00117     const stdair::SegmentCabinList_T lSegmentCabinList =
00118       stdair::BomManager::getList<stdair::SegmentCabin> (ioLegCabin);
00119     stdair::SegmentCabinList_T::const_iterator itSC = lSegmentCabinList.begin();
00120     assert (itSC != lSegmentCabinList.end());
00121     const stdair::SegmentCabin* lSegmentCabin_ptr = *itSC;
00122     assert (lSegmentCabin_ptr != NULL);
00123     
00124     // Retrieve the class list.
00125     const stdair::BookingClassList_T lBookingClassList =
00126       stdair::BomManager::getList<stdair::BookingClass> (*lSegmentCabin_ptr);
00127 
00128     // Generate the demand samples for the booking classes.
00129     for (stdair::BookingClassList_T::const_iterator itBC =
00130            lBookingClassList.begin(); itBC != lBookingClassList.end(); ++itBC) {
00131       stdair::BookingClass* lBookingClass_ptr = *itBC;
00132       assert (lBookingClass_ptr != NULL);
00133 
00134       const stdair::Yield_T& lYield = lBookingClass_ptr->getYield();
00135       stdair::VirtualClassStruct lVirtualClass (*lBookingClass_ptr);
00136       lVirtualClass.setYield (lYield);
00137       lVirtualClass.setMean (lBookingClass_ptr->getMean());
00138       lVirtualClass.setStdDev (lBookingClass_ptr->getStdDev());
00139 
00140       lVirtualClassMap.insert (stdair::VirtualClassMap_T::
00141                                value_type (lYield, lVirtualClass));
00142     }
00143 
00144     // Browse the virtual class map from high to low yield.
00145     ioLegCabin.emptyVirtualClassList();
00146     for (stdair::VirtualClassMap_T::reverse_iterator itVC =
00147            lVirtualClassMap.rbegin(); itVC != lVirtualClassMap.rend(); ++itVC) {
00148       stdair::VirtualClassStruct& lVC = itVC->second;
00149       
00150       ioLegCabin.addVirtualClass (lVC);
00151     }
00152   }
00153   
00154   // ////////////////////////////////////////////////////////////////////
00155   double Optimiser::
00156   optimiseUsingOnDForecast (stdair::FlightDate& ioFlightDate,
00157                             const bool& iReduceFluctuations) {
00158     double lMaxBPVariation = 0.0;
00159     // Check if the flight date holds a list of leg dates.
00160     // If so, retieve it and optimise the cabins.
00161     if (stdair::BomManager::hasList<stdair::LegDate> (ioFlightDate)) {
00162       STDAIR_LOG_DEBUG ("Optimisation for the flight date: "
00163                         << ioFlightDate.toString());
00164       const stdair::LegDateList_T& lLDList =
00165         stdair::BomManager::getList<stdair::LegDate> (ioFlightDate);
00166       for (stdair::LegDateList_T::const_iterator itLD = lLDList.begin();
00167            itLD != lLDList.end(); ++itLD) {
00168         stdair::LegDate* lLD_ptr = *itLD;
00169         assert (lLD_ptr != NULL);
00170 
00171         //
00172         const stdair::LegCabinList_T& lLCList =
00173           stdair::BomManager::getList<stdair::LegCabin> (*lLD_ptr);
00174         for (stdair::LegCabinList_T::const_iterator itLC = lLCList.begin();
00175              itLC != lLCList.end(); ++itLC) {
00176           stdair::LegCabin* lLC_ptr = *itLC;
00177           assert (lLC_ptr != NULL);
00178           MCOptimiser::optimisationByMCIntegration (*lLC_ptr);
00179           const stdair::BidPrice_T& lCurrentBidPrice =
00180             lLC_ptr->getCurrentBidPrice();
00181           const stdair::BidPrice_T& lPreviousBidPrice =
00182             lLC_ptr->getPreviousBidPrice();
00183           assert (lPreviousBidPrice != 0);
00184           const double lBPVariation =
00185             std::abs((lCurrentBidPrice - lPreviousBidPrice)/lPreviousBidPrice);
00186           lMaxBPVariation = std::max(lMaxBPVariation, lBPVariation);
00187         }
00188       }
00189     }
00190     return lMaxBPVariation;
00191   }
00192 
00193 }
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines