RMOL Logo  0.25.3
C++ library of Revenue Management and Optimisation classes and functions
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros Pages
Optimiser.cpp
Go to the documentation of this file.
1 // //////////////////////////////////////////////////////////////////////
2 // Import section
3 // //////////////////////////////////////////////////////////////////////
4 // STL
5 #include <cassert>
6 #include <sstream>
7 // StdAir
8 #include <stdair/basic/BasConst_General.hpp>
9 #include <stdair/basic/RandomGeneration.hpp>
10 #include <stdair/bom/BomManager.hpp>
11 #include <stdair/bom/FlightDate.hpp>
12 #include <stdair/bom/LegDate.hpp>
13 #include <stdair/bom/SegmentDate.hpp>
14 #include <stdair/bom/LegCabin.hpp>
15 #include <stdair/bom/SegmentCabin.hpp>
16 #include <stdair/bom/FareFamily.hpp>
17 #include <stdair/bom/BookingClass.hpp>
18 #include <stdair/service/Logger.hpp>
19 // RMOL
20 #include <rmol/bom/MCOptimiser.hpp>
21 #include <rmol/bom/Emsr.hpp>
22 #include <rmol/bom/DPOptimiser.hpp>
24 
25 namespace RMOL {
26 
27  // ////////////////////////////////////////////////////////////////////
28  void Optimiser::
30  stdair::LegCabin& ioLegCabin) {
31  // Retrieve the segment-cabin
32  const stdair::SegmentCabinList_T lSegmentCabinList =
33  stdair::BomManager::getList<stdair::SegmentCabin> (ioLegCabin);
34  stdair::SegmentCabinList_T::const_iterator itSC = lSegmentCabinList.begin();
35  assert (itSC != lSegmentCabinList.end());
36  const stdair::SegmentCabin* lSegmentCabin_ptr = *itSC;
37  assert (lSegmentCabin_ptr != NULL);
38 
39  // Retrieve the class list.
40  const stdair::BookingClassList_T lBookingClassList =
41  stdair::BomManager::getList<stdair::BookingClass> (*lSegmentCabin_ptr);
42  stdair::RandomGeneration lSeedGenerator (stdair::DEFAULT_RANDOM_SEED);
43 
44  // Generate the demand samples for the booking classes.
45  for (stdair::BookingClassList_T::const_iterator itBC =
46  lBookingClassList.begin(); itBC != lBookingClassList.end(); ++itBC) {
47  stdair::RandomSeed_T lRandomSeed =
48  lSeedGenerator.generateUniform01 () * 1e9;
49  stdair::BookingClass* lBookingClass_ptr = *itBC;
50  assert (lBookingClass_ptr != NULL);
51  lBookingClass_ptr->generateDemandSamples (K, lRandomSeed);
52 
53  // DEBUG
54  //STDAIR_LOG_DEBUG ("Generating " << K << " demand samples for the class "
55  // << lBookingClass_ptr->describeKey());
56  }
57 
58  // Call the class performing the actual algorithm
60  }
61 
62  // ////////////////////////////////////////////////////////////////////
63  void Optimiser::optimalOptimisationByDP (stdair::LegCabin& ioLegCabin) {
65  }
66 
67  // ////////////////////////////////////////////////////////////////////
68  void Optimiser::heuristicOptimisationByEmsr (stdair::LegCabin& ioLegCabin) {
70  }
71 
72  // ////////////////////////////////////////////////////////////////////
73  void Optimiser::heuristicOptimisationByEmsrA (stdair::LegCabin& ioLegCabin) {
75  }
76 
77  // ////////////////////////////////////////////////////////////////////
78  void Optimiser::heuristicOptimisationByEmsrB (stdair::LegCabin& ioLegCabin) {
80  }
81 
82  // ////////////////////////////////////////////////////////////////////
83  void Optimiser::optimise (stdair::FlightDate& ioFlightDate) {
84  // Browse the leg-cabin list and build the virtual class list for
85  // each cabin.
86  const stdair::LegDateList_T& lLDList =
87  stdair::BomManager::getList<stdair::LegDate> (ioFlightDate);
88  for (stdair::LegDateList_T::const_iterator itLD = lLDList.begin();
89  itLD != lLDList.end(); ++itLD) {
90  stdair::LegDate* lLD_ptr = *itLD;
91  assert (lLD_ptr != NULL);
92 
93  //
94  const stdair::LegCabinList_T& lLCList =
95  stdair::BomManager::getList<stdair::LegCabin> (*lLD_ptr);
96  for (stdair::LegCabinList_T::const_iterator itLC = lLCList.begin();
97  itLC != lLCList.end(); ++itLC) {
98  stdair::LegCabin* lLC_ptr = *itLC;
99  assert (lLC_ptr != NULL);
100 
101  // Build the virtual class list.
103 
104  // Optimise using Monte-Carlo Integration method.
105  optimalOptimisationByMCIntegration (10000, *lLC_ptr);
106  }
107  }
108  }
109 
110  // ////////////////////////////////////////////////////////////////////
111  void Optimiser::
112  buildVirtualClassListForLegBasedOptimisation (stdair::LegCabin& ioLegCabin) {
113  // The map holding all virtual classes to be created.
114  stdair::VirtualClassMap_T lVirtualClassMap;
115 
116  // Retrieve the segment-cabin
117  const stdair::SegmentCabinList_T lSegmentCabinList =
118  stdair::BomManager::getList<stdair::SegmentCabin> (ioLegCabin);
119  stdair::SegmentCabinList_T::const_iterator itSC = lSegmentCabinList.begin();
120  assert (itSC != lSegmentCabinList.end());
121  const stdair::SegmentCabin* lSegmentCabin_ptr = *itSC;
122  assert (lSegmentCabin_ptr != NULL);
123 
124  // Retrieve the class list.
125  const stdair::BookingClassList_T lBookingClassList =
126  stdair::BomManager::getList<stdair::BookingClass> (*lSegmentCabin_ptr);
127 
128  // Generate the demand samples for the booking classes.
129  for (stdair::BookingClassList_T::const_iterator itBC =
130  lBookingClassList.begin(); itBC != lBookingClassList.end(); ++itBC) {
131  stdair::BookingClass* lBookingClass_ptr = *itBC;
132  assert (lBookingClass_ptr != NULL);
133 
134  const stdair::Yield_T& lYield = lBookingClass_ptr->getYield();
135  stdair::VirtualClassStruct lVirtualClass (*lBookingClass_ptr);
136  lVirtualClass.setYield (lYield);
137  lVirtualClass.setMean (lBookingClass_ptr->getMean());
138  lVirtualClass.setStdDev (lBookingClass_ptr->getStdDev());
139 
140  lVirtualClassMap.insert (stdair::VirtualClassMap_T::
141  value_type (lYield, lVirtualClass));
142  }
143 
144  // Browse the virtual class map from high to low yield.
145  ioLegCabin.emptyVirtualClassList();
146  for (stdair::VirtualClassMap_T::reverse_iterator itVC =
147  lVirtualClassMap.rbegin(); itVC != lVirtualClassMap.rend(); ++itVC) {
148  stdair::VirtualClassStruct& lVC = itVC->second;
149 
150  ioLegCabin.addVirtualClass (lVC);
151  }
152  }
153 
154  // ////////////////////////////////////////////////////////////////////
155  double Optimiser::
156  optimiseUsingOnDForecast (stdair::FlightDate& ioFlightDate,
157  const bool& iReduceFluctuations) {
158  double lMaxBPVariation = 0.0;
159  // Check if the flight date holds a list of leg dates.
160  // If so, retieve it and optimise the cabins.
161  if (stdair::BomManager::hasList<stdair::LegDate> (ioFlightDate)) {
162  STDAIR_LOG_DEBUG ("Optimisation for the flight date: "
163  << ioFlightDate.toString());
164  const stdair::LegDateList_T& lLDList =
165  stdair::BomManager::getList<stdair::LegDate> (ioFlightDate);
166  for (stdair::LegDateList_T::const_iterator itLD = lLDList.begin();
167  itLD != lLDList.end(); ++itLD) {
168  stdair::LegDate* lLD_ptr = *itLD;
169  assert (lLD_ptr != NULL);
170 
171  //
172  const stdair::LegCabinList_T& lLCList =
173  stdair::BomManager::getList<stdair::LegCabin> (*lLD_ptr);
174  for (stdair::LegCabinList_T::const_iterator itLC = lLCList.begin();
175  itLC != lLCList.end(); ++itLC) {
176  stdair::LegCabin* lLC_ptr = *itLC;
177  assert (lLC_ptr != NULL);
179  const stdair::BidPrice_T& lCurrentBidPrice =
180  lLC_ptr->getCurrentBidPrice();
181  const stdair::BidPrice_T& lPreviousBidPrice =
182  lLC_ptr->getPreviousBidPrice();
183  assert (lPreviousBidPrice != 0);
184  const double lBPVariation =
185  std::abs((lCurrentBidPrice - lPreviousBidPrice)/lPreviousBidPrice);
186  lMaxBPVariation = std::max(lMaxBPVariation, lBPVariation);
187  }
188  }
189  }
190  return lMaxBPVariation;
191  }
192 
193 }