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 }
Generated on Sun Jun 14 23:33:59 2009 for RMOL by Doxygen 1.5.8