00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef _MOEOEASYEA_H
00039 #define _MOEOEASYEA_H
00040
00041 #include <apply.h>
00042 #include <eoBreed.h>
00043 #include <eoContinue.h>
00044 #include <eoMergeReduce.h>
00045 #include <eoPopEvalFunc.h>
00046 #include <eoSelect.h>
00047 #include <eoTransform.h>
00048 #include <algo/moeoEA.h>
00049 #include <diversity/moeoDiversityAssignment.h>
00050 #include <diversity/moeoDummyDiversityAssignment.h>
00051 #include <fitness/moeoFitnessAssignment.h>
00052 #include <replacement/moeoReplacement.h>
00053
00057 template < class MOEOT >
00058 class moeoEasyEA: public moeoEA < MOEOT >
00059 {
00060 public:
00061
00072 moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace,
00073 moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
00074 :
00075 continuator(_continuator), eval (_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
00076 fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
00077 {}
00078
00079
00090 moeoEasyEA(eoContinue < MOEOT > & _continuator, eoPopEvalFunc < MOEOT > & _popEval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace,
00091 moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
00092 :
00093 continuator(_continuator), eval (dummyEval), loopEval(dummyEval), popEval(_popEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
00094 fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
00095 {}
00096
00097
00109 moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce,
00110 moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
00111 :
00112 continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(_merge,_reduce), replace(mergeReduce),
00113 fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
00114 {}
00115
00116
00128 moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, moeoReplacement < MOEOT > & _replace,
00129 moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
00130 :
00131 continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
00132 fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
00133 {}
00134
00135
00148 moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce,
00149 moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
00150 :
00151 continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(_merge,_reduce), replace(mergeReduce),
00152 fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
00153 {}
00154
00155
00160 virtual void operator()(eoPop < MOEOT > & _pop)
00161 {
00162 eoPop < MOEOT > offspring, empty_pop;
00163 popEval(empty_pop, _pop);
00164 bool firstTime = true;
00165 do
00166 {
00167 try
00168 {
00169 unsigned int pSize = _pop.size();
00170 offspring.clear();
00171
00172 if (evalFitAndDivBeforeSelection || firstTime)
00173 {
00174 firstTime = false;
00175 fitnessEval(_pop);
00176 diversityEval(_pop);
00177 }
00178 breed(_pop, offspring);
00179 popEval(_pop, offspring);
00180 replace(_pop, offspring);
00181 if (pSize > _pop.size())
00182 {
00183 throw std::runtime_error("Population shrinking!");
00184 }
00185 else if (pSize < _pop.size())
00186 {
00187 throw std::runtime_error("Population growing!");
00188 }
00189 }
00190 catch (std::exception& e)
00191 {
00192 std::string s = e.what();
00193 s.append( " in moeoEasyEA");
00194 throw std::runtime_error( s );
00195 }
00196 } while (continuator(_pop));
00197 }
00198
00199
00200 protected:
00201
00203 eoContinue < MOEOT > & continuator;
00205 eoEvalFunc < MOEOT > & eval;
00207 eoPopLoopEval < MOEOT > loopEval;
00209 eoPopEvalFunc < MOEOT > & popEval;
00211 eoSelectTransform < MOEOT > selectTransform;
00213 eoBreed < MOEOT > & breed;
00215 eoMergeReduce < MOEOT > mergeReduce;
00217 moeoReplacement < MOEOT > & replace;
00219 moeoFitnessAssignment < MOEOT > & fitnessEval;
00221 moeoDiversityAssignment < MOEOT > & diversityEval;
00223 bool evalFitAndDivBeforeSelection;
00225 class eoDummyEval : public eoEvalFunc < MOEOT >
00226 { public:
00227 void operator()(MOEOT &) {}} dummyEval;
00229 class eoDummySelect : public eoSelect < MOEOT >
00230 { public:
00231 void operator()(const eoPop < MOEOT > &, eoPop < MOEOT > &) {} } dummySelect;
00233 class eoDummyTransform : public eoTransform < MOEOT >
00234 { public:
00235 void operator()(eoPop < MOEOT > &) {} } dummyTransform;
00237 eoNoElitism < MOEOT > dummyMerge;
00239 eoTruncate < MOEOT > dummyReduce;
00240
00241 };
00242
00243 #endif