00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOIBMOLS_H_
00014 #define MOEOIBMOLS_H_
00015
00016 #include <math.h>
00017 #include <eoContinue.h>
00018 #include <eoEvalFunc.h>
00019 #include <eoPop.h>
00020 #include <moMove.h>
00021 #include <moMoveInit.h>
00022 #include <moNextMove.h>
00023 #include <algo/moeoLS.h>
00024 #include <archive/moeoArchive.h>
00025 #include <fitness/moeoBinaryIndicatorBasedFitnessAssignment.h>
00026 #include <move/moeoMoveIncrEval.h>
00027
00032 template < class MOEOT, class Move >
00033 class moeoIBMOLS : public moeoLS < MOEOT, eoPop < MOEOT > & >
00034 {
00035 public:
00036
00038 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00039
00040
00050 moeoIBMOLS(
00051 moMoveInit < Move > & _moveInit,
00052 moNextMove < Move > & _nextMove,
00053 eoEvalFunc < MOEOT > & _eval,
00054 moeoMoveIncrEval < Move > & _moveIncrEval,
00055 moeoBinaryIndicatorBasedFitnessAssignment < MOEOT > & _fitnessAssignment,
00056 eoContinue < MOEOT > & _continuator
00057 ) :
00058 moveInit(_moveInit),
00059 nextMove(_nextMove),
00060 eval(_eval),
00061 moveIncrEval(_moveIncrEval),
00062 fitnessAssignment (_fitnessAssignment),
00063 continuator (_continuator)
00064 {}
00065
00066
00073 void operator() (eoPop < MOEOT > & _pop, moeoArchive < MOEOT > & _arch)
00074 {
00075
00076
00077
00078
00079
00080
00081
00082
00083 fitnessAssignment(_pop);
00084
00085 moeoArchive < MOEOT > archive;
00086
00087 moeoArchive < MOEOT > previousArchive;
00088
00089 archive.update(_pop);
00090 do
00091 {
00092 previousArchive.update(archive);
00093 oneStep(_pop);
00094 archive.update(_pop);
00095 } while ( (! archive.equals(previousArchive)) && (continuator(_arch)) );
00096 _arch.update(archive);
00097 }
00098
00099
00100 private:
00101
00103 moMoveInit < Move > & moveInit;
00105 moNextMove < Move > & nextMove;
00107 eoEvalFunc < MOEOT > & eval;
00109 moeoMoveIncrEval < Move > & moveIncrEval;
00111 moeoBinaryIndicatorBasedFitnessAssignment < MOEOT > & fitnessAssignment;
00113 eoContinue < MOEOT > & continuator;
00114
00115
00120 void oneStep (eoPop < MOEOT > & _pop)
00121 {
00122
00123 Move move;
00124
00125 ObjectiveVector x_objVec;
00126 double x_fitness;
00127
00128 int worst_idx;
00129 ObjectiveVector worst_objVec;
00130 double worst_fitness;
00132
00133 int ext_0_idx, ext_1_idx;
00134 ObjectiveVector ext_0_objVec, ext_1_objVec;
00135 unsigned int ind;
00137
00138 unsigned int i=0;
00139
00140 moveInit(move, _pop[i]);
00141 while (i<_pop.size() && continuator(_pop))
00142 {
00143
00144
00145 x_objVec = moveIncrEval(move, _pop[i]);
00146
00147 x_fitness = fitnessAssignment.updateByAdding(_pop, x_objVec);
00148
00152
00153 ext_0_idx = -1;
00154 ext_0_objVec = x_objVec;
00155 ext_1_idx = -1;
00156 ext_1_objVec = x_objVec;
00157 for (unsigned int k=0; k<_pop.size(); k++)
00158 {
00159
00160 if (_pop[k].objectiveVector()[0] < ext_0_objVec[0])
00161 {
00162 ext_0_idx = k;
00163 ext_0_objVec = _pop[k].objectiveVector();
00164 }
00165 else if ( (_pop[k].objectiveVector()[0] == ext_0_objVec[0]) && (_pop[k].objectiveVector()[1] < ext_0_objVec[1]) )
00166 {
00167 ext_0_idx = k;
00168 ext_0_objVec = _pop[k].objectiveVector();
00169 }
00170
00171 else if (_pop[k].objectiveVector()[1] < ext_1_objVec[1])
00172 {
00173 ext_1_idx = k;
00174 ext_1_objVec = _pop[k].objectiveVector();
00175 }
00176 else if ( (_pop[k].objectiveVector()[1] == ext_1_objVec[1]) && (_pop[k].objectiveVector()[0] < ext_1_objVec[0]) )
00177 {
00178 ext_1_idx = k;
00179 ext_1_objVec = _pop[k].objectiveVector();
00180 }
00181 }
00182
00183 if (ext_0_idx == -1)
00184 {
00185 ind = 0;
00186 while (ind == ext_1_idx)
00187 {
00188 ind++;
00189 }
00190 worst_idx = ind;
00191 worst_objVec = _pop[ind].objectiveVector();
00192 worst_fitness = _pop[ind].fitness();
00193 }
00194 else if (ext_1_idx == -1)
00195 {
00196 ind = 0;
00197 while (ind == ext_0_idx)
00198 {
00199 ind++;
00200 }
00201 worst_idx = ind;
00202 worst_objVec = _pop[ind].objectiveVector();
00203 worst_fitness = _pop[ind].fitness();
00204 }
00205 else
00206 {
00207 worst_idx = -1;
00208 worst_objVec = x_objVec;
00209 worst_fitness = x_fitness;
00210 }
00214
00215
00216 for (unsigned int j=0; j<_pop.size(); j++)
00217 {
00218 if ( (j!=ext_0_idx) && (j!=ext_1_idx) )
00219 {
00220 if (_pop[j].fitness() < worst_fitness)
00221 {
00222 worst_idx = j;
00223 worst_objVec = _pop[j].objectiveVector();
00224 worst_fitness = _pop[j].fitness();
00225 }
00226 }
00227 }
00228
00229 if (worst_idx == -1)
00230 {
00231
00232
00233 if (! nextMove(move, _pop[i]))
00234 {
00235 i++;
00236 if (i<_pop.size())
00237 {
00238
00239 moveInit(move, _pop[i]);
00240 }
00241 }
00242 }
00243
00244 else if (worst_idx <= i)
00245 {
00246
00247 _pop[worst_idx] = _pop[i];
00248 move(_pop[worst_idx]);
00249 _pop[worst_idx].objectiveVector(x_objVec);
00250 _pop[worst_idx].fitness(x_fitness);
00251
00252 i++;
00253 if (i<_pop.size())
00254 {
00255
00256 moveInit(move, _pop[i]);
00257 }
00258 }
00259
00260 else if (worst_idx > i)
00261 {
00262
00263 _pop[worst_idx] = _pop[i+1];
00264 _pop[i+1] = _pop[i];
00265 move(_pop[i+1]);
00266 _pop[i+1].objectiveVector(x_objVec);
00267 _pop[i+1].fitness(x_fitness);
00268
00269 i += 2;
00270 if (i<_pop.size())
00271 {
00272
00273 moveInit(move, _pop[i]);
00274 }
00275 }
00276
00277 fitnessAssignment.updateByDeleting(_pop, worst_objVec);
00278 }
00279 }
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00304 void new_oneStep (eoPop < MOEOT > & _pop)
00305 {
00306
00307 Move move;
00308
00309 ObjectiveVector x_objVec;
00310 double x_fitness;
00311
00312 int worst_idx;
00313 ObjectiveVector worst_objVec;
00314 double worst_fitness;
00316
00317 int ext_0_idx, ext_1_idx;
00318 unsigned int ind;
00320
00321 unsigned int i=0;
00322
00323 moveInit(move, _pop[i]);
00324 while (i<_pop.size() && continuator(_pop))
00325 {
00326
00327
00328 x_objVec = moveIncrEval(move, _pop[i]);
00329
00330 x_fitness = fitnessAssignment.updateByAdding(_pop, x_objVec);
00331
00335
00336 OneObjectiveComparator comp0(0);
00337 ext_0_idx = std::min_element(_pop.begin(), _pop.end(), comp0) - _pop.begin();
00338 OneObjectiveComparator comp1(1);
00339 ext_1_idx = std::min_element(_pop.begin(), _pop.end(), comp1) - _pop.begin();
00340
00341 if (x_objVec[0] < _pop[ext_0_idx].objectiveVector()[0])
00342 {
00343 ext_0_idx = -1;
00344 }
00345 else if ( (x_objVec[0] == _pop[ext_0_idx].objectiveVector()[0]) && (x_objVec[1] < _pop[ext_0_idx].objectiveVector()[1]) )
00346 {
00347 ext_0_idx = -1;
00348 }
00349 else if (x_objVec[1] < _pop[ext_1_idx].objectiveVector()[1])
00350 {
00351 ext_1_idx = -1;
00352 }
00353 else if ( (x_objVec[1] == _pop[ext_1_idx].objectiveVector()[1]) && (x_objVec[0] < _pop[ext_1_idx].objectiveVector()[0]) )
00354 {
00355 ext_1_idx = -1;
00356 }
00357
00358 if (ext_0_idx == -1)
00359 {
00360 ind = 0;
00361 while (ind == ext_1_idx)
00362 {
00363 ind++;
00364 }
00365 worst_idx = ind;
00366 worst_objVec = _pop[ind].objectiveVector();
00367 worst_fitness = _pop[ind].fitness();
00368 }
00369 else if (ext_1_idx == -1)
00370 {
00371 ind = 0;
00372 while (ind == ext_0_idx)
00373 {
00374 ind++;
00375 }
00376 worst_idx = ind;
00377 worst_objVec = _pop[ind].objectiveVector();
00378 worst_fitness = _pop[ind].fitness();
00379 }
00380 else
00381 {
00382 worst_idx = -1;
00383 worst_objVec = x_objVec;
00384 worst_fitness = x_fitness;
00385 }
00389
00390
00391 for (unsigned int j=0; j<_pop.size(); j++)
00392 {
00393 if ( (j!=ext_0_idx) && (j!=ext_1_idx) )
00394 {
00395 if (_pop[j].fitness() < worst_fitness)
00396 {
00397 worst_idx = j;
00398 worst_objVec = _pop[j].objectiveVector();
00399 worst_fitness = _pop[j].fitness();
00400 }
00401 }
00402 }
00403
00404 if (worst_idx == -1)
00405 {
00406
00407
00408 if (! nextMove(move, _pop[i]))
00409 {
00410 i++;
00411 if (i<_pop.size())
00412 {
00413
00414 moveInit(move, _pop[i]);
00415 }
00416 }
00417 }
00418
00419 else if (worst_idx <= i)
00420 {
00421
00422 _pop[worst_idx] = _pop[i];
00423 move(_pop[worst_idx]);
00424 _pop[worst_idx].objectiveVector(x_objVec);
00425 _pop[worst_idx].fitness(x_fitness);
00426
00427 i++;
00428 if (i<_pop.size())
00429 {
00430
00431 moveInit(move, _pop[i]);
00432 }
00433 }
00434
00435 else if (worst_idx > i)
00436 {
00437
00438 _pop[worst_idx] = _pop[i+1];
00439 _pop[i+1] = _pop[i];
00440 move(_pop[i+1]);
00441 _pop[i+1].objectiveVector(x_objVec);
00442 _pop[i+1].fitness(x_fitness);
00443
00444 i += 2;
00445 if (i<_pop.size())
00446 {
00447
00448 moveInit(move, _pop[i]);
00449 }
00450 }
00451
00452 fitnessAssignment.updateByDeleting(_pop, worst_objVec);
00453 }
00454 }
00455
00456
00457
00458
00459
00460
00462 class OneObjectiveComparator : public moeoComparator < MOEOT >
00463 {
00464 public:
00465 OneObjectiveComparator(unsigned int _obj) : obj(_obj)
00466 {
00467 if (obj > MOEOT::ObjectiveVector::nObjectives())
00468 {
00469 throw std::runtime_error("Problem with the index of objective in OneObjectiveComparator");
00470 }
00471 }
00472 const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
00473 {
00474 if (_moeo1.objectiveVector()[obj] < _moeo2.objectiveVector()[obj])
00475 {
00476 return true;
00477 }
00478 else
00479 {
00480 return (_moeo1.objectiveVector()[obj] == _moeo2.objectiveVector()[obj]) && (_moeo1.objectiveVector()[(obj+1)%2] < _moeo2.objectiveVector()[(obj+1)%2]);
00481 }
00482 }
00483 private:
00484 unsigned int obj;
00485 };
00487
00488
00489
00490
00491 };
00492
00493 #endif