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 MAKE_EA_MOEO_H_
00039 #define MAKE_EA_MOEO_H_
00040
00041 #include <stdlib.h>
00042 #include <eoContinue.h>
00043 #include <eoEvalFunc.h>
00044 #include <eoGeneralBreeder.h>
00045 #include <eoGenOp.h>
00046 #include <utils/eoParser.h>
00047 #include <utils/eoState.h>
00048
00049 #include <algo/moeoEA.h>
00050 #include <algo/moeoEasyEA.h>
00051 #include <archive/moeoArchive.h>
00052 #include <comparator/moeoAggregativeComparator.h>
00053 #include <comparator/moeoComparator.h>
00054 #include <comparator/moeoDiversityThenFitnessComparator.h>
00055 #include <comparator/moeoFitnessThenDiversityComparator.h>
00056 #include <diversity/moeoDiversityAssignment.h>
00057 #include <diversity/moeoDummyDiversityAssignment.h>
00058 #include <diversity/moeoFrontByFrontCrowdingDiversityAssignment.h>
00059 #include <diversity/moeoFrontByFrontSharingDiversityAssignment.h>
00060 #include <fitness/moeoDummyFitnessAssignment.h>
00061 #include <fitness/moeoExpBinaryIndicatorBasedFitnessAssignment.h>
00062 #include <fitness/moeoFastNonDominatedSortingFitnessAssignment.h>
00063 #include <fitness/moeoFitnessAssignment.h>
00064 #include <metric/moeoAdditiveEpsilonBinaryMetric.h>
00065 #include <metric/moeoHypervolumeBinaryMetric.h>
00066 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
00067 #include <replacement/moeoElitistReplacement.h>
00068 #include <replacement/moeoEnvironmentalReplacement.h>
00069 #include <replacement/moeoGenerationalReplacement.h>
00070 #include <replacement/moeoReplacement.h>
00071 #include <selection/moeoDetTournamentSelect.h>
00072 #include <selection/moeoRandomSelect.h>
00073 #include <selection/moeoStochTournamentSelect.h>
00074 #include <selection/moeoSelectOne.h>
00075 #include <selection/moeoSelectors.h>
00076
00077
00087 template < class MOEOT >
00088 moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalFunc < MOEOT > & _eval, eoContinue < MOEOT > & _continue, eoGenOp < MOEOT > & _op, moeoArchive < MOEOT > & _archive)
00089 {
00090
00091
00092 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00093
00094
00095
00096 std::string & fitnessParam = _parser.createParam(std::string("FastNonDominatedSorting"), "fitness",
00097 "Fitness assignment scheme: Dummy, FastNonDominatedSorting or IndicatorBased", 'F',
00098 "Evolution Engine").value();
00099 std::string & indicatorParam = _parser.createParam(std::string("Epsilon"), "indicator",
00100 "Binary indicator for IndicatorBased: Epsilon, Hypervolume", 'i',
00101 "Evolution Engine").value();
00102 double rho = _parser.createParam(1.1, "rho", "reference point for the hypervolume indicator", 'r',
00103 "Evolution Engine").value();
00104 double kappa = _parser.createParam(0.05, "kappa", "Scaling factor kappa for IndicatorBased", 'k',
00105 "Evolution Engine").value();
00106 moeoFitnessAssignment < MOEOT > * fitnessAssignment;
00107 if (fitnessParam == std::string("Dummy"))
00108 {
00109 fitnessAssignment = new moeoDummyFitnessAssignment < MOEOT> ();
00110 }
00111 else if (fitnessParam == std::string("FastNonDominatedSorting"))
00112 {
00113 fitnessAssignment = new moeoFastNonDominatedSortingFitnessAssignment < MOEOT> ();
00114 }
00115 else if (fitnessParam == std::string("IndicatorBased"))
00116 {
00117
00118 moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > *metric;
00119 if (indicatorParam == std::string("Epsilon"))
00120 {
00121 metric = new moeoAdditiveEpsilonBinaryMetric < ObjectiveVector >;
00122 }
00123 else if (indicatorParam == std::string("Hypervolume"))
00124 {
00125 metric = new moeoHypervolumeBinaryMetric < ObjectiveVector > (rho);
00126 }
00127 else
00128 {
00129 std::string stmp = std::string("Invalid binary quality indicator: ") + indicatorParam;
00130 throw std::runtime_error(stmp.c_str());
00131 }
00132 fitnessAssignment = new moeoExpBinaryIndicatorBasedFitnessAssignment < MOEOT > (*metric, kappa);
00133 }
00134 else
00135 {
00136 std::string stmp = std::string("Invalid fitness assignment strategy: ") + fitnessParam;
00137 throw std::runtime_error(stmp.c_str());
00138 }
00139 _state.storeFunctor(fitnessAssignment);
00140
00141
00142
00143 eoValueParam<eoParamParamType> & diversityParam = _parser.createParam(eoParamParamType("Dummy"), "diversity",
00144 "Diversity assignment scheme: Dummy, Sharing(nicheSize) or Crowding", 'D', "Evolution Engine");
00145 eoParamParamType & diversityParamValue = diversityParam.value();
00146 moeoDiversityAssignment < MOEOT > * diversityAssignment;
00147 if (diversityParamValue.first == std::string("Dummy"))
00148 {
00149 diversityAssignment = new moeoDummyDiversityAssignment < MOEOT> ();
00150 }
00151 else if (diversityParamValue.first == std::string("Sharing"))
00152 {
00153 double nicheSize;
00154 if (!diversityParamValue.second.size())
00155 {
00156 std::cerr << "WARNING, no niche size given for Sharing, using 0.5" << std::endl;
00157 nicheSize = 0.5;
00158 diversityParamValue.second.push_back(std::string("0.5"));
00159 }
00160 else
00161 {
00162 nicheSize = atoi(diversityParamValue.second[0].c_str());
00163 }
00164 diversityAssignment = new moeoFrontByFrontSharingDiversityAssignment < MOEOT> (nicheSize);
00165 }
00166 else if (diversityParamValue.first == std::string("Crowding"))
00167 {
00168 diversityAssignment = new moeoFrontByFrontCrowdingDiversityAssignment < MOEOT> ();
00169 }
00170 else
00171 {
00172 std::string stmp = std::string("Invalid diversity assignment strategy: ") + diversityParamValue.first;
00173 throw std::runtime_error(stmp.c_str());
00174 }
00175 _state.storeFunctor(diversityAssignment);
00176
00177
00178
00179 std::string & comparatorParam = _parser.createParam(std::string("FitnessThenDiversity"), "comparator",
00180 "Comparator scheme: FitnessThenDiversity, DiversityThenFitness or Aggregative", 'C', "Evolution Engine").value();
00181 moeoComparator < MOEOT > * comparator;
00182 if (comparatorParam == std::string("FitnessThenDiversity"))
00183 {
00184 comparator = new moeoFitnessThenDiversityComparator < MOEOT> ();
00185 }
00186 else if (comparatorParam == std::string("DiversityThenFitness"))
00187 {
00188 comparator = new moeoDiversityThenFitnessComparator < MOEOT> ();
00189 }
00190 else if (comparatorParam == std::string("Aggregative"))
00191 {
00192 comparator = new moeoAggregativeComparator < MOEOT> ();
00193 }
00194 else
00195 {
00196 std::string stmp = std::string("Invalid comparator strategy: ") + comparatorParam;
00197 throw std::runtime_error(stmp.c_str());
00198 }
00199 _state.storeFunctor(comparator);
00200
00201
00202
00203 eoValueParam < eoParamParamType > & selectionParam = _parser.createParam(eoParamParamType("DetTour(2)"), "selection",
00204 "Selection scheme: DetTour(T), StochTour(t) or Random", 'S', "Evolution Engine");
00205 eoParamParamType & ppSelect = selectionParam.value();
00206 moeoSelectOne < MOEOT > * select;
00207 if (ppSelect.first == std::string("DetTour"))
00208 {
00209 unsigned int tSize;
00210 if (!ppSelect.second.size())
00211 {
00212 std::cerr << "WARNING, no parameter passed to DetTour, using 2" << std::endl;
00213 tSize = 2;
00214
00215 ppSelect.second.push_back(std::string("2"));
00216 }
00217 else
00218 {
00219 tSize = atoi(ppSelect.second[0].c_str());
00220 }
00221 select = new moeoDetTournamentSelect < MOEOT > (*comparator, tSize);
00222 }
00223 else if (ppSelect.first == std::string("StochTour"))
00224 {
00225 double tRate;
00226 if (!ppSelect.second.size())
00227 {
00228 std::cerr << "WARNING, no parameter passed to StochTour, using 1" << std::endl;
00229 tRate = 1;
00230
00231 ppSelect.second.push_back(std::string("1"));
00232 }
00233 else
00234 {
00235 tRate = atof(ppSelect.second[0].c_str());
00236 }
00237 select = new moeoStochTournamentSelect < MOEOT > (*comparator, tRate);
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 else if (ppSelect.first == std::string("Random"))
00247 {
00248 select = new moeoRandomSelect <MOEOT > ();
00249 }
00250 else
00251 {
00252 std::string stmp = std::string("Invalid selection strategy: ") + ppSelect.first;
00253 throw std::runtime_error(stmp.c_str());
00254 }
00255 _state.storeFunctor(select);
00256
00257
00258
00259 std::string & replacementParam = _parser.createParam(std::string("Elitist"), "replacement",
00260 "Replacement scheme: Elitist, Environmental or Generational", 'R', "Evolution Engine").value();
00261 moeoReplacement < MOEOT > * replace;
00262 if (replacementParam == std::string("Elitist"))
00263 {
00264 replace = new moeoElitistReplacement < MOEOT> (*fitnessAssignment, *diversityAssignment, *comparator);
00265 }
00266 else if (replacementParam == std::string("Environmental"))
00267 {
00268 replace = new moeoEnvironmentalReplacement < MOEOT> (*fitnessAssignment, *diversityAssignment, *comparator);
00269 }
00270 else if (replacementParam == std::string("Generational"))
00271 {
00272 replace = new moeoGenerationalReplacement < MOEOT> ();
00273 }
00274 else
00275 {
00276 std::string stmp = std::string("Invalid replacement strategy: ") + replacementParam;
00277 throw std::runtime_error(stmp.c_str());
00278 }
00279 _state.storeFunctor(replace);
00280
00281
00282
00283 eoValueParam < eoHowMany > & offspringRateParam = _parser.createParam(eoHowMany(1.0), "nbOffspring",
00284 "Number of offspring (percentage or absolute)", 'O', "Evolution Engine");
00285
00286
00287
00288 eoGeneralBreeder < MOEOT > * breed = new eoGeneralBreeder < MOEOT > (*select, _op, offspringRateParam.value());
00289 _state.storeFunctor(breed);
00290
00291 moeoEA < MOEOT > * algo = new moeoEasyEA < MOEOT > (_continue, _eval, *breed, *replace, *fitnessAssignment, *diversityAssignment);
00292 _state.storeFunctor(algo);
00293 return *algo;
00294
00295 }
00296
00297 #endif