From 8b7d5260fbd206e22bba163f500c8e2ed8c7f4c5 Mon Sep 17 00:00:00 2001 From: liefooga Date: Tue, 26 Jun 2007 13:28:59 +0000 Subject: [PATCH] merge ParadisEO-MOEO v-1.0 git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@400 331e1502-861f-0410-8da2-ba01fb791d7f --- trunk/paradiseo-moeo/Makefile.am | 11 +- trunk/paradiseo-moeo/NEWS | 4 + trunk/paradiseo-moeo/README | 4 +- trunk/paradiseo-moeo/configure.in | 10 +- trunk/paradiseo-moeo/doc/Makefile.am | 5 + .../doc/html/MOEO_8h-source.html | 230 +++++++ trunk/paradiseo-moeo/doc/html/annotated.html | 115 ++++ .../doc/html/classMOEO-members.html | 86 +++ trunk/paradiseo-moeo/doc/html/classMOEO.html | 388 ++++++++++++ trunk/paradiseo-moeo/doc/html/classMOEO.png | Bin 0 -> 4369 bytes trunk/paradiseo-moeo/doc/html/classes.html | 56 ++ ...oAchievementFitnessAssignment-members.html | 51 ++ ...classmoeoAchievementFitnessAssignment.html | 344 ++++++++++ .../classmoeoAchievementFitnessAssignment.png | Bin 0 -> 1898 bytes ...eoAdditiveEpsilonBinaryMetric-members.html | 47 ++ .../classmoeoAdditiveEpsilonBinaryMetric.html | 171 +++++ .../classmoeoAdditiveEpsilonBinaryMetric.png | Bin 0 -> 2698 bytes ...lassmoeoAggregativeComparator-members.html | 44 ++ .../html/classmoeoAggregativeComparator.html | 162 +++++ .../html/classmoeoAggregativeComparator.png | Bin 0 -> 1050 bytes .../doc/html/classmoeoAlgo.html | 61 ++ .../paradiseo-moeo/doc/html/classmoeoAlgo.png | Bin 0 -> 1962 bytes .../doc/html/classmoeoArchive-members.html | 80 +++ .../doc/html/classmoeoArchive.html | 324 ++++++++++ .../doc/html/classmoeoArchive.png | Bin 0 -> 1084 bytes ...eObjectiveVectorSavingUpdater-members.html | 49 ++ ...eoArchiveObjectiveVectorSavingUpdater.html | 145 +++++ ...oeoArchiveObjectiveVectorSavingUpdater.png | Bin 0 -> 1285 bytes .../html/classmoeoArchiveUpdater-members.html | 46 ++ .../doc/html/classmoeoArchiveUpdater.html | 119 ++++ .../doc/html/classmoeoArchiveUpdater.png | Bin 0 -> 799 bytes .../html/classmoeoBinaryMetric-members.html | 40 ++ .../doc/html/classmoeoBinaryMetric.html | 71 +++ .../doc/html/classmoeoBinaryMetric.png | Bin 0 -> 5892 bytes ...moeoBinaryMetricSavingUpdater-members.html | 51 ++ .../classmoeoBinaryMetricSavingUpdater.html | 148 +++++ .../classmoeoBinaryMetricSavingUpdater.png | Bin 0 -> 1154 bytes .../doc/html/classmoeoBitVector-members.html | 86 +++ .../doc/html/classmoeoBitVector.html | 182 ++++++ .../doc/html/classmoeoBitVector.png | Bin 0 -> 2539 bytes .../doc/html/classmoeoCombinedLS-members.html | 43 ++ .../doc/html/classmoeoCombinedLS.html | 190 ++++++ .../doc/html/classmoeoCombinedLS.png | Bin 0 -> 1797 bytes .../doc/html/classmoeoComparator-members.html | 40 ++ .../doc/html/classmoeoComparator.html | 64 ++ .../doc/html/classmoeoComparator.png | Bin 0 -> 3417 bytes .../classmoeoContributionMetric-members.html | 45 ++ .../doc/html/classmoeoContributionMetric.html | 262 ++++++++ .../doc/html/classmoeoContributionMetric.png | Bin 0 -> 2274 bytes ...oConvertPopToObjectiveVectors-members.html | 41 ++ ...classmoeoConvertPopToObjectiveVectors.html | 95 +++ .../classmoeoConvertPopToObjectiveVectors.png | Bin 0 -> 1170 bytes ...iterionBasedFitnessAssignment-members.html | 43 ++ ...ssmoeoCriterionBasedFitnessAssignment.html | 60 ++ ...assmoeoCriterionBasedFitnessAssignment.png | Bin 0 -> 1503 bytes ...ngDistanceDiversityAssignment-members.html | 46 ++ ...eoCrowdingDistanceDiversityAssignment.html | 204 ++++++ ...oeoCrowdingDistanceDiversityAssignment.png | Bin 0 -> 2318 bytes .../classmoeoDetTournamentSelect-members.html | 47 ++ .../html/classmoeoDetTournamentSelect.html | 196 ++++++ .../doc/html/classmoeoDetTournamentSelect.png | Bin 0 -> 1070 bytes .../doc/html/classmoeoDistance-members.html | 43 ++ .../doc/html/classmoeoDistance.html | 197 ++++++ .../doc/html/classmoeoDistance.png | Bin 0 -> 1238 bytes .../html/classmoeoDistanceMatrix-members.html | 42 ++ .../doc/html/classmoeoDistanceMatrix.html | 149 +++++ .../doc/html/classmoeoDistanceMatrix.png | Bin 0 -> 889 bytes .../classmoeoDiversityAssignment-members.html | 43 ++ .../html/classmoeoDiversityAssignment.html | 163 +++++ .../doc/html/classmoeoDiversityAssignment.png | Bin 0 -> 3792 bytes ...iversityThenFitnessComparator-members.html | 41 ++ ...assmoeoDiversityThenFitnessComparator.html | 106 ++++ ...lassmoeoDiversityThenFitnessComparator.png | Bin 0 -> 1406 bytes ...smoeoDummyDiversityAssignment-members.html | 43 ++ .../classmoeoDummyDiversityAssignment.html | 149 +++++ .../classmoeoDummyDiversityAssignment.png | Bin 0 -> 1273 bytes ...assmoeoDummyFitnessAssignment-members.html | 43 ++ .../html/classmoeoDummyFitnessAssignment.html | 149 +++++ .../html/classmoeoDummyFitnessAssignment.png | Bin 0 -> 1225 bytes .../doc/html/classmoeoEA-members.html | 40 ++ .../paradiseo-moeo/doc/html/classmoeoEA.html | 65 ++ trunk/paradiseo-moeo/doc/html/classmoeoEA.png | Bin 0 -> 2158 bytes .../doc/html/classmoeoEasyEA-members.html | 62 ++ .../doc/html/classmoeoEasyEA.html | 599 ++++++++++++++++++ .../doc/html/classmoeoEasyEA.png | Bin 0 -> 1292 bytes ...lassmoeoEasyEA_1_1eoDummyEval-members.html | 43 ++ .../html/classmoeoEasyEA_1_1eoDummyEval.html | 67 ++ .../html/classmoeoEasyEA_1_1eoDummyEval.png | Bin 0 -> 979 bytes ...ssmoeoEasyEA_1_1eoDummySelect-members.html | 41 ++ .../classmoeoEasyEA_1_1eoDummySelect.html | 67 ++ .../html/classmoeoEasyEA_1_1eoDummySelect.png | Bin 0 -> 1019 bytes ...oeoEasyEA_1_1eoDummyTransform-members.html | 41 ++ .../classmoeoEasyEA_1_1eoDummyTransform.html | 67 ++ .../classmoeoEasyEA_1_1eoDummyTransform.png | Bin 0 -> 1125 bytes .../classmoeoElitistReplacement-members.html | 50 ++ .../doc/html/classmoeoElitistReplacement.html | 310 +++++++++ .../doc/html/classmoeoElitistReplacement.png | Bin 0 -> 1073 bytes ...moeoElitistReplacement_1_1Cmp-members.html | 39 ++ .../classmoeoElitistReplacement_1_1Cmp.html | 100 +++ .../html/classmoeoEntropyMetric-members.html | 50 ++ .../doc/html/classmoeoEntropyMetric.html | 303 +++++++++ .../doc/html/classmoeoEntropyMetric.png | Bin 0 -> 2280 bytes ...smoeoEnvironmentalReplacement-members.html | 51 ++ .../classmoeoEnvironmentalReplacement.html | 315 +++++++++ .../classmoeoEnvironmentalReplacement.png | Bin 0 -> 1438 bytes ...vironmentalReplacement_1_1Cmp-members.html | 39 ++ ...ssmoeoEnvironmentalReplacement_1_1Cmp.html | 100 +++ .../classmoeoEuclideanDistance-members.html | 48 ++ .../doc/html/classmoeoEuclideanDistance.html | 116 ++++ .../doc/html/classmoeoEuclideanDistance.png | Bin 0 -> 1292 bytes .../doc/html/classmoeoEvalFunc-members.html | 42 ++ .../doc/html/classmoeoEvalFunc.html | 55 ++ .../doc/html/classmoeoEvalFunc.png | Bin 0 -> 847 bytes ...natedSortingFitnessAssignment-members.html | 51 ++ ...tNonDominatedSortingFitnessAssignment.html | 325 ++++++++++ ...stNonDominatedSortingFitnessAssignment.png | Bin 0 -> 1684 bytes ...gnment_1_1ObjectiveComparator-members.html | 42 ++ ...nessAssignment_1_1ObjectiveComparator.html | 114 ++++ ...tnessAssignment_1_1ObjectiveComparator.png | Bin 0 -> 1663 bytes .../classmoeoFitnessAssignment-members.html | 43 ++ .../doc/html/classmoeoFitnessAssignment.html | 165 +++++ .../doc/html/classmoeoFitnessAssignment.png | Bin 0 -> 3839 bytes ...itnessThenDiversityComparator-members.html | 41 ++ ...assmoeoFitnessThenDiversityComparator.html | 106 ++++ ...lassmoeoFitnessThenDiversityComparator.png | Bin 0 -> 1402 bytes ...ngDistanceDiversityAssignment-members.html | 47 ++ ...ntCrowdingDistanceDiversityAssignment.html | 200 ++++++ ...ontCrowdingDistanceDiversityAssignment.png | Bin 0 -> 2259 bytes ...ontSharingDiversityAssignment-members.html | 53 ++ ...rontByFrontSharingDiversityAssignment.html | 248 ++++++++ ...FrontByFrontSharingDiversityAssignment.png | Bin 0 -> 1895 bytes ...anceObjectiveVectorComparator-members.html | 45 ++ ...eoGDominanceObjectiveVectorComparator.html | 194 ++++++ ...oeoGDominanceObjectiveVectorComparator.png | Bin 0 -> 1559 bytes ...ssmoeoGenerationalReplacement-members.html | 42 ++ .../classmoeoGenerationalReplacement.html | 113 ++++ .../html/classmoeoGenerationalReplacement.png | Bin 0 -> 2064 bytes .../doc/html/classmoeoHybridLS-members.html | 48 ++ .../doc/html/classmoeoHybridLS.html | 141 +++++ .../doc/html/classmoeoHybridLS.png | Bin 0 -> 750 bytes ...ssmoeoHypervolumeBinaryMetric-members.html | 50 ++ .../classmoeoHypervolumeBinaryMetric.html | 225 +++++++ .../html/classmoeoHypervolumeBinaryMetric.png | Bin 0 -> 2681 bytes .../doc/html/classmoeoIBEA-members.html | 57 ++ .../doc/html/classmoeoIBEA.html | 498 +++++++++++++++ .../paradiseo-moeo/doc/html/classmoeoIBEA.png | Bin 0 -> 1377 bytes ...dicatorBasedFitnessAssignment-members.html | 52 ++ ...ssmoeoIndicatorBasedFitnessAssignment.html | 414 ++++++++++++ ...assmoeoIndicatorBasedFitnessAssignment.png | Bin 0 -> 1500 bytes .../doc/html/classmoeoLS-members.html | 40 ++ .../paradiseo-moeo/doc/html/classmoeoLS.html | 63 ++ trunk/paradiseo-moeo/doc/html/classmoeoLS.png | Bin 0 -> 1810 bytes .../classmoeoManhattanDistance-members.html | 48 ++ .../doc/html/classmoeoManhattanDistance.html | 116 ++++ .../doc/html/classmoeoManhattanDistance.png | Bin 0 -> 1294 bytes .../doc/html/classmoeoMetric-members.html | 37 ++ .../doc/html/classmoeoMetric.html | 63 ++ .../doc/html/classmoeoMetric.png | Bin 0 -> 6647 bytes .../doc/html/classmoeoNSGA-members.html | 56 ++ .../doc/html/classmoeoNSGA.html | 457 +++++++++++++ .../paradiseo-moeo/doc/html/classmoeoNSGA.png | Bin 0 -> 1449 bytes .../doc/html/classmoeoNSGAII-members.html | 56 ++ .../doc/html/classmoeoNSGAII.html | 422 ++++++++++++ .../doc/html/classmoeoNSGAII.png | Bin 0 -> 1286 bytes .../classmoeoNormalizedDistance-members.html | 47 ++ .../doc/html/classmoeoNormalizedDistance.html | 220 +++++++ .../doc/html/classmoeoNormalizedDistance.png | Bin 0 -> 1213 bytes ...olutionVsSolutionBinaryMetric-members.html | 45 ++ ...malizedSolutionVsSolutionBinaryMetric.html | 178 ++++++ ...rmalizedSolutionVsSolutionBinaryMetric.png | Bin 0 -> 2692 bytes ...tiveObjectiveVectorComparator-members.html | 41 ++ ...oeoObjectiveObjectiveVectorComparator.html | 106 ++++ ...moeoObjectiveObjectiveVectorComparator.png | Bin 0 -> 1308 bytes .../classmoeoObjectiveVector-members.html | 44 ++ .../doc/html/classmoeoObjectiveVector.html | 222 +++++++ ...moeoObjectiveVectorComparator-members.html | 40 ++ .../classmoeoObjectiveVectorComparator.html | 64 ++ .../classmoeoObjectiveVectorComparator.png | Bin 0 -> 2533 bytes ...lassmoeoObjectiveVectorDouble-members.html | 53 ++ .../html/classmoeoObjectiveVectorDouble.html | 351 ++++++++++ .../html/classmoeoObjectiveVectorDouble.png | Bin 0 -> 902 bytes ...lassmoeoObjectiveVectorTraits-members.html | 43 ++ .../html/classmoeoObjectiveVectorTraits.html | 183 ++++++ ...assmoeoOneObjectiveComparator-members.html | 43 ++ .../html/classmoeoOneObjectiveComparator.html | 150 +++++ .../html/classmoeoOneObjectiveComparator.png | Bin 0 -> 1066 bytes ...oParetoBasedFitnessAssignment-members.html | 43 ++ ...classmoeoParetoBasedFitnessAssignment.html | 61 ++ .../classmoeoParetoBasedFitnessAssignment.png | Bin 0 -> 1875 bytes ...retoObjectiveVectorComparator-members.html | 41 ++ ...ssmoeoParetoObjectiveVectorComparator.html | 106 ++++ ...assmoeoParetoObjectiveVectorComparator.png | Bin 0 -> 1501 bytes .../html/classmoeoRandomSelect-members.html | 45 ++ .../doc/html/classmoeoRandomSelect.html | 74 +++ .../doc/html/classmoeoRandomSelect.png | Bin 0 -> 1901 bytes .../doc/html/classmoeoRealVector-members.html | 86 +++ .../doc/html/classmoeoRealVector.html | 109 ++++ .../doc/html/classmoeoRealVector.png | Bin 0 -> 2896 bytes .../html/classmoeoReplacement-members.html | 40 ++ .../doc/html/classmoeoReplacement.html | 63 ++ .../doc/html/classmoeoReplacement.png | Bin 0 -> 2429 bytes .../html/classmoeoRouletteSelect-members.html | 44 ++ .../doc/html/classmoeoRouletteSelect.html | 144 +++++ .../doc/html/classmoeoRouletteSelect.png | Bin 0 -> 1009 bytes ...ssmoeoScalarFitnessAssignment-members.html | 43 ++ .../classmoeoScalarFitnessAssignment.html | 61 ++ .../html/classmoeoScalarFitnessAssignment.png | Bin 0 -> 1934 bytes ...classmoeoSelectFromPopAndArch-members.html | 49 ++ .../html/classmoeoSelectFromPopAndArch.html | 201 ++++++ .../html/classmoeoSelectFromPopAndArch.png | Bin 0 -> 1109 bytes .../doc/html/classmoeoSelectOne-members.html | 41 ++ .../doc/html/classmoeoSelectOne.html | 65 ++ .../doc/html/classmoeoSelectOne.png | Bin 0 -> 2926 bytes ...oeoSharingDiversityAssignment-members.html | 51 ++ .../classmoeoSharingDiversityAssignment.html | 347 ++++++++++ .../classmoeoSharingDiversityAssignment.png | Bin 0 -> 1935 bytes .../classmoeoSolutionUnaryMetric-members.html | 40 ++ .../html/classmoeoSolutionUnaryMetric.html | 62 ++ .../doc/html/classmoeoSolutionUnaryMetric.png | Bin 0 -> 2041 bytes ...olutionVsSolutionBinaryMetric-members.html | 40 ++ ...assmoeoSolutionVsSolutionBinaryMetric.html | 63 ++ ...lassmoeoSolutionVsSolutionBinaryMetric.png | Bin 0 -> 2700 bytes ...lassmoeoStochTournamentSelect-members.html | 47 ++ .../html/classmoeoStochTournamentSelect.html | 196 ++++++ .../html/classmoeoStochTournamentSelect.png | Bin 0 -> 1089 bytes .../html/classmoeoUnaryMetric-members.html | 40 ++ .../doc/html/classmoeoUnaryMetric.html | 61 ++ .../doc/html/classmoeoUnaryMetric.png | Bin 0 -> 956 bytes .../doc/html/classmoeoVector-members.html | 85 +++ .../doc/html/classmoeoVector.html | 264 ++++++++ .../doc/html/classmoeoVector.png | Bin 0 -> 2359 bytes .../classmoeoVectorUnaryMetric-members.html | 40 ++ .../doc/html/classmoeoVectorUnaryMetric.html | 62 ++ .../doc/html/classmoeoVectorUnaryMetric.png | Bin 0 -> 2011 bytes ...oeoVectorVsVectorBinaryMetric-members.html | 40 ++ .../classmoeoVectorVsVectorBinaryMetric.html | 62 ++ .../classmoeoVectorVsVectorBinaryMetric.png | Bin 0 -> 1856 bytes trunk/paradiseo-moeo/doc/html/doxygen.css | 358 +++++++++++ trunk/paradiseo-moeo/doc/html/doxygen.png | Bin 0 -> 1281 bytes trunk/paradiseo-moeo/doc/html/files.html | 102 +++ trunk/paradiseo-moeo/doc/html/ftv2blank.png | Bin 0 -> 174 bytes trunk/paradiseo-moeo/doc/html/ftv2doc.png | Bin 0 -> 255 bytes .../doc/html/ftv2folderclosed.png | Bin 0 -> 259 bytes .../doc/html/ftv2folderopen.png | Bin 0 -> 261 bytes .../paradiseo-moeo/doc/html/ftv2lastnode.png | Bin 0 -> 233 bytes trunk/paradiseo-moeo/doc/html/ftv2link.png | Bin 0 -> 358 bytes .../paradiseo-moeo/doc/html/ftv2mlastnode.png | Bin 0 -> 160 bytes trunk/paradiseo-moeo/doc/html/ftv2mnode.png | Bin 0 -> 194 bytes trunk/paradiseo-moeo/doc/html/ftv2node.png | Bin 0 -> 235 bytes .../paradiseo-moeo/doc/html/ftv2plastnode.png | Bin 0 -> 165 bytes trunk/paradiseo-moeo/doc/html/ftv2pnode.png | Bin 0 -> 200 bytes .../paradiseo-moeo/doc/html/ftv2vertline.png | Bin 0 -> 229 bytes trunk/paradiseo-moeo/doc/html/functions.html | 294 +++++++++ .../doc/html/functions_func.html | 202 ++++++ .../doc/html/functions_type.html | 54 ++ .../doc/html/functions_vars.html | 181 ++++++ trunk/paradiseo-moeo/doc/html/hierarchy.html | 289 +++++++++ trunk/paradiseo-moeo/doc/html/index.html | 8 + .../doc/html/index_8h-source.html | 29 + trunk/paradiseo-moeo/doc/html/installdox | 117 ++++ trunk/paradiseo-moeo/doc/html/main.html | 38 ++ .../make__checkpoint__moeo_8h-source.html | 189 ++++++ .../html/make__continue__moeo_8h-source.html | 123 ++++ .../doc/html/make__ea__moeo_8h-source.html | 291 +++++++++ ...chievementFitnessAssignment_8h-source.html | 135 ++++ ...AdditiveEpsilonBinaryMetric_8h-source.html | 92 +++ .../moeoAggregativeComparator_8h-source.html | 68 ++ .../doc/html/moeoAlgo_8h-source.html | 46 ++ ...bjectiveVectorSavingUpdater_8h-source.html | 104 +++ .../html/moeoArchiveUpdater_8h-source.html | 69 ++ .../doc/html/moeoArchive_8h-source.html | 172 +++++ ...eoBinaryMetricSavingUpdater_8h-source.html | 98 +++ .../doc/html/moeoBitVector_8h-source.html | 86 +++ .../doc/html/moeoCombinedLS_8h-source.html | 76 +++ .../doc/html/moeoComparator_8h-source.html | 49 ++ .../moeoContributionMetric_8h-source.html | 110 ++++ ...onvertPopToObjectiveVectors_8h-source.html | 65 ++ ...erionBasedFitnessAssignment_8h-source.html | 49 ++ ...DistanceDiversityAssignment_8h-source.html | 124 ++++ .../moeoDetTournamentSelect_8h-source.html | 92 +++ .../html/moeoDistanceMatrix_8h-source.html | 91 +++ .../doc/html/moeoDistance_8h-source.html | 64 ++ .../moeoDiversityAssignment_8h-source.html | 65 ++ ...ersityThenFitnessComparator_8h-source.html | 65 ++ ...oeoDummyDiversityAssignment_8h-source.html | 74 +++ .../moeoDummyFitnessAssignment_8h-source.html | 74 +++ .../doc/html/moeoEA_8h-source.html | 50 ++ .../doc/html/moeoEasyEA_8h-source.html | 169 +++++ .../moeoElitistReplacement_8h-source.html | 114 ++++ .../doc/html/moeoEntropyMetric_8h-source.html | 174 +++++ ...oeoEnvironmentalReplacement_8h-source.html | 128 ++++ .../html/moeoEuclideanDistance_8h-source.html | 75 +++ .../doc/html/moeoEvalFunc_8h-source.html | 52 ++ ...tedSortingFitnessAssignment_8h-source.html | 222 +++++++ .../html/moeoFitnessAssignment_8h-source.html | 65 ++ ...nessThenDiversityComparator_8h-source.html | 65 ++ ...DistanceDiversityAssignment_8h-source.html | 139 ++++ ...tSharingDiversityAssignment_8h-source.html | 108 ++++ ...ceObjectiveVectorComparator_8h-source.html | 109 ++++ ...moeoGenerationalReplacement_8h-source.html | 59 ++ .../doc/html/moeoHybridLS_8h-source.html | 86 +++ ...moeoHypervolumeBinaryMetric_8h-source.html | 141 +++++ .../doc/html/moeoIBEA_8h-source.html | 133 ++++ ...catorBasedFitnessAssignment_8h-source.html | 185 ++++++ .../doc/html/moeoLS_8h-source.html | 51 ++ .../html/moeoManhattanDistance_8h-source.html | 75 +++ .../doc/html/moeoMetric_8h-source.html | 74 +++ .../doc/html/moeoNSGAII_8h-source.html | 128 ++++ .../doc/html/moeoNSGA_8h-source.html | 128 ++++ .../moeoNormalizedDistance_8h-source.html | 114 ++++ ...utionVsSolutionBinaryMetric_8h-source.html | 93 +++ ...veObjectiveVectorComparator_8h-source.html | 72 +++ ...eoObjectiveVectorComparator_8h-source.html | 50 ++ .../moeoObjectiveVectorDouble_8h-source.html | 140 ++++ ...moeoObjectiveVectorTraits_8cpp-source.html | 45 ++ .../moeoObjectiveVectorTraits_8h-source.html | 107 ++++ .../html/moeoObjectiveVector_8h-source.html | 88 +++ .../moeoOneObjectiveComparator_8h-source.html | 72 +++ ...aretoBasedFitnessAssignment_8h-source.html | 49 ++ ...toObjectiveVectorComparator_8h-source.html | 90 +++ .../doc/html/moeoRandomSelect_8h-source.html | 62 ++ .../doc/html/moeoRealVector_8h-source.html | 56 ++ .../doc/html/moeoReplacement_8h-source.html | 49 ++ .../html/moeoRouletteSelect_8h-source.html | 77 +++ ...moeoScalarFitnessAssignment_8h-source.html | 49 ++ .../moeoSelectFromPopAndArch_8h-source.html | 93 +++ .../doc/html/moeoSelectOne_8h-source.html | 49 ++ .../doc/html/moeoSelectors_8h-source.html | 186 ++++++ ...oSharingDiversityAssignment_8h-source.html | 131 ++++ .../moeoStochTournamentSelect_8h-source.html | 100 +++ .../doc/html/moeoVector_8h-source.html | 134 ++++ trunk/paradiseo-moeo/doc/html/pages.html | 33 + trunk/paradiseo-moeo/doc/html/search.idx | Bin 0 -> 528395 bytes trunk/paradiseo-moeo/doc/html/search.php | 381 +++++++++++ trunk/paradiseo-moeo/doc/html/tab_b.gif | Bin 0 -> 35 bytes trunk/paradiseo-moeo/doc/html/tab_l.gif | Bin 0 -> 706 bytes trunk/paradiseo-moeo/doc/html/tab_r.gif | Bin 0 -> 2585 bytes trunk/paradiseo-moeo/doc/html/tabs.css | 102 +++ trunk/paradiseo-moeo/doc/html/tree.html | 482 ++++++++++++++ trunk/paradiseo-moeo/doc/html/webpages.html | 31 + trunk/paradiseo-moeo/doc/index.h | 44 ++ trunk/paradiseo-moeo/doc/latex/FreeSans.ttf | Bin 0 -> 22932 bytes trunk/paradiseo-moeo/doc/latex/Makefile | 39 ++ trunk/paradiseo-moeo/doc/latex/annotated.tex | 81 +++ trunk/paradiseo-moeo/doc/latex/classMOEO.eps | 243 +++++++ trunk/paradiseo-moeo/doc/latex/classMOEO.tex | 226 +++++++ .../classmoeoAchievementFitnessAssignment.eps | 215 +++++++ .../classmoeoAchievementFitnessAssignment.tex | 172 +++++ .../classmoeoAdditiveEpsilonBinaryMetric.eps | 233 +++++++ .../classmoeoAdditiveEpsilonBinaryMetric.tex | 78 +++ .../latex/classmoeoAggregativeComparator.eps | 209 ++++++ .../latex/classmoeoAggregativeComparator.tex | 79 +++ .../doc/latex/classmoeoAlgo.eps | 229 +++++++ .../doc/latex/classmoeoAlgo.tex | 25 + .../doc/latex/classmoeoArchive.eps | 215 +++++++ .../doc/latex/classmoeoArchive.tex | 170 +++++ ...oeoArchiveObjectiveVectorSavingUpdater.eps | 209 ++++++ ...oeoArchiveObjectiveVectorSavingUpdater.tex | 70 ++ .../doc/latex/classmoeoArchiveUpdater.eps | 209 ++++++ .../doc/latex/classmoeoArchiveUpdater.tex | 61 ++ .../doc/latex/classmoeoBinaryMetric.eps | 271 ++++++++ .../doc/latex/classmoeoBinaryMetric.tex | 27 + .../classmoeoBinaryMetricSavingUpdater.eps | 209 ++++++ .../classmoeoBinaryMetricSavingUpdater.tex | 79 +++ .../doc/latex/classmoeoBitVector.eps | 227 +++++++ .../doc/latex/classmoeoBitVector.tex | 88 +++ .../doc/latex/classmoeoCombinedLS.eps | 215 +++++++ .../doc/latex/classmoeoCombinedLS.tex | 98 +++ .../doc/latex/classmoeoComparator.eps | 227 +++++++ .../doc/latex/classmoeoComparator.tex | 27 + .../doc/latex/classmoeoContributionMetric.eps | 227 +++++++ .../doc/latex/classmoeoContributionMetric.tex | 120 ++++ .../classmoeoConvertPopToObjectiveVectors.eps | 203 ++++++ .../classmoeoConvertPopToObjectiveVectors.tex | 49 ++ ...assmoeoCriterionBasedFitnessAssignment.eps | 209 ++++++ ...assmoeoCriterionBasedFitnessAssignment.tex | 27 + ...oeoCrowdingDistanceDiversityAssignment.eps | 215 +++++++ ...oeoCrowdingDistanceDiversityAssignment.tex | 114 ++++ .../latex/classmoeoDetTournamentSelect.eps | 215 +++++++ .../latex/classmoeoDetTournamentSelect.tex | 102 +++ .../doc/latex/classmoeoDistance.eps | 209 ++++++ .../doc/latex/classmoeoDistance.tex | 87 +++ .../doc/latex/classmoeoDistanceMatrix.eps | 203 ++++++ .../doc/latex/classmoeoDistanceMatrix.tex | 78 +++ .../latex/classmoeoDiversityAssignment.eps | 231 +++++++ .../latex/classmoeoDiversityAssignment.tex | 75 +++ ...lassmoeoDiversityThenFitnessComparator.eps | 209 ++++++ ...lassmoeoDiversityThenFitnessComparator.tex | 49 ++ .../classmoeoDummyDiversityAssignment.eps | 209 ++++++ .../classmoeoDummyDiversityAssignment.tex | 75 +++ .../latex/classmoeoDummyFitnessAssignment.eps | 209 ++++++ .../latex/classmoeoDummyFitnessAssignment.tex | 75 +++ .../paradiseo-moeo/doc/latex/classmoeoEA.eps | 235 +++++++ .../paradiseo-moeo/doc/latex/classmoeoEA.tex | 27 + .../doc/latex/classmoeoEasyEA.eps | 221 +++++++ .../doc/latex/classmoeoEasyEA.tex | 194 ++++++ .../latex/classmoeoEasyEA_1_1eoDummyEval.eps | 209 ++++++ .../latex/classmoeoEasyEA_1_1eoDummyEval.tex | 33 + .../classmoeoEasyEA_1_1eoDummySelect.eps | 209 ++++++ .../classmoeoEasyEA_1_1eoDummySelect.tex | 33 + .../classmoeoEasyEA_1_1eoDummyTransform.eps | 209 ++++++ .../classmoeoEasyEA_1_1eoDummyTransform.tex | 33 + .../doc/latex/classmoeoElitistReplacement.eps | 215 +++++++ .../doc/latex/classmoeoElitistReplacement.tex | 141 +++++ .../classmoeoElitistReplacement_1_1Cmp.tex | 52 ++ .../doc/latex/classmoeoEntropyMetric.eps | 227 +++++++ .../doc/latex/classmoeoEntropyMetric.tex | 152 +++++ .../classmoeoEnvironmentalReplacement.eps | 215 +++++++ .../classmoeoEnvironmentalReplacement.tex | 147 +++++ ...assmoeoEnvironmentalReplacement_1_1Cmp.tex | 52 ++ .../doc/latex/classmoeoEuclideanDistance.eps | 215 +++++++ .../doc/latex/classmoeoEuclideanDistance.tex | 59 ++ .../doc/latex/classmoeoEvalFunc.eps | 209 ++++++ .../doc/latex/classmoeoEvalFunc.tex | 22 + ...stNonDominatedSortingFitnessAssignment.eps | 215 +++++++ ...stNonDominatedSortingFitnessAssignment.tex | 179 ++++++ ...tnessAssignment_1_1ObjectiveComparator.eps | 209 ++++++ ...tnessAssignment_1_1ObjectiveComparator.tex | 55 ++ .../doc/latex/classmoeoFitnessAssignment.eps | 239 +++++++ .../doc/latex/classmoeoFitnessAssignment.tex | 75 +++ ...lassmoeoFitnessThenDiversityComparator.eps | 209 ++++++ ...lassmoeoFitnessThenDiversityComparator.tex | 49 ++ ...ontCrowdingDistanceDiversityAssignment.eps | 215 +++++++ ...ontCrowdingDistanceDiversityAssignment.tex | 102 +++ ...FrontByFrontSharingDiversityAssignment.eps | 215 +++++++ ...FrontByFrontSharingDiversityAssignment.tex | 117 ++++ ...oeoGDominanceObjectiveVectorComparator.eps | 209 ++++++ ...oeoGDominanceObjectiveVectorComparator.tex | 104 +++ .../classmoeoGenerationalReplacement.eps | 239 +++++++ .../classmoeoGenerationalReplacement.tex | 51 ++ .../doc/latex/classmoeoHybridLS.eps | 209 ++++++ .../doc/latex/classmoeoHybridLS.tex | 67 ++ .../classmoeoHypervolumeBinaryMetric.eps | 233 +++++++ .../classmoeoHypervolumeBinaryMetric.tex | 108 ++++ .../doc/latex/classmoeoIBEA.eps | 221 +++++++ .../doc/latex/classmoeoIBEA.tex | 175 +++++ ...assmoeoIndicatorBasedFitnessAssignment.eps | 209 ++++++ ...assmoeoIndicatorBasedFitnessAssignment.tex | 213 +++++++ .../paradiseo-moeo/doc/latex/classmoeoLS.eps | 215 +++++++ .../paradiseo-moeo/doc/latex/classmoeoLS.tex | 29 + .../doc/latex/classmoeoManhattanDistance.eps | 215 +++++++ .../doc/latex/classmoeoManhattanDistance.tex | 59 ++ .../doc/latex/classmoeoMetric.eps | 236 +++++++ .../doc/latex/classmoeoMetric.tex | 25 + .../doc/latex/classmoeoNSGA.eps | 221 +++++++ .../doc/latex/classmoeoNSGA.tex | 169 +++++ .../doc/latex/classmoeoNSGAII.eps | 221 +++++++ .../doc/latex/classmoeoNSGAII.tex | 169 +++++ .../doc/latex/classmoeoNormalizedDistance.eps | 209 ++++++ .../doc/latex/classmoeoNormalizedDistance.tex | 112 ++++ ...rmalizedSolutionVsSolutionBinaryMetric.eps | 227 +++++++ ...rmalizedSolutionVsSolutionBinaryMetric.tex | 84 +++ ...moeoObjectiveObjectiveVectorComparator.eps | 209 ++++++ ...moeoObjectiveObjectiveVectorComparator.tex | 49 ++ .../doc/latex/classmoeoObjectiveVector.tex | 114 ++++ .../classmoeoObjectiveVectorComparator.eps | 219 +++++++ .../classmoeoObjectiveVectorComparator.tex | 29 + .../latex/classmoeoObjectiveVectorDouble.eps | 197 ++++++ .../latex/classmoeoObjectiveVectorDouble.tex | 181 ++++++ .../latex/classmoeoObjectiveVectorTraits.tex | 97 +++ .../latex/classmoeoOneObjectiveComparator.eps | 209 ++++++ .../latex/classmoeoOneObjectiveComparator.tex | 78 +++ .../classmoeoParetoBasedFitnessAssignment.eps | 215 +++++++ .../classmoeoParetoBasedFitnessAssignment.tex | 27 + ...assmoeoParetoObjectiveVectorComparator.eps | 209 ++++++ ...assmoeoParetoObjectiveVectorComparator.tex | 49 ++ .../doc/latex/classmoeoRandomSelect.eps | 239 +++++++ .../doc/latex/classmoeoRandomSelect.tex | 36 ++ .../doc/latex/classmoeoRealVector.eps | 227 +++++++ .../doc/latex/classmoeoRealVector.tex | 49 ++ .../doc/latex/classmoeoReplacement.eps | 225 +++++++ .../doc/latex/classmoeoReplacement.tex | 27 + .../doc/latex/classmoeoRouletteSelect.eps | 215 +++++++ .../doc/latex/classmoeoRouletteSelect.tex | 82 +++ .../classmoeoScalarFitnessAssignment.eps | 215 +++++++ .../classmoeoScalarFitnessAssignment.tex | 27 + .../latex/classmoeoSelectFromPopAndArch.eps | 215 +++++++ .../latex/classmoeoSelectFromPopAndArch.tex | 89 +++ .../doc/latex/classmoeoSelectOne.eps | 233 +++++++ .../doc/latex/classmoeoSelectOne.tex | 27 + .../classmoeoSharingDiversityAssignment.eps | 215 +++++++ .../classmoeoSharingDiversityAssignment.tex | 178 ++++++ .../latex/classmoeoSolutionUnaryMetric.eps | 221 +++++++ .../latex/classmoeoSolutionUnaryMetric.tex | 27 + ...lassmoeoSolutionVsSolutionBinaryMetric.eps | 227 +++++++ ...lassmoeoSolutionVsSolutionBinaryMetric.tex | 27 + .../latex/classmoeoStochTournamentSelect.eps | 215 +++++++ .../latex/classmoeoStochTournamentSelect.tex | 102 +++ .../doc/latex/classmoeoUnaryMetric.eps | 215 +++++++ .../doc/latex/classmoeoUnaryMetric.tex | 27 + .../doc/latex/classmoeoVector.eps | 221 +++++++ .../doc/latex/classmoeoVector.tex | 135 ++++ .../doc/latex/classmoeoVectorUnaryMetric.eps | 221 +++++++ .../doc/latex/classmoeoVectorUnaryMetric.tex | 27 + .../classmoeoVectorVsVectorBinaryMetric.eps | 221 +++++++ .../classmoeoVectorVsVectorBinaryMetric.tex | 27 + trunk/paradiseo-moeo/doc/latex/doxygen.sty | 78 +++ trunk/paradiseo-moeo/doc/latex/hierarchy.tex | 223 +++++++ trunk/paradiseo-moeo/doc/latex/main.tex | 5 + trunk/paradiseo-moeo/doc/latex/pages.tex | 5 + trunk/paradiseo-moeo/doc/latex/refman.tex | 116 ++++ trunk/paradiseo-moeo/doc/latex/webpages.tex | 3 + trunk/paradiseo-moeo/doc/man/man3/MOEO.3 | 253 ++++++++ .../man3/moeoAchievementFitnessAssignment.3 | 185 ++++++ .../man3/moeoAdditiveEpsilonBinaryMetric.3 | 86 +++ .../doc/man/man3/moeoAggregativeComparator.3 | 83 +++ trunk/paradiseo-moeo/doc/man/man3/moeoAlgo.3 | 23 + .../paradiseo-moeo/doc/man/man3/moeoArchive.3 | 172 +++++ .../moeoArchiveObjectiveVectorSavingUpdater.3 | 81 +++ .../doc/man/man3/moeoArchiveUpdater.3 | 65 ++ .../doc/man/man3/moeoBinaryMetric.3 | 27 + .../man/man3/moeoBinaryMetricSavingUpdater.3 | 91 +++ .../doc/man/man3/moeoBitVector.3 | 87 +++ .../doc/man/man3/moeoCombinedLS.3 | 101 +++ .../doc/man/man3/moeoComparator.3 | 27 + .../doc/man/man3/moeoContributionMetric.3 | 129 ++++ .../man3/moeoConvertPopToObjectiveVectors.3 | 47 ++ .../moeoCriterionBasedFitnessAssignment.3 | 25 + .../moeoCrowdingDistanceDiversityAssignment.3 | 126 ++++ .../doc/man/man3/moeoDetTournamentSelect.3 | 107 ++++ .../doc/man/man3/moeoDistance.3 | 93 +++ .../doc/man/man3/moeoDistanceMatrix.3 | 79 +++ .../doc/man/man3/moeoDiversityAssignment.3 | 81 +++ .../man3/moeoDiversityThenFitnessComparator.3 | 49 ++ .../man/man3/moeoDummyDiversityAssignment.3 | 77 +++ .../doc/man/man3/moeoDummyFitnessAssignment.3 | 77 +++ trunk/paradiseo-moeo/doc/man/man3/moeoEA.3 | 27 + .../paradiseo-moeo/doc/man/man3/moeoEasyEA.3 | 283 +++++++++ .../doc/man/man3/moeoEasyEA_eoDummyEval.3 | 33 + .../doc/man/man3/moeoEasyEA_eoDummySelect.3 | 33 + .../man/man3/moeoEasyEA_eoDummyTransform.3 | 33 + .../doc/man/man3/moeoElitistReplacement.3 | 163 +++++ .../doc/man/man3/moeoElitistReplacement_Cmp.3 | 57 ++ .../doc/man/man3/moeoEntropyMetric.3 | 163 +++++ .../man/man3/moeoEnvironmentalReplacement.3 | 171 +++++ .../man3/moeoEnvironmentalReplacement_Cmp.3 | 57 ++ .../doc/man/man3/moeoEuclideanDistance.3 | 61 ++ .../doc/man/man3/moeoEvalFunc.3 | 21 + ...FastNonDominatedSortingFitnessAssignment.3 | 189 ++++++ ...ingFitnessAssignment_ObjectiveComparator.3 | 57 ++ .../doc/man/man3/moeoFitnessAssignment.3 | 81 +++ .../man3/moeoFitnessThenDiversityComparator.3 | 49 ++ ...FrontCrowdingDistanceDiversityAssignment.3 | 112 ++++ ...eoFrontByFrontSharingDiversityAssignment.3 | 130 ++++ .../moeoGDominanceObjectiveVectorComparator.3 | 107 ++++ .../man/man3/moeoGenerationalReplacement.3 | 51 ++ .../doc/man/man3/moeoHybridLS.3 | 77 +++ .../man/man3/moeoHypervolumeBinaryMetric.3 | 120 ++++ trunk/paradiseo-moeo/doc/man/man3/moeoIBEA.3 | 231 +++++++ .../moeoIndicatorBasedFitnessAssignment.3 | 223 +++++++ trunk/paradiseo-moeo/doc/man/man3/moeoLS.3 | 29 + .../doc/man/man3/moeoManhattanDistance.3 | 61 ++ .../paradiseo-moeo/doc/man/man3/moeoMetric.3 | 25 + trunk/paradiseo-moeo/doc/man/man3/moeoNSGA.3 | 213 +++++++ .../paradiseo-moeo/doc/man/man3/moeoNSGAII.3 | 203 ++++++ .../doc/man/man3/moeoNormalizedDistance.3 | 123 ++++ ...NormalizedSolutionVsSolutionBinaryMetric.3 | 93 +++ .../moeoObjectiveObjectiveVectorComparator.3 | 49 ++ .../doc/man/man3/moeoObjectiveVector.3 | 123 ++++ .../man/man3/moeoObjectiveVectorComparator.3 | 29 + .../doc/man/man3/moeoObjectiveVectorDouble.3 | 179 ++++++ .../doc/man/man3/moeoObjectiveVectorTraits.3 | 105 +++ .../doc/man/man3/moeoOneObjectiveComparator.3 | 79 +++ .../man3/moeoParetoBasedFitnessAssignment.3 | 27 + .../moeoParetoObjectiveVectorComparator.3 | 49 ++ .../doc/man/man3/moeoRandomSelect.3 | 37 ++ .../doc/man/man3/moeoRealVector.3 | 49 ++ .../doc/man/man3/moeoReplacement.3 | 27 + .../doc/man/man3/moeoRouletteSelect.3 | 84 +++ .../man/man3/moeoScalarFitnessAssignment.3 | 27 + .../doc/man/man3/moeoSelectFromPopAndArch.3 | 105 +++ .../doc/man/man3/moeoSelectOne.3 | 27 + .../man/man3/moeoSharingDiversityAssignment.3 | 198 ++++++ .../doc/man/man3/moeoSolutionUnaryMetric.3 | 25 + .../man3/moeoSolutionVsSolutionBinaryMetric.3 | 27 + .../doc/man/man3/moeoStochTournamentSelect.3 | 107 ++++ .../doc/man/man3/moeoUnaryMetric.3 | 25 + .../paradiseo-moeo/doc/man/man3/moeoVector.3 | 137 ++++ .../doc/man/man3/moeoVectorUnaryMetric.3 | 25 + .../man/man3/moeoVectorVsVectorBinaryMetric.3 | 25 + trunk/paradiseo-moeo/doc/man/man3/webpages.3 | 15 + trunk/paradiseo-moeo/doc/moeo.doxyfile | 237 +++++++ trunk/paradiseo-moeo/src/Makefile.am | 2 +- trunk/paradiseo-moeo/src/algo/moeoAlgo.h | 21 + .../src/{ => algo}/moeoCombinedLS.h | 7 +- trunk/paradiseo-moeo/src/{ => algo}/moeoEA.h | 4 +- trunk/paradiseo-moeo/src/algo/moeoEasyEA.h | 218 +++++++ .../src/{ => algo}/moeoHybridLS.h | 6 +- trunk/paradiseo-moeo/src/algo/moeoIBEA.h | 168 +++++ trunk/paradiseo-moeo/src/algo/moeoIBMOLS.h | 280 ++++++++ .../src/algo/moeoIteratedIBMOLS.h | 215 +++++++ trunk/paradiseo-moeo/src/{ => algo}/moeoLS.h | 6 +- trunk/paradiseo-moeo/src/algo/moeoNSGA.h | 158 +++++ trunk/paradiseo-moeo/src/algo/moeoNSGAII.h | 153 +++++ .../src/{ => archive}/moeoArchive.h | 39 +- .../comparator/moeoAggregativeComparator.h | 55 ++ .../src/comparator/moeoComparator.h | 24 + .../moeoDiversityThenFitnessComparator.h | 45 ++ .../moeoFitnessThenDiversityComparator.h | 45 ++ .../moeoGDominanceObjectiveVectorComparator.h | 102 +++ .../moeoObjectiveObjectiveVectorComparator.h | 52 ++ .../moeoObjectiveVectorComparator.h | 26 + .../comparator/moeoOneObjectiveComparator.h | 57 ++ .../moeoParetoObjectiveVectorComparator.h | 70 ++ trunk/paradiseo-moeo/src/{ => core}/MOEO.h | 9 +- trunk/paradiseo-moeo/src/core/Makefile.am | 9 + trunk/paradiseo-moeo/src/core/moeoBitVector.h | 74 +++ .../src/{ => core}/moeoEvalFunc.h | 0 .../src/core/moeoObjectiveVector.h | 91 +++ .../moeoObjectiveVectorDouble.h} | 105 +-- .../src/core/moeoObjectiveVectorTraits.cpp | 17 + .../{ => core}/moeoObjectiveVectorTraits.h | 22 +- .../paradiseo-moeo/src/core/moeoRealVector.h | 36 ++ .../src/{ => core}/moeoVector.h | 107 +--- .../src/distance/moeoDistance.h | 54 ++ .../src/distance/moeoDistanceMatrix.h | 76 +++ .../src/distance/moeoEuclideanDistance.h | 58 ++ .../src/distance/moeoManhattanDistance.h | 58 ++ .../src/distance/moeoNormalizedDistance.h | 112 ++++ .../moeoCrowdingDistanceDiversityAssignment.h | 34 +- .../{ => diversity}/moeoDiversityAssignment.h | 42 -- .../diversity/moeoDummyDiversityAssignment.h | 59 ++ ...FrontCrowdingDistanceDiversityAssignment.h | 133 ++++ ...eoFrontByFrontSharingDiversityAssignment.h | 106 ++++ .../moeoSharingDiversityAssignment.h | 142 +++++ .../src/do/make_checkpoint_moeo.h | 18 +- .../src/do/make_continue_moeo.h | 6 +- trunk/paradiseo-moeo/src/do/make_ea_moeo.h | 127 ++-- .../moeoAchievementFitnessAssignment.h | 145 +++++ .../moeoCriterionBasedFitnessAssignment.h | 24 + .../src/fitness/moeoDummyFitnessAssignment.h | 59 ++ ...FastNonDominatedSortingFitnessAssignment.h | 85 ++- .../src/fitness/moeoFitnessAssignment.h | 51 ++ .../moeoIndicatorBasedFitnessAssignment.h | 51 +- .../moeoParetoBasedFitnessAssignment.h | 24 + ...encePointIndicatorBasedFitnessAssignment.h | 109 ++++ .../src/fitness/moeoScalarFitnessAssignment.h | 24 + .../metric/moeoAdditiveEpsilonBinaryMetric.h | 84 +++ .../src/metric/moeoContributionMetric.h | 47 +- .../src/metric/moeoEntropyMetric.h | 41 +- .../src/metric/moeoHypervolumeBinaryMetric.h | 141 +++++ trunk/paradiseo-moeo/src/metric/moeoMetric.h | 22 +- ...NormalizedSolutionVsSolutionBinaryMetric.h | 213 +------ trunk/paradiseo-moeo/src/moeo | 80 +++ .../moeoArchiveObjectiveVectorSavingUpdater.h | 70 -- trunk/paradiseo-moeo/src/moeoComparator.h | 133 ---- trunk/paradiseo-moeo/src/moeoEasyEA.h | 120 ---- .../src/moeoFitnessAssignment.h | 118 ---- trunk/paradiseo-moeo/src/moeoNSGAII.h | 127 ---- .../src/moeoObjectiveVectorComparator.h | 165 ----- .../src/move/moeoMoveIncrEval.h | 11 + .../moeoElitistReplacement.h | 81 ++- .../moeoEnvironmentalReplacement.h | 99 ++- .../moeoGenerationalReplacement.h | 2 +- .../src/{ => replacement}/moeoReplacement.h | 3 +- .../{ => selection}/moeoDetTournamentSelect.h | 33 +- .../src/{ => selection}/moeoRandomSelect.h | 3 +- .../src/selection/moeoRouletteSelect.h | 62 ++ .../moeoSelectFromPopAndArch.h | 9 +- .../src/{ => selection}/moeoSelectOne.h | 0 .../src/{ => selection}/moeoSelectors.h | 27 +- .../moeoStochTournamentSelect.h | 33 +- .../moeoArchiveObjectiveVectorSavingUpdater.h | 94 +++ .../src/{ => utils}/moeoArchiveUpdater.h | 2 +- .../moeoBinaryMetricSavingUpdater.h | 14 +- .../moeoConvertPopToObjectiveVectors.h | 4 +- .../tutorial/Lesson1/FlowShopEA.cpp | 107 ++++ .../tutorial/Lesson1/FlowShopEA.param | 49 ++ .../tutorial/Lesson1/Makefile.am | 11 + .../Lesson1}/benchmarks/020_05_01.txt | 0 .../Lesson1}/benchmarks/020_05_02.txt | 0 .../Lesson1}/benchmarks/020_10_01.txt | 0 .../Lesson1}/benchmarks/020_10_02.txt | 0 .../Lesson1}/benchmarks/020_20_01.txt | 0 .../Lesson1}/benchmarks/050_05_01.txt | 0 .../Lesson1}/benchmarks/050_10_01.txt | 0 .../Lesson1}/benchmarks/050_20_01.txt | 0 .../Lesson1}/benchmarks/100_05_01.txt | 0 .../Lesson1}/benchmarks/100_10_01.txt | 0 .../Lesson1}/benchmarks/100_20_01.txt | 0 .../Lesson1}/benchmarks/200_10_01.txt | 0 .../Lesson1}/benchmarks/README | 0 .../tutorial/Lesson1/flowshop/FlowShop.cpp | 18 + .../tutorial/Lesson1/flowshop/FlowShop.h | 33 + .../flowshop/FlowShopBenchmarkParser.cpp | 101 +++ .../flowshop/FlowShopBenchmarkParser.h | 83 +++ .../Lesson1/flowshop/FlowShopEval.cpp | 64 ++ .../tutorial/Lesson1/flowshop/FlowShopEval.h | 79 +++ .../Lesson1/flowshop/FlowShopInit.cpp | 39 ++ .../tutorial/Lesson1/flowshop/FlowShopInit.h | 47 ++ .../flowshop/FlowShopObjectiveVector.h | 24 + .../FlowShopObjectiveVectorTraits.cpp | 27 + .../flowshop/FlowShopObjectiveVectorTraits.h | 39 ++ .../flowshop/FlowShopOpCrossoverQuad.cpp | 84 +++ .../flowshop/FlowShopOpCrossoverQuad.h | 53 ++ .../flowshop/FlowShopOpMutationExchange.cpp | 50 ++ .../flowshop/FlowShopOpMutationExchange.h | 40 ++ .../flowshop/FlowShopOpMutationShift.cpp | 60 ++ .../flowshop/FlowShopOpMutationShift.h | 40 ++ .../tutorial/Lesson1/flowshop/Makefile.am | 26 + .../Lesson1/flowshop/make_eval_FlowShop.h | 55 ++ .../Lesson1/flowshop/make_genotype_FlowShop.h | 48 ++ .../Lesson1/flowshop/make_op_FlowShop.h | 107 ++++ .../tutorial/Lesson2/Makefile.am | 9 + .../paradiseo-moeo/tutorial/Lesson2/Sch1.cpp | 103 +++ trunk/paradiseo-moeo/tutorial/Makefile.am | 1 + trunk/paradiseo-moeo/tutorials/Makefile.am | 1 - .../tutorials/lesson1/FlowShop.h | 114 ---- .../lesson1/FlowShopBenchmarkParser.h | 140 ---- .../tutorials/lesson1/FlowShopEA | Bin 2559682 -> 0 bytes .../tutorials/lesson1/FlowShopEA.cpp | 118 ---- .../tutorials/lesson1/FlowShopEA.param | 48 -- .../tutorials/lesson1/FlowShopEval.h | 129 ---- .../tutorials/lesson1/FlowShopInit.h | 64 -- .../lesson1/FlowShopOpCrossoverQuad.h | 120 ---- .../lesson1/FlowShopOpMutationExchange.h | 78 --- .../lesson1/FlowShopOpMutationShift.h | 86 --- .../tutorials/lesson1/Makefile.am | 9 - .../tutorials/lesson1/make_eval_FlowShop.h | 55 -- .../lesson1/make_genotype_FlowShop.h | 49 -- .../tutorials/lesson1/make_op_FlowShop.h | 106 ---- .../tutorials/lesson2/Makefile.am | 9 - trunk/paradiseo-moeo/tutorials/lesson2/Sch1 | Bin 1110130 -> 0 bytes .../paradiseo-moeo/tutorials/lesson2/Sch1.cpp | 103 --- 724 files changed, 63306 insertions(+), 2758 deletions(-) create mode 100644 trunk/paradiseo-moeo/doc/Makefile.am create mode 100644 trunk/paradiseo-moeo/doc/html/MOEO_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/annotated.html create mode 100644 trunk/paradiseo-moeo/doc/html/classMOEO-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classMOEO.html create mode 100644 trunk/paradiseo-moeo/doc/html/classMOEO.png create mode 100644 trunk/paradiseo-moeo/doc/html/classes.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAlgo.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoAlgo.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchive-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchive.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchive.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBitVector-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBitVector.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoBitVector.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDistance-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDistance.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDistance.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEA-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEA.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEA.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoHybridLS-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoIBEA-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoIBEA.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoIBEA.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoLS-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoLS.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoLS.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNSGA-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNSGA.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNSGA.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNSGAII-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRealVector-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRealVector.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRealVector.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoReplacement-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoReplacement.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoReplacement.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSelectOne-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVector-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVector.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVector.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric-members.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.html create mode 100644 trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.png create mode 100644 trunk/paradiseo-moeo/doc/html/doxygen.css create mode 100644 trunk/paradiseo-moeo/doc/html/doxygen.png create mode 100644 trunk/paradiseo-moeo/doc/html/files.html create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2blank.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2doc.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2folderclosed.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2folderopen.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2lastnode.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2link.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2mlastnode.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2mnode.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2node.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2plastnode.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2pnode.png create mode 100644 trunk/paradiseo-moeo/doc/html/ftv2vertline.png create mode 100644 trunk/paradiseo-moeo/doc/html/functions.html create mode 100644 trunk/paradiseo-moeo/doc/html/functions_func.html create mode 100644 trunk/paradiseo-moeo/doc/html/functions_type.html create mode 100644 trunk/paradiseo-moeo/doc/html/functions_vars.html create mode 100644 trunk/paradiseo-moeo/doc/html/hierarchy.html create mode 100644 trunk/paradiseo-moeo/doc/html/index.html create mode 100644 trunk/paradiseo-moeo/doc/html/index_8h-source.html create mode 100755 trunk/paradiseo-moeo/doc/html/installdox create mode 100644 trunk/paradiseo-moeo/doc/html/main.html create mode 100644 trunk/paradiseo-moeo/doc/html/make__checkpoint__moeo_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/make__continue__moeo_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/make__ea__moeo_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoAchievementFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoAdditiveEpsilonBinaryMetric_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoAggregativeComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoAlgo_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoArchiveObjectiveVectorSavingUpdater_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoArchiveUpdater_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoArchive_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoBinaryMetricSavingUpdater_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoBitVector_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoCombinedLS_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoContributionMetric_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoConvertPopToObjectiveVectors_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoCriterionBasedFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoCrowdingDistanceDiversityAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDetTournamentSelect_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDistanceMatrix_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDistance_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDiversityAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDiversityThenFitnessComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDummyDiversityAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoDummyFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoEA_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoEasyEA_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoElitistReplacement_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoEntropyMetric_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoEnvironmentalReplacement_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoEuclideanDistance_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoEvalFunc_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoFastNonDominatedSortingFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoFitnessThenDiversityComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoFrontByFrontCrowdingDistanceDiversityAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoFrontByFrontSharingDiversityAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoGDominanceObjectiveVectorComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoGenerationalReplacement_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoHybridLS_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoHypervolumeBinaryMetric_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoIBEA_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoIndicatorBasedFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoLS_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoManhattanDistance_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoMetric_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoNSGAII_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoNSGA_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoNormalizedDistance_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoNormalizedSolutionVsSolutionBinaryMetric_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoObjectiveObjectiveVectorComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorDouble_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8cpp-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoObjectiveVector_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoOneObjectiveComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoParetoBasedFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoParetoObjectiveVectorComparator_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoRandomSelect_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoRealVector_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoReplacement_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoRouletteSelect_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoScalarFitnessAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoSelectFromPopAndArch_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoSelectOne_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoSelectors_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoSharingDiversityAssignment_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoStochTournamentSelect_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/moeoVector_8h-source.html create mode 100644 trunk/paradiseo-moeo/doc/html/pages.html create mode 100644 trunk/paradiseo-moeo/doc/html/search.idx create mode 100644 trunk/paradiseo-moeo/doc/html/search.php create mode 100644 trunk/paradiseo-moeo/doc/html/tab_b.gif create mode 100644 trunk/paradiseo-moeo/doc/html/tab_l.gif create mode 100644 trunk/paradiseo-moeo/doc/html/tab_r.gif create mode 100644 trunk/paradiseo-moeo/doc/html/tabs.css create mode 100644 trunk/paradiseo-moeo/doc/html/tree.html create mode 100644 trunk/paradiseo-moeo/doc/html/webpages.html create mode 100644 trunk/paradiseo-moeo/doc/index.h create mode 100644 trunk/paradiseo-moeo/doc/latex/FreeSans.ttf create mode 100644 trunk/paradiseo-moeo/doc/latex/Makefile create mode 100644 trunk/paradiseo-moeo/doc/latex/annotated.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classMOEO.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classMOEO.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoArchive.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoArchive.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDistance.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDistance.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEA.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEA.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement_1_1Cmp.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement_1_1Cmp.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoLS.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoLS.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVector.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorTraits.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoVector.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoVector.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.eps create mode 100644 trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/doxygen.sty create mode 100644 trunk/paradiseo-moeo/doc/latex/hierarchy.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/main.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/pages.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/refman.tex create mode 100644 trunk/paradiseo-moeo/doc/latex/webpages.tex create mode 100644 trunk/paradiseo-moeo/doc/man/man3/MOEO.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoAchievementFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoAdditiveEpsilonBinaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoAggregativeComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoAlgo.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoArchive.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoArchiveObjectiveVectorSavingUpdater.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoArchiveUpdater.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetricSavingUpdater.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoBitVector.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoCombinedLS.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoContributionMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoConvertPopToObjectiveVectors.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoCriterionBasedFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoCrowdingDistanceDiversityAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDetTournamentSelect.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDistance.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDistanceMatrix.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDiversityAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDiversityThenFitnessComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDummyDiversityAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoDummyFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEA.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyEval.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummySelect.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyTransform.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement_Cmp.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEntropyMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement_Cmp.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEuclideanDistance.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoEvalFunc.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment_ObjectiveComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoFitnessThenDiversityComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontCrowdingDistanceDiversityAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontSharingDiversityAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoGDominanceObjectiveVectorComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoGenerationalReplacement.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoHybridLS.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoHypervolumeBinaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoIBEA.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoIndicatorBasedFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoLS.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoManhattanDistance.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoNSGA.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoNSGAII.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedDistance.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedSolutionVsSolutionBinaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveObjectiveVectorComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVector.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorDouble.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorTraits.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoOneObjectiveComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoParetoBasedFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoParetoObjectiveVectorComparator.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoRandomSelect.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoRealVector.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoReplacement.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoRouletteSelect.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoScalarFitnessAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoSelectFromPopAndArch.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoSelectOne.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoSharingDiversityAssignment.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoSolutionUnaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoSolutionVsSolutionBinaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoStochTournamentSelect.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoUnaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoVector.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoVectorUnaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/moeoVectorVsVectorBinaryMetric.3 create mode 100644 trunk/paradiseo-moeo/doc/man/man3/webpages.3 create mode 100644 trunk/paradiseo-moeo/doc/moeo.doxyfile create mode 100644 trunk/paradiseo-moeo/src/algo/moeoAlgo.h rename trunk/paradiseo-moeo/src/{ => algo}/moeoCombinedLS.h (92%) rename trunk/paradiseo-moeo/src/{ => algo}/moeoEA.h (87%) create mode 100755 trunk/paradiseo-moeo/src/algo/moeoEasyEA.h rename trunk/paradiseo-moeo/src/{ => algo}/moeoHybridLS.h (94%) create mode 100644 trunk/paradiseo-moeo/src/algo/moeoIBEA.h create mode 100755 trunk/paradiseo-moeo/src/algo/moeoIBMOLS.h create mode 100755 trunk/paradiseo-moeo/src/algo/moeoIteratedIBMOLS.h rename trunk/paradiseo-moeo/src/{ => algo}/moeoLS.h (83%) create mode 100644 trunk/paradiseo-moeo/src/algo/moeoNSGA.h create mode 100644 trunk/paradiseo-moeo/src/algo/moeoNSGAII.h rename trunk/paradiseo-moeo/src/{ => archive}/moeoArchive.h (81%) create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoAggregativeComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoDiversityThenFitnessComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoFitnessThenDiversityComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoGDominanceObjectiveVectorComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoObjectiveObjectiveVectorComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoObjectiveVectorComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoOneObjectiveComparator.h create mode 100644 trunk/paradiseo-moeo/src/comparator/moeoParetoObjectiveVectorComparator.h rename trunk/paradiseo-moeo/src/{ => core}/MOEO.h (92%) create mode 100644 trunk/paradiseo-moeo/src/core/Makefile.am create mode 100644 trunk/paradiseo-moeo/src/core/moeoBitVector.h rename trunk/paradiseo-moeo/src/{ => core}/moeoEvalFunc.h (100%) create mode 100644 trunk/paradiseo-moeo/src/core/moeoObjectiveVector.h rename trunk/paradiseo-moeo/src/{moeoObjectiveVector.h => core/moeoObjectiveVectorDouble.h} (64%) create mode 100644 trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.cpp rename trunk/paradiseo-moeo/src/{ => core}/moeoObjectiveVectorTraits.h (84%) create mode 100644 trunk/paradiseo-moeo/src/core/moeoRealVector.h rename trunk/paradiseo-moeo/src/{ => core}/moeoVector.h (63%) create mode 100644 trunk/paradiseo-moeo/src/distance/moeoDistance.h create mode 100644 trunk/paradiseo-moeo/src/distance/moeoDistanceMatrix.h create mode 100644 trunk/paradiseo-moeo/src/distance/moeoEuclideanDistance.h create mode 100644 trunk/paradiseo-moeo/src/distance/moeoManhattanDistance.h create mode 100644 trunk/paradiseo-moeo/src/distance/moeoNormalizedDistance.h rename trunk/paradiseo-moeo/src/{ => diversity}/moeoCrowdingDistanceDiversityAssignment.h (76%) rename trunk/paradiseo-moeo/src/{ => diversity}/moeoDiversityAssignment.h (56%) create mode 100644 trunk/paradiseo-moeo/src/diversity/moeoDummyDiversityAssignment.h create mode 100644 trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h create mode 100644 trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h create mode 100644 trunk/paradiseo-moeo/src/diversity/moeoSharingDiversityAssignment.h create mode 100644 trunk/paradiseo-moeo/src/fitness/moeoAchievementFitnessAssignment.h create mode 100644 trunk/paradiseo-moeo/src/fitness/moeoCriterionBasedFitnessAssignment.h create mode 100644 trunk/paradiseo-moeo/src/fitness/moeoDummyFitnessAssignment.h rename trunk/paradiseo-moeo/src/{ => fitness}/moeoFastNonDominatedSortingFitnessAssignment.h (69%) create mode 100644 trunk/paradiseo-moeo/src/fitness/moeoFitnessAssignment.h rename trunk/paradiseo-moeo/src/{ => fitness}/moeoIndicatorBasedFitnessAssignment.h (77%) create mode 100644 trunk/paradiseo-moeo/src/fitness/moeoParetoBasedFitnessAssignment.h create mode 100755 trunk/paradiseo-moeo/src/fitness/moeoReferencePointIndicatorBasedFitnessAssignment.h create mode 100644 trunk/paradiseo-moeo/src/fitness/moeoScalarFitnessAssignment.h create mode 100644 trunk/paradiseo-moeo/src/metric/moeoAdditiveEpsilonBinaryMetric.h create mode 100644 trunk/paradiseo-moeo/src/metric/moeoHypervolumeBinaryMetric.h delete mode 100644 trunk/paradiseo-moeo/src/moeoArchiveObjectiveVectorSavingUpdater.h delete mode 100644 trunk/paradiseo-moeo/src/moeoComparator.h delete mode 100755 trunk/paradiseo-moeo/src/moeoEasyEA.h delete mode 100644 trunk/paradiseo-moeo/src/moeoFitnessAssignment.h delete mode 100644 trunk/paradiseo-moeo/src/moeoNSGAII.h delete mode 100644 trunk/paradiseo-moeo/src/moeoObjectiveVectorComparator.h create mode 100644 trunk/paradiseo-moeo/src/move/moeoMoveIncrEval.h rename trunk/paradiseo-moeo/src/{ => replacement}/moeoElitistReplacement.h (50%) rename trunk/paradiseo-moeo/src/{ => replacement}/moeoEnvironmentalReplacement.h (50%) rename trunk/paradiseo-moeo/src/{ => replacement}/moeoGenerationalReplacement.h (96%) rename trunk/paradiseo-moeo/src/{ => replacement}/moeoReplacement.h (91%) rename trunk/paradiseo-moeo/src/{ => selection}/moeoDetTournamentSelect.h (65%) rename trunk/paradiseo-moeo/src/{ => selection}/moeoRandomSelect.h (96%) create mode 100644 trunk/paradiseo-moeo/src/selection/moeoRouletteSelect.h rename trunk/paradiseo-moeo/src/{ => selection}/moeoSelectFromPopAndArch.h (96%) rename trunk/paradiseo-moeo/src/{ => selection}/moeoSelectOne.h (100%) rename trunk/paradiseo-moeo/src/{ => selection}/moeoSelectors.h (88%) rename trunk/paradiseo-moeo/src/{ => selection}/moeoStochTournamentSelect.h (67%) create mode 100644 trunk/paradiseo-moeo/src/utils/moeoArchiveObjectiveVectorSavingUpdater.h rename trunk/paradiseo-moeo/src/{ => utils}/moeoArchiveUpdater.h (97%) rename trunk/paradiseo-moeo/src/{metric => utils}/moeoBinaryMetricSavingUpdater.h (92%) rename trunk/paradiseo-moeo/src/{ => utils}/moeoConvertPopToObjectiveVectors.h (94%) create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.param create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/Makefile.am rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/020_05_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/020_05_02.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/020_10_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/020_10_02.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/020_20_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/050_05_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/050_10_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/050_20_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/100_05_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/100_10_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/100_20_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/200_10_01.txt (100%) rename trunk/paradiseo-moeo/{tutorials/lesson1 => tutorial/Lesson1}/benchmarks/README (100%) create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopBenchmarkParser.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopBenchmarkParser.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopEval.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopEval.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopInit.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopInit.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVector.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpCrossoverQuad.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpCrossoverQuad.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/Makefile.am create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_eval_FlowShop.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_genotype_FlowShop.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_op_FlowShop.h create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson2/Makefile.am create mode 100644 trunk/paradiseo-moeo/tutorial/Lesson2/Sch1.cpp create mode 100644 trunk/paradiseo-moeo/tutorial/Makefile.am delete mode 100755 trunk/paradiseo-moeo/tutorials/Makefile.am delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h delete mode 100755 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.cpp delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopInit.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpCrossoverQuad.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationExchange.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/Makefile.am delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson2/Makefile.am delete mode 100755 trunk/paradiseo-moeo/tutorials/lesson2/Sch1 delete mode 100644 trunk/paradiseo-moeo/tutorials/lesson2/Sch1.cpp diff --git a/trunk/paradiseo-moeo/Makefile.am b/trunk/paradiseo-moeo/Makefile.am index f82d6f279..1d58ec812 100755 --- a/trunk/paradiseo-moeo/Makefile.am +++ b/trunk/paradiseo-moeo/Makefile.am @@ -1,16 +1,17 @@ -SUBDIRS = docs src tutorials +SUBDIRS = doc src tutorial clean_all: clean_aux clean_doc -@make clean -@(rm -rf aclocal.m4 autom4te.cache configure config.* CO* dep* INST* install-sh miss* mkins* Makefile Makefile.in;\ - cd docs; rm -rf Makefile Makefile.in *.doxytag; cd ../src ; rm -rf Makefile Makefile.in; cd ../tutorials; rm -rf Makefile Makefile.in;\ - cd lesson1; rm -rf .deps/ Makefile Makefile.in) + cd doc; rm -rf Makefile Makefile.in *.doxytag; cd ../src ; rm -rf Makefile Makefile.in; cd core ; rm -rf Makefile Makefile.in;\ + cd ../../tutorial; rm -rf Makefile Makefile.in; cd Lesson1; rm -rf .deps/ Makefile Makefile.in *.status;\ + cd flowshop; rm -rf .deps/ Makefile Makefile.in; cd ../../Lesson2; rm -rf .deps/ Makefile Makefile.in) clean_aux: -@find . \( -name "*~" -o -name "*.old" -o -name "#*" -o -name "*.bak" \) -print -exec rm -rf \{\} \; doc: - -@(cd docs; make doc) + -@(cd doc; make doc) clean_doc: - -@(cd docs; make clean-local) + -@(cd doc; make clean-local) diff --git a/trunk/paradiseo-moeo/NEWS b/trunk/paradiseo-moeo/NEWS index 55f7d22e4..b54ffafe3 100644 --- a/trunk/paradiseo-moeo/NEWS +++ b/trunk/paradiseo-moeo/NEWS @@ -1,3 +1,4 @@ +<<<<<<< .courant * release 1.0.alpha # Local Variables: @@ -5,3 +6,6 @@ # mode: text # fill-column: 80 # End: +======= +* release 1.0 +>>>>>>> .fusion-droit.r399 diff --git a/trunk/paradiseo-moeo/README b/trunk/paradiseo-moeo/README index 74a966fdf..c7633575f 100644 --- a/trunk/paradiseo-moeo/README +++ b/trunk/paradiseo-moeo/README @@ -52,7 +52,9 @@ structure: | +-- lesson1 A bi-objective flow-shop problem example with main algorithms. | | - | +-benchmarks Instance files for testing. + | +- flowshop Flow-shop source files + | | + | +- benchmarks Instance files for testing. | |-- lesson2 Implement NSGA-II for the SCH1 problem. diff --git a/trunk/paradiseo-moeo/configure.in b/trunk/paradiseo-moeo/configure.in index 4b8d41f28..70f8905a6 100755 --- a/trunk/paradiseo-moeo/configure.in +++ b/trunk/paradiseo-moeo/configure.in @@ -39,8 +39,10 @@ AC_ARG_WITH(EOdir, AC_OUTPUT([ Makefile src/Makefile -docs/Makefile -tutorials/Makefile -tutorials/lesson1/Makefile -tutorials/lesson2/Makefile +src/core/Makefile +doc/Makefile +tutorial/Makefile +tutorial/Lesson1/Makefile +tutorial/Lesson1/flowshop/Makefile +tutorial/Lesson2/Makefile ]) diff --git a/trunk/paradiseo-moeo/doc/Makefile.am b/trunk/paradiseo-moeo/doc/Makefile.am new file mode 100644 index 000000000..254b2661c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/Makefile.am @@ -0,0 +1,5 @@ +doc: + -@doxygen moeo.doxyfile + +clean-local: + rm -rf html latex man diff --git a/trunk/paradiseo-moeo/doc/html/MOEO_8h-source.html b/trunk/paradiseo-moeo/doc/html/MOEO_8h-source.html new file mode 100644 index 000000000..55169039a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/MOEO_8h-source.html @@ -0,0 +1,230 @@ + + +ParadisEO-MOEO: MOEO.h Source File + + + + +
+
+

MOEO.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // MOEO.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEO_H_
+00014 #define MOEO_H_
+00015 
+00016 #include <iostream>
+00017 #include <stdexcept>
+00018 #include <string>
+00019 #include <EO.h>
+00020 
+00033 template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity >
+00034 class MOEO : public EO < MOEOObjectiveVector >
+00035 {
+00036 public:
+00037 
+00039     typedef MOEOObjectiveVector ObjectiveVector;
+00040 
+00042     typedef MOEOFitness Fitness;
+00043 
+00045     typedef MOEODiversity Diversity;
+00046 
+00047 
+00051     MOEO()
+00052     {
+00053         // default values for every parameters
+00054         objectiveVectorValue = ObjectiveVector();
+00055         fitnessValue = Fitness();
+00056         diversityValue = Diversity();
+00057         // invalidate all
+00058         invalidate();
+00059     }
+00060 
+00061 
+00065     virtual ~MOEO() {};
+00066 
+00067 
+00071     ObjectiveVector objectiveVector() const
+00072     {
+00073         if ( invalidObjectiveVector() )
+00074         {
+00075             throw std::runtime_error("invalid objective vector in MOEO");
+00076         }
+00077         return objectiveVectorValue;
+00078     }
+00079 
+00080 
+00085     void objectiveVector(const ObjectiveVector & _objectiveVectorValue)
+00086     {
+00087         objectiveVectorValue = _objectiveVectorValue;
+00088         invalidObjectiveVectorValue = false;
+00089     }
+00090 
+00091 
+00095     void invalidateObjectiveVector()
+00096     {
+00097         invalidObjectiveVectorValue = true;
+00098     }
+00099 
+00100 
+00104     bool invalidObjectiveVector() const
+00105     {
+00106         return invalidObjectiveVectorValue;
+00107     }
+00108 
+00109 
+00113     Fitness fitness() const
+00114     {
+00115         if ( invalidFitness() )
+00116         {
+00117             throw std::runtime_error("invalid fitness in MOEO");
+00118         }
+00119         return fitnessValue;
+00120     }
+00121 
+00122 
+00127     void fitness(const Fitness & _fitnessValue)
+00128     {
+00129         fitnessValue = _fitnessValue;
+00130         invalidFitnessValue = false;
+00131     }
+00132 
+00133 
+00137     void invalidateFitness()
+00138     {
+00139         invalidFitnessValue = true;
+00140     }
+00141 
+00142 
+00146     bool invalidFitness() const
+00147     {
+00148         return invalidFitnessValue;
+00149     }
+00150 
+00151 
+00155     Diversity diversity() const
+00156     {
+00157         if ( invalidDiversity() )
+00158         {
+00159             throw std::runtime_error("invalid diversity in MOEO");
+00160         }
+00161         return diversityValue;
+00162     }
+00163 
+00164 
+00169     void diversity(const Diversity & _diversityValue)
+00170     {
+00171         diversityValue = _diversityValue;
+00172         invalidDiversityValue = false;
+00173     }
+00174 
+00175 
+00179     void invalidateDiversity()
+00180     {
+00181         invalidDiversityValue = true;
+00182     }
+00183 
+00184 
+00188     bool invalidDiversity() const
+00189     {
+00190         return invalidDiversityValue;
+00191     }
+00192 
+00193 
+00197     void invalidate()
+00198     {
+00199         invalidateObjectiveVector();
+00200         invalidateFitness();
+00201         invalidateDiversity();
+00202     }
+00203 
+00204 
+00208     bool invalid() const
+00209     {
+00210         return invalidObjectiveVector();
+00211     }
+00212 
+00213 
+00220     bool operator<(const MOEO & _other) const
+00221     {
+00222         return objectiveVector() < _other.objectiveVector();
+00223     }
+00224 
+00225 
+00229     virtual std::string className() const
+00230     {
+00231         return "MOEO";
+00232     }
+00233 
+00234 
+00239     virtual void printOn(std::ostream & _os) const
+00240     {
+00241         if ( invalidObjectiveVector() )
+00242         {
+00243             _os << "INVALID\t";
+00244         }
+00245         else
+00246         {
+00247             _os << objectiveVectorValue << '\t';
+00248         }
+00249     }
+00250 
+00251 
+00256     virtual void readFrom(std::istream & _is)
+00257     {
+00258         std::string objectiveVector_str;
+00259         int pos = _is.tellg();
+00260         _is >> objectiveVector_str;
+00261         if (objectiveVector_str == "INVALID")
+00262         {
+00263             invalidateObjectiveVector();
+00264         }
+00265         else
+00266         {
+00267             invalidObjectiveVectorValue = false;
+00268             _is.seekg(pos); // rewind
+00269             _is >> objectiveVectorValue;
+00270         }
+00271     }
+00272 
+00273 
+00274 private:
+00275 
+00277     ObjectiveVector objectiveVectorValue;
+00279     bool invalidObjectiveVectorValue;
+00281     Fitness fitnessValue;
+00283     bool invalidFitnessValue;
+00285     Diversity diversityValue;
+00287     bool invalidDiversityValue;
+00288 
+00289 };
+00290 
+00291 #endif /*MOEO_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/annotated.html b/trunk/paradiseo-moeo/doc/html/annotated.html new file mode 100644 index 000000000..d493f7dad --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/annotated.html @@ -0,0 +1,115 @@ + + +ParadisEO-MOEO: Class List + + + + +
+
+
+
+

ParadisEO-MOEO Class List

Here are the classes, structs, unions and interfaces with brief descriptions: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >Base class allowing to represent a solution (an individual) for multi-objective optimization
moeoAchievementFitnessAssignment< MOEOT >Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980)
moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C
moeoAggregativeComparator< MOEOT >Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value
moeoAlgoAbstract class for multi-objective algorithms
moeoArchive< MOEOT >An archive is a secondary population that stores non-dominated solutions
moeoArchiveObjectiveVectorSavingUpdater< MOEOT >This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation
moeoArchiveUpdater< MOEOT >This class allows to update the archive at each generation with newly found non-dominated solutions
moeoBinaryMetric< A1, A2, R >Base class for binary metrics
moeoBinaryMetricSavingUpdater< MOEOT >This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file
moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >This class is an implementationeo of a simple bit-valued moeoVector
moeoCombinedLS< MOEOT, Type >This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions
moeoComparator< MOEOT >Functor allowing to compare two solutions
moeoContributionMetric< ObjectiveVector >The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc
moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >Functor allowing to get a vector of objective vectors from a population
moeoCriterionBasedFitnessAssignment< MOEOT >MoeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies
moeoCrowdingDistanceDiversityAssignment< MOEOT >Diversity assignment sheme based on crowding distance proposed in: K
moeoDetTournamentSelect< MOEOT >Selection strategy that selects ONE individual by deterministic tournament
moeoDistance< MOEOT, Type >The base class for distance computation
moeoDistanceMatrix< MOEOT, Type >A matrix to compute distances between every pair of individuals contained in a population
moeoDiversityAssignment< MOEOT >Functor that sets the diversity values of a whole population
moeoDiversityThenFitnessComparator< MOEOT >Functor allowing to compare two solutions according to their diversity values, then according to their fitness values
moeoDummyDiversityAssignment< MOEOT >MoeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population if it is invalid
moeoDummyFitnessAssignment< MOEOT >MoeoDummyFitnessAssignment is a moeoFitnessAssignment that gives the value '0' as the individual's fitness for a whole population if it is invalid
moeoEA< MOEOT >Abstract class for multi-objective evolutionary algorithms
moeoEasyEA< MOEOT >An easy class to design multi-objective evolutionary algorithms
moeoEasyEA< MOEOT >::eoDummyEvalDummy eval
moeoEasyEA< MOEOT >::eoDummySelectDummy select
moeoEasyEA< MOEOT >::eoDummyTransformDummy transform
moeoElitistReplacement< MOEOT >Elitist replacement strategy that consists in keeping the N best individuals
moeoElitistReplacement< MOEOT >::CmpThis object is used to compare solutions in order to sort the population
moeoEntropyMetric< ObjectiveVector >The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc
moeoEnvironmentalReplacement< MOEOT >Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion
moeoEnvironmentalReplacement< MOEOT >::CmpThis object is used to compare solutions in order to sort the population
moeoEuclideanDistance< MOEOT >A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e
moeoEvalFunc< MOEOT >
moeoFastNonDominatedSortingFitnessAssignment< MOEOT >Fitness assignment sheme based on Pareto-dominance count proposed in: N
moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparatorFunctor allowing to compare two solutions according to their first objective value, then their second, and so on
moeoFitnessAssignment< MOEOT >Functor that sets the fitness values of a whole population
moeoFitnessThenDiversityComparator< MOEOT >Functor allowing to compare two solutions according to their fitness values, then according to their diversity values
moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >Diversity assignment sheme based on crowding distance proposed in: K
moeoFrontByFrontSharingDiversityAssignment< MOEOT >Sharing assignment scheme on the way it is used in NSGA
moeoGDominanceObjectiveVectorComparator< ObjectiveVector >This functor class allows to compare 2 objective vectors according to g-dominance
moeoGenerationalReplacement< MOEOT >Generational replacement: only the new individuals are preserved
moeoHybridLS< MOEOT >This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified
moeoHypervolumeBinaryMetric< ObjectiveVector >Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., Künzli S
moeoIBEA< MOEOT >IBEA (Indicator-Based Evolutionary Algorithm) as described in: E
moeoIndicatorBasedFitnessAssignment< MOEOT >Fitness assignment sheme based an Indicator proposed in: E
moeoLS< MOEOT, Type >Abstract class for local searches applied to multi-objective optimization
moeoManhattanDistance< MOEOT >A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e
moeoMetricBase class for performance metrics (also known as quality indicators)
moeoNormalizedDistance< MOEOT, Type >The base class for double distance computation with normalized objective values (i.e
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values
moeoNSGA< MOEOT >NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N
moeoNSGAII< MOEOT >NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S
moeoObjectiveObjectiveVectorComparator< ObjectiveVector >Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on
moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >Abstract class allowing to represent a solution in the objective space (phenotypic representation)
moeoObjectiveVectorComparator< ObjectiveVector >Abstract class allowing to compare 2 objective vectors
moeoObjectiveVectorDouble< ObjectiveVectorTraits >This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e
moeoObjectiveVectorTraitsA traits class for moeoObjectiveVector to specify the number of objectives and which ones have to be minimized or maximized
moeoOneObjectiveComparator< MOEOT >Functor allowing to compare two solutions according to one objective
moeoParetoBasedFitnessAssignment< MOEOT >MoeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies
moeoParetoObjectiveVectorComparator< ObjectiveVector >This functor class allows to compare 2 objective vectors according to Pareto dominance
moeoRandomSelect< MOEOT >Selection strategy that selects only one element randomly from a whole population
moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >This class is an implementation of a simple double-valued moeoVector
moeoReplacement< MOEOT >Replacement strategy for multi-objective optimization
moeoRouletteSelect< MOEOT >Selection strategy that selects ONE individual by using roulette wheel process
moeoScalarFitnessAssignment< MOEOT >MoeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies
moeoSelectFromPopAndArch< MOEOT >Elitist selection process that consists in choosing individuals in the archive as well as in the current population
moeoSelectOne< MOEOT >Selection strategy for multi-objective optimization that selects only one element from a whole population
moeoSharingDiversityAssignment< MOEOT >Sharing assignment scheme originally porposed by: D
moeoSolutionUnaryMetric< ObjectiveVector, R >Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector
moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors
moeoStochTournamentSelect< MOEOT >Selection strategy that selects ONE individual by stochastic tournament
moeoUnaryMetric< A, R >Base class for unary metrics
moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >Base class for fixed length chromosomes, just derives from MOEO and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison)
moeoVectorUnaryMetric< ObjectiveVector, R >Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors)
moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors)
+
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classMOEO-members.html b/trunk/paradiseo-moeo/doc/html/classMOEO-members.html new file mode 100644 index 000000000..a1c7f047a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classMOEO-members.html @@ -0,0 +1,86 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+
+
+

MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Member List

This is the complete list of members for MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
className() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
diversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
diversity(const Diversity &_diversityValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
Diversity typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
diversityValueMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [private]
EO()EO< MOEOObjectiveVector >
EO()EO< MOEOObjectiveVector >
Fitness typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
fitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
fitness(const Fitness &_fitnessValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::fitness(const Fitness &_fitness)EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::fitness(performance_type perf)EO< MOEOObjectiveVector >
fitness_traits typedefEO< MOEOObjectiveVector >
fitnessValueMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [private]
invalid() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate_worth(void)EO< MOEOObjectiveVector >
invalidateDiversity()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateFitness()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateObjectiveVector()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidDiversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidDiversityValueMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [private]
invalidFitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidFitnessValueMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [private]
invalidObjectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidObjectiveVectorValueMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [private]
MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
ObjectiveVector typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
objectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
objectiveVector(const ObjectiveVector &_objectiveVectorValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
objectiveVectorValueMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [private]
operator<(const MOEO &_other) const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::operator<(const EO &_eo2) const EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::operator<(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
operator>(const EO &_eo2) const EO< MOEOObjectiveVector >
operator>(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
performance(performance_type perf)EO< MOEOObjectiveVector >
performance(void) const EO< MOEOObjectiveVector >
performance_type typedefEO< MOEOObjectiveVector >
printOn(std::ostream &_os) const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
readFrom(std::istream &_is)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
storage_type typedefEO< MOEOObjectiveVector >
worth(worth_type worth)EO< MOEOObjectiveVector >
worth(void) const EO< MOEOObjectiveVector >
worth_type typedefEO< MOEOObjectiveVector >
~EO()EO< MOEOObjectiveVector > [virtual]
~eoObject()eoObject [virtual]
~eoPersistent()eoPersistent [virtual]
~eoPrintable()eoPrintable [virtual]
~MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classMOEO.html b/trunk/paradiseo-moeo/doc/html/classMOEO.html new file mode 100644 index 000000000..880d533b0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classMOEO.html @@ -0,0 +1,388 @@ + + +ParadisEO-MOEO: MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Class Template Reference + + + + +
+
+
+
+

MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Class Template Reference

Base class allowing to represent a solution (an individual) for multi-objective optimization. +More... +

+#include <MOEO.h> +

+

Inheritance diagram for MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >: +

+ +EO< MOEOObjectiveVector > +eoObject +eoPersistent +eoPrintable +moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > +moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > +moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > +moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > +moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOObjectiveVector ObjectiveVector
 the objective vector type of a solution
+typedef MOEOFitness Fitness
 the fitness type of a solution
+typedef MOEODiversity Diversity
 the diversity type of a solution

Public Member Functions

MOEO ()
 Ctor.
+virtual ~MOEO ()
 Virtual dtor.
+ObjectiveVector objectiveVector () const
 Returns the objective vector of the current solution.
void objectiveVector (const ObjectiveVector &_objectiveVectorValue)
 Sets the objective vector of the current solution.
+void invalidateObjectiveVector ()
 Sets the objective vector as invalid.
+bool invalidObjectiveVector () const
 Returns true if the objective vector is invalid, false otherwise.
+Fitness fitness () const
 Returns the fitness value of the current solution.
void fitness (const Fitness &_fitnessValue)
 Sets the fitness value of the current solution.
+void invalidateFitness ()
 Sets the fitness value as invalid.
+bool invalidFitness () const
 Returns true if the fitness value is invalid, false otherwise.
+Diversity diversity () const
 Returns the diversity value of the current solution.
void diversity (const Diversity &_diversityValue)
 Sets the diversity value of the current solution.
+void invalidateDiversity ()
 Sets the diversity value as invalid.
+bool invalidDiversity () const
 Returns true if the diversity value is invalid, false otherwise.
+void invalidate ()
 Sets the objective vector, the fitness value and the diversity value as invalid.
+bool invalid () const
 Returns true if the fitness value is invalid, false otherwise.
bool operator< (const MOEO &_other) const
 Returns true if the objective vector of the current solution is smaller than the objective vector of _other on the first objective, then on the second, and so on (can be usefull for sorting/printing).
+virtual std::string className () const
 Return the class id (the class name as a std::string).
virtual void printOn (std::ostream &_os) const
 Writing object.
virtual void readFrom (std::istream &_is)
 Reading object.

Private Attributes

+ObjectiveVector objectiveVectorValue
 the objective vector of this solution
+bool invalidObjectiveVectorValue
 true if the objective vector is invalid
+Fitness fitnessValue
 the fitness value of this solution
+bool invalidFitnessValue
 true if the fitness value is invalid
+Diversity diversityValue
 the diversity value of this solution
+bool invalidDiversityValue
 true if the diversity value is invalid
+

Detailed Description

+

template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ class MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >

+ +Base class allowing to represent a solution (an individual) for multi-objective optimization. +

+The template argument MOEOObjectiveVector allows to represent the solution in the objective space (it can be a moeoObjectiveVector object). The template argument MOEOFitness is an object reflecting the quality of the solution in term of convergence (the fitness of a solution is always to be maximized). The template argument MOEODiversity is an object reflecting the quality of the solution in term of diversity (the diversity of a solution is always to be maximized). All template arguments must have a void and a copy constructor. Using some specific representations, you will have to define a copy constructor if the default one is not what you want. In the same cases, you will also have to define the affectation operator (operator=). Then, you will explicitly have to call the parent copy constructor and the parent affectation operator at the beginning of the corresponding implementation. Besides, note that, contrary to the mono-objective case (and to EO) where the fitness value of a solution is confused with its objective value, the fitness value differs of the objectives values in the multi-objective case. +

+ +

+Definition at line 34 of file MOEO.h.


Member Function Documentation

+ +
+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
void MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVector (const ObjectiveVector _objectiveVectorValue  )  [inline]
+
+
+ +

+Sets the objective vector of the current solution. +

+

Parameters:
+ + +
_objectiveVectorValue the new objective vector
+
+ +

+Definition at line 85 of file MOEO.h. +

+References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidObjectiveVectorValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVectorValue. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
void MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::fitness (const Fitness _fitnessValue  )  [inline]
+
+
+ +

+Sets the fitness value of the current solution. +

+

Parameters:
+ + +
_fitnessValue the new fitness value
+
+ +

+Definition at line 127 of file MOEO.h. +

+References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::fitnessValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidFitnessValue. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
void MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::diversity (const Diversity _diversityValue  )  [inline]
+
+
+ +

+Sets the diversity value of the current solution. +

+

Parameters:
+ + +
_diversityValue the new diversity value
+
+ +

+Definition at line 169 of file MOEO.h. +

+References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::diversityValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidDiversityValue. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
bool MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::operator< (const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > &  _other  )  const [inline]
+
+
+ +

+Returns true if the objective vector of the current solution is smaller than the objective vector of _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +

+You should implement another function in the sub-class of MOEO to have another sorting mecanism.

Parameters:
+ + +
_other the other MOEO object to compare with
+
+ +

+Definition at line 220 of file MOEO.h. +

+References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVector(). +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
virtual void MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn (std::ostream &  _os  )  const [inline, virtual]
+
+ +

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
virtual void MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom (std::istream &  _is  )  [inline, virtual]
+
+ +

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classMOEO.png b/trunk/paradiseo-moeo/doc/html/classMOEO.png new file mode 100644 index 0000000000000000000000000000000000000000..43ac723c7834f7ca515d503184ec4241f51307ba GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classes.html b/trunk/paradiseo-moeo/doc/html/classes.html new file mode 100644 index 000000000..f137773a7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classes.html @@ -0,0 +1,56 @@ + + +ParadisEO-MOEO: Alphabetical List + + + + +
+
+ +

ParadisEO-MOEO Class Index

A | B | C | D | E | F | G | H | I | L | M | N | O | P | R | S | U | V

+ +
  A  
+
moeoEasyEA::eoDummyTransform   moeoNormalizedSolutionVsSolutionBinaryMetric   
moeoAchievementFitnessAssignment   moeoElitistReplacement   moeoNSGA   
moeoAdditiveEpsilonBinaryMetric   moeoElitistReplacement::Cmp   moeoNSGAII   
moeoAggregativeComparator   moeoEntropyMetric   
  O  
+
moeoAlgo   moeoEnvironmentalReplacement   moeoObjectiveObjectiveVectorComparator   
moeoArchive   moeoEnvironmentalReplacement::Cmp   moeoObjectiveVector   
moeoArchiveObjectiveVectorSavingUpdater   moeoEuclideanDistance   moeoObjectiveVectorComparator   
moeoArchiveUpdater   moeoEvalFunc   moeoObjectiveVectorDouble   
  B  
+
  F  
+
moeoObjectiveVectorTraits   
moeoBinaryMetric   moeoFastNonDominatedSortingFitnessAssignment   moeoOneObjectiveComparator   
moeoBinaryMetricSavingUpdater   moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator   
  P  
+
moeoBitVector   moeoFitnessAssignment   moeoParetoBasedFitnessAssignment   
  C  
+
moeoFitnessThenDiversityComparator   moeoParetoObjectiveVectorComparator   
moeoCombinedLS   moeoFrontByFrontCrowdingDistanceDiversityAssignment   
  R  
+
moeoComparator   moeoFrontByFrontSharingDiversityAssignment   moeoRandomSelect   
moeoContributionMetric   
  G  
+
moeoRealVector   
moeoConvertPopToObjectiveVectors   moeoGDominanceObjectiveVectorComparator   moeoReplacement   
moeoCriterionBasedFitnessAssignment   moeoGenerationalReplacement   moeoRouletteSelect   
moeoCrowdingDistanceDiversityAssignment   
  H  
+
  S  
+
  D  
+
moeoHybridLS   moeoScalarFitnessAssignment   
moeoDetTournamentSelect   moeoHypervolumeBinaryMetric   moeoSelectFromPopAndArch   
moeoDistance   
  I  
+
moeoSelectOne   
moeoDistanceMatrix   moeoIBEA   moeoSharingDiversityAssignment   
moeoDiversityAssignment   moeoIndicatorBasedFitnessAssignment   moeoSolutionUnaryMetric   
moeoDiversityThenFitnessComparator   
  L  
+
moeoSolutionVsSolutionBinaryMetric   
moeoDummyDiversityAssignment   moeoLS   moeoStochTournamentSelect   
moeoDummyFitnessAssignment   
  M  
+
  U  
+
  E  
+
moeoManhattanDistance   moeoUnaryMetric   
moeoEA   moeoMetric   
  V  
+
moeoEasyEA   MOEO   moeoVector   
moeoEasyEA::eoDummyEval   
  N  
+
moeoVectorUnaryMetric   
moeoEasyEA::eoDummySelect   moeoNormalizedDistance   moeoVectorVsVectorBinaryMetric   

A | B | C | D | E | F | G | H | I | L | M | N | O | P | R | S | U | V

+


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment-members.html new file mode 100644 index 000000000..31cd49829 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment-members.html @@ -0,0 +1,51 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoAchievementFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoAchievementFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + +
compute(MOEOT &_moeo)moeoAchievementFitnessAssignment< MOEOT > [inline, private]
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
inf() const moeoAchievementFitnessAssignment< MOEOT > [inline, private]
lambdasmoeoAchievementFitnessAssignment< MOEOT > [private]
moeoAchievementFitnessAssignment(ObjectiveVector &_reference, std::vector< double > &_lambdas, double _spn=0.0001)moeoAchievementFitnessAssignment< MOEOT > [inline]
moeoAchievementFitnessAssignment(ObjectiveVector &_reference, double _spn=0.0001)moeoAchievementFitnessAssignment< MOEOT > [inline]
ObjectiveVector typedefmoeoAchievementFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoAchievementFitnessAssignment< MOEOT > [inline, virtual]
referencemoeoAchievementFitnessAssignment< MOEOT > [private]
setReference(const ObjectiveVector &_reference)moeoAchievementFitnessAssignment< MOEOT > [inline]
spnmoeoAchievementFitnessAssignment< MOEOT > [private]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoAchievementFitnessAssignment< MOEOT > [inline, virtual]
moeoScalarFitnessAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.html new file mode 100644 index 000000000..997874957 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.html @@ -0,0 +1,344 @@ + + +ParadisEO-MOEO: moeoAchievementFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoAchievementFitnessAssignment< MOEOT > Class Template Reference

Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). +More... +

+#include <moeoAchievementFitnessAssignment.h> +

+

Inheritance diagram for moeoAchievementFitnessAssignment< MOEOT >: +

+ +moeoScalarFitnessAssignment< MOEOT > +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

 moeoAchievementFitnessAssignment (ObjectiveVector &_reference, std::vector< double > &_lambdas, double _spn=0.0001)
 Default ctor.
 moeoAchievementFitnessAssignment (ObjectiveVector &_reference, double _spn=0.0001)
 Ctor with default values for lambdas (1/nObjectives).
virtual void operator() (eoPop< MOEOT > &_pop)
 Sets the fitness values for every solution contained in the population _pop.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)
 Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do).
void setReference (const ObjectiveVector &_reference)
 Sets the reference point.

Private Member Functions

+double inf () const
 Returns a big value (regarded as infinite).
void compute (MOEOT &_moeo)
 Computes the fitness value for a solution.

Private Attributes

+ObjectiveVector reference
 the reference point
+std::vector< double > lambdas
 the weighted coefficients vector
+double spn
 an arbitrary small positive number (0 < _spn << 1)
+

Detailed Description

+

template<class MOEOT>
+ class moeoAchievementFitnessAssignment< MOEOT >

+ +Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). +

+ +

+Definition at line 24 of file moeoAchievementFitnessAssignment.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoAchievementFitnessAssignment< MOEOT >::moeoAchievementFitnessAssignment (ObjectiveVector _reference,
std::vector< double > &  _lambdas,
double  _spn = 0.0001 
) [inline]
+
+
+ +

+Default ctor. +

+

Parameters:
+ + + + +
_reference reference point vector
_lambdas weighted coefficients vector
_spn arbitrary small positive number (0 < _spn << 1)
+
+ +

+Definition at line 38 of file moeoAchievementFitnessAssignment.h. +

+References moeoAchievementFitnessAssignment< MOEOT >::spn. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoAchievementFitnessAssignment< MOEOT >::moeoAchievementFitnessAssignment (ObjectiveVector _reference,
double  _spn = 0.0001 
) [inline]
+
+
+ +

+Ctor with default values for lambdas (1/nObjectives). +

+

Parameters:
+ + + +
_reference reference point vector
_spn arbitrary small positive number (0 < _spn << 1)
+
+ +

+Definition at line 54 of file moeoAchievementFitnessAssignment.h. +

+References moeoAchievementFitnessAssignment< MOEOT >::lambdas, and moeoAchievementFitnessAssignment< MOEOT >::spn. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoAchievementFitnessAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the fitness values for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 75 of file moeoAchievementFitnessAssignment.h. +

+References moeoAchievementFitnessAssignment< MOEOT >::compute(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoAchievementFitnessAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do). +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implements moeoFitnessAssignment< MOEOT >. +

+Definition at line 89 of file moeoAchievementFitnessAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoAchievementFitnessAssignment< MOEOT >::setReference (const ObjectiveVector _reference  )  [inline]
+
+
+ +

+Sets the reference point. +

+

Parameters:
+ + +
_reference the new reference point
+
+ +

+Definition at line 99 of file moeoAchievementFitnessAssignment.h. +

+References moeoAchievementFitnessAssignment< MOEOT >::reference. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoAchievementFitnessAssignment< MOEOT >::compute (MOEOT &  _moeo  )  [inline, private]
+
+ +

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoAchievementFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..4396fd5a311832a8510826e86cb68c3504a28ca2 GIT binary patch literal 1898 zcmcgteK^w#8~&+No$5?QMQ2ze$+{}?HM|S84KX$3W0;Rrm^CzW4x(^nG+%MBtTTpH z3!~$sT4XY-oUjvHrZ_d^vr=@*_qO%9@kJU zs<)R9;5_;IJOFG0+|e$+Ke6Unfj1P0o#=WtxO)z$uT-={-ty&Y9YP!v9drNWM2&HY zO#t=>SG~rkUfr|mKIPKl*kG9v=PU{>R%sVma+4<$c(pqY1<~w>!lic9oM$ham?q&T zR;2c`K8(fZ(qv8{e0+I(k+^&Whn7a?Ua*E^Rf8e9(j>Yk-6zAx7%G;q94;3|U2M*m z+;B^I>Dqe;3l``Ewu5AjMbBKz4sbqx{CyRfe#|kS_i!>c>L;&w2U!;~q31HKVeQV} zrzF$!hfH>?ygGgF316_UZHQWy1sRy>*Q=;Jla3Az?ZQS4!tm)PD{u#R`1&hZ5J1Nk zaC;5x{m;pbk(h||%psnbvS!3F(WoIeyD!WmKgL-ohptnF{#MChGoISyZ-$Eb^6$4~ zR#A>u+uDoXrQSLxGP=w@AYjU*!tK}Lxn{gujk`-UboVjkS@r9A@uz?=s z@-PA)=`|%9fS5zEOO|;3A6rk>#e(HTdd4SWL`lCLI+;1^21O4`{1tBw>*@x3w)Nql z?URG_g8sUY?e!+)o+w_*A<>IHM>p9slJIFnR#I}Jtn-KJP-{9sxY>{zuVb!7FgnRCA0GdYH#5}(Z9Dy_<%3P9;J zIYC;ISHW#Or=)f#4)|sfq^qFA+a#MeLxFv3tF8{JO)8r<@ zt=;>=`&+BUphF_&>HGCoAM75Myjm&PihoRYB(%%ub@8IIy!^OCv-FP5Bcf2n$jjR1 z>v_bRm+qm1P;D6N;SEKfz?-KaB&eYBQQ%|5Ij(6D>{udWl$!7JwyM;i`T@9?#yX6P zqq&#(Z7BCG3Mr6Od`x~QzY9Ovm(D1u*e&#^FViRMhA<=v215|DQtSLm8Pz}pW0CxO z@K&KqyFKJ>?t|8b@q`tcI?d_u9R~5_F9eR z+ZWxsLF>Vpg%zhee~W%ewqi0viF87n{ZC}q_?8fao1-)m7QfYxouJle++IP8%8v*Z zp^qI$g~Au^EqmLNw2&CzJ?|3R2R@HN1QP^pnpS`rp=tSRxV%0cq}1j8tZb!`emgR~ zWRSE#q@}0de~y(&4g*lMM}^a%_t-j$^~It4c`NqFhCi>kk-=0KVV7NNP3@V@@_6op=QjA@gK-!2t~}K@ zt$1R|-n$fggn;*!bovj-lW0xnE=-%PjY*rlFg=M!pk>?8UT<~#~;Oy~I~@fl8>txmKq z1kdYW@z~e&WISI)Wk@4&zil9W^5l%Z`R9yh1%6{ExW-32R*0F}<0Yoz1Eqfuzq;O) z#c%?!S679kYT5DrBWIPl+fMANwrGfen0jD#W|MOVzwt8t%W^E``v^JsN39|oZ9dX+ zH|n(RL{sq{1u~|$WWWChf@A)R;H~yuipt{OKe#{b>2~3x&$6z`N$?9cvOj9MN6#I# z;k#PM(y)35K}$~WF13CU?7K2$&}cOC-!ZWOTWb&u@5(3>YJw4P$9SO|j)!IZ6SAs% AJpcdz literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric-members.html new file mode 100644 index 000000000..96c38dd6b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric-members.html @@ -0,0 +1,47 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoAdditiveEpsilonBinaryMetric< ObjectiveVector > Member List

This is the complete list of members for moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >, including all inherited members.

+ + + + + + + + + + + +
boundsmoeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [protected]
epsilon(const ObjectiveVector &_o1, const ObjectiveVector &_o2, const unsigned int _obj)moeoAdditiveEpsilonBinaryMetric< ObjectiveVector > [inline, private]
functor_category()eoBF< A1, A2, R > [static]
moeoNormalizedSolutionVsSolutionBinaryMetric()moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline]
operator()(const ObjectiveVector &_o1, const ObjectiveVector &_o2)moeoAdditiveEpsilonBinaryMetric< ObjectiveVector > [inline]
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
setup(double _min, double _max, unsigned int _obj)moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline, virtual]
tiny()moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline, static]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.html new file mode 100644 index 000000000..164165d6a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.html @@ -0,0 +1,171 @@ + + +ParadisEO-MOEO: moeoAdditiveEpsilonBinaryMetric< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoAdditiveEpsilonBinaryMetric< ObjectiveVector > Class Template Reference

Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C. +More... +

+#include <moeoAdditiveEpsilonBinaryMetric.h> +

+

Inheritance diagram for moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >: +

+ +moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > +moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double > +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + + + + + +

Public Member Functions

double operator() (const ObjectiveVector &_o1, const ObjectiveVector &_o2)
 Returns the minimal distance by which the objective vector _o1 must be translated in all objectives so that it weakly dominates the objective vector _o2.

Private Member Functions

double epsilon (const ObjectiveVector &_o1, const ObjectiveVector &_o2, const unsigned int _obj)
 Returns the epsilon value by which the objective vector _o1 must be translated in the objective _obj so that it dominates the objective vector _o2.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >

+ +Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C. +

+M., Grunert da Fonseca V.: Performance Assessment of Multiobjective Optimizers: An Analysis and Review. IEEE Transactions on Evolutionary Computation 7(2), pp.117–132 (2003). +

+ +

+Definition at line 24 of file moeoAdditiveEpsilonBinaryMetric.h.


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
double moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >::operator() (const ObjectiveVector &  _o1,
const ObjectiveVector &  _o2 
) [inline]
+
+
+ +

+Returns the minimal distance by which the objective vector _o1 must be translated in all objectives so that it weakly dominates the objective vector _o2. +

+

Warning:
don't forget to set the bounds for every objective before the call of this function
+
Parameters:
+ + + +
_o1 the first objective vector
_o2 the second objective vector
+
+ +

+Definition at line 35 of file moeoAdditiveEpsilonBinaryMetric.h. +

+References moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >::epsilon(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + + + + + + + +
double moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >::epsilon (const ObjectiveVector &  _o1,
const ObjectiveVector &  _o2,
const unsigned int  _obj 
) [inline, private]
+
+
+ +

+Returns the epsilon value by which the objective vector _o1 must be translated in the objective _obj so that it dominates the objective vector _o2. +

+

Parameters:
+ + + + +
_o1 the first objective vector
_o2 the second objective vector
_obj the index of the objective
+
+ +

+Definition at line 64 of file moeoAdditiveEpsilonBinaryMetric.h. +

+References moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >::bounds. +

+Referenced by moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoAdditiveEpsilonBinaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..636b8dfc529ed5fbdc6bf2d0393380a959eae336 GIT binary patch literal 2698 zcmchZX;_l!8pmnsv`%2z88tz(8l5zeToJbnml{-ZsT@VkN=wah!JVLNc`Hq7OmRWU z%yh~?O+#=^3TI4HLr}-k+yZgSP$LXE*fggzA5Q0dnh)>w-tYf(_2x3j%@G@7wF(0Rk<*1OhEXtXQs8G~A;|%9r|n7cWPJLZLJjibfjk@O7p2>1k|i zOlne$C_k6sJ={D&yWjK#gFtJy>~pa9ilSplMowsJKKT)R~yKGHoo*^9X?p@7x3@4UWZh5TY>e zL!6=kyRAoS2%AIaENSVvI>dDq=0>th?E(Rqp>o8>AwM{Nq{2+1E(1q(@!m#$;Q=f#!z*s}c2MBBet zyfCHVOafKxV*YwU9{oIdDb!9K6#g;cf*E7Mu6~U*T{)#RlQfQwQ&jBYx}DXyMd1cM5-ZIuZb|dM>`#VJ<60(^6JGS>c|> zNUTS<0hNNLnCdC8rzXgX@Isq7tirOhuFIqgHN&w3c$^p~mp1b$O8wheZyOk8uGkP?9?9@?sxP&SaIPk za{aygy0>gQ>bWan{zEwI5k4!67uBI5=NCx&4o;6c*;bypwjNdcgq42*g%4Srs1}UZ ziYhE0OdnKkU=*3Z+;0Kh(0+^*k@cqL4{c^YcB>)ddB%=ObZ@EE?EP|kfD&J#=k7DO;gndAS*g23fYq+cKID$HfB`?%BMKS2yweH#)xDK*4KWfcz*%jd4?s~K;@n>{8{ zLy+1Yd354lzE(pXpA3$+y4d2uPaS0XG7hpz#6Fvh77S6fjj8}j!7y+%s7$rbf%ZI= zZR&q|3Bq_(?>@T6Or$eIcsv?%dHC3inRB8@9~E>ySSP;%l?EnPzkc7#I`3~&@A6`@ zkbEX{s@Qj+B&q=HXR{;T3>N=`r^J~trjJh`6JE0ESjT=rV640AEn>yUv+k4!r@dI0 zy8~@36{^4}wR13XqqK4{`$?Y_9*(lEjO zRsFy!PM0=n9%xwy@T*Nnl0%KV_HAn)LDc>(bIM4OE)3ejGu(?`GBK1OwgL&iMk&TD zMBz4%N#b(i?&ChT*R91%E#Y3Q>R@5pMqRvg7hU?{OAYGZ@S-6=;ed5dR%ct- zhI(i9rM_IX;cWpr-dl5-_TP{QWH4tKnvnF{nmqWX;{K=MFqtzD6RpFqslLX!<&Vp* zu(-oYsB6!F`FgKnlZsNxutdm#C2f2q#xQ^?t#U~RdruD$ z!G1(rZ77?N4HDE;(>O6_h7fhsi)H~1d*|S%LLulJ?rM(^q6Lo)-eUK z5ZWM$Vl{{b^~1Rk3OE4KKGw*NB-_p>*)fM|VZ!GNLO)vnDj2c(qEq(h&soe%aWept zN(qYUOJweRG20hfM>j|JHGEIM?wk1F`Al`t4Oel5FTOAFl~JC97RGveesF^@WQVYO zZfqa^A1IgBlpYV0->EXQ(h&{yD!c&A6pY7cz_g~Odu3>on+?ko+s+xHqS}e?b$mtShPz0|$rcPq@sP6)Kc-O5k-K%Kf z(A)?ZT8=*4KPKfJVa%&}r{pG~{e!+WvWw@kU^5WXkRRg;44e)0FZ#ww+p(+8-S39U$E_{eiJ*=(Y?4!d1E_ew^?M& z`=m6rKx-0|;_v1RoR);A`yqV?Rvk;GyT%sn8+#khHt#J`o5Jq-0#8|fFFAuE3yAq$ d()q + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoAggregativeComparator< MOEOT > Member List

This is the complete list of members for moeoAggregativeComparator< MOEOT >, including all inherited members.

+ + + + + + + + +
functor_category()eoBF< A1, A2, R > [static]
moeoAggregativeComparator(double _weightFitness=1.0, double _weightDiversity=1.0)moeoAggregativeComparator< MOEOT > [inline]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoAggregativeComparator< MOEOT > [inline]
moeoComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
weightDiversitymoeoAggregativeComparator< MOEOT > [private]
weightFitnessmoeoAggregativeComparator< MOEOT > [private]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.html new file mode 100644 index 000000000..0dc53395a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.html @@ -0,0 +1,162 @@ + + +ParadisEO-MOEO: moeoAggregativeComparator< MOEOT > Class Template Reference + + + + +
+
+ +

moeoAggregativeComparator< MOEOT > Class Template Reference

Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. +More... +

+#include <moeoAggregativeComparator.h> +

+

Inheritance diagram for moeoAggregativeComparator< MOEOT >: +

+ +moeoComparator< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + +

Public Member Functions

 moeoAggregativeComparator (double _weightFitness=1.0, double _weightDiversity=1.0)
 Ctor.
const bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 < _moeo2 according to the aggregation of their fitness and diversity values.

Private Attributes

+double weightFitness
 the weight for fitness
+double weightDiversity
 the weight for diversity
+

Detailed Description

+

template<class MOEOT>
+ class moeoAggregativeComparator< MOEOT >

+ +Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. +

+ +

+Definition at line 22 of file moeoAggregativeComparator.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoAggregativeComparator< MOEOT >::moeoAggregativeComparator (double  _weightFitness = 1.0,
double  _weightDiversity = 1.0 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + +
_weightFitness the weight for fitness
_weightDiversity the weight for diversity
+
+ +

+Definition at line 31 of file moeoAggregativeComparator.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const bool moeoAggregativeComparator< MOEOT >::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns true if _moeo1 < _moeo2 according to the aggregation of their fitness and diversity values. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 40 of file moeoAggregativeComparator.h. +

+References moeoAggregativeComparator< MOEOT >::weightDiversity, and moeoAggregativeComparator< MOEOT >::weightFitness. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoAggregativeComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..6a43ed01696985e399f545f5749a02ddadf71a7c GIT binary patch literal 1050 zcmV+#1m*jQP)FL|dtLh;{*0G3gB$#5 zivXb-hAce=-VQ^ShDY5U;mP6%1dr(z03}I);z)4pk(t6Zg7L21i$pB^IPrfy~{rs{`2pq@UNero5F7#?FKiv!3}P3gB#r71~<6D zPk~?haNxerWDNeh;h4XGl0S=MmFEg$e$IYKnqv%Y4kJ|0^*OZ_vf7UDNLhpqJY!;H z>;Z61rzkw)QPMeCBM%rJ*X;cUIQu-vypM3fiO<*2*TBt4-bu{!TNv z!B2)?`qTN+KMkJ?x4hcz;5UwTgB#r71~<6D4Q_CQ8{FWhz%P9`aNlP#2LHA2IF~DH z#PaB!N?Q1U$&iJzmUZyi2ly>KjbO|vwm4R4pAGOxNeyVKcJNGvJ0gx%xmpbmn)3)x zYv^X+0b)t51WDNi5<{s`%jIear6tGMh0kpL3|uOprtn-C6~)0)H^sA8Z~$m5@6(^a zOO09sr-C^=3LNyR(6@Ys{><{R2iG#Ospa$Vmn`RPmy{aAp$BK5m!iE%v~Tx$iFUfr zDe8lkW#Vq6qm--ZRdITszY^_B?S=YNgTD{ou^If1@JoL>U;3xvbK#a(yB++-(Qa^q z8{FUqH@LwKZg7Je{1iA`*Zkmj*@Bmv!40m`zOu_*fWC@rMxNdd@D1FdAYXzz_b6-E z20?@v5?RN<>qA4m(k6&z`F zaLRAto~OkHdVS$lK-W4R;HhX0WDcZdIWKGC54npL(;|EqPM-?AnYQ2ueRZ@L?j4WS ze_kh$*$X_my0)Cx)=Ue)3x^t>g(Oiy3wLyd1BEj?o!v0A?Wi%aX^@kvEg!PI442TW z;ni+6me0aFmMc`<47%;v=MuVZ$jiw-Z{TJ2ZnRH*UZR~eG}?y}?HHD*jyEc>Ho+;{ z`G!e-iuNj;C-?b7wD()1xbQtV^QEw&&BDEg@uJp2aPdMJoC!ap8T^j$D}Orw2i$=3 Up0G!;;s5{u07*qoM6N<$f|x`L?*IS* literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAlgo.html b/trunk/paradiseo-moeo/doc/html/classmoeoAlgo.html new file mode 100644 index 000000000..60e82c3f9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoAlgo.html @@ -0,0 +1,61 @@ + + +ParadisEO-MOEO: moeoAlgo Class Reference + + + + +
+
+ +

moeoAlgo Class Reference

Abstract class for multi-objective algorithms. +More... +

+#include <moeoAlgo.h> +

+

Inheritance diagram for moeoAlgo: +

+ +moeoEA< MOEOT > +moeoLS< MOEOT, Type > +moeoEasyEA< MOEOT > +moeoIBEA< MOEOT > +moeoNSGA< MOEOT > +moeoNSGAII< MOEOT > +moeoCombinedLS< MOEOT, Type > + + + +
+

Detailed Description

+Abstract class for multi-objective algorithms. +

+ +

+Definition at line 19 of file moeoAlgo.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoAlgo.png b/trunk/paradiseo-moeo/doc/html/classmoeoAlgo.png new file mode 100644 index 0000000000000000000000000000000000000000..464a61acdf631d28e6120658ce87de0ef781bd1c GIT binary patch literal 1962 zcmbtVeLT}^8=n+Mhp9ACcAVrTCOIdsi-bHg&6=0J;mOKNNK?+H$h?%N5wUojKFlbK zq;1AHk!VPssT|~NL}gx@`Q=^S!k%?L&vQQKpXZO~dH%TX@Atm$>wDeT=W|{6=gPpK z5n9{#ZU=!tT1d|mz97(6ijt>qRaNd3=X;Av(8HkoJroLsk}4F!k`fX_$$no#q3~*} zVoZ5dq4=WxK*vA!hl4=s$B`#o{jU^Fv1r+BhaK%YxB8MF(^Lg}2veR{zdH&0yphA7 z+p|Ns&C1j&AfRTEJS;-+eOdG6cI??2eK7u&WA>8VtZ4nf`eUmy*X zHLkzrqfha<3yH1p<&U#H$;9z5bN)H>?b@jB{jXLesK=s#)`1>{Lv{p!8{Byb)=cn`aI=C9J82-5I75ohZ z#|QKH_n>Rgsww1_eQ2 zP*DBBV3*#VDVbmIU0iVRtrxvXP+_~5I*51k4<8F09CQ)Op@4=f338ASTivUY^5|@t zDhU6Fqro_!jv>fZ`>cX{Rcx~J!FT^kg6@Suk2eb8HaK`nTq-p}8DMG)(5(#dcANN~ zGDz*W9QTki)rdU=`U@}hZYw_c)_*0e5LSJ#+#GM3ijh+?rQ@q#T;31f7aSUqVDbQ> ztfX*!^(1`INSO!0O!<;35UNaq#IodrwK#d>d}@|&f*$2<-)5B${ONGmM3b;Pj9+)>33k$z2fwJ^UcEzbI=>81m;07OoKA9kP$Z7+@=c+Rq~N?4&E0#=?B zU{w|;T8&=!J;0UCwX%4%OZ~&h( zta;%T!|~ZSGmD`tB2i5c42gk`;$0(Kp3b8$i}i0@3XKb%Tkq7B+p)W>oj>7Cb{{5~ z=}xGzyP|!ygQdG{(7`XyXG}}rK+VKPB}&}zI^bNK`A*Xr|8zp>Dm053bcWkG9~XR1 zU||~2(G*9AaZYuoQXR5neO+3b1hZegxp``3O@rlpbTKo)tlIuz8$6y&W;v5sPJFNi zCr@3xKb1N!gd6kG-x26zXT@id0@6A@bNuR@Bx}}MI*DmHf3Ef{@DF6S(@|}X`xYQ{ zbnQZRAqPeq$Hof#e&Eb;ek8 zk#AIk?Gh{9`Q^~E|4N4~zOxQv(P_O1b~3@6>c3rT;9-(-)~)1p6WZaplHvYLuZ3N& zy$XqUXSCcGMLZdT!H39ixe|E2ZqQ@V3j4W-iTV^nCTeY(0I1Cu53zlAa05Z&%AE z>LEq)rIF4Hc78(!L6LwZGZqlU9?d=Js&lkbt#PgCYJRVkJYEzQ#_}v=bXakVPM87F z_KC|MaOA*t$*TdLY>=I;|54+HqupY!X5c1aZTVMUf3GGMG|;hEOk8sCJ`eq6D0|Ec z!*qx$0dmn<@R|JIdMr#ecSs?)(mbjiocUmA(QqmO9ndjjRJ<~MFgu1ig}_!ezdv>~ z-Ky@Y80p>6;X{W#KG3ksMw*uS2p@N6kp^VtfA+iN1j81d(#zm+j{wolHC=}CgytiY zS&#NXCm&Kfjaksu-KVnP=7W({P7P2|{#||B(VjkvkJ9E|lZ`y_o zbLmxN&)os^V=c?_hZV~V6k>?;;?|Eq5tQ=8VzS9tl4p~&u7UjJKen*(f~p=W@do3Q b+kEn(bemaMJv%}DoU5DHg^r literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchive-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoArchive-members.html new file mode 100644 index 000000000..c9dbefb97 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoArchive-members.html @@ -0,0 +1,80 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoArchive< MOEOT > Member List

This is the complete list of members for moeoArchive< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
append(unsigned _newPopSize, eoInit< MOEOT > &_chromInit)eoPop< MOEOT >
best_element() const eoPop< MOEOT >
className() const eoPop< MOEOT > [virtual]
comparatormoeoArchive< MOEOT > [private]
contains(const ObjectiveVector &_objectiveVector) const moeoArchive< MOEOT > [inline]
dominates(const ObjectiveVector &_objectiveVector) const moeoArchive< MOEOT > [inline]
eoPop()eoPop< MOEOT >
eoPop(unsigned _popSize, eoInit< MOEOT > &_chromInit)eoPop< MOEOT >
eoPop(std::istream &_is)eoPop< MOEOT >
eoPop(void)eoPop< MOEOT >
equals(const moeoArchive< MOEOT > &_arch)moeoArchive< MOEOT > [inline]
Fitness typedefeoPop< MOEOT >
fitness_traits typedefeoPop< MOEOT >
getPerf2Worth()eoPop< MOEOT >
invalidate()eoPop< MOEOT > [virtual]
it_best_element()eoPop< MOEOT >
it_worse_element()eoPop< MOEOT >
moeoArchive()moeoArchive< MOEOT > [inline]
moeoArchive(moeoObjectiveVectorComparator< ObjectiveVector > &_comparator)moeoArchive< MOEOT > [inline]
nth_element(int nth)eoPop< MOEOT >
nth_element(int which, std::vector< const MOEOT * > &result) const eoPop< MOEOT >
nth_element_fitness(int which) const eoPop< MOEOT >
ObjectiveVector typedefmoeoArchive< MOEOT >
paretoComparatormoeoArchive< MOEOT > [private]
printOn(std::ostream &_os) const eoPop< MOEOT > [virtual]
readFrom(std::istream &_is)eoPop< MOEOT > [virtual]
scale()eoPop< MOEOT >
setPerf2Worth(eoPerf2Worth< MOEOT > &_p2w)eoPop< MOEOT >
setPerf2Worth(eoPerf2Worth< MOEOT > *_p2w)eoPop< MOEOT >
shuffle(void)eoPop< MOEOT >
shuffle(std::vector< const MOEOT * > &result) const eoPop< MOEOT >
sort(void)eoPop< MOEOT >
sort(std::vector< const MOEOT * > &result) const eoPop< MOEOT >
sort()eoPop< MOEOT >
sortedPrintOn(std::ostream &_os) const eoPop< MOEOT > [virtual]
swap(eoPop< MOEOT > &other)eoPop< MOEOT >
swap(eoPop< MOEOT > &other)eoPop< MOEOT >
update(const MOEOT &_moeo)moeoArchive< MOEOT > [inline]
update(const eoPop< MOEOT > &_pop)moeoArchive< MOEOT > [inline]
worse_element() const eoPop< MOEOT >
~eoObject()eoObject [virtual]
~eoPersistent()eoPersistent [virtual]
~eoPop()eoPop< MOEOT > [virtual]
~eoPrintable()eoPrintable [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchive.html b/trunk/paradiseo-moeo/doc/html/classmoeoArchive.html new file mode 100644 index 000000000..bc868a186 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoArchive.html @@ -0,0 +1,324 @@ + + +ParadisEO-MOEO: moeoArchive< MOEOT > Class Template Reference + + + + +
+
+ +

moeoArchive< MOEOT > Class Template Reference

An archive is a secondary population that stores non-dominated solutions. +More... +

+#include <moeoArchive.h> +

+

Inheritance diagram for moeoArchive< MOEOT >: +

+ +eoPop< MOEOT > +eoObject +eoPersistent +eoPrintable + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type of an objective vector for a solution.

Public Member Functions

 moeoArchive ()
 Default ctor.
 moeoArchive (moeoObjectiveVectorComparator< ObjectiveVector > &_comparator)
 Ctor.
bool dominates (const ObjectiveVector &_objectiveVector) const
 Returns true if the current archive dominates _objectiveVector according to the moeoObjectiveVectorComparator given in the constructor.
bool contains (const ObjectiveVector &_objectiveVector) const
 Returns true if the current archive already contains a solution with the same objective values than _objectiveVector.
void update (const MOEOT &_moeo)
 Updates the archive with a given individual _moeo.
void update (const eoPop< MOEOT > &_pop)
 Updates the archive with a given population _pop.
bool equals (const moeoArchive< MOEOT > &_arch)
 Returns true if the current archive contains the same objective vectors than the given archive _arch.

Private Attributes

+moeoObjectiveVectorComparator<
+ ObjectiveVector > & 
comparator
 The moeoObjectiveVectorComparator used to compare solutions.
+moeoParetoObjectiveVectorComparator<
+ ObjectiveVector
paretoComparator
 A moeoObjectiveVectorComparator based on Pareto dominance (used as default).
+

Detailed Description

+

template<class MOEOT>
+ class moeoArchive< MOEOT >

+ +An archive is a secondary population that stores non-dominated solutions. +

+ +

+Definition at line 24 of file moeoArchive.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + +
moeoArchive< MOEOT >::moeoArchive (  )  [inline]
+
+
+ +

+Default ctor. +

+The moeoObjectiveVectorComparator used to compare solutions is based on Pareto dominance +

+Definition at line 44 of file moeoArchive.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoArchive< MOEOT >::moeoArchive (moeoObjectiveVectorComparator< ObjectiveVector > &  _comparator  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_comparator the moeoObjectiveVectorComparator used to compare solutions
+
+ +

+Definition at line 52 of file moeoArchive.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
bool moeoArchive< MOEOT >::dominates (const ObjectiveVector _objectiveVector  )  const [inline]
+
+
+ +

+Returns true if the current archive dominates _objectiveVector according to the moeoObjectiveVectorComparator given in the constructor. +

+

Parameters:
+ + +
_objectiveVector the objective vector to compare with the current archive
+
+ +

+Definition at line 60 of file moeoArchive.h. +

+References moeoArchive< MOEOT >::comparator. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
bool moeoArchive< MOEOT >::contains (const ObjectiveVector _objectiveVector  )  const [inline]
+
+
+ +

+Returns true if the current archive already contains a solution with the same objective values than _objectiveVector. +

+

Parameters:
+ + +
_objectiveVector the objective vector to compare with the current archive
+
+ +

+Definition at line 78 of file moeoArchive.h. +

+Referenced by moeoArchive< MOEOT >::equals(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoArchive< MOEOT >::update (const MOEOT &  _moeo  )  [inline]
+
+
+ +

+Updates the archive with a given individual _moeo. +

+

Parameters:
+ + +
_moeo the given individual
+
+ +

+Definition at line 95 of file moeoArchive.h. +

+References moeoArchive< MOEOT >::comparator. +

+Referenced by moeoArchive< MOEOT >::update(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoArchive< MOEOT >::update (const eoPop< MOEOT > &  _pop  )  [inline]
+
+
+ +

+Updates the archive with a given population _pop. +

+

Parameters:
+ + +
_pop the given population
+
+ +

+Definition at line 138 of file moeoArchive.h. +

+References moeoArchive< MOEOT >::update(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
bool moeoArchive< MOEOT >::equals (const moeoArchive< MOEOT > &  _arch  )  [inline]
+
+
+ +

+Returns true if the current archive contains the same objective vectors than the given archive _arch. +

+

Parameters:
+ + +
_arch the given archive
+
+ +

+Definition at line 151 of file moeoArchive.h. +

+References moeoArchive< MOEOT >::contains(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchive.png b/trunk/paradiseo-moeo/doc/html/classmoeoArchive.png new file mode 100644 index 0000000000000000000000000000000000000000..d3035b86eb08f65900b238d190e33ab5ec6370b2 GIT binary patch literal 1084 zcmeAS@N?(olHy`uVBq!ia0y~yU~~bp53n!;$-YVK{Xj}0z$e7@|Ns9$=Kuc(=Fd-< z0AzvjfddDs5B+}v7rW_x@@QmrP=WV?0B)?cVN_UxtZ z{;Uh{zCQ|Dmi+AMjfqL;FCY2vcKoQ#g+#Y@ z&7UTPe+5{--~7q`fZ>RB`vakW=1hV@f^J+ZxR4-N3`$J2 z?PUJL^oV2sF;AsVS>gJaYln~N?~gn#T|Zx1eb#Nk>(9g2+8>^$UH#}^^zsC0fxlN{ zCLNu>a{g~kq34_0Lwq*!8^-6TiEZ;~e75cP>YsO1UhVCOI^TU!q2r&xl)WpWg%3ZL zp1sxTV(-qo-P+0BadX0sTw<%7oF1_Y%;)b^sWaR7-+X23!{ve%7eSf-qU7z_w(}k9SE6>h#-|qeUt=5ghO%-BSJG_4O1+KF{wB4cP zw#?DaJNuGvD0iItZ_OXPd6QY7d}za&c?MGw&#paR{YS0*`{MuA-78iLv8E`l`thMj zf_LT%e#e{LyI2EXo2-fw`nzMdt<~MTmdKI;Vst0IT!;CIA2c literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater-members.html new file mode 100644 index 000000000..bdcc98d28 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater-members.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoArchiveObjectiveVectorSavingUpdater< MOEOT > Member List

This is the complete list of members for moeoArchiveObjectiveVectorSavingUpdater< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + +
archmoeoArchiveObjectiveVectorSavingUpdater< MOEOT > [private]
className(void) const eoUpdater [virtual]
countmoeoArchiveObjectiveVectorSavingUpdater< MOEOT > [private]
countermoeoArchiveObjectiveVectorSavingUpdater< MOEOT > [private]
filenamemoeoArchiveObjectiveVectorSavingUpdater< MOEOT > [private]
functor_category()eoF< void > [static]
idmoeoArchiveObjectiveVectorSavingUpdater< MOEOT > [private]
lastCall()eoUpdater [virtual]
moeoArchiveObjectiveVectorSavingUpdater(moeoArchive< MOEOT > &_arch, const std::string &_filename, bool _count=false, int _id=-1)moeoArchiveObjectiveVectorSavingUpdater< MOEOT > [inline]
operator()()moeoArchiveObjectiveVectorSavingUpdater< MOEOT > [inline, virtual]
result_type typedefeoF< void >
~eoF()eoF< void > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.html b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.html new file mode 100644 index 000000000..1f5a1b044 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.html @@ -0,0 +1,145 @@ + + +ParadisEO-MOEO: moeoArchiveObjectiveVectorSavingUpdater< MOEOT > Class Template Reference + + + + +
+
+ +

moeoArchiveObjectiveVectorSavingUpdater< MOEOT > Class Template Reference

This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. +More... +

+#include <moeoArchiveObjectiveVectorSavingUpdater.h> +

+

Inheritance diagram for moeoArchiveObjectiveVectorSavingUpdater< MOEOT >: +

+ +eoUpdater +eoF< void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoArchiveObjectiveVectorSavingUpdater (moeoArchive< MOEOT > &_arch, const std::string &_filename, bool _count=false, int _id=-1)
 Ctor.
+void operator() ()
 Saves the fitness of the archive's members into the file.

Private Attributes

+moeoArchive< MOEOT > & arch
 local archive
+std::string filename
 target filename
+bool count
 this variable is set to true if a new file have to be created each time () is called and to false if the file only HAVE to be updated
+unsigned int counter
 counter
+int id
 own ID
+

Detailed Description

+

template<class MOEOT>
+ class moeoArchiveObjectiveVectorSavingUpdater< MOEOT >

+ +This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. +

+ +

+Definition at line 28 of file moeoArchiveObjectiveVectorSavingUpdater.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoArchiveObjectiveVectorSavingUpdater< MOEOT >::moeoArchiveObjectiveVectorSavingUpdater (moeoArchive< MOEOT > &  _arch,
const std::string &  _filename,
bool  _count = false,
int  _id = -1 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + + + +
_arch local archive
_filename target filename
_count put this variable to true if you want a new file to be created each time () is called and to false if you only want the file to be updated
_id own ID
+
+ +

+Definition at line 39 of file moeoArchiveObjectiveVectorSavingUpdater.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.png b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveObjectiveVectorSavingUpdater.png new file mode 100644 index 0000000000000000000000000000000000000000..c70a60fc04c4d881d75a7863a70da4b98c0a66b3 GIT binary patch literal 1285 zcmeAS@N?(olHy`uVBq!ia0y~yVDtg953n!;$+@oX)j&!jz$e7@|Ns9$=Kuc(=Fd-< z0AzvjfddDs5B+}v41v8gB`H!p8VixZ>rjxnuw#4)h;b|dzbv%vDPvlOSbuxGAO_S*n zS(7SGT-4Ej++ApTiN|u$?81vNukOTTzt1{*bxHrTz|C{Mh+MDm*!VqLPc`U%_Or^} zduDk}D>lCNsOZw4hMhN4t70~tjS}`=_I#(L^PdKvdg0*9lU8P)ys{-l!uRV^-Q#bW z3S5_ebI^78czyb-ATNO0Zp&QE6SaOf!JHz(Mx_<5mXtD@-!va~ipSh1^eg zD)DsLw<}wcv!aq#NS@>QnZjqciLKSTp&F)=uO_Nt~KHO|_ zJ7~!c_OhFDlT!|SE&e>&BzxI%^|-A*{kM}R@@)98oAR|~H#5+4@jsUzPX(r`wu>S0 zw~As4p8lWxzUqeY38wjuChQP@YMPk(HbyltXEE}vV6|8v_Mm}$PRxaLiKf~6AFQ4I zc-b;Vp#9Hh?bF^7w)@%bg@<;pyIFQ3?77qZliN<0o3=N`{`7Nh*%Vpr(fa>F$=@Hf z{{I3V{=O7>x%_?q#hCckT8{D;o3nOpDSc@>Mc%XcZ(RJ(3DG}d&aDl0&3xr_`)QHN zr-Li&WDh()SoGNR)#{ednm?j9ns~eKh`XF$`1$YbtXcbdUaSiKRrE8|V`}dCor|V! z(~o~0lu%@nWgTxGd-1CB=D5DDVt>=a>nbO#ob_|b&&|)`3aeM$tUAH8{qAy^%WWC6 zW*=V{S^s=XMjQLtI|;q678%R*oL-n*{~NmbU6lW)g`RWcHGB8eubL^fTsdZ=&(?pH zCYzsY&I(<_w*2xPzO@(kl+Lo0{j<>1R{rPn;ImRsZp)p0Zz{j|<}PcWZC0#B4^7Os z-wfo>EH1vDlXw5j*=HBqEK+}E=DnL4cU?w`XJP;V literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater-members.html new file mode 100644 index 000000000..9bd8bd306 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater-members.html @@ -0,0 +1,46 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoArchiveUpdater< MOEOT > Member List

This is the complete list of members for moeoArchiveUpdater< MOEOT >, including all inherited members.

+ + + + + + + + + + +
archmoeoArchiveUpdater< MOEOT > [private]
className(void) const eoUpdater [virtual]
functor_category()eoF< void > [static]
lastCall()eoUpdater [virtual]
moeoArchiveUpdater(moeoArchive< MOEOT > &_arch, const eoPop< MOEOT > &_pop)moeoArchiveUpdater< MOEOT > [inline]
operator()()moeoArchiveUpdater< MOEOT > [inline, virtual]
popmoeoArchiveUpdater< MOEOT > [private]
result_type typedefeoF< void >
~eoF()eoF< void > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.html b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.html new file mode 100644 index 000000000..a160949b4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.html @@ -0,0 +1,119 @@ + + +ParadisEO-MOEO: moeoArchiveUpdater< MOEOT > Class Template Reference + + + + +
+
+ +

moeoArchiveUpdater< MOEOT > Class Template Reference

This class allows to update the archive at each generation with newly found non-dominated solutions. +More... +

+#include <moeoArchiveUpdater.h> +

+

Inheritance diagram for moeoArchiveUpdater< MOEOT >: +

+ +eoUpdater +eoF< void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + +

Public Member Functions

 moeoArchiveUpdater (moeoArchive< MOEOT > &_arch, const eoPop< MOEOT > &_pop)
 Ctor.
+void operator() ()
 Updates the archive with newly found non-dominated solutions contained in the main population.

Private Attributes

+moeoArchive< MOEOT > & arch
 the archive of non-dominated solutions
+const eoPop< MOEOT > & pop
 the main population
+

Detailed Description

+

template<class MOEOT>
+ class moeoArchiveUpdater< MOEOT >

+ +This class allows to update the archive at each generation with newly found non-dominated solutions. +

+ +

+Definition at line 24 of file moeoArchiveUpdater.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoArchiveUpdater< MOEOT >::moeoArchiveUpdater (moeoArchive< MOEOT > &  _arch,
const eoPop< MOEOT > &  _pop 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + +
_arch an archive of non-dominated solutions
_pop the main population
+
+ +

+Definition at line 33 of file moeoArchiveUpdater.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.png b/trunk/paradiseo-moeo/doc/html/classmoeoArchiveUpdater.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab110825e7910218537efa2bb2ec6c1d4e7d1cc GIT binary patch literal 799 zcmV+)1K|9LP)zrR8G zWQB;DJ+8gMROzE}?dAKSdlZgyi0?RP%)lI^hk|s6Ac_vqF$WY09b*+GaOx44bS`O^ zznRrGg>*gzOiIY>5_{)^N(|J_rB~7?CbQx$J9f-vey!-5h3~T92kXLlGpv;3>(b;H z2Mrc`IOUkG3lksDF{1_r%2kvxXG%YBUptODsq*V~9p!fWx{PwA9D@P{3KS?%pg@6Q zs*Jfxy3%zely@n#t{R5fs?ysBy=#U_Q|~KYNF8LTG_}i_+d8S%5>uC%qE*V!vbiR@ zf!UxeHRT+Sd2W>r%%-{2nsSP_Qf%gOw=StDZoDpcIVPLtIcCtHK)H%C=1ghKS>H(& z)RWJtTq(z(K!E}U3KS?%pqMISu9B{FT?yrlO1)K>>%-?MwcN*ZkWFrHQ#Mm-=~7CS zTCZ$wQ+|gMO6|4YbZe&6l5$m8dWcMwT2kg^TA|#wY^Xe47egiInB2ZybBxPv%4SN_ zw*I34ltT^5S(PzoN@LFYPO6}ud`{&`IR*s^6ev)jK!F0qRG|UQPu_Z}4;qwDQhc-F zmhHUh>O*%xe4XTv(uStiE5*6?=q(Dx4zD9z9qQUcy+##34o**^#6L-Mnw*ZI6vN9P zCxgh#Nbeg(!s>%--_xRa(pWBs)QGxA(pg{0`;>YV*Ey)>A1eB4R=QYO$zyvZZ%#$= zCCsA4f5npWXE26O$3Ex#YNNbV@#MnXoH)-s dt1{$F=^p{@ELgmXfWH6$002ovPDHLkV1l#Ud^rFB literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric-members.html new file mode 100644 index 000000000..f12099c0a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoBinaryMetric< A1, A2, R > Member List

This is the complete list of members for moeoBinaryMetric< A1, A2, R >, including all inherited members.

+ + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.html new file mode 100644 index 000000000..01bf14440 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.html @@ -0,0 +1,71 @@ + + +ParadisEO-MOEO: moeoBinaryMetric< A1, A2, R > Class Template Reference + + + + +
+
+ +

moeoBinaryMetric< A1, A2, R > Class Template Reference

Base class for binary metrics. +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoBinaryMetric< A1, A2, R >: +

+ +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase +moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R > +moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double > +moeoVectorVsVectorBinaryMetric< ObjectiveVector, R > +moeoVectorVsVectorBinaryMetric< ObjectiveVector, double > +moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > +moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > +moeoContributionMetric< ObjectiveVector > +moeoEntropyMetric< ObjectiveVector > +moeoAdditiveEpsilonBinaryMetric< ObjectiveVector > +moeoHypervolumeBinaryMetric< ObjectiveVector > + +List of all members. + +
+

Detailed Description

+

template<class A1, class A2, class R>
+ class moeoBinaryMetric< A1, A2, R >

+ +Base class for binary metrics. +

+ +

+Definition at line 36 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7be93f06ee18f943384142d6d1a2649a7edde5 GIT binary patch literal 5892 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 l;AYQ%xX0O^y){taGR$Xx&c literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater-members.html new file mode 100644 index 000000000..c5bed19b9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater-members.html @@ -0,0 +1,51 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoBinaryMetricSavingUpdater< MOEOT > Member List

This is the complete list of members for moeoBinaryMetricSavingUpdater< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + +
className(void) const eoUpdater [virtual]
countermoeoBinaryMetricSavingUpdater< MOEOT > [private]
filenamemoeoBinaryMetricSavingUpdater< MOEOT > [private]
firstGenmoeoBinaryMetricSavingUpdater< MOEOT > [private]
functor_category()eoF< void > [static]
lastCall()eoUpdater [virtual]
metricmoeoBinaryMetricSavingUpdater< MOEOT > [private]
moeoBinaryMetricSavingUpdater(moeoVectorVsVectorBinaryMetric< ObjectiveVector, double > &_metric, const eoPop< MOEOT > &_pop, std::string _filename)moeoBinaryMetricSavingUpdater< MOEOT > [inline]
ObjectiveVector typedefmoeoBinaryMetricSavingUpdater< MOEOT >
oldPopmoeoBinaryMetricSavingUpdater< MOEOT > [private]
operator()()moeoBinaryMetricSavingUpdater< MOEOT > [inline, virtual]
popmoeoBinaryMetricSavingUpdater< MOEOT > [private]
result_type typedefeoF< void >
~eoF()eoF< void > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.html b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.html new file mode 100644 index 000000000..6255d1f4b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.html @@ -0,0 +1,148 @@ + + +ParadisEO-MOEO: moeoBinaryMetricSavingUpdater< MOEOT > Class Template Reference + + + + +
+
+ +

moeoBinaryMetricSavingUpdater< MOEOT > Class Template Reference

This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file. +More... +

+#include <moeoBinaryMetricSavingUpdater.h> +

+

Inheritance diagram for moeoBinaryMetricSavingUpdater< MOEOT >: +

+ +eoUpdater +eoF< void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The objective vector type of a solution.

Public Member Functions

 moeoBinaryMetricSavingUpdater (moeoVectorVsVectorBinaryMetric< ObjectiveVector, double > &_metric, const eoPop< MOEOT > &_pop, std::string _filename)
 Ctor.
+void operator() ()
 Saves the metric's value for the current generation.

Private Attributes

+moeoVectorVsVectorBinaryMetric<
+ ObjectiveVector, double > & 
metric
 binary metric comparing two Pareto sets
+const eoPop< MOEOT > & pop
 main population
+eoPop< MOEOT > oldPop
 (n-1) population
+std::string filename
 target filename
+bool firstGen
 is it the first generation ?
+unsigned int counter
 counter
+

Detailed Description

+

template<class MOEOT>
+ class moeoBinaryMetricSavingUpdater< MOEOT >

+ +This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file. +

+ +

+Definition at line 28 of file moeoBinaryMetricSavingUpdater.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoBinaryMetricSavingUpdater< MOEOT >::moeoBinaryMetricSavingUpdater (moeoVectorVsVectorBinaryMetric< ObjectiveVector, double > &  _metric,
const eoPop< MOEOT > &  _pop,
std::string  _filename 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + + +
_metric the binary metric comparing two Pareto sets
_pop the main population
_filename the target filename
+
+ +

+Definition at line 42 of file moeoBinaryMetricSavingUpdater.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.png b/trunk/paradiseo-moeo/doc/html/classmoeoBinaryMetricSavingUpdater.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ec32e83445ee56cab769e46d8029d0c1c1f739 GIT binary patch literal 1154 zcmeAS@N?(olHy`uVBq!ia0y~yVB`U^53n!;N#_3!w}F&IfKQ0)|NsAi%>Vxn%%7hy z0muU50|yRNANv0U$Ym@E@(X5gcy=R=fq_NB)5S5QV$R#yj+1UH2)G_q%YMLSVeX;# zCA|2*vdag-EYGsEW7EE_Y%x#eXJYZsEtq;|>C19)pZ$5VABr<1+S;Ca_6jsvdaX5! zTfK3v-qu?sZ+?mOnz$$KdlsSAt9dj=IB8v}lwR##sffmq=OErwU@H%y4D zE0L1Yc0T;6$?b;vrbll#vAig|#vGnCgXgl6NTlGpD+WKeMQ=K}f6~3AtEEz^o5j|K z`+l)~__62MtnRhK%Stv&`B&J8_fG46+G5??y{Irk+Q&V9uNj}Us`&c*n)wMC5p8X$ z84DT(%5KUHRSrB2u)!RbB8)l8qQdZ%^e zN@-qiDOl^~eRP?rL1CrOH?Q9I?8jccyMjLnpUhppC`^S%aKtA5waU-sf!p5>RHNq1sgyZq0Pz zX)AvJzWCtKZMWoG8COn!>}H!i-HG>XY_HUk%-& + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Member List

This is the complete list of members for moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtomType typedefmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >
className() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
ContainerType typedefmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >
Diversity typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
diversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
diversity(const Diversity &_diversityValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO()EO< MOEOObjectiveVector >
EO()EO< MOEOObjectiveVector >
Fitness typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
fitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
fitness(const Fitness &_fitnessValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::fitness(const Fitness &_fitness)EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::fitness(performance_type perf)EO< MOEOObjectiveVector >
fitness_traits typedefEO< MOEOObjectiveVector >
invalid() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate_worth(void)EO< MOEOObjectiveVector >
invalidateDiversity()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateFitness()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateObjectiveVector()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidDiversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidFitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidObjectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
moeoBitVector(unsigned int _size=0, bool _value=false)moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
moeoVector(unsigned int _size=0, bool_value=bool())moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > [inline]
ObjectiveVector typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
objectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
objectiveVector(const ObjectiveVector &_objectiveVectorValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
operator<(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > &_moeo) const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > [inline]
MOEO::operator<(const MOEO &_other) const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::operator<(const EO &_eo2) const EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::operator<(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
operator>(const EO &_eo2) const EO< MOEOObjectiveVector >
operator>(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
performance(performance_type perf)EO< MOEOObjectiveVector >
performance(void) const EO< MOEOObjectiveVector >
performance_type typedefEO< MOEOObjectiveVector >
printOn(std::ostream &_os) const moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
readFrom(std::istream &_is)moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
storage_type typedefEO< MOEOObjectiveVector >
value(const std::vector< bool > &_v)moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > [inline]
worth(worth_type worth)EO< MOEOObjectiveVector >
worth(void) const EO< MOEOObjectiveVector >
worth_type typedefEO< MOEOObjectiveVector >
~EO()EO< MOEOObjectiveVector > [virtual]
~eoObject()eoObject [virtual]
~eoPersistent()eoPersistent [virtual]
~eoPrintable()eoPrintable [virtual]
~MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBitVector.html b/trunk/paradiseo-moeo/doc/html/classmoeoBitVector.html new file mode 100644 index 000000000..9e6d7fa0a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoBitVector.html @@ -0,0 +1,182 @@ + + +ParadisEO-MOEO: moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Class Template Reference + + + + +
+
+ +

moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Class Template Reference

This class is an implementationeo of a simple bit-valued moeoVector. +More... +

+#include <moeoBitVector.h> +

+

Inheritance diagram for moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >: +

+ +moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > +MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > +EO< MOEOObjectiveVector > +eoObject +eoPersistent +eoPrintable + +List of all members. + + + + + + + + + + + +

Public Member Functions

 moeoBitVector (unsigned int _size=0, bool _value=false)
 Ctor.
virtual void printOn (std::ostream &_os) const
 Writing object.
virtual void readFrom (std::istream &_is)
 Reading object.
+

Detailed Description

+

template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ class moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >

+ +This class is an implementationeo of a simple bit-valued moeoVector. +

+ +

+Definition at line 22 of file moeoBitVector.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + + + + + + + + + + +
moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::moeoBitVector (unsigned int  _size = 0,
bool  _value = false 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + +
_size Length of vector (default is 0)
_value Initial value of all elements (default is default value of type GeneType)
+
+ +

+Definition at line 37 of file moeoBitVector.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
virtual void moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn (std::ostream &  _os  )  const [inline, virtual]
+
+
+ +

+Writing object. +

+

Parameters:
+ + +
_os output stream
+
+ +

+Reimplemented from moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >. +

+Definition at line 45 of file moeoBitVector.h. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + +
virtual void moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom (std::istream &  _is  )  [inline, virtual]
+
+
+ +

+Reading object. +

+

Parameters:
+ + +
_is input stream
+
+ +

+Reimplemented from moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >. +

+Definition at line 58 of file moeoBitVector.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoBitVector.png b/trunk/paradiseo-moeo/doc/html/classmoeoBitVector.png new file mode 100644 index 0000000000000000000000000000000000000000..461c6469d669ab251f84b1950de75478126c50ae GIT binary patch literal 2539 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 + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoCombinedLS< MOEOT, Type > Member List

This is the complete list of members for moeoCombinedLS< MOEOT, Type >, including all inherited members.

+ + + + + + + +
add(moeoLS< MOEOT, Type > &_mols)moeoCombinedLS< MOEOT, Type > [inline]
combinedLSmoeoCombinedLS< MOEOT, Type > [private]
functor_category()eoBF< Type, moeoArchive< MOEOT > &, void > [static]
moeoCombinedLS(moeoLS< MOEOT, Type > &_first_mols)moeoCombinedLS< MOEOT, Type > [inline]
operator()(Type _type, moeoArchive< MOEOT > &_arch)moeoCombinedLS< MOEOT, Type > [inline, virtual]
~eoBF()eoBF< Type, moeoArchive< MOEOT > &, void > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.html b/trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.html new file mode 100644 index 000000000..97b381ed3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.html @@ -0,0 +1,190 @@ + + +ParadisEO-MOEO: moeoCombinedLS< MOEOT, Type > Class Template Reference + + + + +
+
+ +

moeoCombinedLS< MOEOT, Type > Class Template Reference

This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions. +More... +

+#include <moeoCombinedLS.h> +

+

Inheritance diagram for moeoCombinedLS< MOEOT, Type >: +

+ +moeoLS< MOEOT, Type > +moeoAlgo +eoBF< Type, moeoArchive< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + +

Public Member Functions

 moeoCombinedLS (moeoLS< MOEOT, Type > &_first_mols)
 Ctor.
void add (moeoLS< MOEOT, Type > &_mols)
 Adds a new local search to combine.
void operator() (Type _type, moeoArchive< MOEOT > &_arch)
 Gives a new solution in order to explore the neigborhood.

Private Attributes

+std::vector< moeoLS< MOEOT,
+ Type > * > 
combinedLS
 the vector that contains the combined LS
+

Detailed Description

+

template<class MOEOT, class Type>
+ class moeoCombinedLS< MOEOT, Type >

+ +This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions. +

+ +

+Definition at line 25 of file moeoCombinedLS.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT, class Type>
+ + + + + + + + + +
moeoCombinedLS< MOEOT, Type >::moeoCombinedLS (moeoLS< MOEOT, Type > &  _first_mols  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_first_mols the first multi-objective local search to add
+
+ +

+Definition at line 33 of file moeoCombinedLS.h. +

+References moeoCombinedLS< MOEOT, Type >::combinedLS. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT, class Type>
+ + + + + + + + + +
void moeoCombinedLS< MOEOT, Type >::add (moeoLS< MOEOT, Type > &  _mols  )  [inline]
+
+
+ +

+Adds a new local search to combine. +

+

Parameters:
+ + +
_mols the multi-objective local search to add
+
+ +

+Definition at line 42 of file moeoCombinedLS.h. +

+References moeoCombinedLS< MOEOT, Type >::combinedLS. +

+

+ +

+
+
+template<class MOEOT, class Type>
+ + + + + + + + + + + + + + + + + + +
void moeoCombinedLS< MOEOT, Type >::operator() (Type  _type,
moeoArchive< MOEOT > &  _arch 
) [inline, virtual]
+
+
+ +

+Gives a new solution in order to explore the neigborhood. +

+The new non-dominated solutions are added to the archive

Parameters:
+ + + +
_type the object to apply the local search to
_arch the archive of non-dominated solutions
+
+ +

+Implements eoBF< Type, moeoArchive< MOEOT > &, void >. +

+Definition at line 53 of file moeoCombinedLS.h. +

+References moeoCombinedLS< MOEOT, Type >::combinedLS. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.png b/trunk/paradiseo-moeo/doc/html/classmoeoCombinedLS.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc8d9deb9800b0706bea3733da46c01fe857ff4 GIT binary patch literal 1797 zcmb_dX;hPE7XDa-62Vg1RL~$`Sqel+29ZT&F+hU}NCbi(CLof8k_b!yDNsQNOGYKo z2oed1DE0u>u;e3wAWH)jA?zcvFS5xN<3a(cIHWn$o->`9Gr#7?`@YY8&i!%kbMABB zYrZ~T>A?2D007YO!n&UV0M*k%Nn=C&oL#CG3@CRipUj1g9`bfzv-P zeXNVU@4ElU#c(=yL+cZZX47nJY+XP{p+bfklbT;*EpH6QLs}HA%SaWD833sxZcy2l z^Q2(<$1h?x{J~hugEkl5=AYO=fl*zh=u7AQ!wRZGuL(j0A~)i=ag-X^)K_XMg)+J7 z$>y}ryB{sYys)M6a>>%YQs^ix1E<*zV>@?r<#iVIqvmq+$w0YP=c&Q-o!4i1$uV~o z4xk^+v5~PGLebEz1AQZl6w=HhUB3+(jwokEt3c|mT%cVK09B1~z;==F&L>-wj2)2{ z(GrGcpI-2h%dCxe|H!;+VvLjYem}J9o}n==b!gXJv-)`8z_dv1Ypn`HS6qS|2x|V2 z&wV|rBK+?Em-0Tb?#b5QhGCa5q=2nlxr^M$Xc7Yn?~51qLhEWDDt8Fv?#+x>yNaZy z9d8={v5EJL5g*BHo2Y;U?}iBf3>{zdPg#69hL|&3=z#uy#=@NoA$OO|kA(cy@#?0x z_iCu0cP+V5Vr|xBA%(RTVJ;?@I@}DhVE2bLI6{0;cX5^j;3tAiIwI8AM_u zdGS%h4myT*PE(GIa45B`>MzzJzeWZwMT#!Dr>+FtpJzvH| zd`=n6nBfxQ0@r|-3IbFpUJ}4YX|8`C=55EZ3%^>k>XUO+$g{7 zb)eF|qOCdT#2?P!m`!Pcf)#X*CzBbGYkx=@iC7oLic|ST38x-(qBlb}Rl!;kiG<%ol} zG6! zwC6$`6KhwwkGE8Gi(_nPlpxMXZ!@!0bw#ownkH zZ+-7F_f?g72!Cz1oK=y;jq3e0m_$tZVh}SJHE)ztt&|kb`q^I}Ofx~lJ&B=MeAQvLas;hP?|17}E!^ge+_}SFo0GTO2^Z)<= literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoComparator-members.html new file mode 100644 index 000000000..e48afd472 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoComparator-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoComparator< MOEOT > Member List

This is the complete list of members for moeoComparator< MOEOT >, including all inherited members.

+ + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoComparator.html new file mode 100644 index 000000000..bfc96eb8e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoComparator.html @@ -0,0 +1,64 @@ + + +ParadisEO-MOEO: moeoComparator< MOEOT > Class Template Reference + + + + +
+
+ +

moeoComparator< MOEOT > Class Template Reference

Functor allowing to compare two solutions. +More... +

+#include <moeoComparator.h> +

+

Inheritance diagram for moeoComparator< MOEOT >: +

+ +eoBF< A1, A2, R > +eoFunctorBase +moeoAggregativeComparator< MOEOT > +moeoDiversityThenFitnessComparator< MOEOT > +moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator +moeoFitnessThenDiversityComparator< MOEOT > +moeoOneObjectiveComparator< MOEOT > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoComparator< MOEOT >

+ +Functor allowing to compare two solutions. +

+ +

+Definition at line 22 of file moeoComparator.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..616eae5e0d1a8ec560752a95c392eb4ffeafc37e GIT binary patch literal 3417 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 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric-members.html new file mode 100644 index 000000000..1e8d94e54 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric-members.html @@ -0,0 +1,45 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoContributionMetric< ObjectiveVector > Member List

This is the complete list of members for moeoContributionMetric< ObjectiveVector >, including all inherited members.

+ + + + + + + + + +
card_C(const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)moeoContributionMetric< ObjectiveVector > [inline, private]
card_N(const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)moeoContributionMetric< ObjectiveVector > [inline, private]
card_W(const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)moeoContributionMetric< ObjectiveVector > [inline, private]
functor_category()eoBF< A1, A2, R > [static]
operator()(const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)moeoContributionMetric< ObjectiveVector > [inline]
moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
paretoComparatormoeoContributionMetric< ObjectiveVector > [private]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.html new file mode 100644 index 000000000..412938151 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.html @@ -0,0 +1,262 @@ + + +ParadisEO-MOEO: moeoContributionMetric< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoContributionMetric< ObjectiveVector > Class Template Reference

The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. +More... +

+#include <moeoContributionMetric.h> +

+

Inheritance diagram for moeoContributionMetric< ObjectiveVector >: +

+ +moeoVectorVsVectorBinaryMetric< ObjectiveVector, double > +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + +

Public Member Functions

double operator() (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)
 Returns the contribution of the Pareto set '_set1' relatively to the Pareto set '_set2'.

Private Member Functions

unsigned int card_C (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)
 Returns the number of solutions both in '_set1' and '_set2'.
unsigned int card_W (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)
 Returns the number of solutions in '_set1' dominating at least one solution of '_set2'.
unsigned int card_N (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)
 Returns the number of solutions in '_set1' having no relation of dominance with those from '_set2'.

Private Attributes

+moeoParetoObjectiveVectorComparator<
+ ObjectiveVector > 
paretoComparator
 Functor to compare two objective vectors according to Pareto dominance relation.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoContributionMetric< ObjectiveVector >

+ +The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. +

+of the 2000 Congress on Evolutionary Computation, IEEE Press, pp. 317-324) +

+ +

+Definition at line 24 of file moeoContributionMetric.h.


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
double moeoContributionMetric< ObjectiveVector >::operator() (const std::vector< ObjectiveVector > &  _set1,
const std::vector< ObjectiveVector > &  _set2 
) [inline]
+
+
+ +

+Returns the contribution of the Pareto set '_set1' relatively to the Pareto set '_set2'. +

+

Parameters:
+ + + +
_set1 the first Pareto set
_set2 the second Pareto set
+
+ +

+Definition at line 33 of file moeoContributionMetric.h. +

+References moeoContributionMetric< ObjectiveVector >::card_C(), moeoContributionMetric< ObjectiveVector >::card_N(), and moeoContributionMetric< ObjectiveVector >::card_W(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
unsigned int moeoContributionMetric< ObjectiveVector >::card_C (const std::vector< ObjectiveVector > &  _set1,
const std::vector< ObjectiveVector > &  _set2 
) [inline, private]
+
+
+ +

+Returns the number of solutions both in '_set1' and '_set2'. +

+

Parameters:
+ + + +
_set1 the first Pareto set
_set2 the second Pareto set
+
+ +

+Definition at line 54 of file moeoContributionMetric.h. +

+Referenced by moeoContributionMetric< ObjectiveVector >::operator()(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
unsigned int moeoContributionMetric< ObjectiveVector >::card_W (const std::vector< ObjectiveVector > &  _set1,
const std::vector< ObjectiveVector > &  _set2 
) [inline, private]
+
+
+ +

+Returns the number of solutions in '_set1' dominating at least one solution of '_set2'. +

+

Parameters:
+ + + +
_set1 the first Pareto set
_set2 the second Pareto set
+
+ +

+Definition at line 71 of file moeoContributionMetric.h. +

+References moeoContributionMetric< ObjectiveVector >::paretoComparator. +

+Referenced by moeoContributionMetric< ObjectiveVector >::operator()(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
unsigned int moeoContributionMetric< ObjectiveVector >::card_N (const std::vector< ObjectiveVector > &  _set1,
const std::vector< ObjectiveVector > &  _set2 
) [inline, private]
+
+
+ +

+Returns the number of solutions in '_set1' having no relation of dominance with those from '_set2'. +

+

Parameters:
+ + + +
_set1 the first Pareto set
_set2 the second Pareto set
+
+ +

+Definition at line 89 of file moeoContributionMetric.h. +

+References moeoContributionMetric< ObjectiveVector >::paretoComparator. +

+Referenced by moeoContributionMetric< ObjectiveVector >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoContributionMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9f60d0ddcd23530f0fcf0a98176b6e7189b374 GIT binary patch literal 2274 zcmbtWdpy&7AE%^Jt4@W`5hbO$lw>)mh*-^~ltnBhmu;b#p}9W7QSPhBZ7MOBOslb& z8TFhwBzLy9XIRLjpA_b@v1i9QJ?A{n>-F@{`Q!Wje!idY=X-g*Kkv``^-Xqmv;!%r zE6K^pfuQy_=j7y8eUjPp3ae$kZ9f?;8+JIu&f7|*Qkf~0HWn6oWyq|R*4WsHdnFx_ zP31A?99`s2eBk)X$*l{A+E|?r&j<1^1rM8Uu`N5@7rBiip8tjREVdSW_Sy&C;>}S5>2(zAOb+M&WQ0clz>1nVFOVG-bbs zbDMYYJR=Oy0BI*LF9$YN=C$DQ5q9c$epA8^zQ$eeEKVfaj7@VU32Y22r)^hKOtJMt z?7H4faa?U@a|KkA3?D^yS~N!BrWoTjY)?)iE_p>i+7O-#u8W25a1~b#3Y8FoIc3i# zytDc3!Pl+BY!w2HG+h5F`tsN3@8H)Qw za6?QdA}gte>s@3?yo}4>=xm7V9wC)x24}5Pvt|zIjD`Y7{N7N}QFFht6}T z|F}SjpBtu*sp>#ORDvR`fkR})oJfuGqVPQF0~)c8)?ChiZ_rV?)XrHh5V@oQc~-iC zsy`tr24SpP-|`Do-VA????-GY75s!xKGJ4P4APxGQaRkP&1?C7T}LZsP>}g&l2-8B z;bFemmEfl)iA&v6t9eTlFL1fCC9$vlg!OM3jk_(Q`fFv+M({@5nPTilI7Yte8~wlG zDa+x_YN@6=m4P=74BM%`LV)k)rng~3p*ZQ_B+Vl+@z3WVdJMbZ6CPMm>Q#$MDB7)s3m;EOQgDhc$1+Jv zrUhSq9%||68ECuK%F#5LJ-W!pum+m&g~dx6np-$};aObpX8%vh7Es`R!$QGj>pz5G z1&J#dK)BY3xW-_ze(H;k47@8Naxdc^VHKDUlwxDKho%The~Zw+)mNB+t)w+|#^iVX zS-Dn_CQ>)N@b%zz7yqrsxso!6XQ$RjUdQiRbGN*lG|d|(Q^#-e|yN*K-PKCuRp zHgn2hC^T@ikrZnV`WOlZC>UqBNy5EGLiN6hRMCg+P1f2$MiF-O7xHfy_puWcz4@a9 z{!Yp93mALI+^=)Q_AiF!9qh*Gtrda&F{E(S@zinTx=fC`a}!p|5f0(9vyCABR+|T6+7zI zGG-yYqm7x!jZvru$GnsTW*1@C{eP^d;!?$u%{hAXWZf8KgzQ5i2eoyyAzOR> + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector > Member List

This is the complete list of members for moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >, including all inherited members.

+ + + + + +
functor_category()eoUF< A1, R > [static]
operator()(const eoPop< MOEOT > _pop)moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector > [inline]
eoUF::operator()(A1)=0eoUF< A1, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.html b/trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.html new file mode 100644 index 000000000..221c8f077 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.html @@ -0,0 +1,95 @@ + + +ParadisEO-MOEO: moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector > Class Template Reference

Functor allowing to get a vector of objective vectors from a population. +More... +

+#include <moeoConvertPopToObjectiveVectors.h> +

+

Inheritance diagram for moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >: +

+ +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

const std::vector< ObjectiveVector > operator() (const eoPop< MOEOT > _pop)
 Returns a vector of the objective vectors from the population _pop.
+

Detailed Description

+

template<class MOEOT, class ObjectiveVector = typename MOEOT::ObjectiveVector>
+ class moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >

+ +Functor allowing to get a vector of objective vectors from a population. +

+ +

+Definition at line 23 of file moeoConvertPopToObjectiveVectors.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT, class ObjectiveVector = typename MOEOT::ObjectiveVector>
+ + + + + + + + + +
const std::vector< ObjectiveVector > moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >::operator() (const eoPop< MOEOT >  _pop  )  [inline]
+
+
+ +

+Returns a vector of the objective vectors from the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 31 of file moeoConvertPopToObjectiveVectors.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.png b/trunk/paradiseo-moeo/doc/html/classmoeoConvertPopToObjectiveVectors.png new file mode 100644 index 0000000000000000000000000000000000000000..3904ce95401fabe95c5cfe7574a8a1ba97c18710 GIT binary patch literal 1170 zcmeAS@N?(olHy`uVBq!ia0y~yVC(?0J6M>3B)?SRLLem(;1lBd|Nnm=^Z)+?^XDf_ z0J6aNz<~qRhyFhSav4j4{DK)Ap4~`eU|`Ykba4!+nDchFciC+N9@kFK<4ejM%Guwx z8JzkzJwWIW$EH;EOgUz^cJt-EJl#jC|2WujKK>WS@csF>$3OS__#84a)tb59Gj<#~7N@qXaV@JtLN+7EjVK1DZDI`#RNz+B zaJ`P7ps?fE`rXqyEhE&@5<5C)^yjP$-f(;Ed?VQ+v$8pyUya@^-_kax*Hu1cO7jMF zwLJUdF7{up`AzXTvTB zU~p`h(V4_sps*szs>1sGtA(cBKy;M&-^ z?qE3AFTeca1tUXFVC>A9wcvxql8|FH_4cAIKL4J5t`^-Nzw=&U|H|)|_Rnc?(hy%* zsu#FidUamO`}eax^mjgW3o5@-_jlpm>*4;sD$k!RwSIMT#rDO{%$LITeJ5!6)Slik zrTTNZ=Tp^LZXUn%FW%AkVZ>=SrGhJ9!99iVLAy?WymBbmTURY*$I4T09tSVFVs*0D z_UgY{am|lwekB~5{^rRm^Ox73`si96TA5!AbvCn3&G%RgI4F743VnG?>%&;C&T zZ(D5j)J(NoTt60YUfmJGueAKL&D_q~EAO6U3CFqKPP%_RYqkEBIluQw{F?W|b6&{u z$MXu-a#St<&b^tM>zrEAN}$3rKi2FWB8Ma d$VnggSLeq~SSfU?7g&HWc)I$ztaD0e0sz-A5-|V( literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment-members.html new file mode 100644 index 000000000..c737d7902 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoCriterionBasedFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoCriterionBasedFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &)=0eoUF< eoPop< MOEOT > &, void > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0moeoFitnessAssignment< MOEOT > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.html new file mode 100644 index 000000000..73a9d19b1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.html @@ -0,0 +1,60 @@ + + +ParadisEO-MOEO: moeoCriterionBasedFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoCriterionBasedFitnessAssignment< MOEOT > Class Template Reference

moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies. +More... +

+#include <moeoCriterionBasedFitnessAssignment.h> +

+

Inheritance diagram for moeoCriterionBasedFitnessAssignment< MOEOT >: +

+ +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoCriterionBasedFitnessAssignment< MOEOT >

+ +moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies. +

+ +

+Definition at line 22 of file moeoCriterionBasedFitnessAssignment.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoCriterionBasedFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a36cb021b959c46aee343d9d0db853a23cfb09 GIT binary patch literal 1503 zcmchX`&W_&7{_tTPD#3SJ4)nbi}K_Jl`I|1tSBuLFNs*arb#X@fO5PsZK9P^Gw+>5 zypYYxOZ0k~psA@usHLR|_9~jX6sD%;644VTjI;d*+c`Vud7kh0`^)pg=bY!s^7THc zuZPrw!C?9xr%w36U^=#1FWB;>b`mO&!?l9&CHT8(G#ahdXap4%Aq86ZcMAl9pM@Hk zHtNLtc@tqr{}>H}!E_TmP8{=3EMF==!{S=+bd%3A;f{hI($+2gFCNx>=VEo#Fh3H* zFzBdjmzWXveE6myc)RFbm)$Nk2PYf6_eOBEVyHcV-rKAwu9(<$d)opZ_o?35rD z#{{UZaU~!aKob=>ckMDdQZK(`naAf%wQ_?rd7W}e6_>Y-$wg#M&P!)+MBhKKxu zzG~PEbN}~2*3&j>(LlbkS+FvM)8Y{R1h^7Hp#>y^*x{}2)r`nr-}o-xPU7gG)|fCq8Q}|z$Yk;Q&-5* z$-SSPpKv?#y-iHxAHJEtp61QREv@7Sd@VE;LQ6Dud^xaX>>&T z(NdoT2DY!4e!m{*&EAXTmn#>}DkPudW8|4~xXN{c_Wh?=f7(Z4_TDj`Wy_G*V*!8Q z)k?LoRh^};X#%BC*wclAdq^D5RA9IkF|Z!?7{ek)9!V z;=JWm4FK4(Oi5Hb<28BWu--M_$$>-T57e#YjSnEU;y_qaE`%`n%ExtLKE`rueCXtG zJMReV;2E3c?2i~VJHF|i%yYA`JBmJ<(=nV^vmWsDXgRZR0fk zgysx@N{B>QgBa!PZAaqbb1AZqW=36VIwb2PhoH>Yz?H@G``5uBRF$HqV)N7^6@)Y5 z|H>n0@W__}DT;H%T#>_D$PlUU&l7!i@iR-RDN!X*osCipitEYs1{)q|Ni`H=52?%4 lBt;Srm=vla-(do5??_gn5S=w(5^KkP%QHKw?{ud1h++qL# literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment-members.html new file mode 100644 index 000000000..0dee23f7b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment-members.html @@ -0,0 +1,46 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoCrowdingDistanceDiversityAssignment< MOEOT > Member List

This is the complete list of members for moeoCrowdingDistanceDiversityAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
inf() const moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline]
ObjectiveVector typedefmoeoCrowdingDistanceDiversityAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline, virtual]
setDistances(eoPop< MOEOT > &_pop)moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline, protected, virtual]
tiny() const moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline, virtual]
moeoDiversityAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoDiversityAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.html new file mode 100644 index 000000000..861b579eb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.html @@ -0,0 +1,204 @@ + + +ParadisEO-MOEO: moeoCrowdingDistanceDiversityAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoCrowdingDistanceDiversityAssignment< MOEOT > Class Template Reference

Diversity assignment sheme based on crowding distance proposed in: K. +More... +

+#include <moeoCrowdingDistanceDiversityAssignment.h> +

+

Inheritance diagram for moeoCrowdingDistanceDiversityAssignment< MOEOT >: +

+ +moeoDiversityAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase +moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > + +List of all members. + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

+double inf () const
 Returns a big value (regarded as infinite).
+double tiny () const
 Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound).
void operator() (eoPop< MOEOT > &_pop)
 Computes diversity values for every solution contained in the population _pop.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)

Protected Member Functions

virtual void setDistances (eoPop< MOEOT > &_pop)
 Sets the distance values.
+

Detailed Description

+

template<class MOEOT>
+ class moeoCrowdingDistanceDiversityAssignment< MOEOT >

+ +Diversity assignment sheme based on crowding distance proposed in: K. +

+Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). +

+ +

+Definition at line 25 of file moeoCrowdingDistanceDiversityAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoCrowdingDistanceDiversityAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Computes diversity values for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 55 of file moeoCrowdingDistanceDiversityAssignment.h. +

+References moeoCrowdingDistanceDiversityAssignment< MOEOT >::inf(), and moeoCrowdingDistanceDiversityAssignment< MOEOT >::setDistances(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoCrowdingDistanceDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+

Warning:
NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
+
Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+
Warning:
NOT IMPLEMENTED, DO NOTHING !
+ +

+Implements moeoDiversityAssignment< MOEOT >. +

+Reimplemented in moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >. +

+Definition at line 78 of file moeoCrowdingDistanceDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoCrowdingDistanceDiversityAssignment< MOEOT >::setDistances (eoPop< MOEOT > &  _pop  )  [inline, protected, virtual]
+
+
+ +

+Sets the distance values. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Reimplemented in moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >. +

+Definition at line 90 of file moeoCrowdingDistanceDiversityAssignment.h. +

+References moeoCrowdingDistanceDiversityAssignment< MOEOT >::inf(). +

+Referenced by moeoCrowdingDistanceDiversityAssignment< MOEOT >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoCrowdingDistanceDiversityAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd747ef51f0443e14aebe8136db243dbcb9dd5f GIT binary patch literal 2318 zcmcJR{Xf%tAIHb(&{@YiazAu~#mo|Q(TH?rY;$w?Qo>?{au=(aa6-jomYX&AvduQR z>6*J7&0TU+j7qwWgeaHQ>6qm-G3N-kBcm&MIIi7z6^T z;INJW2&BN2>-8N!$SbNwMM>VYJzTvpGMP*+WwI_7iq%s^A{m3^9LGupVRXC@2+5v5N{2apBM<2 zxh*xGS=3-v6n{a{Wihif`jH~*rf92KUBo4_zOtU?o5Y}D;*42*!;L-%dSOAot+p7S zwvMJ8wmuF>Z#s+g7qLRaR>sVBUXDKXV3*a)`=CU%!##lyJ9LUThVX|eTo>s zvY62lgGWV7TBY?Cl%VbRi6Cv@mI9z^L{QLZ1>7p1iYnOip5W$N{S>%PF5_^R1V}Z& zzDOS`A3yiSo?#Gts;PkBB&Bemi=_Z4jc!#*C~9^{M8No19Syrc7f!)0KLPdt9%btB zuNw7m7W!B=c#UvqmaF{%5dDZOtgwvH)Q-}vttxZjEN@KfdIM05c#crqA~Xox)TeVb zX(8b(M5FHu!-|XaCCZyeXRsTD*HYqs16-%cC|Z; zwio1a=tQQM8CfI!c+gi=yHN(tG=dvp`PMr2#mf2wkgZ26#;wylK1Wp2+S$^kqvL%Q zHEVpHUq7MhZgMRE)AJG%T`8e*nhb9Osi6V0NW@XY|eMzYE4?+1RNxIAM?@N z-3D!S)S}3P&DSJ;&4_xH!^lIb4{ncCRGg~bi+{K3iOr)D90_DGZQvAGs9fin;6E4# zuZ9pwyoh0utg9;hkxaFEQ7Jo2Bo1ie`Leako*;2Yj2p1ST0f zYC?+kD$`9CFl|g;j9=Z}`8?-#e6OK6`!76g&DoxEVaa!5`Qxnq3s2HTXTZkv**q5S z94^BOVZ)`V`rm{40kdHhYW09hWa?txCG@x0`0&j(dz4;2C@)sBsZxS^6@IMux@cFD z1O%@bt0-i_SO^}>Fyz4I=D^FSq8`Q^6K zmq>;cJMXT=o$?X*-w*ZZ9|^6$+@HYSFh75R&PUsz_)?tc5)*m>ghftfP~kjRQLIg; zbsbhA*mh4$$4zoBGyPQ&#JM~gD)xu+OYsLpiFwK4T5K=1*nO?R*a*!yqgZosRNft@ zP(2C&25(@vmMS(#Sg*T?S?8Za4W?Z>KI4bYQ%=YhWfq*k`7*x1;O%}6d=KkN)QiVm zbD1{FP8^k5^*dnZ7+Ej>2r?yG5mWEFUyaJa^R&QF0{-(S+u!3mg53WeBvzr!eI<2BHsQwSd0<*}%`NQ4+-bAS$}} zzVW1+u=Kdk9#S$o-oekxwx}lUnll&cX4XDZzfWez`K2$e=R&4O$=P)Q%BTI$vO7N-C9s{W zY+!|9Y!Xw=(}cfcwE^;HM-W^A{QOilYIA~iQeqmqY6#gdWpq>fjyzQVd~c-amhbX4 z`kp4YNU0(jk6QHZTC;eJhS%faZ=zwS?ud97X{V><{w4-S>-4X-Ip^+Bng@}5Cgjh= zqgsuFi^M6sLaLiL(HPTC-Nitew%P|4cGtpk`kxI3*X|0j(QQ65eK7hAzv{dt)-OF) zPh$kYgxcpB2s({{;NuLyasT^bpA6zVUO@lr+(g}c;kR5}^`;RvxXcG7su^*fE&|DX zLn!g{p{bAzJp58zdaVWO*` + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDetTournamentSelect< MOEOT > Member List

This is the complete list of members for moeoDetTournamentSelect< MOEOT >, including all inherited members.

+ + + + + + + + + + + +
comparatormoeoDetTournamentSelect< MOEOT > [protected]
defaultComparatormoeoDetTournamentSelect< MOEOT > [protected]
functor_category()eoUF< A1, R > [static]
moeoDetTournamentSelect(moeoComparator< MOEOT > &_comparator, unsigned int _tSize=2)moeoDetTournamentSelect< MOEOT > [inline]
moeoDetTournamentSelect(unsigned int _tSize=2)moeoDetTournamentSelect< MOEOT > [inline]
operator()(const eoPop< MOEOT > &_pop)moeoDetTournamentSelect< MOEOT > [inline]
moeoSelectOne::operator()(A1)=0eoUF< A1, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)eoSelectOne< MOEOT > [virtual]
tSizemoeoDetTournamentSelect< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.html b/trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.html new file mode 100644 index 000000000..3e769e4b2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.html @@ -0,0 +1,196 @@ + + +ParadisEO-MOEO: moeoDetTournamentSelect< MOEOT > Class Template Reference + + + + +
+
+ +

moeoDetTournamentSelect< MOEOT > Class Template Reference

Selection strategy that selects ONE individual by deterministic tournament. +More... +

+#include <moeoDetTournamentSelect.h> +

+

Inheritance diagram for moeoDetTournamentSelect< MOEOT >: +

+ +moeoSelectOne< MOEOT > +eoSelectOne< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoDetTournamentSelect (moeoComparator< MOEOT > &_comparator, unsigned int _tSize=2)
 Full Ctor.
 moeoDetTournamentSelect (unsigned int _tSize=2)
 Ctor without comparator.
const MOEOT & operator() (const eoPop< MOEOT > &_pop)
 Apply the tournament to the given population.

Protected Attributes

+moeoComparator< MOEOT > & comparator
 the comparator (used to compare 2 individuals)
+moeoFitnessThenDiversityComparator<
+ MOEOT > 
defaultComparator
 a fitness then diversity comparator can be used as default
+unsigned int tSize
 the number of individuals in the tournament
+

Detailed Description

+

template<class MOEOT>
+ class moeoDetTournamentSelect< MOEOT >

+ +Selection strategy that selects ONE individual by deterministic tournament. +

+ +

+Definition at line 24 of file moeoDetTournamentSelect.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoDetTournamentSelect< MOEOT >::moeoDetTournamentSelect (moeoComparator< MOEOT > &  _comparator,
unsigned int  _tSize = 2 
) [inline]
+
+
+ +

+Full Ctor. +

+

Parameters:
+ + + +
_comparator the comparator (used to compare 2 individuals)
_tSize the number of individuals in the tournament (default: 2)
+
+ +

+Definition at line 33 of file moeoDetTournamentSelect.h. +

+References moeoDetTournamentSelect< MOEOT >::tSize. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoDetTournamentSelect< MOEOT >::moeoDetTournamentSelect (unsigned int  _tSize = 2  )  [inline]
+
+
+ +

+Ctor without comparator. +

+A moeoFitnessThenDiversityComparator is used as default.

Parameters:
+ + +
_tSize the number of individuals in the tournament (default: 2)
+
+ +

+Definition at line 49 of file moeoDetTournamentSelect.h. +

+References moeoDetTournamentSelect< MOEOT >::tSize. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
const MOEOT& moeoDetTournamentSelect< MOEOT >::operator() (const eoPop< MOEOT > &  _pop  )  [inline]
+
+
+ +

+Apply the tournament to the given population. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 65 of file moeoDetTournamentSelect.h. +

+References moeoDetTournamentSelect< MOEOT >::comparator, and moeoDetTournamentSelect< MOEOT >::tSize. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.png b/trunk/paradiseo-moeo/doc/html/classmoeoDetTournamentSelect.png new file mode 100644 index 0000000000000000000000000000000000000000..4fbb8131906f3cc4051f92301ec664627407dd38 GIT binary patch literal 1070 zcmeAS@N?(olHy`uVBq!ia0vp^FM#+53p0=u3EX}GNJ#|vgt-3y{~yTw|Np@J`3Vz% zEHFNB;6U}E|4)Ei#*!evU^u05 z`|GOr|2epgnfn5ReK%hDHF>k)#uL*SFD1`B%=h1F%ER|R-ah4haW+uN=zWr{^f{O3 zy~nG}^j4cWBzGAc6`sLi*jCf#WGCz7wv*|4W_y~ZY3v1or#}BAj!Zmtdx!qBWR1ct zN5xHE%viQLIof1vw({J?m-bpdvzVO`@7nCLvG-F&`&{8yt%kk7jBFO1J$~iPJ&7G} zOVm!id1}}zGW-0!ZLAsr3)nB}ZC|i{`gi@9YRxa_kH=o<@Bcn~!S|Va9U7TfxkP{} z92(;|-hOibSbI&T;h%`fGu5=ot(?hcXUUv8E8~9lw#8a4`BP`#_{tP0rLoGMcYeL7 z*3omphlXRdwKX!TLB(yaX1oh7U*uvIWE9XF689$PyPMUyUDLm$)W}?3HgR3=ORifb zKBeE5@tIEEvMAB!x%THRGCnuW9Qo67ZZ9~_9k8JH0?>uAdE3^vD(Qdzec|_+IG~eY zZqsim`?>gsT{fSC^`ekzua_RFO4HhP=d|}B75x{Lvz`fW(TVlXh*|SqXnjWerrF9b zUVYZiID6zp81p4vqfN^X<>@6%3IF*xV%qO`=hCb5qGcXuY!7~-tFx=O>H3??&pB4V zc-HkVJ>y=#(ZaOv9PigpST{f5-a{kTT}$&8P3pY3>`P{wQ08pKV}*;W&9A)mNS`Ue zn;@2%SuAZUv-0eb8-~4;ayKPg6pTUYb9=`%ZQirv|J<0k zL{>QBwaH8N)Pvcs`*vF_*zOQJE3T$w$$B&WvL{bl#p3G@{Qq=S#lJZ>Tl8x8-4CAT zPrC1F&FWLR{`=O1`LWZTPK7`BKfKbfIjFj?j5 l-_5|v^+n; + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDistance< MOEOT, Type > Member List

This is the complete list of members for moeoDistance< MOEOT, Type >, including all inherited members.

+ + + + + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)moeoDistance< MOEOT, Type > [inline, virtual]
setup(double _min, double _max, unsigned int _obj)moeoDistance< MOEOT, Type > [inline, virtual]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoDistance< MOEOT, Type > [inline, virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDistance.html b/trunk/paradiseo-moeo/doc/html/classmoeoDistance.html new file mode 100644 index 000000000..2e226b7aa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDistance.html @@ -0,0 +1,197 @@ + + +ParadisEO-MOEO: moeoDistance< MOEOT, Type > Class Template Reference + + + + +
+
+ +

moeoDistance< MOEOT, Type > Class Template Reference

The base class for distance computation. +More... +

+#include <moeoDistance.h> +

+

Inheritance diagram for moeoDistance< MOEOT, Type >: +

+ +eoBF< A1, A2, R > +eoFunctorBase +moeoNormalizedDistance< MOEOT, Type > + +List of all members. + + + + + + + + + + + +

Public Member Functions

virtual void setup (const eoPop< MOEOT > &_pop)
 Nothing to do.
virtual void setup (double _min, double _max, unsigned int _obj)
 Nothing to do.
virtual void setup (eoRealInterval _realInterval, unsigned int _obj)
 Nothing to do.
+

Detailed Description

+

template<class MOEOT, class Type>
+ class moeoDistance< MOEOT, Type >

+ +The base class for distance computation. +

+ +

+Definition at line 22 of file moeoDistance.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT, class Type>
+ + + + + + + + + +
virtual void moeoDistance< MOEOT, Type >::setup (const eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Nothing to do. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Reimplemented in moeoNormalizedDistance< MOEOT, Type >, and moeoNormalizedDistance< MOEOT >. +

+Definition at line 30 of file moeoDistance.h. +

+

+ +

+
+
+template<class MOEOT, class Type>
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void moeoDistance< MOEOT, Type >::setup (double  _min,
double  _max,
unsigned int  _obj 
) [inline, virtual]
+
+
+ +

+Nothing to do. +

+

Parameters:
+ + + + +
_min lower bound
_max upper bound
_obj the objective index
+
+ +

+Reimplemented in moeoNormalizedDistance< MOEOT, Type >, and moeoNormalizedDistance< MOEOT >. +

+Definition at line 40 of file moeoDistance.h. +

+

+ +

+
+
+template<class MOEOT, class Type>
+ + + + + + + + + + + + + + + + + + +
virtual void moeoDistance< MOEOT, Type >::setup (eoRealInterval  _realInterval,
unsigned int  _obj 
) [inline, virtual]
+
+
+ +

+Nothing to do. +

+

Parameters:
+ + + +
_realInterval the eoRealInterval object
_obj the objective index
+
+ +

+Reimplemented in moeoNormalizedDistance< MOEOT, Type >, and moeoNormalizedDistance< MOEOT >. +

+Definition at line 49 of file moeoDistance.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDistance.png b/trunk/paradiseo-moeo/doc/html/classmoeoDistance.png new file mode 100644 index 0000000000000000000000000000000000000000..cf22dcd06a34613885c9dd3a4fcecfa241c4a6a8 GIT binary patch literal 1238 zcmeAS@N?(olHy`uVBq!ia0y~yU}Ocd53n!;$^Wmi1%Z@AfKQ0)|Ns9%BL5G}pPw)R z$O7X72M$yp`u_yTWh@Eu3ubV5b|Z~}fhEV&#WAE}&f7VGlV%(6v>o-HKQT|iZ^Pxd z6UK9I{+3@DF|EgQ&J>o88mF?Qs(5 z=F!+^Fz1ki6o2vS60O5I%f23-wXnza8^`*jZwYK#-+#<-OlpnmIs5%_<5%Uo26JTj z&+bVO3NGfJUa9!;z=`zp-Nhn2Ko^9keyH1g{{6SzQ@@pOj6NyN@ZkD(^Mj@m`}R*Z zKcp(LPGIuE1zz_U1bCJ`;bl0OK!Dk9Q1PGN;1L-UuDCPlAVKKFovifrBj=KhvUx@viBi9skYBv?Q7yhPKJ^U$rw@@g%fun*QXF(F<;8 zxqs{AdlvG4oRY|QtTjiddx|>U()l0R*EO^UImp2JaM>ZkLcIe*sME7HYZ*TJS ziVO4IKR3N7v@!Xdw5f7ovf}0Bnc`1>9uV5BvVH3;apC)R@?tz+z0%`qTzqwZoeh4J u%=2}ndmShSoZW#rG`sCCFnfOe%D;KKw?^MK9y4Ge#Ng@b=d#Wzp$Pzvp)o-K literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix-members.html new file mode 100644 index 000000000..618490b6b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix-members.html @@ -0,0 +1,42 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDistanceMatrix< MOEOT, Type > Member List

This is the complete list of members for moeoDistanceMatrix< MOEOT, Type >, including all inherited members.

+ + + + + + +
distancemoeoDistanceMatrix< MOEOT, Type > [private]
functor_category()eoUF< const eoPop< MOEOT > &, void > [static]
moeoDistanceMatrix(unsigned int _size, moeoDistance< MOEOT, Type > &_distance)moeoDistanceMatrix< MOEOT, Type > [inline]
operator()(const eoPop< MOEOT > &_pop)moeoDistanceMatrix< MOEOT, Type > [inline, virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< const eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.html b/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.html new file mode 100644 index 000000000..be5de081d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.html @@ -0,0 +1,149 @@ + + +ParadisEO-MOEO: moeoDistanceMatrix< MOEOT, Type > Class Template Reference + + + + +
+
+ +

moeoDistanceMatrix< MOEOT, Type > Class Template Reference

A matrix to compute distances between every pair of individuals contained in a population. +More... +

+#include <moeoDistanceMatrix.h> +

+

Inheritance diagram for moeoDistanceMatrix< MOEOT, Type >: +

+ +eoUF< const eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + +

Public Member Functions

 moeoDistanceMatrix (unsigned int _size, moeoDistance< MOEOT, Type > &_distance)
 Ctor.
void operator() (const eoPop< MOEOT > &_pop)
 Sets the distance between every pair of individuals contained in the population _pop.

Private Attributes

+moeoDistance< MOEOT, Type > & distance
 the distance to use
+

Detailed Description

+

template<class MOEOT, class Type>
+ class moeoDistanceMatrix< MOEOT, Type >

+ +A matrix to compute distances between every pair of individuals contained in a population. +

+ +

+Definition at line 24 of file moeoDistanceMatrix.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT, class Type>
+ + + + + + + + + + + + + + + + + + +
moeoDistanceMatrix< MOEOT, Type >::moeoDistanceMatrix (unsigned int  _size,
moeoDistance< MOEOT, Type > &  _distance 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + +
_size size for every dimension of the matrix
_distance the distance to use
+
+ +

+Definition at line 37 of file moeoDistanceMatrix.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT, class Type>
+ + + + + + + + + +
void moeoDistanceMatrix< MOEOT, Type >::operator() (const eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the distance between every pair of individuals contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< const eoPop< MOEOT > &, void >. +

+Definition at line 51 of file moeoDistanceMatrix.h. +

+References moeoDistanceMatrix< MOEOT, Type >::distance. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.png b/trunk/paradiseo-moeo/doc/html/classmoeoDistanceMatrix.png new file mode 100644 index 0000000000000000000000000000000000000000..a8aac1611982e595822cda5ee959436d09918f9b GIT binary patch literal 889 zcmV-<1BU#GP)n#-aTz(%686ek9~Ht(MQZZTTB#wm-%<{;?JS zyc+s4`!0Sv^kvp>bzjR*eg`0aNG}gKlO}LF5FdM_a|)lJ(PutjH}ECkY##apk$8p= zptr(&Ie(lzkDn0A|Bg@b2aJE4pD*Occ%M(#a3~L-K7R>C==mp}zsmmzj7c+`|9t-7 z{fYU1Ml-(gjX#q=`}_Ad+sAhe{Br*7>(cy>+wIc)>G@}T;~U@j#y7t4jcP1gJ_ zUv`)`S}>kwV3$v2oETNLOKN&$1QY`)JI0ouWZM5C@Aw>lDEv~`qty^Qe&7XUT!%s& z^C84R{80lHKloBu-B&wrEud~D3$&Hty`=#%1@_Ph9_itM}iqxO@2{}}&@ z{Mp~XXaD{2%lTISyEK1#{u$r+#y7t4jcr%`6W4_B4o$>(hE6%fl5#Iq09BJYW@BEW4uFBF~lz^qUCEPxFaEA|UAjhxg zFK&-d3uJOBd|v2i4+|_UUq02g{%5}0zz&~QyAuDj1PUKzgkdE;_uY?FZ!lBlz(*o@*3s8bB~intSz5)ILnqXtseWHl? P00000NkvXXu0mjf#`MSi literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment-members.html new file mode 100644 index 000000000..9e4c38561 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDiversityAssignment< MOEOT > Member List

This is the complete list of members for moeoDiversityAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoDiversityAssignment< MOEOT >
operator()(eoPop< MOEOT > &)=0eoUF< eoPop< MOEOT > &, void > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0moeoDiversityAssignment< MOEOT > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoDiversityAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.html new file mode 100644 index 000000000..eda898a05 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.html @@ -0,0 +1,163 @@ + + +ParadisEO-MOEO: moeoDiversityAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoDiversityAssignment< MOEOT > Class Template Reference

Functor that sets the diversity values of a whole population. +More... +

+#include <moeoDiversityAssignment.h> +

+

Inheritance diagram for moeoDiversityAssignment< MOEOT >: +

+ +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase +moeoCrowdingDistanceDiversityAssignment< MOEOT > +moeoDummyDiversityAssignment< MOEOT > +moeoSharingDiversityAssignment< MOEOT > +moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > +moeoFrontByFrontSharingDiversityAssignment< MOEOT > + +List of all members. + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type for objective vector.

Public Member Functions

virtual void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0
 Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
void updateByDeleting (eoPop< MOEOT > &_pop, MOEOT &_moeo)
 Updates the diversity values of the whole population _pop by taking the deletion of the individual _moeo into account.
+

Detailed Description

+

template<class MOEOT>
+ class moeoDiversityAssignment< MOEOT >

+ +Functor that sets the diversity values of a whole population. +

+ +

+Definition at line 23 of file moeoDiversityAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
virtual void moeoDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [pure virtual]
+
+
+ +

+Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implemented in moeoCrowdingDistanceDiversityAssignment< MOEOT >, moeoDummyDiversityAssignment< MOEOT >, moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >, moeoFrontByFrontSharingDiversityAssignment< MOEOT >, and moeoSharingDiversityAssignment< MOEOT >. +

+Referenced by moeoDiversityAssignment< MOEOT >::updateByDeleting(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
MOEOT &  _moeo 
) [inline]
+
+
+ +

+Updates the diversity values of the whole population _pop by taking the deletion of the individual _moeo into account. +

+

Parameters:
+ + + +
_pop the population
_moeo the individual
+
+ +

+Definition at line 44 of file moeoDiversityAssignment.h. +

+References moeoDiversityAssignment< MOEOT >::updateByDeleting(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..202cdb4a5d619850cd38e5d5875f8cc29ea77a01 GIT binary patch literal 3792 zcmdT{c{r478&~R7B&D)bQkHDRSQ?R1Gq#bCeQ9C5m?6h9_9W_*8DcCMX3*G5I2ij@ zvV<^Wl+2)%j9r>6WBp!Veb@J$bDclWb*}6C<9*-zxqkP3zt?l$zx(&R?*lVaI3JHF z4;L2~pP|7;b1tqORM1}D!42L&JpY9RK7`FoEH7a2+%aGB0Uy{u$&rt**3^xlV;5FMm7Tzg_Zt(A35x5yvQa%g> zM@U)-iO!TgMMLI_229(5chLggI%FNY!0~5GXfO=SA~N$fffY$ZrIWjI4&pRK%W)bZ z@^iEb7_WZb9CHv^V#d9d;R6}b52JI^3LE7zX}W2cZkj`#CokD2R^zC*gFmz&oM7x= z<3B0hCDL}474a3nt#^kg4sr)3jmV@K90VYLSW<5vx90aV7C0LzsMo4T-Tr$2+QMBc zy?YU$`!eSMWryl^aQk;NcRo73pTed3%YWR2ciVA^aG&Qrdh;l-&1LTnr3mbuzujs3 zuJsSBx7x=3af<_M z9RNIONTzY2GLfkeJ9gnP}407hA$(Iyl;JJnG9kphn!+v+C^o&`<=l@ zTrx=omwQ4*3kO?8&59xT%Dw}+awf2tFZl8{9Xl;w-BV}3#lFEVM$!Q=L9`^Av6qOn zxA_jRV00Fmuqp(*8TU@2oCVMWVg(x)3%aSF2T%#EXYBgxY9{+Cn>#KD%@q}NUn^S+ zqs%;`U*vtJRy{fWxH44rR7JjQ9O0O9VGUZiJITmgY@h-_G;8a1Ra zoc#8JWEfOud_L`FseNQ!J!9i**n9oX1~*pdZLxBkCgEIb8lc<0Do{$p@@dX;9}$Ets#s`(aBYX(7a;HkB!L|IL4&?{Vt%9NNez3qJZP;TMJ*^fNI(a zb5zMKk%7}=mi4!glpv4fC7_ZB0~=8+iU^CxYQ&|MT?s8hKoWIL_1(NE)$h+?bqRB! z#Jxn!54R=2*`6GBiJV{DG&DCtBi>zmUvW$}X5|yRRq3``64AZ3NGNX}*$mog;x^)U$jB{qLNT3n z;WTpfea(W1_5^pWP7}vsdc@G!-N(pjtSPRzIZDi#d`3%ZJ{UQ8rQXiU&5d)|GM z4;u?Nw45KjgKP@lX1RwSjCHgR$jCGCcoj&35ST$Swbl&QXyT=EZJzw+16_@X{AT5H z$JT|IH{x#{a$Vmdi(Rtu*n1xpe2md4J}GsQv5tzC$+Ml`D=wXNgOxQbU13eCh;?Ge zhM=32h0E>+Y;INtdl$ivz%$@9D7~^+!PfJ5tRN*S-XJgQ zdUhZF6$Ntmxrk{BkM6Ic{qxkIX^J(rLQWZ%>?Axq2is+h@9xdf7x(zq++1^`c1kPs zY~R_mR3xC!&11bTAJ)yZ@vF?A`*TeJ>_bm$4RpHyQ^00-E0gKQ&AetLZ7eL zK^)lp$*BjSifkN=DBOt6jNs>t+X8ka^EaqmWnP=>Fvp zvWVYVYgnhCszsoMNq-!4Z!4{(YIy_8mY~(;Q##$}!yv`7gER-3XwEaWmczj-l*zqP zU*^bH9sFCTzL@KqxNF%CV@gLdPnAAy`8se?>C2nulxwILR5Q-1se67OHW{vZOVF$=Fx(A-VagVTE~mn@ z(O&ktYmKKEL28;YtP~vvvBxs;+cNWTy2WX=%NSr5)wCS)Y!Ptl8dR1H&)<0JCu9oG z@=H$bZkmw$%lV`%TNG#jNb0dk+D$EQIK$yyUDOY~dA$=<5L{z8mFM*t3D>Q8&L&U$ zl@FO={1S<=7bYH&O2LD3bo&pDdBpoevGkNd1p_6Ds~Y@>+R~)|Gl%T zn;wGb^kU}F_C>YLB&c94OyURR(XMtVBXRwSN9RNfUmKxT?jD-8U#_2!Gb5kT90=8S zD(qSb@oL~Z`Rd&mJ3joT-4H79%*k2Hsmj6ye?=x{mDNP^Z1LfD9ZIy(Jg#xwdg6ET zw^I2MTgcO>v#KGKuHfA{`in63OgdV#uCt@mc19OBzXAD|0?8>*HA7UcB d=)r6J53&FN literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator-members.html new file mode 100644 index 000000000..fd0a9d305 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator-members.html @@ -0,0 +1,41 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDiversityThenFitnessComparator< MOEOT > Member List

This is the complete list of members for moeoDiversityThenFitnessComparator< MOEOT >, including all inherited members.

+ + + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoDiversityThenFitnessComparator< MOEOT > [inline]
moeoComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.html new file mode 100644 index 000000000..a1547aeb5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.html @@ -0,0 +1,106 @@ + + +ParadisEO-MOEO: moeoDiversityThenFitnessComparator< MOEOT > Class Template Reference + + + + +
+
+ +

moeoDiversityThenFitnessComparator< MOEOT > Class Template Reference

Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. +More... +

+#include <moeoDiversityThenFitnessComparator.h> +

+

Inheritance diagram for moeoDiversityThenFitnessComparator< MOEOT >: +

+ +moeoComparator< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

const bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 < _moeo2 according to their diversity values, then according to their fitness values.
+

Detailed Description

+

template<class MOEOT>
+ class moeoDiversityThenFitnessComparator< MOEOT >

+ +Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. +

+ +

+Definition at line 22 of file moeoDiversityThenFitnessComparator.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const bool moeoDiversityThenFitnessComparator< MOEOT >::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns true if _moeo1 < _moeo2 according to their diversity values, then according to their fitness values. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 31 of file moeoDiversityThenFitnessComparator.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoDiversityThenFitnessComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..14c65dd0bf4faab0ec0b579573e1c49bb4a3e3e4 GIT binary patch literal 1406 zcmb_c`Bzd26n<7tWl`o**)lHGB(D>sotzn(K}8XiBzs_siaV*ea57CzkxrpzrI7<- zrBTVl9=VJQ7G&zwWQ~<=ERJQ2xn!7Gm}6?iyk`D`&irui{l0VWPv8B{R~SU6V60YH z0RVvUr}{zwVBw15_BpfBPWJELhmPez+n8jt*^EN7xm_xa6r$+gYHx4PzF{6fsYMz@ zX8>M9-FpGR($3%4o0(ZYTFy$X2JQR?2Y;Hqxqb7I?Db7jceC@VDf@}dzok4q8Bh<_ zi=C>UA3{<@ugr^1e?EJye@w`Ur7BJ5L~e3I>N;)fj-ijWn&#A9P_NsFeYhx@&;gRdxoP6F-O}r3tVo)(mIT2;YH#TM+2p^mKcD(o%{sCRD9u2GBug!^R zu{@?Lq{W^5ZFS?OW=`lVN( z4o{DtC82gnTY7l~BEHMkz@tM|O*b#|gSO&Ce@*HKZ9rsGf4Q8BuO5Bq#D09_g?9XP z)Sg+=u$ogr2Y7v9~nd1j#{dkxsqr)jhOipVija1U$1x_I8rwX%bDF)sbZ}kz_k6kdh z+7s5zSt>!AE@@JaY^4~!Z&Bsmb?{M$4W`9YDi=(NzW&>7U8%S!;s=X zZ5t{VBYXc3Nx%H$&4$jjJF>BCe#V7-<{BS`{aU#6O&d+u$(8K8kX{k!NZ&Oy5SUUD z{BdHU?CLxCG#CCm04eK@(A2y0FNMfT*VxjYz}@NrcEnVTsiTja7pqLlIisU3=_zn! zUW)NZe(^Ne4@pZ=#95I)*f4Z#{(Qv$npo83_Nd^>2%~9!-X-kySS&vJV{P#a=U4&Q z`g;zc!j4Z`O%RneD0VZSVNBt4tSfsb;xDD;&8vfgJq)(Z>jTN4v@cM;#iY^&gRC~1 z?4CCmOND6HHpa~nhtW#GKU3L6Lr;#9X+8OLEjx84eiag_Jg#XHgK@)ebpbMYg^14D zGX`HQB={P`jLVV7Hi@BPkb_MZDrQ(jcPgkoQ@p5>tFKZ#T2{y49IM28NO5D7f=3c~ z+qdvL%Am#T>!d=Wp`oa + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDummyDiversityAssignment< MOEOT > Member List

This is the complete list of members for moeoDummyDiversityAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoDummyDiversityAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoDummyDiversityAssignment< MOEOT > [inline, virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoDummyDiversityAssignment< MOEOT > [inline, virtual]
moeoDiversityAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoDiversityAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.html new file mode 100644 index 000000000..b0a118858 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.html @@ -0,0 +1,149 @@ + + +ParadisEO-MOEO: moeoDummyDiversityAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoDummyDiversityAssignment< MOEOT > Class Template Reference

moeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population if it is invalid. +More... +

+#include <moeoDummyDiversityAssignment.h> +

+

Inheritance diagram for moeoDummyDiversityAssignment< MOEOT >: +

+ +moeoDiversityAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type for objective vector.

Public Member Functions

void operator() (eoPop< MOEOT > &_pop)
 Sets the diversity to '0' for every individuals of the population _pop if it is invalid.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)
 Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
+

Detailed Description

+

template<class MOEOT>
+ class moeoDummyDiversityAssignment< MOEOT >

+ +moeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population if it is invalid. +

+ +

+Definition at line 22 of file moeoDummyDiversityAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoDummyDiversityAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the diversity to '0' for every individuals of the population _pop if it is invalid. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 34 of file moeoDummyDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoDummyDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implements moeoDiversityAssignment< MOEOT >. +

+Definition at line 52 of file moeoDummyDiversityAssignment.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoDummyDiversityAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..b4489ca4435eed165a5fe5bcbdb0730d09a9eaf6 GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0y~yVB`j}53n!;$%o3(i-43wfKQ0)|NsAi%>Vxn%%7hy z0muU50|yRNANv0U$Ym@E@(X5gcy=R=fq|vp)5S5QV$R#yv1LmX1X`b}o)@t`Ao}D? zPR6`V|5bTHJ{CJ}F}-NQUpl#Di^~rkuHPm1AAc%mtJSN&#<@g7Onh zPD{L9ryaOG_cw>zi6-@9A08eL>}he}sXo>bedn1ck6d-BWb>nC)5YZ%S6+`jbK2an zV}gf4Q0|czk0laSPPnxnoa|H>bW3QTd~$5R;g75FdROOPar5eVZ#Zu~Z-l1y$qYp$ zZP%>kIn{MbZB&msXtH@323$_q^LsPn>*Aj~?ebncX7g?O`1So=mNk|JcKi0->lHBN zJf@?%3gk+#>aNBho+(KSM3|Stg|-6?kQTdU5^tsHHZ^I%H-j6CUano$dr|A#xl?vs zdybf0SdsnS?A}Ysp1=*fJ1i!h7n?6rUUBGHidA>uALSz}4(@pQ$(5_^^y8iLwj`)X zpK|qnCE`|kS%~ecqv1`JcaPt5C^x3v%Q_XfXn(`O%e@D)_AjeAs<22+`e#M|!(y@c z1d-)aH#^1}BnSBIl1_I%$HSX?zT0@Fp_xo`&YH7J0;Jz;+Su+4(>wTtQ3;bu7F6CgkXMSs{(@lx8*ITC+xm}leZoGE>af$eU z>yzhPdXk^JU+1WUZ}Z1@=h<|=CceKW!}dZ&VzR`7$q8qI7GVh(gpl2vv*2LsGrWmr%T(?5KR6d;Cqqq7c8Y_nxNziMzSww?tn}p>`!x&CQ9+<1aJ!`tj|4GXJRa&k#dK|C?KO zOJvSaWLqv~cunNPRL%GEHf6>qi#)#CJ<}`a#!nlW_rGOUNGQ&ckBf`Hy+wV~#%&Ty zrJo-S(cK?w7Ix+s_v~+nmRNi&*(hbicI8-Fkl)QM$0ardJ=ym#JW|t$o%4*jwyJQ@ zr|#hV<7RL5j#+-So%_jx|Eny|{rCIW7yBPOy8OudLlq8SzyI1$o-Nd4$#cQeK+VuW z{ostHE}}>Y2N6DywDd}hXO?5x#`2ic{@~QrYru1HTjH9u%VyroXGz`AIggCK&c4Ub-;jzvRxK(}~%<^QC7+-h1w* z_9dIAaJiuJJn7l3*WAu^p4HL)*(9mlcUphhe!YVmR30yTXza!_dE>T&39EKwUfLG0 z?Ea77bBZrdd!2eC(A=-aBf)4WCb9OYhvaGr(^l?z!vAkBJ<6flcvIjMoAQ-s5{K1# z45T+soM^ehXl95St6@;Qn&)902P5sNjOrpOlWeelHH1C2|4r}#8;|YEz9VT^BCZH=KMswzb`=+_GCi66Y z?>*~Px$E|6AqQ%aj=hcOR&gIPYy3(ABtUa*e|e{uVR8sgsy2 R + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoDummyFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoDummyFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoDummyFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoDummyFitnessAssignment< MOEOT > [inline, virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoDummyFitnessAssignment< MOEOT > [inline, virtual]
moeoFitnessAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.html new file mode 100644 index 000000000..0f01b191e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.html @@ -0,0 +1,149 @@ + + +ParadisEO-MOEO: moeoDummyFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoDummyFitnessAssignment< MOEOT > Class Template Reference

moeoDummyFitnessAssignment is a moeoFitnessAssignment that gives the value '0' as the individual's fitness for a whole population if it is invalid. +More... +

+#include <moeoDummyFitnessAssignment.h> +

+

Inheritance diagram for moeoDummyFitnessAssignment< MOEOT >: +

+ +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type for objective vector.

Public Member Functions

void operator() (eoPop< MOEOT > &_pop)
 Sets the fitness to '0' for every individuals of the population _pop if it is invalid.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)
 Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
+

Detailed Description

+

template<class MOEOT>
+ class moeoDummyFitnessAssignment< MOEOT >

+ +moeoDummyFitnessAssignment is a moeoFitnessAssignment that gives the value '0' as the individual's fitness for a whole population if it is invalid. +

+ +

+Definition at line 22 of file moeoDummyFitnessAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoDummyFitnessAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the fitness to '0' for every individuals of the population _pop if it is invalid. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 34 of file moeoDummyFitnessAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoDummyFitnessAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implements moeoFitnessAssignment< MOEOT >. +

+Definition at line 52 of file moeoDummyFitnessAssignment.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoDummyFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd125053909412c943a4a896ee74c6a69ca3508 GIT binary patch literal 1225 zcmeAS@N?(olHy`uVBq!ia0y~yU}OZc53n!;$#0COvw@UEfKQ0)|NsAi%>Vxn%%7hy z0muU50|yRNANv0U$Ym@E@(X5gcy=R=fq^C7)5S5QV$R#yo@GxIc-p#s*EdR^P=9f~ zcHx?$|H>vA42C=2NZnDY;#EnY@Lg89#+0J znpoY(+10g(bBbZMR%(U^gAf;+hoXR?8nqf6Q^#IGR<&)*%Y&KHM6PIgEL=MK zPA$`%TPu3J(o(8b9b`8=TQKK6M@EFMlY4-OtI(&UY!QiV?hU!=Vht^hb>hj+7nFD` zZ+y}5;H#QB@$GJw3OTQbr7Y#e1^fBB?!>&gU7{KAzCsD@ ziyS=%P|*XYrmy}6*X)lPGAUaqDg0egZztE@{844KUgTz;FUsX+w{y!J47gd!=da^- zJd?!LsXbf6?y~#ey~mok`Z;t>ggEw0E?g`=;Z$={y2rnTF|1qmuNL~S&3xLbbAm@0 zLc^0-z2Bzj%)ZeOuXtQD{NfZ=DXs%k7R>LQm(b1YIM42^b5qolDXY$wzFM_mD@*0C zQa-*ZdM~-xYgs1jovhxpB%njLam6G@tFF&7GAn9JO`_cuPAR7|ZBw%pTKgOA(t8wXtwXHE9N~QIC-Ro~n4fcGp%PXj0g#s8N-y-mSUbI+58y%}N~QYytv7|Wd*OlE(MJTNn-xL~%>0|PC_=`&Lf-7hJc z^Qx_QgSWv+$C<2anqr%(oYb@Cv`QuI68mKpkgb^TQ;R8XzNXhV{cJ|z1=pH*SpVOv zoX64$On--?EOItWpSv(`&(3+u77ssvdHeTDYkJTFwenBj1!HajlUYZ?&*fk1^Fl3c U78Nim0m~f*Pgg&ebxsLQ0D-v=GXMYp literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEA-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEA-members.html new file mode 100644 index 000000000..e6a6b5912 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEA-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEA< MOEOT > Member List

This is the complete list of members for moeoEA< MOEOT >, including all inherited members.

+ + + + +
functor_category()eoUF< A1, R > [static]
operator()(A1)=0eoUF< A1, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEA.html b/trunk/paradiseo-moeo/doc/html/classmoeoEA.html new file mode 100644 index 000000000..c0f748b81 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEA.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoEA< MOEOT > Class Template Reference + + + + +
+
+ +

moeoEA< MOEOT > Class Template Reference

Abstract class for multi-objective evolutionary algorithms. +More... +

+#include <moeoEA.h> +

+

Inheritance diagram for moeoEA< MOEOT >: +

+ +moeoAlgo +eoAlgo< MOEOT > +eoUF< A1, R > +eoFunctorBase +moeoEasyEA< MOEOT > +moeoIBEA< MOEOT > +moeoNSGA< MOEOT > +moeoNSGAII< MOEOT > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoEA< MOEOT >

+ +Abstract class for multi-objective evolutionary algorithms. +

+ +

+Definition at line 23 of file moeoEA.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEA.png b/trunk/paradiseo-moeo/doc/html/classmoeoEA.png new file mode 100644 index 0000000000000000000000000000000000000000..f07b0051085b4e728d52207401867f237ce431d9 GIT binary patch literal 2158 zcmcguc~H|y8jVK46%mz@8+3OtK?Wj3AfSM(oY90x1X<*eFi{9Xtb`B^fq)|M0AwT} z31`WTTn>m3K{llm*q;hQ2qY{7W;PrXfgs@$IkI79oT;7K+N%9y_m9{8y1(kKuiopg zyYHU$@zUC5xC;aVX(7Gcu^`a)EEWH_1FUN6&KtR^I{mXKKM$o+siI0Huednu8x{Kr zJRXn!QaP>~Zlhp*&VgJf#g{>#ojZ{3fA+gxFk2WylsfEY>g?_vdq8xZQ`2qZ72W26 zUMTksmf*df9UdldaIe}iHW^awsz{Js5EjL>%!**f2E`4 z8?Tg*A_zztYJHb8__zmVmIHC`@?4T~YmS=K}05vJ+kS$NaiHwGa=l@2H> z>UFJNU_?w~Fx2Kv_szo9n~FvIdE!+$>k_VJKO{GiT=h;~3qQ~5M~je)fEu)crNwIX zfywSm{3dtjoro%c<>m0nz!aAy7Qw6Yq&H8<-E7@h;{hfqxeLY4VGi>N^I0L{43%UdJM0OwBZQ( z1X#_o+tMcpm=C9=j*K^WKcGIJ9KnnwaQ$Rmc+NDmTfU&i$|y~%^0uY)$Wu?BgiLW6_-<(;nNE?hLRg_|<4z(>=t6T7 zokron%#&g|iMb*mYNiL)ah!^{4>O&fV)=B*i@tx6al3)E=kim+4?_ICp}F@T7_Y^JcKm=EA7lpd;cV^l;QA;*IR!7m-v24$B!F`=-MlJ z_G-Ix*nt;8NE}XInXQF7jJeC?@frFFgSh+G!&l~}?4blfaw$ZePMLnFxul_w< z((0po9#Zq|iHmz078or{3&?bd<_ANse<#le*z7@O9k}&I9r*eW&QtX?b=CdHF!9x7 z`=$Imy%qXTh*aF-CWfkAV$}xEDd4exA#~v<;`P`<@b8`Yy+1GW0anuV{0cZ}zheAi z{rcQ^CL@Q9`FO1Ss6yn|{B?(`J6pKzr(HtDW~qBcE0YI&H+}EW+%D`K*re~1UjHs- zg8W@Qvf5TRN2;FpE?Qdh)rL!jD3~sgexxvyBG;5e{+i>QjSw-iRmW}eM^bXJ$`S7~g7D)NLllcp zyhvnSN$iG>w%Bv)_2;@`P@UCo{Ax)Z+v`98WX+=q&^JF*imP`g;NV9x!Tew+ z`+QhXuB!Uz=*Orc*w!-ku2fn3gZys}n#+ubJuy(J^Q5oG5mH5@z2liTh(Dq$JGF9LD=M+LED3txi&z>k!}HEkI2B9L+~yW3PRBrn^U z+=9%24NQbuTBT*52#``xbX)Yj(&v~WnCO_J|Jw*kcG{KG#U2lwj?e1YP*BSj_iK6% zge(D%T-r2fU!2w?ymyyW%q;;poFakCC^oL3_6y}sGp4rjm6&H=35H6#o9OJI(0oh1 zXNqQnXd@9Y%Q?q!@~^+zIMQn?V8XMRxaS?s%%RyhMb)1Qt>O`Z84?**x1=C>l@_`r zEVFHAY + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEasyEA< MOEOT > Member List

This is the complete list of members for moeoEasyEA< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
breedmoeoEasyEA< MOEOT > [protected]
continuatormoeoEasyEA< MOEOT > [protected]
diversityEvalmoeoEasyEA< MOEOT > [protected]
dummyEvalmoeoEasyEA< MOEOT > [protected]
dummyMergemoeoEasyEA< MOEOT > [protected]
dummyReducemoeoEasyEA< MOEOT > [protected]
dummySelectmoeoEasyEA< MOEOT > [protected]
dummyTransformmoeoEasyEA< MOEOT > [protected]
evalmoeoEasyEA< MOEOT > [protected]
evalFitAndDivBeforeSelectionmoeoEasyEA< MOEOT > [protected]
fitnessEvalmoeoEasyEA< MOEOT > [protected]
functor_category()eoUF< A1, R > [static]
loopEvalmoeoEasyEA< MOEOT > [protected]
mergeReducemoeoEasyEA< MOEOT > [protected]
moeoEasyEA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoBreed< MOEOT > &_breed, moeoReplacement< MOEOT > &_replace, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)moeoEasyEA< MOEOT > [inline]
moeoEasyEA(eoContinue< MOEOT > &_continuator, eoPopEvalFunc< MOEOT > &_popEval, eoBreed< MOEOT > &_breed, moeoReplacement< MOEOT > &_replace, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)moeoEasyEA< MOEOT > [inline]
moeoEasyEA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoBreed< MOEOT > &_breed, eoMerge< MOEOT > &_merge, eoReduce< MOEOT > &_reduce, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)moeoEasyEA< MOEOT > [inline]
moeoEasyEA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoSelect< MOEOT > &_select, eoTransform< MOEOT > &_transform, moeoReplacement< MOEOT > &_replace, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)moeoEasyEA< MOEOT > [inline]
moeoEasyEA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoSelect< MOEOT > &_select, eoTransform< MOEOT > &_transform, eoMerge< MOEOT > &_merge, eoReduce< MOEOT > &_reduce, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)moeoEasyEA< MOEOT > [inline]
operator()(eoPop< MOEOT > &_pop)moeoEasyEA< MOEOT > [inline, virtual]
moeoEA::operator()(A1)=0eoUF< A1, R > [pure virtual]
popEvalmoeoEasyEA< MOEOT > [protected]
replacemoeoEasyEA< MOEOT > [protected]
selectTransformmoeoEasyEA< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.html b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.html new file mode 100644 index 000000000..33e9eb9b2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.html @@ -0,0 +1,599 @@ + + +ParadisEO-MOEO: moeoEasyEA< MOEOT > Class Template Reference + + + + +
+
+ +

moeoEasyEA< MOEOT > Class Template Reference

An easy class to design multi-objective evolutionary algorithms. +More... +

+#include <moeoEasyEA.h> +

+

Inheritance diagram for moeoEasyEA< MOEOT >: +

+ +moeoEA< MOEOT > +moeoAlgo +eoAlgo< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoEasyEA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoBreed< MOEOT > &_breed, moeoReplacement< MOEOT > &_replace, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)
 Ctor taking a breed and merge.
 moeoEasyEA (eoContinue< MOEOT > &_continuator, eoPopEvalFunc< MOEOT > &_popEval, eoBreed< MOEOT > &_breed, moeoReplacement< MOEOT > &_replace, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)
 Ctor taking a breed, a merge and a eoPopEval.
 moeoEasyEA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoBreed< MOEOT > &_breed, eoMerge< MOEOT > &_merge, eoReduce< MOEOT > &_reduce, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)
 Ctor taking a breed, a merge and a reduce.
 moeoEasyEA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoSelect< MOEOT > &_select, eoTransform< MOEOT > &_transform, moeoReplacement< MOEOT > &_replace, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)
 Ctor taking a select, a transform and a replacement.
 moeoEasyEA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoSelect< MOEOT > &_select, eoTransform< MOEOT > &_transform, eoMerge< MOEOT > &_merge, eoReduce< MOEOT > &_reduce, moeoFitnessAssignment< MOEOT > &_fitnessEval, moeoDiversityAssignment< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)
 Ctor taking a select, a transform, a merge and a reduce.
virtual void operator() (eoPop< MOEOT > &_pop)
 Applies a few generation of evolution to the population _pop.

Protected Attributes

+eoContinue< MOEOT > & continuator
 the stopping criteria
+eoEvalFunc< MOEOT > & eval
 the evaluation functions
+eoPopLoopEval< MOEOT > loopEval
 to evaluate the whole population
+eoPopEvalFunc< MOEOT > & popEval
 to evaluate the whole population
+eoSelectTransform< MOEOT > selectTransform
 breed: a select followed by a transform
+eoBreed< MOEOT > & breed
 the breeder
+eoMergeReduce< MOEOT > mergeReduce
 replacement: a merge followed by a reduce
+moeoReplacement< MOEOT > & replace
 the replacment strategy
+moeoFitnessAssignment< MOEOT > & fitnessEval
 the fitness assignment strategy
+moeoDiversityAssignment< MOEOT > & diversityEval
 the diversity assignment strategy
+bool evalFitAndDivBeforeSelection
 if this parameter is set to 'true', the fitness and the diversity of the whole population will be re-evaluated before the selection process
+moeoEasyEA::eoDummyEval dummyEval
 a dummy eval
+moeoEasyEA::eoDummySelect dummySelect
 a dummy select
+moeoEasyEA::eoDummyTransform dummyTransform
 a dummy transform
+eoNoElitism< MOEOT > dummyMerge
 a dummy merge
+eoTruncate< MOEOT > dummyReduce
 a dummy reduce

Classes

class  eoDummyEval
 a dummy eval More...
class  eoDummySelect
 a dummy select More...
class  eoDummyTransform
 a dummy transform More...
+

Detailed Description

+

template<class MOEOT>
+ class moeoEasyEA< MOEOT >

+ +An easy class to design multi-objective evolutionary algorithms. +

+ +

+Definition at line 33 of file moeoEasyEA.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoEasyEA< MOEOT >::moeoEasyEA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoBreed< MOEOT > &  _breed,
moeoReplacement< MOEOT > &  _replace,
moeoFitnessAssignment< MOEOT > &  _fitnessEval,
moeoDiversityAssignment< MOEOT > &  _diversityEval,
bool  _evalFitAndDivBeforeSelection = false 
) [inline]
+
+
+ +

+Ctor taking a breed and merge. +

+

Parameters:
+ + + + + + + + +
_continuator the stopping criteria
_eval the evaluation functions
_breed the breeder
_replace the replacement strategy
_fitnessEval the fitness evaluation scheme
_diversityEval the diversity evaluation scheme
_evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
+
+ +

+Definition at line 47 of file moeoEasyEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoEasyEA< MOEOT >::moeoEasyEA (eoContinue< MOEOT > &  _continuator,
eoPopEvalFunc< MOEOT > &  _popEval,
eoBreed< MOEOT > &  _breed,
moeoReplacement< MOEOT > &  _replace,
moeoFitnessAssignment< MOEOT > &  _fitnessEval,
moeoDiversityAssignment< MOEOT > &  _diversityEval,
bool  _evalFitAndDivBeforeSelection = false 
) [inline]
+
+
+ +

+Ctor taking a breed, a merge and a eoPopEval. +

+

Parameters:
+ + + + + + + + +
_continuator the stopping criteria
_popEval the evaluation functions for the whole population
_breed the breeder
_replace the replacement strategy
_fitnessEval the fitness evaluation scheme
_diversityEval the diversity evaluation scheme
_evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
+
+ +

+Definition at line 65 of file moeoEasyEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoEasyEA< MOEOT >::moeoEasyEA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoBreed< MOEOT > &  _breed,
eoMerge< MOEOT > &  _merge,
eoReduce< MOEOT > &  _reduce,
moeoFitnessAssignment< MOEOT > &  _fitnessEval,
moeoDiversityAssignment< MOEOT > &  _diversityEval,
bool  _evalFitAndDivBeforeSelection = false 
) [inline]
+
+
+ +

+Ctor taking a breed, a merge and a reduce. +

+

Parameters:
+ + + + + + + + + +
_continuator the stopping criteria
_eval the evaluation functions
_breed the breeder
_merge the merge scheme
_reduce the reduce scheme
_fitnessEval the fitness evaluation scheme
_diversityEval the diversity evaluation scheme
_evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
+
+ +

+Definition at line 84 of file moeoEasyEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoEasyEA< MOEOT >::moeoEasyEA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoSelect< MOEOT > &  _select,
eoTransform< MOEOT > &  _transform,
moeoReplacement< MOEOT > &  _replace,
moeoFitnessAssignment< MOEOT > &  _fitnessEval,
moeoDiversityAssignment< MOEOT > &  _diversityEval,
bool  _evalFitAndDivBeforeSelection = false 
) [inline]
+
+
+ +

+Ctor taking a select, a transform and a replacement. +

+

Parameters:
+ + + + + + + + + +
_continuator the stopping criteria
_eval the evaluation functions
_select the selection scheme
_transform the tranformation scheme
_replace the replacement strategy
_fitnessEval the fitness evaluation scheme
_diversityEval the diversity evaluation scheme
_evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
+
+ +

+Definition at line 103 of file moeoEasyEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoEasyEA< MOEOT >::moeoEasyEA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoSelect< MOEOT > &  _select,
eoTransform< MOEOT > &  _transform,
eoMerge< MOEOT > &  _merge,
eoReduce< MOEOT > &  _reduce,
moeoFitnessAssignment< MOEOT > &  _fitnessEval,
moeoDiversityAssignment< MOEOT > &  _diversityEval,
bool  _evalFitAndDivBeforeSelection = false 
) [inline]
+
+
+ +

+Ctor taking a select, a transform, a merge and a reduce. +

+

Parameters:
+ + + + + + + + + + +
_continuator the stopping criteria
_eval the evaluation functions
_select the selection scheme
_transform the tranformation scheme
_merge the merge scheme
_reduce the reduce scheme
_fitnessEval the fitness evaluation scheme
_diversityEval the diversity evaluation scheme
_evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process
+
+ +

+Definition at line 123 of file moeoEasyEA.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoEasyEA< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Applies a few generation of evolution to the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 135 of file moeoEasyEA.h. +

+References moeoEasyEA< MOEOT >::breed, moeoEasyEA< MOEOT >::continuator, moeoEasyEA< MOEOT >::diversityEval, moeoEasyEA< MOEOT >::evalFitAndDivBeforeSelection, moeoEasyEA< MOEOT >::fitnessEval, moeoEasyEA< MOEOT >::popEval, and moeoEasyEA< MOEOT >::replace. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.png b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA.png new file mode 100644 index 0000000000000000000000000000000000000000..4a16b3df3127e9450e4c58de7d901283bd287e26 GIT binary patch literal 1292 zcmeAS@N?(olHy`uVBq!ia0y~yU~~bpf3PqE$+X=~{y<71z$e7@|Ns9$=Kuc(=Fd-< z0AzvjfddDs5B+}vW?P*D zUEj=<3{+WC+EJ%B>(-(UTi1l6tczqb44G}qm!AoH^G)#W?!H~VojYIfuA1JF`aJ2u z#km%f_8qI-GP`?GNM!%Nz77u;C83Y(3fKNmn6=`3(|5lsyaMs(FR`?*lK=Smt5$Ep z5^05d2V*-r1Ox?@l$=~#IyyK61r?Q)TwGcZf-6)W@lJDizhQ!pi_*2e4D;j7516j@ ze$?MMp*g9;G4S@@693hYb3eU*r7yTUN?`d7j(!b3Z(V`Xlr7u}w>&!XI$u0bYB8*y z)3zMlQU61>cB-;`F zY&FM62NxA3L2hM`A2imvDTLGuoZ%J77hox7K4QIt8=u30zEM?9ny&qShTcW*1@#M8 z@8c7^^;BGt5$M-+fvXp{^D)1SDlEO2MeeGGkecjy~ z)xS*REfd(Vm3EOPy z_u2GFAbIiqO-W0($|%g+_DBNAncv-g?a}!cE8OSL?w;)adyQj$RmqaA>^${)^S-|D z{bVcqx6G2GqVuKBqJLtK0$;E2i!L;tcje`QF7~yHei7v32Oz+~KzZG0Y3Zm7Kn?eE+VXOv|h@;XHwQ zu5&Wpw9k${w#oUVl2se$#W@^nH7o^O)pmbn*6X`9?TFy4S!Q{zr)M1O>Q7kkHrjf^ zmct%-N@*J(W$B$0ux+khYy0chPKk;wb89dCX#5$pZU!;=P!IIyWRqeE(T9mKbLh*2~7ac CiA(eV literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval-members.html new file mode 100644 index 000000000..14956e628 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEasyEA< MOEOT >::eoDummyEval Member List

This is the complete list of members for moeoEasyEA< MOEOT >::eoDummyEval, including all inherited members.

+ + + + + + + +
EOFitT typedefeoEvalFunc< MOEOT >
EOType typedefeoEvalFunc< MOEOT >
functor_category()eoUF< A1, R > [static]
operator()(MOEOT &)moeoEasyEA< MOEOT >::eoDummyEval [inline]
eoEvalFunc< MOEOT >::operator()(A1)=0eoUF< A1, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.html b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.html new file mode 100644 index 000000000..90ccccf13 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.html @@ -0,0 +1,67 @@ + + +ParadisEO-MOEO: moeoEasyEA< MOEOT >::eoDummyEval Class Reference + + + + +
+
+ + +

moeoEasyEA< MOEOT >::eoDummyEval Class Reference

a dummy eval +More... +

+#include <moeoEasyEA.h> +

+

Inheritance diagram for moeoEasyEA< MOEOT >::eoDummyEval: +

+ +eoEvalFunc< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

+void operator() (MOEOT &)
 the dummy functor
+

Detailed Description

+

template<class MOEOT>
+ class moeoEasyEA< MOEOT >::eoDummyEval

+ +a dummy eval +

+ +

+Definition at line 200 of file moeoEasyEA.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.png b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyEval.png new file mode 100644 index 0000000000000000000000000000000000000000..b84873cf58b9694d8c562e72d71d914a2f1227aa GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^pMm%Q3p0>ZHuK;IQW60^A+G=b{|7Sv|35H)e!>JG z3ycpOI8c4){}UjWu_VYZn8D%MjWh-Z=1fl)$B>FSZ)ZpETCBj+@bsyTa2bR4jQlj` z&sYBHC!S#K>5}vQdZTZlt?uf`7RB~TNko5nOH)3wti#3a5-tk z*2J6N4N9(=F)d84V?8h{rt#{;3o{nmxi9XV?&Qdvrd;o`M)&B3=>N+vGW^n#(A{?I zR`7+$U6-obmT|Jr`LI%2uGueB+IRj(&hporxB58DS$uxu)=wW;d`_6Yd6<*U@lb}} z-VSJIn;mcM!?Pc>U%p;?aei0bpS_B|UVq%7_-mP5UWT(YP~L3ILf%{;bC-VXkBs{B zdqtf0o6a)38#+O8iB$S6`Kk)WwOtdxy?CmXRDI_33n|tai!a}NVfalkBOzwS!pH9- z-#Y~_Q9gSy>Gj<=eHP-Gyj*Unf_Sk&FWP^GJ*A!p|HU!@C5w{88{EB#-lZPByB;(x4PzHo@AR_?ZU zsa@B4QSs`tTKCi2E^JngY3%=Cuxrk zTka+0FFLLqqxpbEd#xmIQK#aTt@l#$v*(&r89fwUd;Q|wsQztY|3z;GUO0N~vFEm# z?d7+3Rajh@x%SUlv9ofrM;;&dp0oD#bn)vuPXa^tOD18T6@-3jwohZ4=ij!^{MN$n zXT9oV8tVCM%oEtu{#u%@+7h$9EpA%O+UA%8j(ySw#?l5?ewFSNoy+?8Yx>SFuCWH) zz5801OZM0MOX*3U{h>hfqR8Y-5i9eIwM%QezI}~lyK;KoBF0toEML3uOttYoXPOr=v*4BD zqv`v?q zlk2<2>K}aObhxep + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEasyEA< MOEOT >::eoDummySelect Member List

This is the complete list of members for moeoEasyEA< MOEOT >::eoDummySelect, including all inherited members.

+ + + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(const eoPop< MOEOT > &, eoPop< MOEOT > &)moeoEasyEA< MOEOT >::eoDummySelect [inline]
eoSelect< MOEOT >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.html b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.html new file mode 100644 index 000000000..9bc942e26 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.html @@ -0,0 +1,67 @@ + + +ParadisEO-MOEO: moeoEasyEA< MOEOT >::eoDummySelect Class Reference + + + + +
+
+ + +

moeoEasyEA< MOEOT >::eoDummySelect Class Reference

a dummy select +More... +

+#include <moeoEasyEA.h> +

+

Inheritance diagram for moeoEasyEA< MOEOT >::eoDummySelect: +

+ +eoSelect< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

+void operator() (const eoPop< MOEOT > &, eoPop< MOEOT > &)
 the dummy functor
+

Detailed Description

+

template<class MOEOT>
+ class moeoEasyEA< MOEOT >::eoDummySelect

+ +a dummy select +

+ +

+Definition at line 204 of file moeoEasyEA.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.png b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummySelect.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f3b8454e73aaf0da776000412b40f28e8afb99 GIT binary patch literal 1019 zcmeAS@N?(olHy`uVBq!ia0vp^e}VV_3p0?k{a>*MNJ#|vgt-3y{~yTw|Np@J`3Vz% zEHFNB;6U}E|4)Ei#*!evU% z_}~05bSlQ-gcD~`zzY9=g*n_U&yw|uQhFo*`AxlldVcA$2L6Apii=i>dguR8`!`S6 zJKu&+_H_TrcPXg?Q5}W_{H*Wz8h;u&9J_NUJ!4TyUB|7%#!4IGXMgNcpZ8$$4+VeM zp9de!ueyHw2WQ~z{m)nbzbRZeeLnL~$6V{@-gzzFl|OR+EY59X|2OyJ`cL+32bauS z@l*d}zsUPD|E*bSJ{+8Xa(?aKzpjZz9SxTEDk9 z-ph8TKHs&h%VtXEJ@>_1ylXZ+nzhRA!&!67f3d_u`;Yg)^`F*Hp5AxZ zbLqMLj|ctF&+q#;@9*EoTYqkToxd4MeC7xGj$Iy3?2k{oUq7SvKWoj0-6~ld*WP)r z_f)LXE7l`^N5F+>racF?i`KE%J&1DOQWX+9S>o9G>$ZV$&(u%PGuyY8WwUEi^3QGW zwA;4o{Mb~Q5X9c~=lY}mRrQkn>Ki_$p1r>7x$wnv|N1z;e8{~!U#MxXO4};`Hy5_; zPiLzA7R{P>_{z8WpV@E5Ka!pOar<$@|L#Zcf3kn3wPS1XKkdDC|Jk4apUVUc>+?^D z^GL?3A4mBM4t)md>3?LQD<4&7-7vpz&$|b_w|c`fOA6Bi6=$9QaeSI~t!L}w<~i>k z^tLlkyHtPW_3S@O=IVN$dg|Nv#P{CI=o-sQqN1j!u2e`)`0{CWw3+WFf6G_l&#H^8 z4m>T~6d6@1kzaYS@`<&pnCUM+yRO2{(sv4 z*;1a0tLDD{`e*&8`%nM;cQ{sSwav8lP=3uO8%_0Db`S68{;U7_pZ(ALBlBzi{^d98 XG;}y8`SBMpr!siD`njxgN@xNA^k6C} literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform-members.html new file mode 100644 index 000000000..c21fa1b72 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform-members.html @@ -0,0 +1,41 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEasyEA< MOEOT >::eoDummyTransform Member List

This is the complete list of members for moeoEasyEA< MOEOT >::eoDummyTransform, including all inherited members.

+ + + + + +
functor_category()eoUF< A1, R > [static]
operator()(eoPop< MOEOT > &)moeoEasyEA< MOEOT >::eoDummyTransform [inline]
eoTransform< MOEOT >::operator()(A1)=0eoUF< A1, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.html b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.html new file mode 100644 index 000000000..f19254943 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.html @@ -0,0 +1,67 @@ + + +ParadisEO-MOEO: moeoEasyEA< MOEOT >::eoDummyTransform Class Reference + + + + +
+
+ + +

moeoEasyEA< MOEOT >::eoDummyTransform Class Reference

a dummy transform +More... +

+#include <moeoEasyEA.h> +

+

Inheritance diagram for moeoEasyEA< MOEOT >::eoDummyTransform: +

+ +eoTransform< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

+void operator() (eoPop< MOEOT > &)
 the dummy functor
+

Detailed Description

+

template<class MOEOT>
+ class moeoEasyEA< MOEOT >::eoDummyTransform

+ +a dummy transform +

+ +

+Definition at line 208 of file moeoEasyEA.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.png b/trunk/paradiseo-moeo/doc/html/classmoeoEasyEA_1_1eoDummyTransform.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e6511a2e80d1e98e889fd8e661a94fd3a6e22f GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0y~yU=#+j53n!;$*WPb_5mr00G|-o|Ns93ng9PEm_I*Z z0+0p92M!#lKJ@&{;T$=G9LT!P5O3-*Y?SL`iqkl=e*MJsdvBl{Y$!>OIuTlhR6FwE{g&}oiq0` zq(<{DHGOkju5D9=@}vbvo{DxvPh-pLYdWMVS!~jEW4^PSqMloA_nld*AEy4_)9Vxx ztm)MynrF+Jx-qPBspCXerMLyT5%SGO=f4L&vE3)QZ~jrQqJW&hbDdMO*v~Ezn=W?O zQA%6nkfrqt3rVg?3l$`}E(K_W*FV$vHLvQ$>eD*0CIY98NnFHA;Zs-ZA8Jay;!kMXG<~5$?SwnLrRyxusILEAwQ3!+S7`5~&0Zmb z@t0+nrksqL@-t_OY59x*kF)J;s{8hM$uIO+R*)AMv}VtlPmc2<_c%@c`AAfE&nXZ` zydx+%C;2JM`UMe;8tO;9ZaGeRxBiEa*NpRb&Xj-sSHJ#?TjhCK&;1X|FEAR3s5m=r zviV#n#gRJa$vX!PX4P_bCrQm5UfeDRdP(Pe%?z;L=DBxXkqNt}KL1P16CF)gFU!T> zR>^7XPC0M){cypo?^Dm2MqlN1os?vi`C#$siTu%CjXPAQv}|6~QsZK}r|jA<$tfj# zrG9Np^P~Ni2R!x2;89#Epj@vwC0*>LtH?%y>%ylUt)0ErtkZDW^6`|g&iMrbp&An} zb-v^6it5_aU@rE;@N{w9%jT$K4nUtp8MX}vRAajUde6= zNs3gs>ByO?r!o7v*K^sDNzjPN)R?l`zE~u3-cO6($#-NqQWt>2K)H1-D2~Aqjg1IW z7m;$U`&9exMKM^FqR8=!cdq=YVyw6Rbn77Nt)B44Wq&QIdN!@!d1+hByB|u+Wn(h* zW_bPn+j)D{0-d%W|HQ06Iky!|w6=A6IBU<&xmQhkr!$`3^XJ`>o*?U&PaR_twEcb= zcd0KAi#5|b8g%;bjwh+VY`cPAr%L_x%#)nEOk5;)>O{Xa7H`j+nH5*`^3Bz|nxYhW ziYxWyioKJ5ZP(aWvo?F?`wLU2-(M^sYOmuuec9Am;ojcf`--+Z7&-kA=qj?9Idko$ z+9@^RUN$F<)VuZWfAyX6W-8~R9X*p`?5DEsYP@vJt9Me;(w2nH&6}=&GAZ?85GiM0 zddpE|qptU&{{F1PY7>6#-1KfisT8OAs_^5}SwGq7Pms8?;7;KF^pA&U$}MPker0x* w&1L2(!gGy&tv}oi%(Bi4WB$%ueBwX5d{A?mO#AJAV41++>FVdQ&MBb@0M$SF6#xJL literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement-members.html new file mode 100644 index 000000000..0c076169f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement-members.html @@ -0,0 +1,50 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoElitistReplacement< MOEOT > Member List

This is the complete list of members for moeoElitistReplacement< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + +
comparatormoeoElitistReplacement< MOEOT > [protected]
defaultComparatormoeoElitistReplacement< MOEOT > [protected]
defaultDiversitymoeoElitistReplacement< MOEOT > [protected]
diversityAssignmentmoeoElitistReplacement< MOEOT > [protected]
fitnessAssignmentmoeoElitistReplacement< MOEOT > [protected]
functor_category()eoBF< A1, A2, R > [static]
moeoElitistReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment, moeoComparator< MOEOT > &_comparator)moeoElitistReplacement< MOEOT > [inline]
moeoElitistReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment)moeoElitistReplacement< MOEOT > [inline]
moeoElitistReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoComparator< MOEOT > &_comparator)moeoElitistReplacement< MOEOT > [inline]
moeoElitistReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment)moeoElitistReplacement< MOEOT > [inline]
operator()(eoPop< MOEOT > &_parents, eoPop< MOEOT > &_offspring)moeoElitistReplacement< MOEOT > [inline]
moeoReplacement::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.html b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.html new file mode 100644 index 000000000..f3d10613b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.html @@ -0,0 +1,310 @@ + + +ParadisEO-MOEO: moeoElitistReplacement< MOEOT > Class Template Reference + + + + +
+
+ +

moeoElitistReplacement< MOEOT > Class Template Reference

Elitist replacement strategy that consists in keeping the N best individuals. +More... +

+#include <moeoElitistReplacement.h> +

+

Inheritance diagram for moeoElitistReplacement< MOEOT >: +

+ +moeoReplacement< MOEOT > +eoReplacement< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment, moeoComparator< MOEOT > &_comparator)
 Full constructor.
 moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment)
 Constructor without comparator.
 moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoComparator< MOEOT > &_comparator)
 Constructor without moeoDiversityAssignement.
 moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment)
 Constructor without moeoDiversityAssignement nor moeoComparator.
void operator() (eoPop< MOEOT > &_parents, eoPop< MOEOT > &_offspring)
 Replaces the first population by adding the individuals of the second one, sorting with a moeoComparator and resizing the whole population obtained.

Protected Attributes

+moeoFitnessAssignment< MOEOT > & fitnessAssignment
 the fitness assignment strategy
+moeoDiversityAssignment< MOEOT > & diversityAssignment
 the diversity assignment strategy
+moeoDummyDiversityAssignment<
+ MOEOT > 
defaultDiversity
 a dummy diversity assignment can be used as default
+moeoFitnessThenDiversityComparator<
+ MOEOT > 
defaultComparator
 a fitness then diversity comparator can be used as default
+moeoElitistReplacement::Cmp comparator
 this object is used to compare solutions in order to sort the population

Classes

class  Cmp
 this object is used to compare solutions in order to sort the population More...
+

Detailed Description

+

template<class MOEOT>
+ class moeoElitistReplacement< MOEOT >

+ +Elitist replacement strategy that consists in keeping the N best individuals. +

+ +

+Definition at line 26 of file moeoElitistReplacement.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoElitistReplacement< MOEOT >::moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment,
moeoDiversityAssignment< MOEOT > &  _diversityAssignment,
moeoComparator< MOEOT > &  _comparator 
) [inline]
+
+
+ +

+Full constructor. +

+

Parameters:
+ + + + +
_fitnessAssignment the fitness assignment strategy
_diversityAssignment the diversity assignment strategy
_comparator the comparator (used to compare 2 individuals)
+
+ +

+Definition at line 36 of file moeoElitistReplacement.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoElitistReplacement< MOEOT >::moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment,
moeoDiversityAssignment< MOEOT > &  _diversityAssignment 
) [inline]
+
+
+ +

+Constructor without comparator. +

+A moeoFitThenDivComparator is used as default.

Parameters:
+ + + +
_fitnessAssignment the fitness assignment strategy
_diversityAssignment the diversity assignment strategy
+
+ +

+Definition at line 46 of file moeoElitistReplacement.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoElitistReplacement< MOEOT >::moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment,
moeoComparator< MOEOT > &  _comparator 
) [inline]
+
+
+ +

+Constructor without moeoDiversityAssignement. +

+A dummy diversity is used as default.

Parameters:
+ + + +
_fitnessAssignment the fitness assignment strategy
_comparator the comparator (used to compare 2 individuals)
+
+ +

+Definition at line 56 of file moeoElitistReplacement.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoElitistReplacement< MOEOT >::moeoElitistReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment  )  [inline]
+
+
+ +

+Constructor without moeoDiversityAssignement nor moeoComparator. +

+A moeoFitThenDivComparator and a dummy diversity are used as default.

Parameters:
+ + +
_fitnessAssignment the fitness assignment strategy
+
+ +

+Definition at line 66 of file moeoElitistReplacement.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoElitistReplacement< MOEOT >::operator() (eoPop< MOEOT > &  _parents,
eoPop< MOEOT > &  _offspring 
) [inline]
+
+
+ +

+Replaces the first population by adding the individuals of the second one, sorting with a moeoComparator and resizing the whole population obtained. +

+

Parameters:
+ + + +
_parents the population composed of the parents (the population you want to replace)
_offspring the offspring population
+
+ +

+Definition at line 76 of file moeoElitistReplacement.h. +

+References moeoElitistReplacement< MOEOT >::comparator, moeoElitistReplacement< MOEOT >::diversityAssignment, and moeoElitistReplacement< MOEOT >::fitnessAssignment. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.png b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement.png new file mode 100644 index 0000000000000000000000000000000000000000..c9df8b373d62657217b3d0bc11b561e49c0965af GIT binary patch literal 1073 zcmV-11kU@3P)iVKqtuSzED=V{}Ec$z@RxY;#s(eV~MFg3d(-yH^aYX>1+5qwo1zClm!4; z&c{-B1FN*@W2s*@z0UHJKhx+PT6W&MPy#L#I~Q2k0NcFG3V_L?u$-roKnL`Tvi{h^ z(=0&W1WPQ(>ot{*Rald`+^>>Fa~M4IMeJPmYusnyTDlW4^1Jo&eCuYcTI-d?p?7F< zD)AJDxLzK7tvIZgl%=fCW3}9~T}t2Ay1hH=&rhGMpP%n8S-r-gvXrGPWhqNp%2JlH z`en6z*6a0oSy}h9g1G849o~&eKo9aH*HqD9eJQYdpUIM>na5@?uu$_{V~rVWtip=Y zuCQ>DNJ&mDB*Uz|i9Epq7R1TSg2g_|dhNjWSOB?SYy_jkr52@+yRcoq#$pbE3)9Nv zy1bNL^lNRsj#wAhOX3h9llddd35%;=jQQP^8$S6P*i}|x{^W0a@AZACtj}e&+_SaZ zi@rNc_4#M9dW}P6DN9+(QkJrmr7UIj%WCA8f*9&qbk2m#6Raf4<7s7(1M*ZHR9U>@x#h&-Biej=`y{IndBfRfIWJEa z2R@ymCjr>g2$rnHJZ`a2#T6{S@fq)kCSg0V0HE+|4qLE9l=s;!kU$T_k^}X?gL7`( zuLW%BS0T!~=m?t;yUDL@)}def>s4e~u&2Le93HOMdK~&#?CAJB4kHe3_W3#;^JO}z zhM!9x%Bq@_^)yz?JzLAY=)1F2pMMss*Em#`vXrGPWhqNp%2HOptd`Guy*@81>qb^} zjeh@(bX|=;XNmfLmquT(M18+Wqc2!9qqQ~qRn|=!{kmWGX!Lt?SX-lCur}lHb&dYS z_eM1>`-554lCqx0YPn}?xfgwRmg@7*V)Yt_%2JlHl%*_XDN9+(>X!x0k{xVShxd}Q zp3gE<$e1C#LS_g76kD$*lU3WPyG0Xt14Zu@7X2H}*l6pB1=Fp?_J&%UR3|Kh2B(%d z7-m_p)3Ao{Zm<;1Kx}9y$MG84WUSEJ@^JHU3d=&ESu^kjS@FfCl#30)Sh`{dgY(BD zSg^2`S!6O=itA-$y<(-jNxk$VV~K?(l3z5Gf(20eH2@hKuqze-b^st2cOX=_88+rH zw3zud%vfm-#TULG#P7ndP1cHEzge#$n~bf-;e5TaIOO%hI5hJ(v=WDg!V-s(0&VvB rTEyY0WR9C0BxSvxl=U=L!#&%7{NBj<#)r?b00000NkvXXu0mjfrA{7` literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp-members.html new file mode 100644 index 000000000..54679e55c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp-members.html @@ -0,0 +1,39 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoElitistReplacement< MOEOT >::Cmp Member List

This is the complete list of members for moeoElitistReplacement< MOEOT >::Cmp, including all inherited members.

+ + + +
Cmp(moeoComparator< MOEOT > &_comp)moeoElitistReplacement< MOEOT >::Cmp [inline]
compmoeoElitistReplacement< MOEOT >::Cmp [private]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoElitistReplacement< MOEOT >::Cmp [inline]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp.html b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp.html new file mode 100644 index 000000000..f7e820bd3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoElitistReplacement_1_1Cmp.html @@ -0,0 +1,100 @@ + + +ParadisEO-MOEO: moeoElitistReplacement< MOEOT >::Cmp Class Reference + + + + +
+
+ + +

moeoElitistReplacement< MOEOT >::Cmp Class Reference

this object is used to compare solutions in order to sort the population +More... +

+#include <moeoElitistReplacement.h> +

+List of all members. + + + + + + + + + + + + +

Public Member Functions

 Cmp (moeoComparator< MOEOT > &_comp)
 Ctor.
+bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 is greater than _moeo2 according to the comparator _moeo1 the first individual _moeo2 the first individual.

Private Attributes

+moeoComparator< MOEOT > & comp
 the comparator
+


Detailed Description

+

template<class MOEOT>
+ class moeoElitistReplacement< MOEOT >::Cmp

+ +this object is used to compare solutions in order to sort the population +

+ +

+Definition at line 105 of file moeoElitistReplacement.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoElitistReplacement< MOEOT >::Cmp::Cmp (moeoComparator< MOEOT > &  _comp  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_comp the comparator
+
+ +

+Definition at line 112 of file moeoElitistReplacement.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric-members.html new file mode 100644 index 000000000..80a3b67c1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric-members.html @@ -0,0 +1,50 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEntropyMetric< ObjectiveVector > Member List

This is the complete list of members for moeoEntropyMetric< ObjectiveVector >, including all inherited members.

+ + + + + + + + + + + + + + +
computeUnion(const std::vector< ObjectiveVector > &_f1, const std::vector< ObjectiveVector > &_f2, std::vector< ObjectiveVector > &_f)moeoEntropyMetric< ObjectiveVector > [inline, private]
euclidianDistance(const ObjectiveVector &_set1, const ObjectiveVector &_to, unsigned int _deg=2)moeoEntropyMetric< ObjectiveVector > [inline, private]
functor_category()eoBF< A1, A2, R > [static]
howManyInNicheOf(const std::vector< ObjectiveVector > &_f, const ObjectiveVector &_s, unsigned int _size)moeoEntropyMetric< ObjectiveVector > [inline, private]
normalize(std::vector< ObjectiveVector > &_f)moeoEntropyMetric< ObjectiveVector > [inline, private]
operator()(const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)moeoEntropyMetric< ObjectiveVector > [inline]
moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
paretoComparatormoeoEntropyMetric< ObjectiveVector > [private]
prenormalize(const std::vector< ObjectiveVector > &_f)moeoEntropyMetric< ObjectiveVector > [inline, private]
removeDominated(std::vector< ObjectiveVector > &_f)moeoEntropyMetric< ObjectiveVector > [inline, private]
vect_max_valmoeoEntropyMetric< ObjectiveVector > [private]
vect_min_valmoeoEntropyMetric< ObjectiveVector > [private]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.html new file mode 100644 index 000000000..0c8733e4a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.html @@ -0,0 +1,303 @@ + + +ParadisEO-MOEO: moeoEntropyMetric< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoEntropyMetric< ObjectiveVector > Class Template Reference

The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. +More... +

+#include <moeoEntropyMetric.h> +

+

Inheritance diagram for moeoEntropyMetric< ObjectiveVector >: +

+ +moeoVectorVsVectorBinaryMetric< ObjectiveVector, double > +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

double operator() (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)
 Returns the entropy of the Pareto set '_set1' relatively to the Pareto set '_set2'.

Private Member Functions

void removeDominated (std::vector< ObjectiveVector > &_f)
 Removes the dominated individuals contained in _f.
void prenormalize (const std::vector< ObjectiveVector > &_f)
 Prenormalization.
void normalize (std::vector< ObjectiveVector > &_f)
 Normalization.
void computeUnion (const std::vector< ObjectiveVector > &_f1, const std::vector< ObjectiveVector > &_f2, std::vector< ObjectiveVector > &_f)
 Computation of the union of _f1 and _f2 in _f.
+unsigned int howManyInNicheOf (const std::vector< ObjectiveVector > &_f, const ObjectiveVector &_s, unsigned int _size)
 How many in niche.
+double euclidianDistance (const ObjectiveVector &_set1, const ObjectiveVector &_to, unsigned int _deg=2)
 Euclidian distance.

Private Attributes

+std::vector< double > vect_min_val
 vector of min values
+std::vector< double > vect_max_val
 vector of max values
+moeoParetoObjectiveVectorComparator<
+ ObjectiveVector > 
paretoComparator
 Functor to compare two objective vectors according to Pareto dominance relation.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoEntropyMetric< ObjectiveVector >

+ +The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. +

+of the 2002 Congress on Evolutionary Computation, IEEE Press, pp. 1155-1156) +

+ +

+Definition at line 25 of file moeoEntropyMetric.h.


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
double moeoEntropyMetric< ObjectiveVector >::operator() (const std::vector< ObjectiveVector > &  _set1,
const std::vector< ObjectiveVector > &  _set2 
) [inline]
+
+
+ +

+Returns the entropy of the Pareto set '_set1' relatively to the Pareto set '_set2'. +

+

Parameters:
+ + + +
_set1 the first Pareto set
_set2 the second Pareto set
+
+ +

+Definition at line 34 of file moeoEntropyMetric.h. +

+References moeoEntropyMetric< ObjectiveVector >::computeUnion(), moeoEntropyMetric< ObjectiveVector >::howManyInNicheOf(), moeoEntropyMetric< ObjectiveVector >::normalize(), moeoEntropyMetric< ObjectiveVector >::prenormalize(), and moeoEntropyMetric< ObjectiveVector >::removeDominated(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + +
void moeoEntropyMetric< ObjectiveVector >::removeDominated (std::vector< ObjectiveVector > &  _f  )  [inline, private]
+
+
+ +

+Removes the dominated individuals contained in _f. +

+

Parameters:
+ + +
_f a Pareto set
+
+ +

+Definition at line 85 of file moeoEntropyMetric.h. +

+References moeoEntropyMetric< ObjectiveVector >::paretoComparator. +

+Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + +
void moeoEntropyMetric< ObjectiveVector >::prenormalize (const std::vector< ObjectiveVector > &  _f  )  [inline, private]
+
+
+ +

+Prenormalization. +

+

Parameters:
+ + +
_f a Pareto set
+
+ +

+Definition at line 107 of file moeoEntropyMetric.h. +

+References moeoEntropyMetric< ObjectiveVector >::vect_max_val, and moeoEntropyMetric< ObjectiveVector >::vect_min_val. +

+Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + +
void moeoEntropyMetric< ObjectiveVector >::normalize (std::vector< ObjectiveVector > &  _f  )  [inline, private]
+
+
+ +

+Normalization. +

+

Parameters:
+ + +
_f a Pareto set
+
+ +

+Definition at line 129 of file moeoEntropyMetric.h. +

+References moeoEntropyMetric< ObjectiveVector >::vect_max_val, and moeoEntropyMetric< ObjectiveVector >::vect_min_val. +

+Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + + + + + + + +
void moeoEntropyMetric< ObjectiveVector >::computeUnion (const std::vector< ObjectiveVector > &  _f1,
const std::vector< ObjectiveVector > &  _f2,
std::vector< ObjectiveVector > &  _f 
) [inline, private]
+
+
+ +

+Computation of the union of _f1 and _f2 in _f. +

+

Parameters:
+ + + + +
_f1 the first Pareto set
_f2 the second Pareto set
_f the final Pareto set
+
+ +

+Definition at line 142 of file moeoEntropyMetric.h. +

+Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoEntropyMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..070e38a3370c39ca4381dbd4df7670f3bde4c262 GIT binary patch literal 2280 zcmb7Gc~sKb9>;VlO|fTLspHa2Y3789K6e|FtW1T{(n&=#azj#QLexl&q{UIJBy(R9 z*Hml)QNbl!jOR0T0AYS4#%P)uu80~YkLk^v>GjTgXXcN4@ArPsJ>T!WpXHpJeiVL4 zOG94+1OjP!96sO!0s z6r;+m3f2ei3vwM3go8lqQ#=mrKb}}5DGJP{G;eX=9&;f1>t5Hl>R4&f6NL<7B zAIAtzV+5G9{Sd7RZ{t?9oli`E`?iSB}6~jQoNHzW})#5auGn1E=kp&xHV)+#9BdtOsfU6jr2(YWP1EO;Quf_ zHkRJK-&873S*)f4q*}cEAX5`+stFycT5E`BDuS8P&BEzHfWeSY(|hVB6QW(hFbTF> zha-(q7`x>*8er+rn zHHK?`gM|QWKk7t$M5h=d6LTLK3+&0=wGrRuhrC%M8Y4hnZMwo+o!o$YWOl)&Uzep$ zhb`$h&6!K{k2z`4QHf<6mWZLTwcIT6uSY*Cs)oMmD*3$A|4PPDaZ**;G<1otv9wbk zv@)gh`$@NMXFbm7u7HpqR@~qjQ!U|*Vi8~Z3_C2o`71xa zW1%E%TaeTHfy)VcD+H2tQqg%CS?n9S@e1#StD92e1OibB_+wRMr#(^Ivy0Fk>M!wIbQsSrMC^wBgQ)uDzSzTEc#wrw#G0)zd*Xla!8fd5%YcZwrw z_!T=ant{->VNPTgrD2lYaFMXGllESz{>fRZ3&z@cEZZ=0}G@Pl{K6X93rsB{M^a(D++s)<- z`=#bs{eV~Hy^u7`kYH%aC97+-`=-Vthlx(Mgb=G&_tjE!K+ZphQ*ge1u!Dt&agOBv zVg`<4#`Ap_0+q#+DcT$(lCE3@uxp8ax}P1~lb(NfXuJyAB+S0dkK{Kc{nPyP!e)7H zCQ!GxxgN<fzc8d>o?gQh6ZY=ONX zOJYg)zx(z+a^Hhq0aaB{=Q)UCF4v-zl+PAWjUIp56C{jG;I2PhOc=dC^qly-(%|Ai z{c9*WeO?A7tIywx>*D8P!%R1&taRpkAy#e3Gedq{QJe{RCQmk8bPb5k+9k=};_-i# z@o!hDsH!WSxK`xzpMLz*CVx^Xa>zry&9vseyn!!R?3#EB%I$B_L;t9GeLa8yMK4nZ z8!`h{mFd`99q^RfGv|^V2VQxa${fVMt~IZL*Ifi|4T%Q8z>v zG#7N}sT@;me^NYp^eT2d>16KhnFkOmGq)xgY1hLt+FPAY$4UjJMlpkwD#0oCc#cHu z<}%s7_bSaYe9J@f>iWX2^7QtRL5CFQJ11W1;8VFqO{0%FKJO8JuPN)3R|Upy3H|%_ zC|hD0pHw#F;0!zF^L(E`IMO5XTj0W~G|_a$P~J9VnTI$7Pi`B4Trg(B@?2g_LvXTW4pAY$P>V(TP5`j9vgF!=dkn@|V1GE8Zh6;b8tz1K&1ch4a+_{p z)JliG5Qfi^wDdyx)_R5>UPV`lCx3jQQ^_kb+kKvvX&Po~ZCQ@g|Hjubwumilkat}O zZZ8sd(&UJUv2|2ONHWdXVFTS?I*{TT6@g&zvqHJ8Imdd8=`ms4xkC+sdi0fJlYR&H jq;gwz_uZQ + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEnvironmentalReplacement< MOEOT > Member List

This is the complete list of members for moeoEnvironmentalReplacement< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + +
comparatormoeoEnvironmentalReplacement< MOEOT > [protected]
defaultComparatormoeoEnvironmentalReplacement< MOEOT > [protected]
defaultDiversitymoeoEnvironmentalReplacement< MOEOT > [protected]
diversityAssignmentmoeoEnvironmentalReplacement< MOEOT > [protected]
fitnessAssignmentmoeoEnvironmentalReplacement< MOEOT > [protected]
functor_category()eoBF< A1, A2, R > [static]
moeoEnvironmentalReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment, moeoComparator< MOEOT > &_comparator)moeoEnvironmentalReplacement< MOEOT > [inline]
moeoEnvironmentalReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment)moeoEnvironmentalReplacement< MOEOT > [inline]
moeoEnvironmentalReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoComparator< MOEOT > &_comparator)moeoEnvironmentalReplacement< MOEOT > [inline]
moeoEnvironmentalReplacement(moeoFitnessAssignment< MOEOT > &_fitnessAssignment)moeoEnvironmentalReplacement< MOEOT > [inline]
ObjectiveVector typedefmoeoEnvironmentalReplacement< MOEOT >
operator()(eoPop< MOEOT > &_parents, eoPop< MOEOT > &_offspring)moeoEnvironmentalReplacement< MOEOT > [inline]
moeoReplacement::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.html b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.html new file mode 100644 index 000000000..2c51e0ebf --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.html @@ -0,0 +1,315 @@ + + +ParadisEO-MOEO: moeoEnvironmentalReplacement< MOEOT > Class Template Reference + + + + +
+
+ +

moeoEnvironmentalReplacement< MOEOT > Class Template Reference

Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion. +More... +

+#include <moeoEnvironmentalReplacement.h> +

+

Inheritance diagram for moeoEnvironmentalReplacement< MOEOT >: +

+ +moeoReplacement< MOEOT > +eoReplacement< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type for objective vector.

Public Member Functions

 moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment, moeoComparator< MOEOT > &_comparator)
 Full constructor.
 moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoDiversityAssignment< MOEOT > &_diversityAssignment)
 Constructor without comparator.
 moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment, moeoComparator< MOEOT > &_comparator)
 Constructor without moeoDiversityAssignement.
 moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &_fitnessAssignment)
 Constructor without moeoDiversityAssignement nor moeoComparator.
void operator() (eoPop< MOEOT > &_parents, eoPop< MOEOT > &_offspring)
 Replaces the first population by adding the individuals of the second one, sorting with a moeoComparator and resizing the whole population obtained.

Protected Attributes

+moeoFitnessAssignment< MOEOT > & fitnessAssignment
 the fitness assignment strategy
+moeoDiversityAssignment< MOEOT > & diversityAssignment
 the diversity assignment strategy
+moeoDummyDiversityAssignment<
+ MOEOT > 
defaultDiversity
 a dummy diversity assignment can be used as default
+moeoFitnessThenDiversityComparator<
+ MOEOT > 
defaultComparator
 a fitness then diversity comparator can be used as default
+moeoEnvironmentalReplacement::Cmp comparator
 this object is used to compare solutions in order to sort the population

Classes

class  Cmp
 this object is used to compare solutions in order to sort the population More...
+

Detailed Description

+

template<class MOEOT>
+ class moeoEnvironmentalReplacement< MOEOT >

+ +Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion. +

+ +

+Definition at line 26 of file moeoEnvironmentalReplacement.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoEnvironmentalReplacement< MOEOT >::moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment,
moeoDiversityAssignment< MOEOT > &  _diversityAssignment,
moeoComparator< MOEOT > &  _comparator 
) [inline]
+
+
+ +

+Full constructor. +

+

Parameters:
+ + + + +
_fitnessAssignment the fitness assignment strategy
_diversityAssignment the diversity assignment strategy
_comparator the comparator (used to compare 2 individuals)
+
+ +

+Definition at line 40 of file moeoEnvironmentalReplacement.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoEnvironmentalReplacement< MOEOT >::moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment,
moeoDiversityAssignment< MOEOT > &  _diversityAssignment 
) [inline]
+
+
+ +

+Constructor without comparator. +

+A moeoFitThenDivComparator is used as default.

Parameters:
+ + + +
_fitnessAssignment the fitness assignment strategy
_diversityAssignment the diversity assignment strategy
+
+ +

+Definition at line 50 of file moeoEnvironmentalReplacement.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoEnvironmentalReplacement< MOEOT >::moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment,
moeoComparator< MOEOT > &  _comparator 
) [inline]
+
+
+ +

+Constructor without moeoDiversityAssignement. +

+A dummy diversity is used as default.

Parameters:
+ + + +
_fitnessAssignment the fitness assignment strategy
_comparator the comparator (used to compare 2 individuals)
+
+ +

+Definition at line 60 of file moeoEnvironmentalReplacement.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoEnvironmentalReplacement< MOEOT >::moeoEnvironmentalReplacement (moeoFitnessAssignment< MOEOT > &  _fitnessAssignment  )  [inline]
+
+
+ +

+Constructor without moeoDiversityAssignement nor moeoComparator. +

+A moeoFitThenDivComparator and a dummy diversity are used as default.

Parameters:
+ + +
_fitnessAssignment the fitness assignment strategy
+
+ +

+Definition at line 70 of file moeoEnvironmentalReplacement.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoEnvironmentalReplacement< MOEOT >::operator() (eoPop< MOEOT > &  _parents,
eoPop< MOEOT > &  _offspring 
) [inline]
+
+
+ +

+Replaces the first population by adding the individuals of the second one, sorting with a moeoComparator and resizing the whole population obtained. +

+

Parameters:
+ + + +
_parents the population composed of the parents (the population you want to replace)
_offspring the offspring population
+
+ +

+Definition at line 80 of file moeoEnvironmentalReplacement.h. +

+References moeoEnvironmentalReplacement< MOEOT >::comparator, moeoEnvironmentalReplacement< MOEOT >::diversityAssignment, and moeoEnvironmentalReplacement< MOEOT >::fitnessAssignment. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.png b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0869fc61d4298cef1843bba33defa685d3f177 GIT binary patch literal 1438 zcmbVMYfw@N6sEE=&1~=8BHt?mYnGB!=3_=NL*NpsUQEj7Dh4UKIo`Nl%UBq`a|B-B`Dn`Usv*lh#Uj@$68xkQ`+=nhIC2d zUg|!CkFqZsfmptsMA#X`7OG1Q72V#5@SCk{Nw>(k{`e8-8SbjLuf5C{LpXcoA9a0o zo6HG)sPa5vf_4z`L{uV7Ya;Nq864bAwld+?;!U`58=o@VtXdAl+MfT!zVo5W^XS1y zr_4JQoa)!_LLDAopQy^?oGImmNO%OcD$FW>4xMGk9RtxZLh$sYIs|$kNMH@V4F@|vl2iuE{nj<2I+wg*F*^W5@X4y zw+uV%^3wWP$$Xq${(8Y1h&V=2OsqVS?vEA}7c)`I>JaBce(`bk`E~tIbknus<;Fcr zjZQ3C`hUx+5_;NB-vMo-n34!>TBRgcJ;kd}K6AKw4|eXA&|w6;UddPQh|F4HLTDDcWSlz16r}M!Xv&*QOm)N6X92jKh{yW zvtr?WcRWxpn{=s(^O!$kD&fH@_+4Whk(YCW?Y6MCIk`GlcV8Q@hurQzyJwHfel zBW|Bd#`N0yGDBmhNaB(A`8soKixLcW4J70R61V?A+F}0^hNl3FZyx%;6wyaGI#Zxa z((A{(L3xPXQ!eBs7&XO2laDJf752Ck!6RW_@XEUZKv6s|a}_i9X%EqfC2m>MS#IjP z3%ATM?L&3OA+%!rf`;4{0_~q}m#VvFOW$-_)`z-U`r?p1AA!r2V+9=A{XE)32#JcW zTx*U6B*ikK^+9V&xl7MF^FU+&z#JknM{w+hJs6?MHM@ZIuve$MGnS25YI_pmGnY7Orw%}S7Xgo*g(>^05ft+>A5DF3g56G zphd{OP(?uZa|j@Kj}rBrQu)f-&a z4#07C!FPu)II?@Nu>b98XiHR?gTF!-Gcz;Uu+_?|h~41nUBYeFT}dXP`Y`gs2981N z9|2YUeEH{#(&|q}j6g6q3Ix6^8i#8ltoQ~=f9><%chTd}0a-X6RW~jWn*~Mv#Isu|5G4t8wjMJ++b! zORr1~*^Rr)3tckdn}x~LDADw&T~XnJw`6sCQbRvu^&=-hGmGPK`bk<77J5a?2m|%b z0yOK!mTBfcnfUqTOHvx~fIM;=@C1Y$V;pG#p1K)!@c!qci^NDg&@MEV*Svp-VOh;puze=`umxseX~sz&Ykl0A-GefmvVA`ztMc$rGj)m)fRQ;TLNszvH>ME| e^PP{zPuq>YUKb@f%1SjnQv}J6N~rRUxbQdBEQe(P literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp-members.html new file mode 100644 index 000000000..2f9a7f280 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp-members.html @@ -0,0 +1,39 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEnvironmentalReplacement< MOEOT >::Cmp Member List

This is the complete list of members for moeoEnvironmentalReplacement< MOEOT >::Cmp, including all inherited members.

+ + + +
Cmp(moeoComparator< MOEOT > &_comp)moeoEnvironmentalReplacement< MOEOT >::Cmp [inline]
compmoeoEnvironmentalReplacement< MOEOT >::Cmp [private]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoEnvironmentalReplacement< MOEOT >::Cmp [inline]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp.html b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp.html new file mode 100644 index 000000000..15982de5e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEnvironmentalReplacement_1_1Cmp.html @@ -0,0 +1,100 @@ + + +ParadisEO-MOEO: moeoEnvironmentalReplacement< MOEOT >::Cmp Class Reference + + + + +
+
+ + +

moeoEnvironmentalReplacement< MOEOT >::Cmp Class Reference

this object is used to compare solutions in order to sort the population +More... +

+#include <moeoEnvironmentalReplacement.h> +

+List of all members. + + + + + + + + + + + + +

Public Member Functions

 Cmp (moeoComparator< MOEOT > &_comp)
 Ctor.
+bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 is greater than _moeo2 according to the comparator _moeo1 the first individual _moeo2 the first individual.

Private Attributes

+moeoComparator< MOEOT > & comp
 the comparator
+


Detailed Description

+

template<class MOEOT>
+ class moeoEnvironmentalReplacement< MOEOT >::Cmp

+ +this object is used to compare solutions in order to sort the population +

+ +

+Definition at line 121 of file moeoEnvironmentalReplacement.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoEnvironmentalReplacement< MOEOT >::Cmp::Cmp (moeoComparator< MOEOT > &  _comp  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_comp the comparator
+
+ +

+Definition at line 128 of file moeoEnvironmentalReplacement.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance-members.html new file mode 100644 index 000000000..611b03a77 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance-members.html @@ -0,0 +1,48 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEuclideanDistance< MOEOT > Member List

This is the complete list of members for moeoEuclideanDistance< MOEOT >, including all inherited members.

+ + + + + + + + + + + + +
boundsmoeoNormalizedDistance< MOEOT > [protected]
functor_category()eoBF< A1, A2, R > [static]
moeoNormalizedDistance()moeoNormalizedDistance< MOEOT > [inline]
ObjectiveVector typedefmoeoEuclideanDistance< MOEOT >
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoEuclideanDistance< MOEOT > [inline]
moeoNormalizedDistance< MOEOT >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)moeoNormalizedDistance< MOEOT > [inline, virtual]
setup(double _min, double _max, unsigned int _obj)moeoNormalizedDistance< MOEOT > [inline, virtual]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoNormalizedDistance< MOEOT > [inline, virtual]
tiny()moeoNormalizedDistance< MOEOT > [inline, static]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.html b/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.html new file mode 100644 index 000000000..2e11b0d76 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.html @@ -0,0 +1,116 @@ + + +ParadisEO-MOEO: moeoEuclideanDistance< MOEOT > Class Template Reference + + + + +
+
+ +

moeoEuclideanDistance< MOEOT > Class Template Reference

A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. +More... +

+#include <moeoEuclideanDistance.h> +

+

Inheritance diagram for moeoEuclideanDistance< MOEOT >: +

+ +moeoNormalizedDistance< MOEOT > +moeoDistance< MOEOT, double > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

const double operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns the euclidian distance between _moeo1 and _moeo2 in the objective space.
+

Detailed Description

+

template<class MOEOT>
+ class moeoEuclideanDistance< MOEOT >

+ +A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. +

+between 0 and 1). A distance value then lies between 0 and sqrt(nObjectives). +

+ +

+Definition at line 24 of file moeoEuclideanDistance.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const double moeoEuclideanDistance< MOEOT >::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns the euclidian distance between _moeo1 and _moeo2 in the objective space. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 37 of file moeoEuclideanDistance.h. +

+References moeoNormalizedDistance< MOEOT >::bounds. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.png b/trunk/paradiseo-moeo/doc/html/classmoeoEuclideanDistance.png new file mode 100644 index 0000000000000000000000000000000000000000..e57f38c7ccc8a4decc6305d7e141a0cdf7d6c2dc GIT binary patch literal 1292 zcmeAS@N?(olHy`uVBq!ia0vp^4}kaw3p0>pZ~LwSq$C1-LR|m<{|{vT|9@cq{DcWW z78oBmaG?6o|0h5$V@Z%-FoVOh8)*y-EQ>r{978JRyq)7cYqkMT!^dUWOQcWib*x^v z?%6+gjcF;$$?Az}>!MfK%xwAbRoVLqGv~%Xb7H2+7iRr@ci=x42g5VzsZoD|4^$;- zZM{-fE9@~lWwy+T%gTbwqz;7i&S<#P_`8Qu?UY$Ao06yRE!G6ir`mHTel>PT&@_&2 zSYdT1>#@ZHv*lAau$`Ku7P-=BRe6I(^?!*Izm5hU`-xc6V`eq%lJjGEIakAx+@&v5#5GV8R3xXIOjsY;K#ry4lD{H8Zy?_S#klLHof z5qEA&p2$|y`?}Zt-=YK0Usv&QNGVU)DYd|Be(8@XKbSZYRIkjuQB&|f(EE4O53fTJ zx|$hJ*Xc^HKe6?_$BoMmwI5hpoeASgNK#n#A94Fv0fGD=xE2IR*1w%ResIDG{r{^w#{T zw^{R@hWuci4%NpWIP4gLS|;gFeE-6{?}MzwM)n>n?Wa>%o<%A=cMCaCCATK_ukMBx ztrSnonM%xzEz>_mJaXpDPS~bep^<2Ez$>Tl?ql^v3ElTMCp}Z)ijFMVp+5OYM0Dmw z#W@!iZVa;IQ(fDn5tO^MYxD8M#HMexiA$YNt>~F_`KYm%OocEg_Fk$V3TLdk^XS)s z-_a|PBTd#q#Nuz$mw(rP@XcXZa*aQ8lHie*YwB+L1&SNqzonmla``Q*jJFfMUGz`O zy0!Ogt->)4Nny(iP21F&`whF_Fu0{$w_UM$k44qd^ZkD|ta$S6YN1%iMw=-s_8pFG zXrIwqr?!5p-6M7DyMZ>hZc4{B3BS7aEc&M>OGe`c=Kg(O{&u=nuFwno_TJle+TM;` z&87kjTAT|RpUq$mbqG*A^LbH)=T^^RLk7jy62FCvJ}M->VJP)HX{W!+CGX6RNqrv$ zZg@o;bLKv>6(|aZ2#e7 zUg?N5jW1LpIT~TV5ZKf32i^DeZ<@P`@+GDlnhRXnRa9P7< cf8l!O>QqLN1jff6z@m%6)78&qol`;+08IB>TL1t6 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc-members.html new file mode 100644 index 000000000..90d8c21ba --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc-members.html @@ -0,0 +1,42 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoEvalFunc< MOEOT > Member List

This is the complete list of members for moeoEvalFunc< MOEOT >, including all inherited members.

+ + + + + + +
EOFitT typedefeoEvalFunc< MOEOT >
EOType typedefeoEvalFunc< MOEOT >
functor_category()eoUF< A1, R > [static]
operator()(A1)=0eoUF< A1, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.html b/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.html new file mode 100644 index 000000000..26fd036a1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.html @@ -0,0 +1,55 @@ + + +ParadisEO-MOEO: moeoEvalFunc< MOEOT > Class Template Reference + + + + +
+
+ +

moeoEvalFunc< MOEOT > Class Template Reference

Inheritance diagram for moeoEvalFunc< MOEOT >: +

+ +eoEvalFunc< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoEvalFunc< MOEOT >

+ + +

+ +

+Definition at line 22 of file moeoEvalFunc.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.png b/trunk/paradiseo-moeo/doc/html/classmoeoEvalFunc.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6ffdddc66eb94a0ee942659557d3fd6a1c7664 GIT binary patch literal 847 zcmeAS@N?(olHy`uVBq!ia0vp^%YgU*3p0?c;bsL<5&=FTuK)l42QvTvKQMoO!UP}- zj1L?*P<`nC6CjtdB*-tA!Qt7BGzJEyr=Bj3AsLNtXL(P0tiaQDcG>j~X@~m>&zv@& z`rB{d@ko(p+hdmUQ&*K_*_*$(dc528S^V_ysz zynb8GIJriyGQdEMT%4+G~U&i8cRAGlim(@dvt+0RbabnRkKxNdQ%^m$EFvHI(Oaly-s zo*S;;A#Q(n-#qib8lOMD7dx~5_+zm%x39#`JQcFcXzEIz)O&4}M~&ac&U-%9GUrFO z?5bH$oF}%InJ#l)CLk0e$_QlX_O>o*n-}@W=KL8ZkF+ZB2$e{~LOxkhTX{VlZ z+Nw0U%;`z->ohKPyRg=xImX&qR$SN6Qd9kr%(LPHHj~eXl=BBoIprfCx9WG^XLmMz zgYT?Yug_@romrj`SE#@5(aeX7eXdSdbAGN2a*x&g5*@37js<{rqX4XxgrTWz}aF8iYqr zlgVG6n07DHxw^;ZU+;_!Cw+_r-d<+BFl zW0ys9idlC4qdRHe3a`~HTcxHxe}?7!()CwYy{ok=zUw*vaLA7}jXO(Zue^_ooqzlK zr9I1hQqLvh@x!4%+itw%HafLuP9{Un%wtC1{JtEMe8Bw6VXmCP_x(nF#~dAuy)R!8 zY#x0%jUxdcU&*O$l{6SSQdM# zhfbb+GWcd^eC^%vpCYBlWu*4_S!Qo+GmB;4xgo8#wybpiohd8NRG#5}cl1Bww*S7B UM`A6f15-bPr>mdKI;Vst0FQT*ssI20 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment-members.html new file mode 100644 index 000000000..3b92e22f2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment-members.html @@ -0,0 +1,51 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoFastNonDominatedSortingFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoFastNonDominatedSortingFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + +
comparatormoeoFastNonDominatedSortingFitnessAssignment< MOEOT > [private]
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
mObjectives(eoPop< MOEOT > &_pop)moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline, private]
moeoFastNonDominatedSortingFitnessAssignment()moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline]
moeoFastNonDominatedSortingFitnessAssignment(moeoObjectiveVectorComparator< ObjectiveVector > &_comparator)moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline]
objComparatormoeoFastNonDominatedSortingFitnessAssignment< MOEOT > [private]
ObjectiveVector typedefmoeoFastNonDominatedSortingFitnessAssignment< MOEOT >
oneObjective(eoPop< MOEOT > &_pop)moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline, private]
operator()(eoPop< MOEOT > &_pop)moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline, virtual]
paretoComparatormoeoFastNonDominatedSortingFitnessAssignment< MOEOT > [private]
twoObjectives(eoPop< MOEOT > &_pop)moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline, private]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoFastNonDominatedSortingFitnessAssignment< MOEOT > [inline, virtual]
moeoParetoBasedFitnessAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.html new file mode 100644 index 000000000..de3111212 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.html @@ -0,0 +1,325 @@ + + +ParadisEO-MOEO: moeoFastNonDominatedSortingFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoFastNonDominatedSortingFitnessAssignment< MOEOT > Class Template Reference

Fitness assignment sheme based on Pareto-dominance count proposed in: N. +More... +

+#include <moeoFastNonDominatedSortingFitnessAssignment.h> +

+

Inheritance diagram for moeoFastNonDominatedSortingFitnessAssignment< MOEOT >: +

+ +moeoParetoBasedFitnessAssignment< MOEOT > +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

moeoFastNonDominatedSortingFitnessAssignment ()
 Default ctor.
 moeoFastNonDominatedSortingFitnessAssignment (moeoObjectiveVectorComparator< ObjectiveVector > &_comparator)
 Ctor where you can choose your own way to compare objective vectors.
void operator() (eoPop< MOEOT > &_pop)
 Sets the fitness values for every solution contained in the population _pop.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)
 Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account.

Private Member Functions

void oneObjective (eoPop< MOEOT > &_pop)
 Sets the fitness values for mono-objective problems.
void twoObjectives (eoPop< MOEOT > &_pop)
 Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size.
void mObjectives (eoPop< MOEOT > &_pop)
 Sets the fitness values for problems with more than two objectives with a complexity of O(n² log n), where n stands for the population size.

Private Attributes

+moeoObjectiveVectorComparator<
+ ObjectiveVector > & 
comparator
 Functor to compare two objective vectors.
+moeoParetoObjectiveVectorComparator<
+ ObjectiveVector
paretoComparator
 Functor to compare two objective vectors according to Pareto dominance relation.
+moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator objComparator
 Functor allowing to compare two solutions according to their first objective value, then their second, and so on.

Classes

class  ObjectiveComparator
 Functor allowing to compare two solutions according to their first objective value, then their second, and so on. More...
+

Detailed Description

+

template<class MOEOT>
+ class moeoFastNonDominatedSortingFitnessAssignment< MOEOT >

+ +Fitness assignment sheme based on Pareto-dominance count proposed in: N. +

+Srinivas, K. Deb, "Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms", Evolutionary Computation vol. 2, no. 3, pp. 221-248 (1994) and in: K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). This strategy is, for instance, used in NSGA and NSGA-II. +

+ +

+Definition at line 32 of file moeoFastNonDominatedSortingFitnessAssignment.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::moeoFastNonDominatedSortingFitnessAssignment (moeoObjectiveVectorComparator< ObjectiveVector > &  _comparator  )  [inline]
+
+
+ +

+Ctor where you can choose your own way to compare objective vectors. +

+

Parameters:
+ + +
_comparator the functor used to compare objective vectors
+
+ +

+Definition at line 51 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the fitness values for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 59 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::mObjectives(), and moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::oneObjective(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implements moeoFitnessAssignment< MOEOT >. +

+Definition at line 101 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::comparator. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::oneObjective (eoPop< MOEOT > &  _pop  )  [inline, private]
+
+
+ +

+Sets the fitness values for mono-objective problems. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 143 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::objComparator. +

+Referenced by moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::operator()(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::twoObjectives (eoPop< MOEOT > &  _pop  )  [inline, private]
+
+
+ +

+Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 165 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::mObjectives (eoPop< MOEOT > &  _pop  )  [inline, private]
+
+
+ +

+Sets the fitness values for problems with more than two objectives with a complexity of O(n² log n), where n stands for the population size. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 175 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::comparator. +

+Referenced by moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..3749d9490bd19223bcd81fec910bb31f097d37f7 GIT binary patch literal 1684 zcmZ`)doWL36c(@gh+)+yJouXy6fIQ&e`ADXYD`sx4-Y4T#Vld zgD)UofIuJvFHiSC5J(HJ!OG3rn%()J&{h+SF(-pPHa0diaATwU+O^0+4f?dYySvlG z8>LQBW8>wH3MR9EuZk$;?l+=MUB8xT8aW?%4!s!s0Vg(g-t6Ez zSoGa&f$NRiJMK}A(~`~Pt}bc>r#?fvur$Vd5(A{RvEVsI`7g_S5}?}2hlm{}gxK*> zb?zJo8_nJn*f6zIyV!OMhFu7`bL*jLTP`GEdOx7$w7tV>f5}U-Kafxlu05i~k&0-; z{&m>yyf9~=Y>yU<+ZldPekV-Q2PmuO+HBG$9qGsxz?}8;-%yxtR)qI?aIFYzpFR%d z*w&3Q1LO~Q3I`j-i1XG1v9bo7>4&)ndw$n?TE*);8h2fxP&kOUFuag6PtF6WFg)_> zmg=kF{>K}w|E|^a@i~p;U+c_F_sU++>EX3#E>s5`mB?dq$(S^~+*Om+xPOC-qz>nd619 zt;D>4M!92baLXkAs%Ubl`HW5UgV?mkJ7sQ1`&+(?6g?-nJOu`Yu+ddA+PBsvpIQMq zArVR=r;Z)gI`HE^h7Q6u3Po8uE8|TSir*rK#X3>BY__sgbuWXAVwhKO$}G6p$LHc^T1aN`cB+ zh3G_5X&P$k0$r)h*G2GGvBEU}RLJnx&ifQ)5AWLZbvq!8|I6HGLf0q^9ko6^AWk!u zduR6jJQh@N0T&pnllwn{OqV>T^p; z0^NUwXmV$GK86!*#oq`d#usVDfQUSC_%_a5Hr&HvwGQ5xU+~{9zn7;FJ{RmJn#dhl z*LO`5EB9#XR)Sgyo_V5e=4bVE+RD%|R;W9|JluQ6^Z5{2g4}wv)me6&Iug$K@K;a` zb|R5Bb)zFZz<*-zU2Z{2_`6rkYFcuyMrZYhE}WF11jqlEygrk}Q+!mNE3OW;A&vsV zHTtXKHm#9jP_esaeJa3ROrRvi*A{)MwRtjR>{foy{7yx02VH*_l~iLr>ty)Yz-#2q zN?z*QS8w}B4{w+^QJ(EbUJV|4vjQ89SivrTf7W$eWpw5&eF7m9cbw1{L}~SB) zf(y39zc;lU_Idc}5qVKZ+T&T9g2`#wwL1r!Znv8>W|jQ2X?KFt9bHp(_EGH))DJN6 zQR3s=MXQ=IUd{iHNFrK5HUMd=yEX94sh&@k@JlkQn#OE0`w=}TJWJ}DLv*QXccJG8M~8b&v840&yccuntb#9`3X3l0mYP{M%O=?Cn+ zWdXyN>U;HB?+e0L)nP%UPlVM2U%vSY7qnR50Ou@I_(}I)2A|q4b{rM(TZOM4#I@Nd z3oDm-R&*15XwdX&Y+B-QN=Z&8J*A!C$$VOQc=JJf=>33!-zcU7ay)-8L2sy$9PQB8 z58Xt)O9a<~^ABHcXWGXUCH_w7C`ZF*-6eFwO2BO_uuhfCE%MHgan`4yYm(LFrB#h4 h8Q$u5c3Jr<^R;#Ysr{;NislOed3pG`Hyw-2`V-ZaSjqqZ literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator-members.html new file mode 100644 index 000000000..128563aef --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator-members.html @@ -0,0 +1,42 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator Member List

This is the complete list of members for moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator, including all inherited members.

+ + + + + + +
cmpmoeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator [private]
functor_category()eoBF< A1, A2, R > [static]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator [inline]
moeoComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.html new file mode 100644 index 000000000..7b8294d95 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.html @@ -0,0 +1,114 @@ + + +ParadisEO-MOEO: moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator Class Reference + + + + +
+
+ + +

moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator Class Reference

Functor allowing to compare two solutions according to their first objective value, then their second, and so on. +More... +

+

Inheritance diagram for moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator: +

+ +moeoComparator< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + +

Public Member Functions

const bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 < _moeo2 on the first objective, then on the second, and so on.

Private Attributes

+moeoObjectiveObjectiveVectorComparator<
+ ObjectiveVector
cmp
 the corresponding comparator for objective vectors
+

Detailed Description

+

template<class MOEOT>
+ class moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator

+ +Functor allowing to compare two solutions according to their first objective value, then their second, and so on. +

+ +

+Definition at line 121 of file moeoFastNonDominatedSortingFitnessAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const bool moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns true if _moeo1 < _moeo2 on the first objective, then on the second, and so on. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 129 of file moeoFastNonDominatedSortingFitnessAssignment.h. +

+References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator::cmp. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..7972883251552352a62383b59612ba055e8ec8ff GIT binary patch literal 1663 zcmb_d{Xf$Q9RIq>Q!U+<$Xa+sDq0W3S!h;b?4g(nH@fOrv|M?(X6@4Qa4O-%D%wNJ z!scmXA`kJp9&Tt%O~hVVW|L8F>}|5N$E0tFjAA0Fl;!0 zPz=QZfSC>IU;zGNnfhKp`iHHnvUt7R!lVqnnTPGbcJ2NyJJit7MAcMaPiV*!?6Dv0 zu4`=_CqsLlYhn=?1MIyf9%0^}ar1t=xaZvyQMBq^fA;`HXF(SZ{BwLBn@a0Tw60x> zWJ#rElVM%S+ZdDI@N5KF^Hdt_fm>7-gI|0r|4JiAO`4HRQrVG|);Wk~Iyrp@!GC4? zL;^);LF#VRko}!oMh1Btx>O98O=2y=?9FA-4s=v&~Z0rBcSCrQ6Tql3$71V=8^6Gx7e3J_r13B3?Wu zGe%3cl3v4`A48*x8dVciZlirp7@8 zvYN?s-GK&eVq+#$diVg_x(s?ul+SD{CnAEr7+4Rh=9> z3c<=<-w8}IO-X=L00a>%He2&G=+nJ<%OD@*Zify#@orC6`6G~q-+1(S{5^I5EH^)g z5B)@doEf!V(mb8t>`5n~N=UhH-nqvwri}uGH2i0C-A9<4uI;SgB;==JIknZjHH4k| zN6!B7%kr@wy%GE*XUR0DeB@B^cw9bLU8kw*dPNs6>T~{v`rV_uDXHC#GAG`Q>uEe# zFyqmv)o82xoSYTk?h1{@UWkKjIBr*qm8U(-bl|}yI*Uy+_1jbTJE)HFPG`J&+c@wo1G`lBQZBBHjKM2HA|am z=cbM%EGpSEW*GBsb$_Kvi^bfUbELF!)Tu2iZ{56djqbGuifg;37UN?oFR^r(+HEWL;XLay#esk-<3_FqJ| zdy2?$9ucEOL73Hntr1n?+{Ww%w4!liNo`b|9A8~GS0@$HANWo%VXz&X3m7MAVu>MnKgu%H@mqw)ihm>V}(*X9<{K-^~*KR z0S@os(1cID425s0XIezd%ozvEeV$1YN0;jtXm4<1+!&;EYFQ&N>Vy-|G%4CKh$Oz%*##=Ia;m4KQVp_02PQmSc5!4`xlx(78C#g literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment-members.html new file mode 100644 index 000000000..f0e64167d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &)=0eoUF< eoPop< MOEOT > &, void > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0moeoFitnessAssignment< MOEOT > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.html new file mode 100644 index 000000000..34ea15a0d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.html @@ -0,0 +1,165 @@ + + +ParadisEO-MOEO: moeoFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoFitnessAssignment< MOEOT > Class Template Reference

Functor that sets the fitness values of a whole population. +More... +

+#include <moeoFitnessAssignment.h> +

+

Inheritance diagram for moeoFitnessAssignment< MOEOT >: +

+ +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase +moeoCriterionBasedFitnessAssignment< MOEOT > +moeoDummyFitnessAssignment< MOEOT > +moeoIndicatorBasedFitnessAssignment< MOEOT > +moeoParetoBasedFitnessAssignment< MOEOT > +moeoScalarFitnessAssignment< MOEOT > +moeoFastNonDominatedSortingFitnessAssignment< MOEOT > +moeoAchievementFitnessAssignment< MOEOT > + +List of all members. + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type for objective vector.

Public Member Functions

virtual void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0
 Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
void updateByDeleting (eoPop< MOEOT > &_pop, MOEOT &_moeo)
 Updates the fitness values of the whole population _pop by taking the deletion of the individual _moeo into account.
+

Detailed Description

+

template<class MOEOT>
+ class moeoFitnessAssignment< MOEOT >

+ +Functor that sets the fitness values of a whole population. +

+ +

+Definition at line 23 of file moeoFitnessAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
virtual void moeoFitnessAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [pure virtual]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implemented in moeoAchievementFitnessAssignment< MOEOT >, moeoDummyFitnessAssignment< MOEOT >, moeoFastNonDominatedSortingFitnessAssignment< MOEOT >, and moeoIndicatorBasedFitnessAssignment< MOEOT >. +

+Referenced by moeoFitnessAssignment< MOEOT >::updateByDeleting(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoFitnessAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
MOEOT &  _moeo 
) [inline]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the deletion of the individual _moeo into account. +

+

Parameters:
+ + + +
_pop the population
_moeo the individual
+
+ +

+Definition at line 44 of file moeoFitnessAssignment.h. +

+References moeoFitnessAssignment< MOEOT >::updateByDeleting(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4cd28b9154f83d2365b721863ac1dac1b8833b GIT binary patch literal 3839 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 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator-members.html new file mode 100644 index 000000000..d5c4a4c5b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator-members.html @@ -0,0 +1,41 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoFitnessThenDiversityComparator< MOEOT > Member List

This is the complete list of members for moeoFitnessThenDiversityComparator< MOEOT >, including all inherited members.

+ + + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoFitnessThenDiversityComparator< MOEOT > [inline]
moeoComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.html new file mode 100644 index 000000000..1d255d004 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.html @@ -0,0 +1,106 @@ + + +ParadisEO-MOEO: moeoFitnessThenDiversityComparator< MOEOT > Class Template Reference + + + + +
+
+ +

moeoFitnessThenDiversityComparator< MOEOT > Class Template Reference

Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. +More... +

+#include <moeoFitnessThenDiversityComparator.h> +

+

Inheritance diagram for moeoFitnessThenDiversityComparator< MOEOT >: +

+ +moeoComparator< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

const bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 < _moeo2 according to their fitness values, then according to their diversity values.
+

Detailed Description

+

template<class MOEOT>
+ class moeoFitnessThenDiversityComparator< MOEOT >

+ +Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. +

+ +

+Definition at line 22 of file moeoFitnessThenDiversityComparator.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const bool moeoFitnessThenDiversityComparator< MOEOT >::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns true if _moeo1 < _moeo2 according to their fitness values, then according to their diversity values. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 31 of file moeoFitnessThenDiversityComparator.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoFitnessThenDiversityComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..13040c492f26073a09d5b1978138a788dc86f71d GIT binary patch literal 1402 zcmb`H`&*I+6vtm%orkRpYW`$+ueI|uS zs3SMP(9klgfl1~<8>TJ9%v;**O{LV-fCP=PJ=;I9?T2&D_xyIw=X{@&7a9^^X0qA@ z001)_)(->#0|&isUi_6l`{PEE^<`CPFyyb(>GV>kYi6^_#d`HuG&eV&ZPC5ew+5%c z5CY)+?o~VhEV01(?S|6IC(8FSesWsr4_7_9XhVKJ++;jh$I@94U2oj94`VWI!(CL0 zqCle)D6(L2oaT`)Pxo%}vnOY@4JdfH0WPm8YGEm&94OSVV;M8IdD)bg&O05g7)CDB zAFGFbKW>)HF+ZHA%S>6L6!1lyM=EUw!S%ye(E@Yc2$@YAU^k)!g_|4TG30Z1!S*xn zu@hWSDPdkF1*AQo@7bHSkvq}h)jOPYgn*dRT#~o-L*3fU9tz44p~NH-9$&tq7OS^# zi27+v`Qhl2n2ZXaU^QYpBXv#7H^BT{%o;#M*JxJUZ@KQu6(x-MR@+1`TbJc>!QwvP z^J@dt7DVnQzzPu-UAtJ%3J1v&A z=ytp|i(ZtDkH}MPWm6O}T(%F>mow;FBYyP~d>V)wS zxaQ%e97Q<4qHWpT4rt);Xxm z<8m<>2W`Pb{VjedPIv1edodWs%9G?|6#RQ^*DTuq@xEUMPh%za z^|Kd_oC!SeV0!mNL#WTd5F_X&=hPDqbK1d({>t4_*ice4+MBvRlNl+X-JWbU;+N-u zZ$_OG@*pNnuJS&AF#5-xN$gG{ZXCVz0Ec>Cv@T3Q3k_N#kPYWUm@4yVYUp_{A}L>9 z$dRTjZo}@Pi`+q>Mn=!t2w#Lw5c-jpvyp1Cwoh-ZPZ)RxX@(FK-l#hy%$n!-uAL&B zR*93+k{1{O`mLz#Yu~E3a){$l{z9rr@{sk@D4p5dHc|Pa-?&gIL2ouieWf`+{{L{; zpI|4QrKwNjrW(bKn|!Njh;EasTRMAVHL~w+2`IrirtS7JPjlCl(gc|b|LTC3ZZ;bK}|uF3V+W1Ma1@WyH=ZPmddDkvNYN~C-2T?)?=b2p%lwI zDM7~MdFbjN`Mrh*1Emb+t1kDpmG2uYw!(OHRY!oxof!PAvJ7d3>K0tT3JtWbpir-E z;gOn}9S)n)Q_AGTxV|S&wN`lJY1hOO8F~j69%0r+#`fV44{~M}&VEn##2sCFprqby zs#>G4)fm*+BotogVDG?=D + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > Member List

This is the complete list of members for moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
inf() const moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline]
lastIndex(eoPop< MOEOT > &_pop, unsigned int _start)moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > [inline, private]
ObjectiveVector typedefmoeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline, virtual]
setDistances(eoPop< MOEOT > &_pop)moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > [inline, private, virtual]
tiny() const moeoCrowdingDistanceDiversityAssignment< MOEOT > [inline]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > [inline, virtual]
moeoDiversityAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoDiversityAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.html new file mode 100644 index 000000000..c598db7d0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.html @@ -0,0 +1,200 @@ + + +ParadisEO-MOEO: moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT > Class Template Reference

Diversity assignment sheme based on crowding distance proposed in: K. +More... +

+#include <moeoFrontByFrontCrowdingDistanceDiversityAssignment.h> +

+

Inheritance diagram for moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >: +

+ +moeoCrowdingDistanceDiversityAssignment< MOEOT > +moeoDiversityAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)

Private Member Functions

void setDistances (eoPop< MOEOT > &_pop)
 Sets the distance values.
unsigned int lastIndex (eoPop< MOEOT > &_pop, unsigned int _start)
 Returns the index of the last individual having the same fitness value than _pop[_start].
+

Detailed Description

+

template<class MOEOT>
+ class moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >

+ +Diversity assignment sheme based on crowding distance proposed in: K. +

+Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). Tis strategy assigns diversity values FRONT BY FRONT. It is, for instance, used in NSGA-II. +

+ +

+Definition at line 25 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+

Warning:
NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
+
Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+
Warning:
NOT IMPLEMENTED, DO NOTHING !
+ +

+Reimplemented from moeoCrowdingDistanceDiversityAssignment< MOEOT >. +

+Definition at line 40 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >::setDistances (eoPop< MOEOT > &  _pop  )  [inline, private, virtual]
+
+ +

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
unsigned int moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >::lastIndex (eoPop< MOEOT > &  _pop,
unsigned int  _start 
) [inline, private]
+
+
+ +

+Returns the index of the last individual having the same fitness value than _pop[_start]. +

+

Parameters:
+ + + +
_pop the population
_start the index to start from
+
+ +

+Definition at line 121 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h. +

+Referenced by moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >::setDistances(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a905a8a5c5809c851372883d24d4c39b59ec5e GIT binary patch literal 2259 zcmchZdpOkV7RSeBQ+D+12$?23W9-I6B}Gk{k}+4epAn(5W7^D!amyG|JGZFDrMW4W zVn)a)xiy+J)D%PP;})8&np~r7oG{32XZPQEp7YN+=h=U}@B4k9^{#)`TA#Jvbaz*b zu8xTg2n5o_VVwXFNR73o7d183_5rXWHB6$N@jSLmRcxUSi;~elf z#VNk@jh$|DrsWD&udMHna69AG+=ESTGg)9ob|hwnXE1#s#*kpULX7R+h(F=UgqhT% zk4gyXbHVKk4!GRYfg9k8V>)SBe43hd(s!ru3Y2~a;K;&m8jB+h+cv)(d&#G7%dNok zHBTaGo6aycfjlRW z(dL3;vI;ALwcG^h1-XE2ayB_H!Kj%EVm)(SaEE+VgmSSItZs$qudx166 zKFe;(Wo68RE$r98B10LUeG17b@Bgk$5#Y$zvlILQL+N zModE5?_v8Azv#`cXZ}vQ7Pq7a9AVBQv1;#?_Hmd)z~?KKd>_qD!2ECzaBgxT!UUJdH{5Kb6qbKgm9Mmoa0_abK< zI~>}C`LnAnmq$Vdn1)LC!YTjQx zQWSSu6sEnr4!qyU$N&DGvDCK+0fcp>qp>k1rm@IBe1NO&d9E<7Ml;A;@G5L#qk2!+mh4id?I*dGNG0GeMykV+=umyEt zk6Q`#rdEx))~li8oiW|${btS)VCPp~w}{POyTm-o#mf>41_Ob*urndKBFzY0f@AL> zw5&Rc!)OVY>lfddG9ajS)JEpJ=pXJH~c>Js(*_6 zquHMO&5gVl8Ke>hX*Fw|@*2w>W`61{gQK{clSV(hJ?Z!fN+q8}CGTx=z$YgV@wG`V zvldP9Ke!p@&pUiv#uM$LhHg8Sl}sZdx_mw4Qc6Z;?1KuRD|HMK$|zi?jDi;`9y}3| zHDsVe7rgO@+Rf|k#%9|3=5)2-HVee;L%#n5kX ze&f`4K9l8l`Tx=i|2_W=e51FzsWUm?^J;SFNGhE#{~;d8TkxXgxhW-+;X=EfyTEQ! z!BRq3%`2=?ZrHQ(gOv50RJ$iQ+}Pk^0ZUoW zb$-z`*!3eJVxkw8zd{Hb=P~6gAAOj?1%wW=GwLZ*K%&G&&;8u6n{J&;;Zp%dNI%Z6 ztXkyQU|;ePCrjX{%P;N9<2hQ9+ZQf|e!h;~BDx6M8TdJ+@P-E*SZui~@xfOaShpF8 z@mtt+_rd2!ocyu_Mc}0mN?_FdWSl6o;}d@7s=>KE3p+dyYIngs6`S3CCiq|@M=!AN zk;fyqsWe*TI$iGH=-r= zaBV}lKW0=&gDhZDYHf>c#93z5<7|Vmc|HmH4&NCTf{2~U^EbX}nLBS|d0!BU5%?l5 zvWk$cHr-L+kgYWeANIB=g4ZiHiy{oQ;6=t9n~1GV+D8@q-ZUH>#^W+S#`>qGZ+uvk zSBV&C(i*xH?IpN%Al!W`YqUmoyEf0(JiAwq<7Js5MvLYzkgJm}T&iDQohZ7@X?m{} zS=-4^SebbNIjb1#E@VgEj!{)n(0;2ljf@VI>niYV4)7eNe^sEgKy~VvMxW)i9|#DC Lc6F+B47mI!WMCfU literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment-members.html new file mode 100644 index 000000000..9d331c451 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment-members.html @@ -0,0 +1,53 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoFrontByFrontSharingDiversityAssignment< MOEOT > Member List

This is the complete list of members for moeoFrontByFrontSharingDiversityAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + + +
alphamoeoSharingDiversityAssignment< MOEOT > [protected]
defaultDistancemoeoSharingDiversityAssignment< MOEOT > [protected]
distancemoeoSharingDiversityAssignment< MOEOT > [protected]
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
moeoFrontByFrontSharingDiversityAssignment(moeoDistance< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=2.0)moeoFrontByFrontSharingDiversityAssignment< MOEOT > [inline]
moeoFrontByFrontSharingDiversityAssignment(double _nicheSize=0.5, double _alpha=2.0)moeoFrontByFrontSharingDiversityAssignment< MOEOT > [inline]
moeoSharingDiversityAssignment(moeoDistance< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=1.0)moeoSharingDiversityAssignment< MOEOT > [inline]
moeoSharingDiversityAssignment(double _nicheSize=0.5, double _alpha=1.0)moeoSharingDiversityAssignment< MOEOT > [inline]
nicheSizemoeoSharingDiversityAssignment< MOEOT > [protected]
ObjectiveVector typedefmoeoFrontByFrontSharingDiversityAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoSharingDiversityAssignment< MOEOT > [inline, virtual]
setSimilarities(eoPop< MOEOT > &_pop)moeoFrontByFrontSharingDiversityAssignment< MOEOT > [inline, private, virtual]
sh(double _dist)moeoSharingDiversityAssignment< MOEOT > [inline, protected]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoFrontByFrontSharingDiversityAssignment< MOEOT > [inline, virtual]
moeoDiversityAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoDiversityAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.html new file mode 100644 index 000000000..9729cfefa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.html @@ -0,0 +1,248 @@ + + +ParadisEO-MOEO: moeoFrontByFrontSharingDiversityAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoFrontByFrontSharingDiversityAssignment< MOEOT > Class Template Reference

Sharing assignment scheme on the way it is used in NSGA. +More... +

+#include <moeoFrontByFrontSharingDiversityAssignment.h> +

+

Inheritance diagram for moeoFrontByFrontSharingDiversityAssignment< MOEOT >: +

+ +moeoSharingDiversityAssignment< MOEOT > +moeoDiversityAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

 moeoFrontByFrontSharingDiversityAssignment (moeoDistance< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=2.0)
 Ctor.
 moeoFrontByFrontSharingDiversityAssignment (double _nicheSize=0.5, double _alpha=2.0)
 Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)

Private Member Functions

void setSimilarities (eoPop< MOEOT > &_pop)
 Sets similarities FRONT BY FRONT for every solution contained in the population _pop.
+

Detailed Description

+

template<class MOEOT>
+ class moeoFrontByFrontSharingDiversityAssignment< MOEOT >

+ +Sharing assignment scheme on the way it is used in NSGA. +

+ +

+Definition at line 22 of file moeoFrontByFrontSharingDiversityAssignment.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoFrontByFrontSharingDiversityAssignment< MOEOT >::moeoFrontByFrontSharingDiversityAssignment (moeoDistance< MOEOT, double > &  _distance,
double  _nicheSize = 0.5,
double  _alpha = 2.0 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + + +
_distance the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space)
_nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed)
_alpha parameter used to regulate the shape of the sharing function
+
+ +

+Definition at line 36 of file moeoFrontByFrontSharingDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoFrontByFrontSharingDiversityAssignment< MOEOT >::moeoFrontByFrontSharingDiversityAssignment (double  _nicheSize = 0.5,
double  _alpha = 2.0 
) [inline]
+
+
+ +

+Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. +

+

Parameters:
+ + + +
_nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed)
_alpha parameter used to regulate the shape of the sharing function
+
+ +

+Definition at line 45 of file moeoFrontByFrontSharingDiversityAssignment.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoFrontByFrontSharingDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+

Warning:
NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
+
Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+
Warning:
NOT IMPLEMENTED, DO NOTHING !
+ +

+Reimplemented from moeoSharingDiversityAssignment< MOEOT >. +

+Definition at line 56 of file moeoFrontByFrontSharingDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoFrontByFrontSharingDiversityAssignment< MOEOT >::setSimilarities (eoPop< MOEOT > &  _pop  )  [inline, private, virtual]
+
+
+ +

+Sets similarities FRONT BY FRONT for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Reimplemented from moeoSharingDiversityAssignment< MOEOT >. +

+Definition at line 74 of file moeoFrontByFrontSharingDiversityAssignment.h. +

+References moeoSharingDiversityAssignment< MOEOT >::distance, moeoSharingDiversityAssignment< MOEOT >::nicheSize, and moeoSharingDiversityAssignment< MOEOT >::sh(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoFrontByFrontSharingDiversityAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..836960c5cfb303d8838b8a0a8cd8d70e1d5b4bdc GIT binary patch literal 1895 zcmcgtiBr;f6vqzB@+wws&_uFm)JW68F3Uo#OvMx z==WJ?!IZzH`BcwBz4iO)deh*T;T_8fkoSFNAfyrnvfv~qNb^Zh7$KxMts@&OC#~G0 z4`W1&%z2iX<^UwSVX0j<3WE5Dp%7Tnys0ZDZhD*!hU?#82VezmwNG9mzgoE2MJ5`# zQ$>vh(tVGx%d8H8y<8@@=rE!P=Q*co?7>ET2nQWTf+Uu|BNSV1`cuvcXPD4e!1nd4 z7ugp{urEuZ6eFCV#pwIz(put}Z#J@oHr#NOuh=tU?pC@gvK3nOW+Y#1M>X0Wx?nwB^62dklc>2yGr;U%;{kUNgp0 zY^>TvwCO9y9D>x7#R7S6#WTL`86F;bApD|@_C=rI3}OI!299T}C2N9+r4!3z@}JZ; z2?{bR`25k9mQTsviTQs7IH#pu2p-P6e`~hVm-(c&gO!)t5yzy^DDs?5WSrOMc9ACJ z=#(S49dh@R^SQAihE=3SV?c~S-T;K70_eExw3+;Pk@$^4Lll#7_e=stT2xIJ*WFXf z+eA44&hfQW;2Gus7OH8xpjbYC^COfnyLpt;hJCg&9+&Ghl%2NDVX_!X3zQw7mQ);1 z8$o5l6Gj@;JcFxzpkRyO?y|^($v2QZDA+uqrx#TD5c-{jP2z+Uz z5?1|7Rj%)iJA-Xg^!!!fsT(^%;cZYTzoV1|p#>RxGdy6lLE5(gB8zcxt(fXXM7*`I zC+?W2$ghFL0*5NaV?$WQS(;{nWPo5!rjY+Cl2$$fmUF?Vi ztKzStt4N(QHKop#|7#@2k_sS)(-Ik~YN}{9e#%Yjs6{8+PsLI< zAT_Scr@7d$jenYW)q0B>a(daynKXZ!DDjqU#pUOQ*y_CQs@!5aOhGbS`^>+}V)29e zffI~fnzO;r5#$n8Q;__gyViI^i#!_TCD~|f?%pCGo(-XN=4`36-8p4Gx1=E9tDVJ) z>zAC!0S~TUH70<283kp{^0s5575gJap9|j^?&3T(t>?riih^^3FTbT zBqi9_nIZ$PdOY@$wvjZOUGF#WOY;NQn{AcO)@o=?$TDKQuctIlupryo-vmUblz4%p z`9`+#@t`E@kucS|9aL^t>O#~V`sw`ldLVsY_5zL;+N9W#^ji_)>x1=XV~7|20t%Xp A_5c6? literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator-members.html new file mode 100644 index 000000000..d022fced1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator-members.html @@ -0,0 +1,45 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoGDominanceObjectiveVectorComparator< ObjectiveVector > Member List

This is the complete list of members for moeoGDominanceObjectiveVectorComparator< ObjectiveVector >, including all inherited members.

+ + + + + + + + + +
flag(const ObjectiveVector &_objectiveVector)moeoGDominanceObjectiveVectorComparator< ObjectiveVector > [inline, private]
functor_category()eoBF< A1, A2, R > [static]
moeoGDominanceObjectiveVectorComparator(ObjectiveVector &_ref)moeoGDominanceObjectiveVectorComparator< ObjectiveVector > [inline]
operator()(const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)moeoGDominanceObjectiveVectorComparator< ObjectiveVector > [inline]
moeoObjectiveVectorComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
paretoComparatormoeoGDominanceObjectiveVectorComparator< ObjectiveVector > [private]
refmoeoGDominanceObjectiveVectorComparator< ObjectiveVector > [private]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.html new file mode 100644 index 000000000..aae366063 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.html @@ -0,0 +1,194 @@ + + +ParadisEO-MOEO: moeoGDominanceObjectiveVectorComparator< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoGDominanceObjectiveVectorComparator< ObjectiveVector > Class Template Reference

This functor class allows to compare 2 objective vectors according to g-dominance. +More... +

+#include <moeoGDominanceObjectiveVectorComparator.h> +

+

Inheritance diagram for moeoGDominanceObjectiveVectorComparator< ObjectiveVector >: +

+ +moeoObjectiveVectorComparator< ObjectiveVector > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoGDominanceObjectiveVectorComparator (ObjectiveVector &_ref)
 Ctor.
const bool operator() (const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)
 Returns true if _objectiveVector1 is g-dominated by _objectiveVector2.

Private Member Functions

unsigned int flag (const ObjectiveVector &_objectiveVector)
 Returns the flag of _objectiveVector according to the reference point.

Private Attributes

+ObjectiveVector & ref
 the reference point
+moeoParetoObjectiveVectorComparator<
+ ObjectiveVector > 
paretoComparator
 Pareto comparator.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoGDominanceObjectiveVectorComparator< ObjectiveVector >

+ +This functor class allows to compare 2 objective vectors according to g-dominance. +

+The concept of g-dominance as been introduced in: J. Molina, L. V. Santana, A. G. Hernandez-Diaz, C. A. Coello Coello, R. Caballero, "g-dominance: Reference point based dominance" (2007) +

+ +

+Definition at line 25 of file moeoGDominanceObjectiveVectorComparator.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + +
moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::moeoGDominanceObjectiveVectorComparator (ObjectiveVector &  _ref  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_ref the reference point
+
+ +

+Definition at line 33 of file moeoGDominanceObjectiveVectorComparator.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
const bool moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::operator() (const ObjectiveVector &  _objectiveVector1,
const ObjectiveVector &  _objectiveVector2 
) [inline]
+
+
+ +

+Returns true if _objectiveVector1 is g-dominated by _objectiveVector2. +

+

Parameters:
+ + + +
_objectiveVector1 the first objective vector
_objectiveVector2 the second objective vector
+
+ +

+Definition at line 42 of file moeoGDominanceObjectiveVectorComparator.h. +

+References moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::flag(), and moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::paretoComparator. +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + +
unsigned int moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::flag (const ObjectiveVector &  _objectiveVector  )  [inline, private]
+
+
+ +

+Returns the flag of _objectiveVector according to the reference point. +

+

Parameters:
+ + +
_objectiveVector the first objective vector
+
+ +

+Definition at line 76 of file moeoGDominanceObjectiveVectorComparator.h. +

+References moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::ref. +

+Referenced by moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoGDominanceObjectiveVectorComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..7b85ac538843896fe011d09f7a3d3e0e37869e81 GIT binary patch literal 1559 zcmcIk`8S&h6pbM|@-?JqNR3*KPSMlxWhkXuDS}2CTkX?SC6<;}?ID&hj89IgwWJ2e z(o|7Ps8~Y7Afd`R8nKkpHZ|JfpjE~ioyuhTH*|h@@80**yXW5X9@E_wk3?u8U@#bx z;N;)|gDGUnxj;!#-nT&&j2txGoxL1oGMSvpWCAvuoF`{rOCS&=_sQPNM};^KS5KJj z!t_-b4Bkj^u=ApoeJt}&tvro-G8e)&kk~#$#{cr%jW0Wd=AA=XOdG;I5o0!H1e6O0 zp>JhVQ#seGCtmxs*)N>{&22kIzbo?NPWj+_+B!G7N-!VN%`&8KT-@+7v)= z=$k7iGx)SuWRuz8}EaWanSHPYO+ssDLMxFB=VQ`Cq=ng$rKaAKH+cGy#o&?L`!vFd5;D%RwvXQ4s)6EKmVe#QJvRG3e%ns~%WKwtP0w(4>u5Fd7p$lksv=|FK1H+A!l z&HIhh)gtkfByFf}*=3kZzdpmuBL&><`&>1v2c6`uM?cze+9En`EH{_?oUM5Y0{p7a zPUDdxD8%s=k;bFZ!1))RNgaW~m#sb8Tz2f-tiG7RiWEJJ7_8NpwMi+Bxp2VuH!8b# zq|fpKeRjoug^?!CO#~;vHUVhNoy7_H|Iq9ABd!4de_+#kVlt+eaM&y!K#t1yKZM3g z5-U!6kH$NPS{huHM(_n*W2FtHxd!wQVdzHT8r50HbZQp6)m|#H*480haup#fPqc5` z$V~mwvrJ|1X=a1rJ#&txS&pHy2x+05W&ALBV%w_w>Oo&9Cx+FG@KaB_7k5+WCu$7r zFACPzeq~zKyhPRrdMX_r&+8r5OR7c0oUhcGspcs?8@~m)-Bn$G5N!852f&kzi&J81 z+pYojOF`4iAavWl*?nG%5i{oZM4NEt;0*1iT|k4VxJ1vm;4Y=!w|l^sc8AHa)qHm* zxIbeOKenL2RLu$^v@#eMHMha%ZlilyNbg7r%|4Pk)C#@c3siq&B+-RVhFXBCBy@~( zN*QM`Uh`c;w#>P4)JxnhX+dGNiF@XU3pK*_ZJxe>cWI>r74nW^<|f~oij(}M;hkxw zq_3GLIJiMauxTR-VbN9vZCCP9IRX1Z4F)S7n53mX`>dL4(7lqIXp=3!&j?ET7c^o- YR>TyoJ`g%8%fC2`;OOe`2uIHN7aZNr1^@s6 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement-members.html new file mode 100644 index 000000000..1ba38d217 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement-members.html @@ -0,0 +1,42 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoGenerationalReplacement< MOEOT > Member List

This is the complete list of members for moeoGenerationalReplacement< MOEOT >, including all inherited members.

+ + + + + + +
moeoReplacement::functor_category()eoBF< A1, A2, R > [static]
eoGenerationalReplacement< MOEOT >::functor_category()eoBF< A1, A2, R > [static]
operator()(eoPop< MOEOT > &_parents, eoPop< MOEOT > &_offspring)moeoGenerationalReplacement< MOEOT > [inline]
moeoReplacement::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.html b/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.html new file mode 100644 index 000000000..6acc28bc8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.html @@ -0,0 +1,113 @@ + + +ParadisEO-MOEO: moeoGenerationalReplacement< MOEOT > Class Template Reference + + + + +
+
+ +

moeoGenerationalReplacement< MOEOT > Class Template Reference

Generational replacement: only the new individuals are preserved. +More... +

+#include <moeoGenerationalReplacement.h> +

+

Inheritance diagram for moeoGenerationalReplacement< MOEOT >: +

+ +moeoReplacement< MOEOT > +eoGenerationalReplacement< MOEOT > +eoReplacement< MOEOT > +eoReplacement< EOT > +eoBF< A1, A2, R > +eoBF< A1, A2, R > +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

void operator() (eoPop< MOEOT > &_parents, eoPop< MOEOT > &_offspring)
 Swaps _parents and _offspring.
+

Detailed Description

+

template<class MOEOT>
+ class moeoGenerationalReplacement< MOEOT >

+ +Generational replacement: only the new individuals are preserved. +

+ +

+Definition at line 23 of file moeoGenerationalReplacement.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoGenerationalReplacement< MOEOT >::operator() (eoPop< MOEOT > &  _parents,
eoPop< MOEOT > &  _offspring 
) [inline]
+
+
+ +

+Swaps _parents and _offspring. +

+

Parameters:
+ + + +
_parents the parents population
_offspring the offspring population
+
+ +

+Reimplemented from eoGenerationalReplacement< MOEOT >. +

+Definition at line 32 of file moeoGenerationalReplacement.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.png b/trunk/paradiseo-moeo/doc/html/classmoeoGenerationalReplacement.png new file mode 100644 index 0000000000000000000000000000000000000000..add0344621d3b0c12860a36460ddb334159c748b GIT binary patch literal 2064 zcmc(gSyYqP7RNsVxs*gS(2qeVlR)B!7<8!xnZy7lG%^J&gOMqgL6FHv08xUN0wRNe zp&}Tegn(KGr9~)#5J6BT3o>1iA&Lk@PsUAx*hd&luD&CDV6eAtbkmZ`hD?uymNf% zD_JT>CAoM2cCSZ+0YI_B$>FePeDQnv^%CWcn5y1+@O!Kt2{r}#2Ip17h5>(1kxShA#jxCUwwJwGF_?KFSrr@!?`L~gBB zG*_+iXlahaP_VZjQnWC4XRDju6^5>=-a?*%&3kiLYa%%mBOaSR7{4I2#I!%$x0u() zn6$?4FF>_MtPO;BK7uhXvUB04aH0Xy8^Oe>Ywm!Hx3#57j5bWEO^pBKCd%3I*QFm+ z)B%C204A$kn084SD^EyA0trg98{0`{0D%kWzlYJEA%TA)c@rUTpOk_l<34row48SXGqIOXwXM+|{Z zbkkKbW$*?LGH$Bk6^7@^O?lt%W`><6zREC)j&RU*ExqHAMJK8y*3Da`)MqSV6S{8M zGO(&?3dOt3?N43b=6>OLP^;5cEzk0&9)i(e@3_=o*w>%;c`^6AZtU&E;WKh*k7=;h zSaPVb`dGN9JV~8kMzh6JuUaIJeZBJa`lMccQ=Byv;~Ov%;&?b*Jv5K+qa-Fu zqSma+a_H;;=;R-7$G%*D!$5*!wX+y54Nre(_#j!l!&V<_fCbu(Uu8=E4crGHkde{f z60_J)=sqGGcwtCM8N6Ycbs01{Dmc%HmR8v}lvw8STSAwQP3ry#862ak4QbcFvpLb@ zMz-7VL}Nd8?U310Z_BvqQda98?HQ|2T@CAkmV@xtyR-}|Qf=%`#;JVcLZ1?sKrhav z8$~n64?j{|95AfeH?oHjN@ejgxdH;>J$en~uQ`jqgkv3^Xw7;xO~1IU`gZImu=vc+ zbt3C;i@@v~qIvCxIuZ6;FX+|B4mazpAI@NG@2*~^It{ONQl=fZq>(Dk8^;VM+C{OZ z@8&etwGw>Wnjbw^kH5(ut8+Vj&vm-TJDzL4fF7LCOkU_$IiG{fIU1|Lk%gR|z>@iw zB?dm>*SL*-ZxXWOzsal7&?<&jJqv|8FH^%iSI|scK`r>MrpnX+8vuDDe0U^H^#AZs zriNHfcV=ZigcST|~la|E9y{;6RlIQ0@o(BT0z1rT_`b?CM`3w`tlx9L}iu zs+8h9^AO~xnsn8!sXvIiO_gko;GQzks}NPfq7QYNA4|-`RlC3Q_h@ttoR4&xkB!pp zwPLABN~;F$gRxmbt3^*vARJ4khO7O@eRZ#aI0`!i8n1s*Q?V3-Xj9|jKh!$k_am}t z5VfXioKrh-G4`~^*#O&>#)>I2h220Yr8&>^dV3Fp!*MSIe;|~O8frm0=wNn@LQZA=?YGw!zomtxBS1Phm+vCuQ@lCKm@(k=fN zxzTRXK9~S17UtCRP~He031Gr%K{^{Sg$F{D8e`t$N-#nkwE zb0ayr2~=Fgyxps2)<5E*ve77M=O(Y3E$cI8uRd?~51N>epc&z1gFW4@F|%PKvldX# z=+ovBNlJ%E6T^ASWMRywXTk*RAVgRqcCyH~spUXaq)W=V>#;OS#T0s!GBogz(NLV3 z?@_$n-(_1fI-w~(JThbQ@?Ls6bq$34FX$ZqrH6FVoUND*ai@-!HUXUzE=qCzBZ|4&&%)5w}BC_6yhds zJ&x}a3`UxQ=Nv8=+w|`~5l5L0L!@Ri&T4!YiDt2*Y2;Do*F#qh(S+$LImnKbjgL{; z!pjzgA?0Tj7F7mc91Q9crax0v1g!|$3r3KXn}+2R%9~W_tp<$cKe_Vsp(H6rER|QR WY;%^_GX=8m8*p-Taj3=xT>K4f%9s!U literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS-members.html new file mode 100644 index 000000000..8ab7398fb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS-members.html @@ -0,0 +1,48 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoHybridLS< MOEOT > Member List

This is the complete list of members for moeoHybridLS< MOEOT >, including all inherited members.

+ + + + + + + + + + + + +
archmoeoHybridLS< MOEOT > [private]
className(void) const eoUpdater [virtual]
functor_category()eoF< void > [static]
lastCall()eoUpdater [virtual]
moeoHybridLS(eoContinue< MOEOT > &_term, eoSelect< MOEOT > &_select, moeoLS< MOEOT, MOEOT > &_mols, moeoArchive< MOEOT > &_arch)moeoHybridLS< MOEOT > [inline]
molsmoeoHybridLS< MOEOT > [private]
operator()()moeoHybridLS< MOEOT > [inline, virtual]
result_type typedefeoF< void >
selectmoeoHybridLS< MOEOT > [private]
termmoeoHybridLS< MOEOT > [private]
~eoF()eoF< void > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.html b/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.html new file mode 100644 index 000000000..ac80282e3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.html @@ -0,0 +1,141 @@ + + +ParadisEO-MOEO: moeoHybridLS< MOEOT > Class Template Reference + + + + +
+
+ +

moeoHybridLS< MOEOT > Class Template Reference

This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified. +More... +

+#include <moeoHybridLS.h> +

+

Inheritance diagram for moeoHybridLS< MOEOT >: +

+ +eoUpdater +eoF< void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoHybridLS (eoContinue< MOEOT > &_term, eoSelect< MOEOT > &_select, moeoLS< MOEOT, MOEOT > &_mols, moeoArchive< MOEOT > &_arch)
 Ctor.
+void operator() ()
 Applies the multi-objective local search to selected individuals contained in the archive if the stopping criteria is not verified.

Private Attributes

+eoContinue< MOEOT > & term
 stopping criteria
+eoSelect< MOEOT > & select
 selector
+moeoLS< MOEOT, MOEOT > & mols
 multi-objective local search
+moeoArchive< MOEOT > & arch
 archive
+

Detailed Description

+

template<class MOEOT>
+ class moeoHybridLS< MOEOT >

+ +This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified. +

+ +

+Definition at line 28 of file moeoHybridLS.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoHybridLS< MOEOT >::moeoHybridLS (eoContinue< MOEOT > &  _term,
eoSelect< MOEOT > &  _select,
moeoLS< MOEOT, MOEOT > &  _mols,
moeoArchive< MOEOT > &  _arch 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + + + +
_term stopping criteria
_select selector
_mols a multi-objective local search
_arch the archive
+
+ +

+Definition at line 39 of file moeoHybridLS.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.png b/trunk/paradiseo-moeo/doc/html/classmoeoHybridLS.png new file mode 100644 index 0000000000000000000000000000000000000000..3887a1abb8ff99b476334456db032f4bd6f41aa4 GIT binary patch literal 750 zcmV3S@@(DWag|f>1k5D85#@{#?n!1rDAx5BwEG03c!F)HDPxCdj7G?e-(|cd^ zFl*rib83rOi_58xnHc;F-T)H-5lG{K)Bwcf2|VX8lR&{TF#$zGt9bTPy14G~F4MEG z2`@~D@eJDGDP}M${hTu8-pON}=EUXW^52-xh%#F=|Ck)cR6m>3~$GGL@-JWhzsd@6Ghh#TnQ9hLqW#Y55f!ZXGq&yKF>n>Ra#Sg42DN zX%f?Ag%4wn`_`m^ak4P2TU{@@v5zy?Db#;l7>Q!+>YC+lUV^8$&i#3V&{I{{di z8W#pvnLHYqG*~c0a8h?%hApDe$P8gD{gfpq%)}DSoN25eDJo{;-f70nPm`H;!Q`B{ zeddavMLeyLd8e6H%qZ_6D&_an&A*?Eyst|A?`xB3*VU((C;kSm g{J-=*%nr}uAG9TMpfwd&9RL6T07*qoM6N<$f@hd%>Hq)$ literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric-members.html new file mode 100644 index 000000000..1597a62d8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric-members.html @@ -0,0 +1,50 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoHypervolumeBinaryMetric< ObjectiveVector > Member List

This is the complete list of members for moeoHypervolumeBinaryMetric< ObjectiveVector >, including all inherited members.

+ + + + + + + + + + + + + + +
boundsmoeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [protected]
functor_category()eoBF< A1, A2, R > [static]
hypervolume(const ObjectiveVector &_o1, const ObjectiveVector &_o2, const unsigned int _obj, const bool _flag=false)moeoHypervolumeBinaryMetric< ObjectiveVector > [inline, private]
moeoHypervolumeBinaryMetric(double _rho=1.1)moeoHypervolumeBinaryMetric< ObjectiveVector > [inline]
moeoNormalizedSolutionVsSolutionBinaryMetric()moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline]
operator()(const ObjectiveVector &_o1, const ObjectiveVector &_o2)moeoHypervolumeBinaryMetric< ObjectiveVector > [inline]
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
paretoComparatormoeoHypervolumeBinaryMetric< ObjectiveVector > [private]
rhomoeoHypervolumeBinaryMetric< ObjectiveVector > [private]
setup(double _min, double _max, unsigned int _obj)moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline, virtual]
tiny()moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > [inline, static]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.html new file mode 100644 index 000000000..d39b6dfc0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.html @@ -0,0 +1,225 @@ + + +ParadisEO-MOEO: moeoHypervolumeBinaryMetric< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoHypervolumeBinaryMetric< ObjectiveVector > Class Template Reference

Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., Künzli S. +More... +

+#include <moeoHypervolumeBinaryMetric.h> +

+

Inheritance diagram for moeoHypervolumeBinaryMetric< ObjectiveVector >: +

+ +moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > +moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double > +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoHypervolumeBinaryMetric (double _rho=1.1)
 Ctor.
double operator() (const ObjectiveVector &_o1, const ObjectiveVector &_o2)
 Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho.

Private Member Functions

double hypervolume (const ObjectiveVector &_o1, const ObjectiveVector &_o2, const unsigned int _obj, const bool _flag=false)
 Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj.

Private Attributes

+double rho
 value used to compute the reference point from the worst values for each objective
+moeoParetoObjectiveVectorComparator<
+ ObjectiveVector > 
paretoComparator
 Functor to compare two objective vectors according to Pareto dominance relation.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoHypervolumeBinaryMetric< ObjectiveVector >

+ +Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., Künzli S. +

+: Indicator-Based Selection in Multiobjective Search. In Parallel Problem Solving from Nature (PPSN VIII). Lecture Notes in Computer Science 3242, Springer, Birmingham, UK pp.832–842 (2004). This indicator is based on the hypervolume concept introduced in Zitzler, E., Thiele, L.: Multiobjective Optimization Using Evolutionary Algorithms - A Comparative Case Study. Parallel Problem Solving from Nature (PPSN-V), pp.292-301 (1998). +

+ +

+Definition at line 29 of file moeoHypervolumeBinaryMetric.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + +
moeoHypervolumeBinaryMetric< ObjectiveVector >::moeoHypervolumeBinaryMetric (double  _rho = 1.1  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_rho value used to compute the reference point from the worst values for each objective (default : 1.1)
+
+ +

+Definition at line 37 of file moeoHypervolumeBinaryMetric.h. +

+References moeoHypervolumeBinaryMetric< ObjectiveVector >::rho. +

+

+


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
double moeoHypervolumeBinaryMetric< ObjectiveVector >::operator() (const ObjectiveVector &  _o1,
const ObjectiveVector &  _o2 
) [inline]
+
+
+ +

+Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho. +

+

Warning:
don't forget to set the bounds for every objective before the call of this function
+
Parameters:
+ + + +
_o1 the first objective vector
_o2 the second objective vector
+
+ +

+Definition at line 63 of file moeoHypervolumeBinaryMetric.h. +

+References moeoHypervolumeBinaryMetric< ObjectiveVector >::hypervolume(), and moeoHypervolumeBinaryMetric< ObjectiveVector >::paretoComparator. +

+

+ +

+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
double moeoHypervolumeBinaryMetric< ObjectiveVector >::hypervolume (const ObjectiveVector &  _o1,
const ObjectiveVector &  _o2,
const unsigned int  _obj,
const bool  _flag = false 
) [inline, private]
+
+
+ +

+Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj. +

+

Parameters:
+ + + + + +
_o1 the first objective vector
_o2 the second objective vector
_obj the objective index
_flag used for iteration, if _flag=true _o2 is not talen into account (default : false)
+
+ +

+Definition at line 96 of file moeoHypervolumeBinaryMetric.h. +

+References moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >::bounds, and moeoHypervolumeBinaryMetric< ObjectiveVector >::rho. +

+Referenced by moeoHypervolumeBinaryMetric< ObjectiveVector >::operator()(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoHypervolumeBinaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..df046df5268e2c1a970e23f5132745499af821fb GIT binary patch literal 2681 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 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoIBEA-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoIBEA-members.html new file mode 100644 index 000000000..3ea0f667f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoIBEA-members.html @@ -0,0 +1,57 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoIBEA< MOEOT > Member List

This is the complete list of members for moeoIBEA< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
breedmoeoIBEA< MOEOT > [protected]
continuatormoeoIBEA< MOEOT > [protected]
defaultGenContinuatormoeoIBEA< MOEOT > [protected]
defaultSGAGenOpmoeoIBEA< MOEOT > [protected]
dummyDiversityAssignmentmoeoIBEA< MOEOT > [protected]
fitnessAssignmentmoeoIBEA< MOEOT > [protected]
functor_category()eoUF< A1, R > [static]
genBreedmoeoIBEA< MOEOT > [protected]
moeoIBEA(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)moeoIBEA< MOEOT > [inline]
moeoIBEA(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)moeoIBEA< MOEOT > [inline]
moeoIBEA(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoQuadOp< MOEOT > &_crossover, double _pCross, eoMonOp< MOEOT > &_mutation, double _pMut, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)moeoIBEA< MOEOT > [inline]
moeoIBEA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)moeoIBEA< MOEOT > [inline]
moeoIBEA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)moeoIBEA< MOEOT > [inline]
ObjectiveVector typedefmoeoIBEA< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoIBEA< MOEOT > [inline, virtual]
moeoEA::operator()(A1)=0eoUF< A1, R > [pure virtual]
popEvalmoeoIBEA< MOEOT > [protected]
replacemoeoIBEA< MOEOT > [protected]
selectmoeoIBEA< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoIBEA.html b/trunk/paradiseo-moeo/doc/html/classmoeoIBEA.html new file mode 100644 index 000000000..48a2e3046 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoIBEA.html @@ -0,0 +1,498 @@ + + +ParadisEO-MOEO: moeoIBEA< MOEOT > Class Template Reference + + + + +
+
+ +

moeoIBEA< MOEOT > Class Template Reference

IBEA (Indicator-Based Evolutionary Algorithm) as described in: E. +More... +

+#include <moeoIBEA.h> +

+

Inheritance diagram for moeoIBEA< MOEOT >: +

+ +moeoEA< MOEOT > +moeoAlgo +eoAlgo< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type of objective vector.

Public Member Functions

 moeoIBEA (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)
 Simple ctor with a eoGenOp.
 moeoIBEA (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)
 Simple ctor with a eoTransform.
 moeoIBEA (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoQuadOp< MOEOT > &_crossover, double _pCross, eoMonOp< MOEOT > &_mutation, double _pMut, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)
 Ctor with a crossover, a mutation and their corresponding rates.
 moeoIBEA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)
 Ctor with a continuator (instead of _maxGen) and a eoGenOp.
 moeoIBEA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)
 Ctor with a continuator (instead of _maxGen) and a eoTransform.
virtual void operator() (eoPop< MOEOT > &_pop)
 Apply a few generation of evolution to the population _pop until the stopping criteria is verified.

Protected Attributes

+eoGenContinue< MOEOT > defaultGenContinuator
 a continuator based on the number of generations (used as default)
+eoContinue< MOEOT > & continuator
 stopping criteria
+eoPopLoopEval< MOEOT > popEval
 evaluation function used to evaluate the whole population
+moeoDetTournamentSelect< MOEOT > select
 binary tournament selection
+moeoIndicatorBasedFitnessAssignment<
+ MOEOT > 
fitnessAssignment
 fitness assignment used in IBEA
+moeoDummyDiversityAssignment<
+ MOEOT > 
dummyDiversityAssignment
 dummy diversity assignment
+moeoEnvironmentalReplacement<
+ MOEOT > 
replace
 elitist replacement
+eoSGAGenOp< MOEOT > defaultSGAGenOp
 an object for genetic operators (used as default)
+eoGeneralBreeder< MOEOT > genBreed
 general breeder
+eoBreed< MOEOT > & breed
 breeder
+

Detailed Description

+

template<class MOEOT>
+ class moeoIBEA< MOEOT >

+ +IBEA (Indicator-Based Evolutionary Algorithm) as described in: E. +

+Zitzler, S. Künzli, "Indicator-Based Selection in Multiobjective Search", Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). This class builds the IBEA algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. +

+ +

+Definition at line 38 of file moeoIBEA.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoIBEA< MOEOT >::moeoIBEA (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoGenOp< MOEOT > &  _op,
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &  _metric,
const double  _kappa = 0.05 
) [inline]
+
+
+ +

+Simple ctor with a eoGenOp. +

+

Parameters:
+ + + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_op variation operator
_metric metric
_kappa scaling factor kappa
+
+ +

+Definition at line 54 of file moeoIBEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoIBEA< MOEOT >::moeoIBEA (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoTransform< MOEOT > &  _op,
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &  _metric,
const double  _kappa = 0.05 
) [inline]
+
+
+ +

+Simple ctor with a eoTransform. +

+

Parameters:
+ + + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_op variation operator
_metric metric
_kappa scaling factor kappa
+
+ +

+Definition at line 68 of file moeoIBEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoIBEA< MOEOT >::moeoIBEA (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoQuadOp< MOEOT > &  _crossover,
double  _pCross,
eoMonOp< MOEOT > &  _mutation,
double  _pMut,
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &  _metric,
const double  _kappa = 0.05 
) [inline]
+
+
+ +

+Ctor with a crossover, a mutation and their corresponding rates. +

+

Parameters:
+ + + + + + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_crossover crossover
_pCross crossover probability
_mutation mutation
_pMut mutation probability
_metric metric
_kappa scaling factor kappa
+
+ +

+Definition at line 85 of file moeoIBEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoIBEA< MOEOT >::moeoIBEA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoGenOp< MOEOT > &  _op,
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &  _metric,
const double  _kappa = 0.05 
) [inline]
+
+
+ +

+Ctor with a continuator (instead of _maxGen) and a eoGenOp. +

+

Parameters:
+ + + + + + +
_continuator stopping criteria
_eval evaluation function
_op variation operator
_metric metric
_kappa scaling factor kappa
+
+ +

+Definition at line 100 of file moeoIBEA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoIBEA< MOEOT >::moeoIBEA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoTransform< MOEOT > &  _op,
moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &  _metric,
const double  _kappa = 0.05 
) [inline]
+
+
+ +

+Ctor with a continuator (instead of _maxGen) and a eoTransform. +

+

Parameters:
+ + + + + + +
_continuator stopping criteria
_eval evaluation function
_op variation operator
_metric metric
_kappa scaling factor kappa
+
+ +

+Definition at line 114 of file moeoIBEA.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoIBEA< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Apply a few generation of evolution to the population _pop until the stopping criteria is verified. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 124 of file moeoIBEA.h. +

+References moeoIBEA< MOEOT >::breed, moeoIBEA< MOEOT >::continuator, moeoIBEA< MOEOT >::dummyDiversityAssignment, moeoIBEA< MOEOT >::fitnessAssignment, moeoIBEA< MOEOT >::popEval, and moeoIBEA< MOEOT >::replace. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoIBEA.png b/trunk/paradiseo-moeo/doc/html/classmoeoIBEA.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba6b5a1b006c3b42e714d0e78b5724e54448700 GIT binary patch literal 1377 zcmeAS@N?(olHy`uVBq!ia0y~yU{nIKf3PqE$z4w0Du9$kfKQ0)|NsAi%>Vxn%%7hy z0muU50|yRNANv0U$Ym@E@(X5gcy=R=fq~__r;B4q#hkZub0^I<;Bh!yl2)I5-{A|> z+;2|5rv8>+_=7n~z{M}jEpPGm&AT}{KdqjynYruoZQnk7B@V8;b^c6$Oq7j(srSq& zK584Wy~=d)+Y=k|Sbtr)=4S9b?OaR$<7x)^Z5Hxo)$%=$gdY{_8F5K{-qAg=eT%Ba zt{IC<#LI4Ga>uFbd~{=>DD z<>#{dlCjb5M`M`f+2?I{n3cV;@4&&W#czGjoag}}mKX2etYF$xVIy}%?8fKP>t;7D z&%gM$?-rN!FXLD1H=SLI!8QiQt*jg?bR8UW8JV)U1p=ZQ8g4PMkSO)x*27=B z7hSy{YHw_`ILuApSFLOLegEvke|J2u?+q*zm($(%cwYVKbA>q{lv$b$@v*Y-MWSva^B3mCA2kzt|-sd-Y=D#nRF# z&u`Vt>C)UP_0u!)oBh)_e*?1I((~Jc&P#4uiU}em7N##`T)*DsD zFWYW!{j1%}aL@45lI72n&R^6&efV$VmrlV0Po}#bei&|4l<8}iJ*C{o&ES8`W`W)$ zc5^eA<;`wSW=<^s5D_tVzrwoH_C8myX}q7Y@6)U|SNi9^{j>1m;^^u$lb_1U6~{I1 zcm5W2E8O^3*?qN8`jlDUUM4fI>iu-8uEY27mSnjL%s%Swxq(T=TTI?QTq>ih{rj(- z`*OFdmQl06eW;R6UF<7sYsZi{>(tJ$aQFV5(|Y3OW}nP3zP`!-XH|&hbw7*TF8kWE zb>E!IL|#o*`)lo{emwF>#{Zw3r6AU^7m*UbZ=Y{BRJQ9`F!6$B?}tt?=4&=9`4$E^ zB|dTD+;*hZ>1(>m4Iy!^tB~No-YN(TF*k!L0TKs+YFL~(kp;>vTY6Ug*j2E`>P*M+ zo(cqEcke~}iLI;RC%Fk-|EvZ~TlI%HPN|+X-TUX8+sEU#9zLr6`N?f}IirlE?c1m3 z2DkQcD=a@0{{54*#M@sde=h#Dy80(?@3p1BS8k8LeL8>U;-|3;E32}rf4=R%l@tOL zNeMZ#HAJuf|AOY%PwO9KZv!Wzroi%achQWAs|%8=6z*s&k0@UJ#nyg@-K%HT z$pv24Ez(cdU2;p7u>W`Z@%rG!im#W=jgs1_Xu-Q(!&t;kQCrd6(W+8-@sAZXeQmd| zWvpCWG3U|*{>48VjodwVObnD+eJ1e61UBjREq@=Z;7vX)bJxsmV^wjVU+=7E8S(C! zc25;Q8{Rp;wXAf@% + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoIndicatorBasedFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoIndicatorBasedFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + +
computeFitness(const unsigned int _idx)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline, protected]
computeValues(const eoPop< MOEOT > &_pop)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline, protected]
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
kappamoeoIndicatorBasedFitnessAssignment< MOEOT > [protected]
metricmoeoIndicatorBasedFitnessAssignment< MOEOT > [protected]
moeoIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline]
ObjectiveVector typedefmoeoIndicatorBasedFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline, virtual]
setFitnesses(eoPop< MOEOT > &_pop)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline, protected]
setup(const eoPop< MOEOT > &_pop)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline, protected]
updateByAdding(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoIndicatorBasedFitnessAssignment< MOEOT > [inline, virtual]
moeoFitnessAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
valuesmoeoIndicatorBasedFitnessAssignment< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.html new file mode 100644 index 000000000..19279617a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.html @@ -0,0 +1,414 @@ + + +ParadisEO-MOEO: moeoIndicatorBasedFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoIndicatorBasedFitnessAssignment< MOEOT > Class Template Reference

Fitness assignment sheme based an Indicator proposed in: E. +More... +

+#include <moeoIndicatorBasedFitnessAssignment.h> +

+

Inheritance diagram for moeoIndicatorBasedFitnessAssignment< MOEOT >: +

+ +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 The type of objective vector.

Public Member Functions

 moeoIndicatorBasedFitnessAssignment (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &_metric, const double _kappa=0.05)
 Ctor.
void operator() (eoPop< MOEOT > &_pop)
 Sets the fitness values for every solution contained in the population _pop.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)
 Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
double updateByAdding (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)
 Updates the fitness values of the whole population _pop by taking the adding of the objective vector _objVec into account and returns the fitness value of _objVec.

Protected Member Functions

void setup (const eoPop< MOEOT > &_pop)
 Sets the bounds for every objective using the min and the max value for every objective vector of _pop.
void computeValues (const eoPop< MOEOT > &_pop)
 Compute every indicator value in values (values[i] = I(_v[i], _o)).
void setFitnesses (eoPop< MOEOT > &_pop)
 Sets the fitness value of the whple population.
double computeFitness (const unsigned int _idx)
 Returns the fitness value of the _idx th individual of the population.

Protected Attributes

+moeoNormalizedSolutionVsSolutionBinaryMetric<
+ ObjectiveVector, double > & 
metric
 the quality indicator
+double kappa
 the scaling factor
+std::vector< std::vector<
+ double > > 
values
 the computed indicator values
+

Detailed Description

+

template<class MOEOT>
+ class moeoIndicatorBasedFitnessAssignment< MOEOT >

+ +Fitness assignment sheme based an Indicator proposed in: E. +

+Zitzler, S. Künzli, "Indicator-Based Selection in Multiobjective Search", Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). This strategy is, for instance, used in IBEA. +

+ +

+Definition at line 29 of file moeoIndicatorBasedFitnessAssignment.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoIndicatorBasedFitnessAssignment< MOEOT >::moeoIndicatorBasedFitnessAssignment (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double > &  _metric,
const double  _kappa = 0.05 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + +
_metric the quality indicator
_kappa the scaling factor
+
+ +

+Definition at line 42 of file moeoIndicatorBasedFitnessAssignment.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoIndicatorBasedFitnessAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the fitness values for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 50 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::computeValues(), moeoIndicatorBasedFitnessAssignment< MOEOT >::setFitnesses(), and moeoIndicatorBasedFitnessAssignment< MOEOT >::setup(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoIndicatorBasedFitnessAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Implements moeoFitnessAssignment< MOEOT >. +

+Definition at line 66 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::kappa, and moeoIndicatorBasedFitnessAssignment< MOEOT >::metric. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
double moeoIndicatorBasedFitnessAssignment< MOEOT >::updateByAdding (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline]
+
+
+ +

+Updates the fitness values of the whole population _pop by taking the adding of the objective vector _objVec into account and returns the fitness value of _objVec. +

+

Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+ +

+Definition at line 87 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::kappa, and moeoIndicatorBasedFitnessAssignment< MOEOT >::metric. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoIndicatorBasedFitnessAssignment< MOEOT >::setup (const eoPop< MOEOT > &  _pop  )  [inline, protected]
+
+
+ +

+Sets the bounds for every objective using the min and the max value for every objective vector of _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 130 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::metric, and moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >::setup(). +

+Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::operator()(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoIndicatorBasedFitnessAssignment< MOEOT >::computeValues (const eoPop< MOEOT > &  _pop  )  [inline, protected]
+
+
+ +

+Compute every indicator value in values (values[i] = I(_v[i], _o)). +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 152 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::metric, and moeoIndicatorBasedFitnessAssignment< MOEOT >::values. +

+Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::operator()(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoIndicatorBasedFitnessAssignment< MOEOT >::setFitnesses (eoPop< MOEOT > &  _pop  )  [inline, protected]
+
+
+ +

+Sets the fitness value of the whple population. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 174 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::computeFitness(). +

+Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::operator()(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
double moeoIndicatorBasedFitnessAssignment< MOEOT >::computeFitness (const unsigned int  _idx  )  [inline, protected]
+
+
+ +

+Returns the fitness value of the _idx th individual of the population. +

+

Parameters:
+ + +
_idx the index
+
+ +

+Definition at line 187 of file moeoIndicatorBasedFitnessAssignment.h. +

+References moeoIndicatorBasedFitnessAssignment< MOEOT >::kappa, and moeoIndicatorBasedFitnessAssignment< MOEOT >::values. +

+Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::setFitnesses(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoIndicatorBasedFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d7ef98cf2893981ea3c230e71591428230ca1b GIT binary patch literal 1500 zcmcIkdo+{@6#pc&hMpEX9%GG?q=#sZ*^V}b8I4Db8QU0x3iA-DhPF`b%5yv>4dt0f z3_h#OH&U9h#0rhX3@NoK8rE_=Tg;f9Q-AHBd-m)(_wl>u{&CN_zuCp@vb+Hh?E z0Ce4O7#{#o+pEH@8`V|Oz04V=N`@!geO;7Fr3xyQttBNv*(&teTU%SNv?)KRO0|nV zo&@0giQ!NH&^YggIp%w*@Xtc;%XPcAx{ikw+eBZB(K=*QQ#F0{D9jmJZTbqEbO+rB_)x$9SpolQJC?LhHHelL?v>kp>TVbVx zCDkH!lcQ_bZw;Tk@!GgsUJRGKl@BL-wAdJLPWWWRgZw5GgtO)95__tI_Sh;f=CiPU zjYK9L+1ZlBz{y*k1E1zpc!_1E)h3J7NEWIV|EkK0qqerC|QiojrEj}G^c|3 z_|?$Wg#?$W04(7(Nc2{pW{QWe>e%KpFrM>|0MJ1cKZUM zj550f+Q~lbRE?xxFiG7*6h=spIh+Q$$!x}xLwuXZG%JMzc$a8{=q15Ki-FL#ED~&# zaWe37a74?P+^D{0wtPTCtBApR_h~{b{6uTT5k<*pw>n3;`qc-T3sUzA7F5csoir;YAT*R~!a3#4YfO zx#fxR=5Z1<)uO+8+^P=o%xhtwqX@y>B1>K@y)-|*`|KPc-C~5lE0F%Qg7xjK&=o?u zUd)c&nP><%Rz_-G4sJ%dFtGE@+wfp)W6Fhei~3OJ2yNVIHMj8qk>0D#6bMgRL=mm0 z`P_B8Bv!#P`w}DPi3a!#m(hOq@nqTr&p35Os+UWOtVpBo=g5|;sMsaIHUqVu+Vsv8 z)KpzkHusg|%?%5sAS^2)bDC)wW3*;j6yN8(PpH>*{RVpnxuBIYNYub4i)W^sw8#sQ zX%hDK9Cn#`|M|J9bn!g%P5P^Y)d>zeF9aEvbM*!|e7>?mrcM4F8URptEn_{aGc7+Z{aY`D@MjDtXP{F{WbO(5a~^H zGq`wWr0JAho&}r|RcLpgdo$T+PvB_f9qI93Ch-DV)lQAWkC4%wNO$8naLr}j9* ze}LZ`8@}X@6{#38{2M!r@=TujqB@W(1rQ7 zsk<@k&g-UVcD}eaa4qM-q`w5`{u54}4$$A;jzJ+0aw*vA&y>!Z&2=HYE4zolQJnl3 zRe1d|dfF1Al#tZ}>J$cw+L>#rKN$gq?{CTc3vqT#hll)Gp!&W5;O63qsdoxW{2QG- B%b)-N literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoLS-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoLS-members.html new file mode 100644 index 000000000..b61fe2a24 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoLS-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoLS< MOEOT, Type > Member List

This is the complete list of members for moeoLS< MOEOT, Type >, including all inherited members.

+ + + + +
functor_category()eoBF< Type, moeoArchive< MOEOT > &, void > [static]
operator()(Type, moeoArchive< MOEOT > &)=0eoBF< Type, moeoArchive< MOEOT > &, void > [pure virtual]
~eoBF()eoBF< Type, moeoArchive< MOEOT > &, void > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoLS.html b/trunk/paradiseo-moeo/doc/html/classmoeoLS.html new file mode 100644 index 000000000..579a57b7c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoLS.html @@ -0,0 +1,63 @@ + + +ParadisEO-MOEO: moeoLS< MOEOT, Type > Class Template Reference + + + + +
+
+ +

moeoLS< MOEOT, Type > Class Template Reference

Abstract class for local searches applied to multi-objective optimization. +More... +

+#include <moeoLS.h> +

+

Inheritance diagram for moeoLS< MOEOT, Type >: +

+ +moeoAlgo +eoBF< Type, moeoArchive< MOEOT > &, void > +eoFunctorBase +moeoCombinedLS< MOEOT, Type > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT, class Type>
+ class moeoLS< MOEOT, Type >

+ +Abstract class for local searches applied to multi-objective optimization. +

+Starting from a Type (i.e.: an individual, a pop, an archive...), it produces a set of new non-dominated solutions. +

+ +

+Definition at line 25 of file moeoLS.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoLS.png b/trunk/paradiseo-moeo/doc/html/classmoeoLS.png new file mode 100644 index 0000000000000000000000000000000000000000..fffbbbd90813b3e123f82a5009d9e06325d567f3 GIT binary patch literal 1810 zcmcgtdsxy}7zRyTBz7}Q(iAmOw7jKLV_qViikC8jerRd&Ls3@Nm}o7h%feh)cmcJ> zm=$ITWk0;MMP}1_5ERo2Z!0geW+|HUvNVmcc6qkd-}~cy=l$O2InVQ*@4Vl8a<@i& zj6!0NFc=IK61*h}2GiTA!wrk{brC-Z8`f>Bw}wRrYPDJ&)M^`q!g#I@y!~CChCBR^aijXY<(dl1n1ltNK@yj?g!IeX3_I(v1;&DuBXXAs>%*B*p zM0@)wfeXAv+gh4#;vsNeU!s83#ax)5t@|i>llM^DLvvw`z+4YNT9M$OLza_4o80Xl z$SkVu!Ku7=?NC#ZBFR(+1!YwmrDbDC-~yVqkifhpt|E3BLb5U-q==qdm!4q< zqOWz(yxHM^9Y~qF2Z)_~~d zOid8_g%g&EYDVBD(SvH2hXDA2WPqfrhAVn!z1Hw zaj_bh&)`p$>_rxE09jujt64S&hc@2mflnQ)wD6Dozkp-fm7Ywi+Qv9bN?~TpOr*xo zcivce#o}(7FLs3R=N*nh5aTd=V^#y1KW<;bNw%6~33r`a$f-B&zW=)ThIWtFbjJd> zekqGvTg0Oa*ZN?qcytjfnYsWE4LH*GXpyDoj6+@Thv}C{2e3fBblBvH<(RpGh-*31 zme-mOicVi%1C;rVcVKypP}f(-i#@b+HhEJgBj5%AHf~-&y!X26d2!bgPnr3EHxM+Z z4($Zr>MR${eU9V zP0HxWpFWVIk(1G#fM@-(n;95I5qM!m)5@mdt|@EBQ_L!mj4x&-2- zlGIJjt0u}Gq#^@8yKO9*ey~Qr3l5o7_oUoxE<;+45G>>b0`eOtv9~h<?Ivj zo+Wup^~Q?;+Otv5P{BICk0k?M^?L-o8jjt3XlaFFT#Al6KP{m)CaN|K3kNlzXwCKI zP=q_-rAdn8$a0KP2*U+J5LaMMiSKZaA#9i~wqjb`KBECA{rQOKmwy}GyKnHW-@K>yPXfr-yR+UnvdeGljI-lKG&TGm?)fuV zO6T-WhgB15*m%A})57-yhJL@Y?DLdL<@uJS`$9*Pzhd|SwJj#!oQ|<;t1owACQ;jH zDy7T%TSDU37o8MejU9Dbcsi?uWap*wD=Wgl;R+ zl{x*GTMEcJ$xm8dU1Hg~7+^Uhsz0JwD3MFf7T8{v?giMF&0Is%s6?hSHIXjC_IUyP zz;>%T&g7$#zQpz!U*^O*s&glXZ>MNZ=`udV0-gu8Y*r_!EqSN^)xY~!#e3u8c^4|g aTKLbrIU02A(v0o{gM|b}Y`MBQ{^)P2Tt7De literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance-members.html new file mode 100644 index 000000000..6d78bb4fa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance-members.html @@ -0,0 +1,48 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoManhattanDistance< MOEOT > Member List

This is the complete list of members for moeoManhattanDistance< MOEOT >, including all inherited members.

+ + + + + + + + + + + + +
boundsmoeoNormalizedDistance< MOEOT > [protected]
functor_category()eoBF< A1, A2, R > [static]
moeoNormalizedDistance()moeoNormalizedDistance< MOEOT > [inline]
ObjectiveVector typedefmoeoManhattanDistance< MOEOT >
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoManhattanDistance< MOEOT > [inline]
moeoNormalizedDistance< MOEOT >::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)moeoNormalizedDistance< MOEOT > [inline, virtual]
setup(double _min, double _max, unsigned int _obj)moeoNormalizedDistance< MOEOT > [inline, virtual]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoNormalizedDistance< MOEOT > [inline, virtual]
tiny()moeoNormalizedDistance< MOEOT > [inline, static]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.html b/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.html new file mode 100644 index 000000000..fee8e6ff7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.html @@ -0,0 +1,116 @@ + + +ParadisEO-MOEO: moeoManhattanDistance< MOEOT > Class Template Reference + + + + +
+
+ +

moeoManhattanDistance< MOEOT > Class Template Reference

A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. +More... +

+#include <moeoManhattanDistance.h> +

+

Inheritance diagram for moeoManhattanDistance< MOEOT >: +

+ +moeoNormalizedDistance< MOEOT > +moeoDistance< MOEOT, double > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

const double operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns the Manhattan distance between _moeo1 and _moeo2 in the objective space.
+

Detailed Description

+

template<class MOEOT>
+ class moeoManhattanDistance< MOEOT >

+ +A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. +

+between 0 and 1). A distance value then lies between 0 and nObjectives. +

+ +

+Definition at line 24 of file moeoManhattanDistance.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const double moeoManhattanDistance< MOEOT >::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns the Manhattan distance between _moeo1 and _moeo2 in the objective space. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 37 of file moeoManhattanDistance.h. +

+References moeoNormalizedDistance< MOEOT >::bounds. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.png b/trunk/paradiseo-moeo/doc/html/classmoeoManhattanDistance.png new file mode 100644 index 0000000000000000000000000000000000000000..55fba644616505abbe5afd3e0010bae3defea76a GIT binary patch literal 1294 zcmeAS@N?(olHy`uVBq!ia0vp^4}kaw3p0>pZ~LwSq$C1-LR|m<{|{vT|9@cq{DcWW z78oBmaG?6o|0h5$V@Z%-FoVOh8)*y-EK59H978JRyq)7cYq14SL!xo^66q7g&F{Fs zu6kGBa5&@8xWVTc)?aI>^a&8hA5omM~=A$+&$d+YHU$8`xZgJndK#cvGjJd+|$FVZ*dz zVhXRM-d!q@Es(#QeS<00YxBA*5?8GqrYx@KdGhsW@UhQtO;zq5Vg7K*v?R>y#N&5D zLfTJFRTg-!{c=j^00UbA!<@RAKXyO8p8x%iz=Qbsa`w8~zq>3y{0ox;${I8<@+2@Y zOB`T`D55qs{18<_$#OEIfN#?q#zS{Kq&IK#K>I+-OuW1qV+FaiF=B+H_ zWaeeB8;z{7uYpx4QD%U!}Hst`@&al|;?GDdZ z$%~xmpRrtMlf&~Ydv29S&SeX^9=&1nTYW*KTS_ibq58;G(KnxL9OO#Q|8*=jY;#~) z#sAdXtl6gFeXvf4>EjO^b__vHlk^k)zgW9hu&T*0PVV!XHtB#3|C2i%Y&ZIv*RI~r zJ}sctM^immLcpQIvR~Eq$_Cb1x(A(kCo`L6b-$L|&w1oY<@se-CTZ;1uqM%0&2#0} zOPksXl6dD%JyofZDeBT0r5!rQo}XKI%Uf>ky-Q-I1{Updar0!zX9C8a#b2i%!3~1j zf7CqqyVe9AW1z^}BVzHl?aROKKN#mQEV;-3a+2VYm22v5ItGdx+TYTz-{ilw{K7B2 zzpLlpxe&7VY_h^K6-i;S49EME8jsItwQLZ)S<3%PN53!b<7eglI$FDHx6Wrz($ZJW znqMIPKrwCM{hQfq*Z(kFZr$a6d(T5vi-qfQ>!!?iX_Vs-t@yI^y17_n_*|vW@4IDA z2ddZ}5aVFzZM(pzo94(X5W@L=pT@kPwU=Ue95$F9+t}t~lQDzMVQ$c;_uX0(rLV7F zl5E5BO={Y|3(SUBO-%x&MK+f3{QMGD6>-=(#W#*gHTcxAsI?*IoG0Co{&c2F+qcAq z-&%WaBoi>H@-avS$nyTEG<_k?%6(idNQ zzl$MZ@~wvpv+m!O+WhzPu~X9ijl0*Fylj{)dq(0!?e&=5oYmP;Tm@(2v+d;mUGn>V ze&5!O751mjviQV*){8JLFFSD7?OsnML*4}QPZoc+o>I*Dy<(?%ceg{sr{LA%b46d@ zWYqNqI z=d@?XZI0Eudd`dW`T4_*Q~h*6*_Zvm&FP*08H^kmZf~#MxEfe^F?hQAxvX + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoMetric Member List

This is the complete list of members for moeoMetric, including all inherited members.

+ +
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoMetric.html new file mode 100644 index 000000000..96e4832bd --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoMetric.html @@ -0,0 +1,63 @@ + + +ParadisEO-MOEO: moeoMetric Class Reference + + + + +
+
+ +

moeoMetric Class Reference

Base class for performance metrics (also known as quality indicators). +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoMetric: +

+ +eoFunctorBase +moeoBinaryMetric< A1, A2, R > +moeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, double > +moeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, R > +moeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, double > +moeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, R > +moeoUnaryMetric< A, R > +moeoUnaryMetric< const ObjectiveVector &, R > +moeoUnaryMetric< const std::vector< ObjectiveVector > &, R > + +List of all members. + +
+

Detailed Description

+Base class for performance metrics (also known as quality indicators). +

+ +

+Definition at line 22 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..62d847a9edefa9dd1897db98090302e612399a0b GIT binary patch literal 6647 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 cb9Lj6U13dnyaw9vzcf60I)GGQl>h($ literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNSGA-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoNSGA-members.html new file mode 100644 index 000000000..3fe082851 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNSGA-members.html @@ -0,0 +1,56 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoNSGA< MOEOT > Member List

This is the complete list of members for moeoNSGA< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
breedmoeoNSGA< MOEOT > [protected]
continuatormoeoNSGA< MOEOT > [protected]
defaultGenContinuatormoeoNSGA< MOEOT > [protected]
defaultSGAGenOpmoeoNSGA< MOEOT > [protected]
diversityAssignmentmoeoNSGA< MOEOT > [protected]
fitnessAssignmentmoeoNSGA< MOEOT > [protected]
functor_category()eoUF< A1, R > [static]
genBreedmoeoNSGA< MOEOT > [protected]
moeoNSGA(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, double _nicheSize=0.5)moeoNSGA< MOEOT > [inline]
moeoNSGA(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, double _nicheSize=0.5)moeoNSGA< MOEOT > [inline]
moeoNSGA(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoQuadOp< MOEOT > &_crossover, double _pCross, eoMonOp< MOEOT > &_mutation, double _pMut, double _nicheSize=0.5)moeoNSGA< MOEOT > [inline]
moeoNSGA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, double _nicheSize=0.5)moeoNSGA< MOEOT > [inline]
moeoNSGA(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, double _nicheSize=0.5)moeoNSGA< MOEOT > [inline]
operator()(eoPop< MOEOT > &_pop)moeoNSGA< MOEOT > [inline, virtual]
moeoEA::operator()(A1)=0eoUF< A1, R > [pure virtual]
popEvalmoeoNSGA< MOEOT > [protected]
replacemoeoNSGA< MOEOT > [protected]
selectmoeoNSGA< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNSGA.html b/trunk/paradiseo-moeo/doc/html/classmoeoNSGA.html new file mode 100644 index 000000000..359c59d75 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNSGA.html @@ -0,0 +1,457 @@ + + +ParadisEO-MOEO: moeoNSGA< MOEOT > Class Template Reference + + + + +
+
+ +

moeoNSGA< MOEOT > Class Template Reference

NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N. +More... +

+#include <moeoNSGA.h> +

+

Inheritance diagram for moeoNSGA< MOEOT >: +

+ +moeoEA< MOEOT > +moeoAlgo +eoAlgo< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoNSGA (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, double _nicheSize=0.5)
 Simple ctor with a eoGenOp.
 moeoNSGA (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, double _nicheSize=0.5)
 Simple ctor with a eoTransform.
 moeoNSGA (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoQuadOp< MOEOT > &_crossover, double _pCross, eoMonOp< MOEOT > &_mutation, double _pMut, double _nicheSize=0.5)
 Ctor with a crossover, a mutation and their corresponding rates.
 moeoNSGA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op, double _nicheSize=0.5)
 Ctor with a continuator (instead of _maxGen) and a eoGenOp.
 moeoNSGA (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op, double _nicheSize=0.5)
 Ctor with a continuator (instead of _maxGen) and a eoTransform.
virtual void operator() (eoPop< MOEOT > &_pop)
 Apply a few generation of evolution to the population _pop until the stopping criteria is verified.

Protected Attributes

+eoGenContinue< MOEOT > defaultGenContinuator
 a continuator based on the number of generations (used as default)
+eoContinue< MOEOT > & continuator
 stopping criteria
+eoPopLoopEval< MOEOT > popEval
 evaluation function used to evaluate the whole population
+moeoDetTournamentSelect< MOEOT > select
 binary tournament selection
+moeoFastNonDominatedSortingFitnessAssignment<
+ MOEOT > 
fitnessAssignment
 fitness assignment used in NSGA-II
+moeoFrontByFrontSharingDiversityAssignment<
+ MOEOT > 
diversityAssignment
 diversity assignment used in NSGA-II
+moeoElitistReplacement< MOEOT > replace
 elitist replacement
+eoSGAGenOp< MOEOT > defaultSGAGenOp
 an object for genetic operators (used as default)
+eoGeneralBreeder< MOEOT > genBreed
 general breeder
+eoBreed< MOEOT > & breed
 breeder
+

Detailed Description

+

template<class MOEOT>
+ class moeoNSGA< MOEOT >

+ +NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N. +

+Srinivas, K. Deb, "Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms". Evolutionary Computation, Vol. 2(3), No 2, pp. 221-248 (1994). This class builds the NSGA algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. +

+ +

+Definition at line 37 of file moeoNSGA.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGA< MOEOT >::moeoNSGA (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoGenOp< MOEOT > &  _op,
double  _nicheSize = 0.5 
) [inline]
+
+
+ +

+Simple ctor with a eoGenOp. +

+

Parameters:
+ + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_op variation operator
_nicheSize niche size
+
+ +

+Definition at line 48 of file moeoNSGA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGA< MOEOT >::moeoNSGA (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoTransform< MOEOT > &  _op,
double  _nicheSize = 0.5 
) [inline]
+
+
+ +

+Simple ctor with a eoTransform. +

+

Parameters:
+ + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_op variation operator
_nicheSize niche size
+
+ +

+Definition at line 61 of file moeoNSGA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGA< MOEOT >::moeoNSGA (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoQuadOp< MOEOT > &  _crossover,
double  _pCross,
eoMonOp< MOEOT > &  _mutation,
double  _pMut,
double  _nicheSize = 0.5 
) [inline]
+
+
+ +

+Ctor with a crossover, a mutation and their corresponding rates. +

+

Parameters:
+ + + + + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_crossover crossover
_pCross crossover probability
_mutation mutation
_pMut mutation probability
_nicheSize niche size
+
+ +

+Definition at line 77 of file moeoNSGA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGA< MOEOT >::moeoNSGA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoGenOp< MOEOT > &  _op,
double  _nicheSize = 0.5 
) [inline]
+
+
+ +

+Ctor with a continuator (instead of _maxGen) and a eoGenOp. +

+

Parameters:
+ + + + + +
_continuator stopping criteria
_eval evaluation function
_op variation operator
_nicheSize niche size
+
+ +

+Definition at line 91 of file moeoNSGA.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGA< MOEOT >::moeoNSGA (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoTransform< MOEOT > &  _op,
double  _nicheSize = 0.5 
) [inline]
+
+
+ +

+Ctor with a continuator (instead of _maxGen) and a eoTransform. +

+

Parameters:
+ + + + + +
_continuator stopping criteria
_eval evaluation function
_op variation operator
_nicheSize niche size
+
+ +

+Definition at line 104 of file moeoNSGA.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoNSGA< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Apply a few generation of evolution to the population _pop until the stopping criteria is verified. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 114 of file moeoNSGA.h. +

+References moeoNSGA< MOEOT >::breed, moeoNSGA< MOEOT >::continuator, moeoNSGA< MOEOT >::diversityAssignment, moeoNSGA< MOEOT >::fitnessAssignment, moeoNSGA< MOEOT >::popEval, and moeoNSGA< MOEOT >::replace. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNSGA.png b/trunk/paradiseo-moeo/doc/html/classmoeoNSGA.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9cd8548627840998c1e6d0e560004238f68030 GIT binary patch literal 1449 zcmb_cX;4!K5KgpU4T6-zfE2s{x#eMvw8|0g5QqpNMzI_Z6(Nv#ArMfh6i5O=rxXd5 zh*rWGNS{Oqv;i9OqF~}6AVwlkC?Hg$B8PZD8vCc6{&r?}zi)SEe|)n$%M2p~>Z3NI z5D0`mF32w&fk3)y`O;^rwXw{+xj^b5(5V6Qf!i z7tC?;Q+`Z5KPIICt!MFl$`C8#D(_vSyiFvl|H%*%O%ouB^)a6T(jB{F5ZjsZbP>c4 zCrYou<2UA^)BCtLL#0y`sCVUgtFbUS-k@SAhZAIhr}LU_tQ=(*h~0!hLV1uN%iJ^q z(3(9Iy^>1(zfYw-S;(x9 zfQcai^1PF?Dd~?DQAJ%Dy{)ZeH)4|Sm9D=y3REISl4+vaYHQuhX5QrJ<@7e~VR4HR zd?D9WR_bsdIliIaqWQN1&ZF40GG}mUB6iT}r6kT4*(kh&8T8y@-7j+k6)LmE;QUr} zl$m-+UP+&{IkU+5#f(d6uulWt4@eJR2+zIia~Ki5k9an9#H2oQD4zxF2V7wA1>J;Z3*X-(gNW!n;G|Q3 zc~!gJhNc6>5r>)Fw6Ef>KWgk6!@RG;0UBV*9b@6OXtlkXY}I|x!vLHw!pg5Icg5Sx zY1=s!y?3zcrJVk?Cd{L0g}&pMc6BiaKeE#j*qtCf)o*UX9PwW zb>aK?10AWkyc#pK>7PIU+jF=QuFiXsa1?4w^ZU5Zb`H){+;Q%eO0aYG_w_i>^(S^2 zMFo!Tm%p3PX)##+%?Cc+81nTDAgt?{MCQX$Ov~3m^Ngb;dDZ=D)Dc*&2J^95#<$R4 z4wf_CqWc(SB(NLJSQiKlK(OZ&dtDwuix}wQk-T= zls~>Yaf3v+q6|8AuvxVntz9O!l+tXbOWaGT+r6eE`KLDcd9;~6YniS8zY>{0Ec%Z; z2B#J#9^@a&aIhtXsb8Oml+zk^d#QOb)ipOpBRL+D^}|`2E{NxibXvG**w5(3(Gs)- z-{l%@I-ddo=}rrI?o03&T|3tW0v#q+vWIE{)SX^zj|#;mGeh}Ftf-}gd;NT+`>@Sa zeX!I=F;-J%&xlj}s_YZ?G1yUAG^41Enezo()?()jAi}2L@i6MF80X{^0Ih{VG`A6^ zUQ*KS*5q($g&;+d9(zgrdgS9-EbqmHcH1Lw_suC4;#*A@lS->WQ0Jk`K3IyX`!+fS dnkuDf5EY8g*GQ_WMB2ZK!1)vW8hv6f{tXu{tU3Sy literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII-members.html new file mode 100644 index 000000000..8c2e1de15 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII-members.html @@ -0,0 +1,56 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoNSGAII< MOEOT > Member List

This is the complete list of members for moeoNSGAII< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
breedmoeoNSGAII< MOEOT > [protected]
continuatormoeoNSGAII< MOEOT > [protected]
defaultGenContinuatormoeoNSGAII< MOEOT > [protected]
defaultSGAGenOpmoeoNSGAII< MOEOT > [protected]
diversityAssignmentmoeoNSGAII< MOEOT > [protected]
fitnessAssignmentmoeoNSGAII< MOEOT > [protected]
functor_category()eoUF< A1, R > [static]
genBreedmoeoNSGAII< MOEOT > [protected]
moeoNSGAII(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op)moeoNSGAII< MOEOT > [inline]
moeoNSGAII(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op)moeoNSGAII< MOEOT > [inline]
moeoNSGAII(unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoQuadOp< MOEOT > &_crossover, double _pCross, eoMonOp< MOEOT > &_mutation, double _pMut)moeoNSGAII< MOEOT > [inline]
moeoNSGAII(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op)moeoNSGAII< MOEOT > [inline]
moeoNSGAII(eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op)moeoNSGAII< MOEOT > [inline]
operator()(eoPop< MOEOT > &_pop)moeoNSGAII< MOEOT > [inline, virtual]
moeoEA::operator()(A1)=0eoUF< A1, R > [pure virtual]
popEvalmoeoNSGAII< MOEOT > [protected]
replacemoeoNSGAII< MOEOT > [protected]
selectmoeoNSGAII< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.html b/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.html new file mode 100644 index 000000000..257b5cfb5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.html @@ -0,0 +1,422 @@ + + +ParadisEO-MOEO: moeoNSGAII< MOEOT > Class Template Reference + + + + +
+
+ +

moeoNSGAII< MOEOT > Class Template Reference

NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S. +More... +

+#include <moeoNSGAII.h> +

+

Inheritance diagram for moeoNSGAII< MOEOT >: +

+ +moeoEA< MOEOT > +moeoAlgo +eoAlgo< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoNSGAII (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op)
 Simple ctor with a eoGenOp.
 moeoNSGAII (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op)
 Simple ctor with a eoTransform.
 moeoNSGAII (unsigned int _maxGen, eoEvalFunc< MOEOT > &_eval, eoQuadOp< MOEOT > &_crossover, double _pCross, eoMonOp< MOEOT > &_mutation, double _pMut)
 Ctor with a crossover, a mutation and their corresponding rates.
 moeoNSGAII (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoGenOp< MOEOT > &_op)
 Ctor with a continuator (instead of _maxGen) and a eoGenOp.
 moeoNSGAII (eoContinue< MOEOT > &_continuator, eoEvalFunc< MOEOT > &_eval, eoTransform< MOEOT > &_op)
 Ctor with a continuator (instead of _maxGen) and a eoTransform.
virtual void operator() (eoPop< MOEOT > &_pop)
 Apply a few generation of evolution to the population _pop until the stopping criteria is verified.

Protected Attributes

+eoGenContinue< MOEOT > defaultGenContinuator
 a continuator based on the number of generations (used as default)
+eoContinue< MOEOT > & continuator
 stopping criteria
+eoPopLoopEval< MOEOT > popEval
 evaluation function used to evaluate the whole population
+moeoDetTournamentSelect< MOEOT > select
 binary tournament selection
+moeoFastNonDominatedSortingFitnessAssignment<
+ MOEOT > 
fitnessAssignment
 fitness assignment used in NSGA-II
+moeoFrontByFrontCrowdingDistanceDiversityAssignment<
+ MOEOT > 
diversityAssignment
 diversity assignment used in NSGA-II
+moeoElitistReplacement< MOEOT > replace
 elitist replacement
+eoSGAGenOp< MOEOT > defaultSGAGenOp
 an object for genetic operators (used as default)
+eoGeneralBreeder< MOEOT > genBreed
 general breeder
+eoBreed< MOEOT > & breed
 breeder
+

Detailed Description

+

template<class MOEOT>
+ class moeoNSGAII< MOEOT >

+ +NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S. +

+Agrawal, A. Pratap, and T. Meyarivan : "A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II". In IEEE Transactions on Evolutionary Computation, Vol. 6, No 2, pp 182-197 (April 2002). This class builds the NSGA-II algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. +

+ +

+Definition at line 37 of file moeoNSGAII.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGAII< MOEOT >::moeoNSGAII (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoGenOp< MOEOT > &  _op 
) [inline]
+
+
+ +

+Simple ctor with a eoGenOp. +

+

Parameters:
+ + + + +
_maxGen number of generations before stopping
_eval evaluation function
_op variation operator
+
+ +

+Definition at line 47 of file moeoNSGAII.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGAII< MOEOT >::moeoNSGAII (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoTransform< MOEOT > &  _op 
) [inline]
+
+
+ +

+Simple ctor with a eoTransform. +

+

Parameters:
+ + + + +
_maxGen number of generations before stopping
_eval evaluation function
_op variation operator
+
+ +

+Definition at line 59 of file moeoNSGAII.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGAII< MOEOT >::moeoNSGAII (unsigned int  _maxGen,
eoEvalFunc< MOEOT > &  _eval,
eoQuadOp< MOEOT > &  _crossover,
double  _pCross,
eoMonOp< MOEOT > &  _mutation,
double  _pMut 
) [inline]
+
+
+ +

+Ctor with a crossover, a mutation and their corresponding rates. +

+

Parameters:
+ + + + + + + +
_maxGen number of generations before stopping
_eval evaluation function
_crossover crossover
_pCross crossover probability
_mutation mutation
_pMut mutation probability
+
+ +

+Definition at line 74 of file moeoNSGAII.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGAII< MOEOT >::moeoNSGAII (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoGenOp< MOEOT > &  _op 
) [inline]
+
+
+ +

+Ctor with a continuator (instead of _maxGen) and a eoGenOp. +

+

Parameters:
+ + + + +
_continuator stopping criteria
_eval evaluation function
_op variation operator
+
+ +

+Definition at line 87 of file moeoNSGAII.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoNSGAII< MOEOT >::moeoNSGAII (eoContinue< MOEOT > &  _continuator,
eoEvalFunc< MOEOT > &  _eval,
eoTransform< MOEOT > &  _op 
) [inline]
+
+
+ +

+Ctor with a continuator (instead of _maxGen) and a eoTransform. +

+

Parameters:
+ + + + +
_continuator stopping criteria
_eval evaluation function
_op variation operator
+
+ +

+Definition at line 99 of file moeoNSGAII.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoNSGAII< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Apply a few generation of evolution to the population _pop until the stopping criteria is verified. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 109 of file moeoNSGAII.h. +

+References moeoNSGAII< MOEOT >::breed, moeoNSGAII< MOEOT >::continuator, moeoNSGAII< MOEOT >::diversityAssignment, moeoNSGAII< MOEOT >::fitnessAssignment, moeoNSGAII< MOEOT >::popEval, and moeoNSGAII< MOEOT >::replace. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.png b/trunk/paradiseo-moeo/doc/html/classmoeoNSGAII.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c5303ea6fb48fe46e6093a7438e5c4ff652c2e GIT binary patch literal 1286 zcmaKsTTqe-6vt6flU+j-qoi!g% z3<7~ThwTrIfk15VR-T30Su@|8=w)pyqQYYdAP8C!1SOS~NB^+Wmy$>%3@JEf9c{8= zNMy*KiT;xi2$UTbx;K`}ey54gEcZh=94+e}`-K?bGO(vs6U7mM-UtmOU$Tx^O16Nn zH(-?t+g&@@(O0Xof<7a{Gc?oN{*)o9!{T6ti(XC^hr3G|7wbxSb5B#rfI8*MDn)nV z-N{=tW<}~MMNp>fFS53J%!P-v|`zmZAsp z=hf#tnt&|%*`bKKYyQEOkbQRp8-|1ez0i%;hHtYZjuWB(^WTA)n8|)7|RVv3LUC)L|#B5G5-|ndpa8 zLYE2j^V8VK>n-rr+zn#VV9N*tSf3~8TL$%{l>qO%-!BnN2)purQ+%fbdX-JZZBIPY z_8&BSa&$}_+`T;ajBmLA{MiPwp{7R+ZFnt2((5-9R9K!)&$FOp$>=%@beeQG0%qK8 zJ%O^FGYK!DJ&&^`oj?{Y(K%rdu01z_9TF`RPx@wL(!4RtKR-fkVSIXj{`o0B=g^t_ z#NlnWo<2D0T$^03XP*CA$*S@bzOsc`==z=h2ZIy|EOusRK>aCW&b-PM_YYe%cb4<; ze7`0l74#}%AB)MyuuUYT8Nd3f^rersJz?7aPVz$Gtb2Roi}4zzH#n*>1e-XN1$#`< zUk?WfnJ2D?Q&zx_(>e zVg%;y#_{M`keQCS??2+o=i?6kM=9dY2ZaIlo3_HIq%uqtuV?V1`b=SgU0K{c=8(r1 ziF3Xxz&dW#HfNRF2ws20?tcW3Xt}7w$&8~ zBnMQ{##)7(q1!kk>H6*alL<9ge6sEeEkD;q_eSgc_nr8Z^_Jrfyo`at8@0z6bsHbZ zs(WqUp%>wUSi}r=>BZs-zoP2Jo1@VLpol(d-}7tvcGJS=L!7|zCO*+j3ytP2#QHRb z5|WZ?Uh#2T~g z4Dgxqp6-D9r-BHkPjb9F)`@c~Ew2BBGo=(>l54Z%^x7lsE-#_hrv(WkkV5N2jxzrR DJhXnV literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance-members.html new file mode 100644 index 000000000..ad2ca0898 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance-members.html @@ -0,0 +1,47 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoNormalizedDistance< MOEOT, Type > Member List

This is the complete list of members for moeoNormalizedDistance< MOEOT, Type >, including all inherited members.

+ + + + + + + + + + + +
boundsmoeoNormalizedDistance< MOEOT, Type > [protected]
functor_category()eoBF< A1, A2, R > [static]
moeoNormalizedDistance()moeoNormalizedDistance< MOEOT, Type > [inline]
ObjectiveVector typedefmoeoNormalizedDistance< MOEOT, Type >
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)moeoNormalizedDistance< MOEOT, Type > [inline, virtual]
setup(double _min, double _max, unsigned int _obj)moeoNormalizedDistance< MOEOT, Type > [inline, virtual]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoNormalizedDistance< MOEOT, Type > [inline, virtual]
tiny()moeoNormalizedDistance< MOEOT, Type > [inline, static]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.html b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.html new file mode 100644 index 000000000..ce51a745a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.html @@ -0,0 +1,220 @@ + + +ParadisEO-MOEO: moeoNormalizedDistance< MOEOT, Type > Class Template Reference + + + + +
+
+ +

moeoNormalizedDistance< MOEOT, Type > Class Template Reference

The base class for double distance computation with normalized objective values (i.e. +More... +

+#include <moeoNormalizedDistance.h> +

+

Inheritance diagram for moeoNormalizedDistance< MOEOT, Type >: +

+ +moeoDistance< MOEOT, Type > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

moeoNormalizedDistance ()
 Default ctr.
virtual void setup (const eoPop< MOEOT > &_pop)
 Sets the lower and the upper bounds for every objective using extremes values for solutions contained in the population _pop.
virtual void setup (double _min, double _max, unsigned int _obj)
 Sets the lower bound (_min) and the upper bound (_max) for the objective _obj.
virtual void setup (eoRealInterval _realInterval, unsigned int _obj)
 Sets the lower bound and the upper bound for the objective _obj using a eoRealInterval object.

Static Public Member Functions

+static double tiny ()
 Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound).

Protected Attributes

+std::vector< eoRealIntervalbounds
 the bounds for every objective (bounds[i] = bounds for the objective i)
+

Detailed Description

+

template<class MOEOT, class Type = double>
+ class moeoNormalizedDistance< MOEOT, Type >

+ +The base class for double distance computation with normalized objective values (i.e. +

+between 0 and 1). +

+ +

+Definition at line 24 of file moeoNormalizedDistance.h.


Member Function Documentation

+ +
+
+
+template<class MOEOT, class Type = double>
+ + + + + + + + + +
virtual void moeoNormalizedDistance< MOEOT, Type >::setup (const eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets the lower and the upper bounds for every objective using extremes values for solutions contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Reimplemented from moeoDistance< MOEOT, Type >. +

+Definition at line 59 of file moeoNormalizedDistance.h. +

+Referenced by moeoNormalizedDistance< MOEOT >::setup(). +

+

+ +

+
+
+template<class MOEOT, class Type = double>
+ + + + + + + + + + + + + + + + + + + + + + + + +
virtual void moeoNormalizedDistance< MOEOT, Type >::setup (double  _min,
double  _max,
unsigned int  _obj 
) [inline, virtual]
+
+
+ +

+Sets the lower bound (_min) and the upper bound (_max) for the objective _obj. +

+

Parameters:
+ + + + +
_min lower bound
_max upper bound
_obj the objective index
+
+ +

+Reimplemented from moeoDistance< MOEOT, Type >. +

+Definition at line 83 of file moeoNormalizedDistance.h. +

+

+ +

+
+
+template<class MOEOT, class Type = double>
+ + + + + + + + + + + + + + + + + + +
virtual void moeoNormalizedDistance< MOEOT, Type >::setup (eoRealInterval  _realInterval,
unsigned int  _obj 
) [inline, virtual]
+
+
+ +

+Sets the lower bound and the upper bound for the objective _obj using a eoRealInterval object. +

+

Parameters:
+ + + +
_realInterval the eoRealInterval object
_obj the objective index
+
+ +

+Reimplemented from moeoDistance< MOEOT, Type >. +

+Definition at line 99 of file moeoNormalizedDistance.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.png b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedDistance.png new file mode 100644 index 0000000000000000000000000000000000000000..5fff519494b9831c4caf2ab0ec066fe0b86b9814 GIT binary patch literal 1213 zcmeAS@N?(olHy`uVBq!ia0y~yU}Ocd53n!;$^Wmi1%Z@AfKQ0)|Ns9%BL5G}pPw)R z$O7X72M$yp`u_yTWh@Eu3ubV5b|Z~}fhE|}#WAE}&fD3(lO8MZv>r{nc7XQ-=dLup zBdgxmw=gPxysX$a`G#QZ((8AHr44Gt4oyDA{lPyb{zLiXX+|1{Z}Xhn`A+9b(0|9a z!ZiWjhjTA~mUP>E%ukl!Vdnr%m3_Ct$=b7Cy6AhlcImxr{&f{9PGot@f^7hT+Z{+*S-?sYm z!f5e>j{{b!Oet;rDG;-xDmF$rHGnNOVyfe>xwUoq|F=E*9lK|(1~0>h=h3qgc-!8; z*XZ5Aa+u3u`Sh3AMl%H9q@I7aQJI3n^YX zUBqp%M$0)p&3j3?WsJ;KCdO@RlW*vyuDB*@oUoz0`C8NmPD7cw6VxSTB-@w%mS*b` ze16!mV=>RUuZ0WF8Cut78y{f}{_Oj&KgChf?x4cob8&yqe%{iweFxKFu6vKT zc(k7^F`BT*gh7K@+l#ruXafP}ui5H#VoP{VeUM?!+jENj^7$txH#kgR{bzD+U(%Ny z&Th{I+jbcipL?)5S@=Za>zJv#!)20AL|-_ub75{~rT?tsduPoq-?}b&L2dPxrR$R& z#Ix#O-_iN3qULr;EZb?-q- z^M2>MZWgUKQZsIw7U~tmD;O`?WhBkGJWri(-rbwk0{o9Qn6|Cu_e+eAQ$dsZ2BFgm6&ku|@NwN11rNYW!vieXBl=u$=p z$q4++2O@0hdfeas-mVBfwScEzg6Ch~S)cIP#y6*Qs~bH%Zy8fmk??`x)oVev>eCnc z16M!iS$XBD*wSp96}rpA6P%m>rlr+*E@$)4opdlL`_$hh!p*hI*v#fWTU8Z%K7m_j zN^_s$ci-tfJYv<`BId`vFfD!Bqq~%C#kw!~yni2AZf`#`alP4Zo)XW8scdgH7+%nn z4Yr+METi+mVTMj?Wy*=m_Pxx;A{`SM*KfSynObmW?xc-|65gS$idQYqiSL$XKkaOI zq~GE|OXIUc0rh7NEd6S=z~YVZlBj(ta_zU4?oQos;ZtMxt^?a@7R;}HedyNjpBL70 zKPYu9ZalqsZTF`dgBhE}^0Onv6YA{brPy3kH|g0a$t|Bf)8F{Y@_AFi!K@a + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > Member List

This is the complete list of members for moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >, including all inherited members.

+ + + + + + + + + +
boundsmoeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > [protected]
functor_category()eoBF< A1, A2, R > [static]
moeoNormalizedSolutionVsSolutionBinaryMetric()moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > [inline]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
setup(double _min, double _max, unsigned int _obj)moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > [inline]
setup(eoRealInterval _realInterval, unsigned int _obj)moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > [inline, virtual]
tiny()moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > [inline, static]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.html new file mode 100644 index 000000000..284152dca --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.html @@ -0,0 +1,178 @@ + + +ParadisEO-MOEO: moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > Class Template Reference + + + + +
+
+ +

moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > Class Template Reference

Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. +More... +

+#include <moeoNormalizedSolutionVsSolutionBinaryMetric.h> +

+

Inheritance diagram for moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >: +

+ +moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R > +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + +

Public Member Functions

moeoNormalizedSolutionVsSolutionBinaryMetric ()
 Default ctr for any moeoNormalizedSolutionVsSolutionBinaryMetric object.
void setup (double _min, double _max, unsigned int _obj)
 Sets the lower bound (_min) and the upper bound (_max) for the objective _obj.
virtual void setup (eoRealInterval _realInterval, unsigned int _obj)
 Sets the lower bound and the upper bound for the objective _obj using a eoRealInterval object.

Static Public Member Functions

+static double tiny ()
 Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound).

Protected Attributes

+std::vector< eoRealIntervalbounds
 the bounds for every objective (bounds[i] = bounds for the objective i)
+

Detailed Description

+

template<class ObjectiveVector, class R>
+ class moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >

+ +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. +

+Then, indicator values lie in the interval [-1,1]. Note that you have to set the bounds for every objective before using the operator(). +

+ +

+Definition at line 26 of file moeoNormalizedSolutionVsSolutionBinaryMetric.h.


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector, class R>
+ + + + + + + + + + + + + + + + + + + + + + + + +
void moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >::setup (double  _min,
double  _max,
unsigned int  _obj 
) [inline]
+
+
+ +

+Sets the lower bound (_min) and the upper bound (_max) for the objective _obj. +

+

Parameters:
+ + + + +
_min lower bound
_max upper bound
_obj the objective index
+
+ +

+Definition at line 50 of file moeoNormalizedSolutionVsSolutionBinaryMetric.h. +

+Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::setup(). +

+

+ +

+
+
+template<class ObjectiveVector, class R>
+ + + + + + + + + + + + + + + + + + +
virtual void moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >::setup (eoRealInterval  _realInterval,
unsigned int  _obj 
) [inline, virtual]
+
+
+ +

+Sets the lower bound and the upper bound for the objective _obj using a eoRealInterval object. +

+

Parameters:
+ + + +
_realInterval the eoRealInterval object
_obj the objective index
+
+ +

+Definition at line 66 of file moeoNormalizedSolutionVsSolutionBinaryMetric.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoNormalizedSolutionVsSolutionBinaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..07c556671c141de73542f63a931f5009bcd58d7e GIT binary patch literal 2692 zcmd6pdoAHVnaylcJhv!3Vse%|MK z(@uFDS5?wdf3>?+6#9Z+gvK5I4 z2(UE;j2J7z>83vKPuGdcZ7A#ALsQUEhQ)<7@~L_pVvZL4b!km;_+aN2ZOXdJOO|C1 zt8av*FuU=^$@n&e@PJ#XW9=670O)wQ%(6Bu<0O4ypG#3n05Mh@&edmC_=TWDv)Fl` z!=^(y*~o`-T9m$_k_#*aFx|;^L+j|VA*dPf{I9TUD&`dn3mb8KP_WDKMBxfHeAE?MylRa;XWdpa!l^qw_1ia zDmZuGG(t4>H-u=u*5;Tv$Z$+b50?3+$d&mzM7Yo)P#1d2h}4t%cis}5c=9d|Jo$xd z6y>ZGitF5X5VLUO_MRC+j^Y54-(B()p4aLC+<1cR4&1FV z(DkcNv{kJYwDDPvw&x7sYYEK+Yy5oXj?A*$&jUTwK%;njw&5C+6@{s~Xvtt9p_(v* z;=A>Ts>#utg1N5sjlIXh^QgO6oabniH;(8r12jDg5;9{6?R0dOV{nE5;~7cK;d`yr z4UBEi+^v)Z(_9wT?o~E_F&_^L({8KYD8&Z1z3m1=_3Afd{t)Dh|0#f{7x3v-K4~FA zbD`dlq4pgG=dUTpWqj38js$B2a#D`=ZMt}^2`=qK8KqEUN36X^V>xrVA~^u z>e+-9uHmY`(B;-~V{wKhc}T#zG#*aQW-$0Hb;WzFoIt;t_rCXX3lS4?qR8AS9VBzD z25fNM7z7acyRRQ*eHs-y1nVlgN7!-SaHYGG4rE zz{Y})MJtsR;LM2O!uWQZ+E~(*j+^y(ej^xP?B&NQ0p zAX)b=SIf2@?n6SAnp_pwM3aV*YYFXguHFdhO3sM^-3Y8Tbz#rc=Rm};V(NT=J5eQL z9Pae1FM-wp*P+Y{a6v~l9xe1a~zGaGgSGF7t3JK9v9Ki9$e+lxtok9Eg~aP z_|VUZn_5vsDIFwYa7OR#PBxUBc}(VF++s-lp}hV%JM$#Fkvx$@w<6f$91y_5I&v2TwHRPZ#n*)tUr@b({ECY3dJU30ANatSFrgKkyddr zvC(XnH{FE4#)<>9^r9N7_MbmEzho6(bUWKAo^xeX6E#A@jwRyia&#l; zZPe3&hlBjsfqT!Oy7s!iLW;ey$sQirpg4FXF*_UW_;iQg=!%rOa{=ajHbG(Z5V3qSAin9n%g>h3SQks9qTE`~ znh@shf-dZyE?@i|1;j896^GkB>)l>QGX>KpXPIrg z9ZQ^bXMjpoQVcd!fcH%Dsm9Nr&0vXc;2Xk1@0^bsKu&#_uUceU&@HwY#hZJ3K)v^l z0fUEG>DOc#t%BZCUZ;d@DDEYIK5dJ?OfB98VnX_4gt$6;9IZa$fB7HSp!yvE literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator-members.html new file mode 100644 index 000000000..73aea181b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator-members.html @@ -0,0 +1,41 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoObjectiveObjectiveVectorComparator< ObjectiveVector > Member List

This is the complete list of members for moeoObjectiveObjectiveVectorComparator< ObjectiveVector >, including all inherited members.

+ + + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)moeoObjectiveObjectiveVectorComparator< ObjectiveVector > [inline]
moeoObjectiveVectorComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.html new file mode 100644 index 000000000..b5f28e11d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.html @@ -0,0 +1,106 @@ + + +ParadisEO-MOEO: moeoObjectiveObjectiveVectorComparator< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoObjectiveObjectiveVectorComparator< ObjectiveVector > Class Template Reference

Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. +More... +

+#include <moeoObjectiveObjectiveVectorComparator.h> +

+

Inheritance diagram for moeoObjectiveObjectiveVectorComparator< ObjectiveVector >: +

+ +moeoObjectiveVectorComparator< ObjectiveVector > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

const bool operator() (const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)
 Returns true if _objectiveVector1 < _objectiveVector2 on the first objective, then on the second, and so on.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoObjectiveObjectiveVectorComparator< ObjectiveVector >

+ +Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. +

+ +

+Definition at line 22 of file moeoObjectiveObjectiveVectorComparator.h.


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
const bool moeoObjectiveObjectiveVectorComparator< ObjectiveVector >::operator() (const ObjectiveVector &  _objectiveVector1,
const ObjectiveVector &  _objectiveVector2 
) [inline]
+
+
+ +

+Returns true if _objectiveVector1 < _objectiveVector2 on the first objective, then on the second, and so on. +

+

Parameters:
+ + + +
_objectiveVector1 the first objective vector
_objectiveVector2 the second objective vector
+
+ +

+Definition at line 31 of file moeoObjectiveObjectiveVectorComparator.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveObjectiveVectorComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..4d94f5ab61acdf0200d399a0c962ce12d445661c GIT binary patch literal 1308 zcmeAS@N?(olHy`uVBq!ia0y~yU@QW%53n!;$=CH?KL9C-0G|-o|Ns93ng9PEm_I*Z z0+0p92M!#lKJ@L)rd=~(}0Y8JhG@%}s$u}wb~olrS`)$y-n=&SAW!TVe0#5$c@fA7gT32(mK zjb(FHS6To3bU|!&?bllWzbBm6&1EbSuUpeOEukZg{mDnkA728^iw=A>n>_o+m50sU z*J?7VQ}v-7@syZiO`UVE3H3;uO? z)}M)`e%HkE1q>nzat~UWU$ZO9O`JaAv-gRgs!#q%&HQuOTwc%n?#lJii|?;2Jh}gW z-K+NqWdPLFpwr?2=Nt{pD?eNz1|wtuO-f9{JZ zKA$$>^XlY!@0|3RzlG+i>o#1QzHi#|Qs>IuIi;JHaI)|Ims9w95#JNOU#(hCS}z`) z{Cwi`X={DnJxYFMt}XYJ;pE-ls+ap^Uf)q$5&r4OtXF?(zwkY2Y<*&*=y-nSY};w; z50yK-pH%F>nsuVi$``KllQ!8YJ-=#YuTbwcclp+%61QAtp1i#2-Kh_guT6{9HQ4=a z!F^x9L~B)R&wblJK)gMv?&z*3a^m~j-u{xFUUO&N{=$>&`XPUnN!997fqSY)5pE4sno zep@waS7pq-fOQpzj@W(IauP_=_4l3~?tCHZez@-QbNeUU7P=L#?l?V!apsYyybPy3 z@10v)%ImoLh4quA{D%HaY%yhV!s3x;O3HRaehLbC%}KT|43Vw!707=z>yDOx5#Lg?IBL z7SEircFTGtJ?0m=1z|DK3)nC3c+`-^9d-HV`3v9X?G;YnbCKhR{e~QMcDt-5Ng&(tTfCBtDIP4#2hkz3zJSD+{8cFz_s`+BCm(ib# z=Bp{D0~6nBFFQ$Dwh&1rzuV5je-@d1T$h!Z$Gyv4?y(Q|a$)DKo?i}?Pu`=ep*sK3 z)YHt|y z!&usn=c&9!OXoppAH#h!*B(_A5dE~-QFPvv69+3>m!JBXR7^a9gTl!J!$Yq%h~qRzu3)ngC1P^nW+pc${0Ld{an^LB{Ts5^nZ}9 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector-members.html new file mode 100644 index 000000000..b838f7342 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector-members.html @@ -0,0 +1,44 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > Member List

This is the complete list of members for moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >, including all inherited members.

+ + + + + + + + +
maximizing(unsigned int _i)moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > [inline, static]
minimizing(unsigned int _i)moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > [inline, static]
moeoObjectiveVector(Type _value=Type())moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > [inline]
moeoObjectiveVector(std::vector< Type > &_v)moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > [inline]
nObjectives()moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > [inline, static]
setup(unsigned int _nObjectives, std::vector< bool > &_bObjectives)moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > [inline, static]
Traits typedefmoeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >
Type typedefmoeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector.html new file mode 100644 index 000000000..bc6bd860a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVector.html @@ -0,0 +1,222 @@ + + +ParadisEO-MOEO: moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > Class Template Reference + + + + +
+
+ +

moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType > Class Template Reference

Abstract class allowing to represent a solution in the objective space (phenotypic representation). +More... +

+#include <moeoObjectiveVector.h> +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef ObjectiveVectorTraits Traits
 The traits of objective vectors.
+typedef ObjectiveVectorType Type
 The type of an objective value.

Public Member Functions

moeoObjectiveVector (Type _value=Type())
 Ctor.
 moeoObjectiveVector (std::vector< Type > &_v)
 Ctor from a vector of Type.

Static Public Member Functions

static void setup (unsigned int _nObjectives, std::vector< bool > &_bObjectives)
 Parameters setting (for the objective vector of any solution).
+static unsigned int nObjectives ()
 Returns the number of objectives.
static bool minimizing (unsigned int _i)
 Returns true if the _ith objective have to be minimized.
static bool maximizing (unsigned int _i)
 Returns true if the _ith objective have to be maximized.
+


Detailed Description

+

template<class ObjectiveVectorTraits, class ObjectiveVectorType>
+ class moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >

+ +Abstract class allowing to represent a solution in the objective space (phenotypic representation). +

+The template argument ObjectiveVectorTraits defaults to moeoObjectiveVectorTraits, but it can be replaced at will by any other class that implements the static functions defined therein. Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's. +

+ +

+Definition at line 25 of file moeoObjectiveVector.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class ObjectiveVectorTraits, class ObjectiveVectorType>
+ + + + + + + + + +
moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >::moeoObjectiveVector (std::vector< Type > &  _v  )  [inline]
+
+
+ +

+Ctor from a vector of Type. +

+

Parameters:
+ + +
_v the std::vector < Type >
+
+ +

+Definition at line 46 of file moeoObjectiveVector.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class ObjectiveVectorTraits, class ObjectiveVectorType>
+ + + + + + + + + + + + + + + + + + +
static void moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >::setup (unsigned int  _nObjectives,
std::vector< bool > &  _bObjectives 
) [inline, static]
+
+
+ +

+Parameters setting (for the objective vector of any solution). +

+

Parameters:
+ + + +
_nObjectives the number of objectives
_bObjectives the min/max vector (true = min / false = max)
+
+ +

+Definition at line 55 of file moeoObjectiveVector.h. +

+

+ +

+
+
+template<class ObjectiveVectorTraits, class ObjectiveVectorType>
+ + + + + + + + + +
static bool moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >::minimizing (unsigned int  _i  )  [inline, static]
+
+
+ +

+Returns true if the _ith objective have to be minimized. +

+

Parameters:
+ + +
_i the index
+
+ +

+Definition at line 74 of file moeoObjectiveVector.h. +

+

+ +

+
+
+template<class ObjectiveVectorTraits, class ObjectiveVectorType>
+ + + + + + + + + +
static bool moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >::maximizing (unsigned int  _i  )  [inline, static]
+
+
+ +

+Returns true if the _ith objective have to be maximized. +

+

Parameters:
+ + +
_i the index
+
+ +

+Definition at line 84 of file moeoObjectiveVector.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator-members.html new file mode 100644 index 000000000..115c291d8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoObjectiveVectorComparator< ObjectiveVector > Member List

This is the complete list of members for moeoObjectiveVectorComparator< ObjectiveVector >, including all inherited members.

+ + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.html new file mode 100644 index 000000000..31f8e164d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.html @@ -0,0 +1,64 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorComparator< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoObjectiveVectorComparator< ObjectiveVector > Class Template Reference

Abstract class allowing to compare 2 objective vectors. +More... +

+#include <moeoObjectiveVectorComparator.h> +

+

Inheritance diagram for moeoObjectiveVectorComparator< ObjectiveVector >: +

+ +eoBF< A1, A2, R > +eoFunctorBase +moeoGDominanceObjectiveVectorComparator< ObjectiveVector > +moeoObjectiveObjectiveVectorComparator< ObjectiveVector > +moeoParetoObjectiveVectorComparator< ObjectiveVector > + +List of all members. + +
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoObjectiveVectorComparator< ObjectiveVector >

+ +Abstract class allowing to compare 2 objective vectors. +

+The template argument ObjectiveVector have to be a moeoObjectiveVector. +

+ +

+Definition at line 24 of file moeoObjectiveVectorComparator.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..07d6ef1ec2f50d068012f1182d4c9b0ee01cfee4 GIT binary patch literal 2533 zcmcgudpK148XiUMTtU2$!(LUoy=71 zaX)Hui9xkZ8FCwDG?}zR?&LN@qvou3dq3x#{r5ThkG0mj-sgMX=UdO>1%qw4vfl|yh`c+UPstM6Z%q8nBi3MgUk5x(C8DqVxXi7V&wErQ zm+|widmStDu#?3R#F)&pUYpPeoz*XMbl=SOWvkWmu@4|XXC#|iYj`Gt`Xya>ryNyn z?k)javAl26!=?*=dT1?pN5_c8|J3gzhnzS{LYk)T=GCg=fV8-z_a|;FRK1asn7w*S z-SMD3;trUCMxOOn8397CYlV@MxI5w}0&qb74M?=mzl3V0!_B2It0L%(?GMPzZmTbF z8(RWqq=jwTjuvJ(0{KcJR7hkfGdyM_Vn+v=88%l;VdC$7PGm%?1m9H^jVKgETU94S z=jK*0Xi5!jR`9(hM&G*DM5Ztu0W}|z@qI-V9D(uulN7!H_?Otqtt$cY=2!b2yVfL| z#EQBVlTDy9?iVy^!>{Vr8r?XEH~+KXZvxR~V>0xV-I(S!tK~p_^}qCulSt=#Bu&-l zUM!4w*zaV`whsCJO8l`8zc3r8!jM+rX5Z%eCbgbY?81*azQm8ewHGMcgo8*DGY+N+ zJgG!ffUcvg)to->jL-MAUB?@op~?CHBNXOD&Uzq6R2l$`+oeGJvImjoJ=6FWlkxch zk3Apj`{={Q(2|X(@h_%sj=BzoKN+rXD;084T>XN2kQ!_p0Ni$3LU+~$J#C|arn=56 z)V#}4w^l$8?iESG>wv&SNVLGVw;f3F^S%b*)f$KYT*x0D(_B==qSmu%!&lT;u;WTt zrL9HF5zb~?i@sS=QcpMB=mzZ+0rAxv|0wvIz{&sQJGt)PZu-`I zLolk18XU=DTcVFTz^ojQYv{#vpU0P$^TX)#D z_qCzz(H$dt{MhI`R(eBDPKCm_uo`!0|Zm1l(-b8?(=F!QGLVePo9^7OYB17OMq{Y@h`I`=X`SDURr*FjI#-9jQ{Qy{r_z}jou4GURmu2+nuMr{!owD?Yll)Zj5_ zu-Lh!NR;{!0r}h9q1-81B$fM`512hs^`mIts=OpW9YtooL4y47bbaeAhU0waGXLVZ z-c317qZk89R_Fywb9&1Ix{V6z#V%S z`Dy~txx1~w?&cwutIK04>uSUv$Mo440i%2&oxb3@U1cfL^>91&zW#RQkuYJaeQ>rI zh@Ey!9p&CQqN~eEDrR6xn|j)|75=zL*0+694S&G7)mD#9av*tLFRO9;g?n#Z6NV7C z(xX*x7!$nbDPL@DCPc85g%-VlY1OzM^)oGf}$)m0BFZD-t`LXuOr76EqlXh{zRFdFqO2XYCZ}Hxy!G}h-C?}$ygN%t(3K%k*a|z*{p(aH97cA>-6r?AUq%>eK?hBt{V2f)~Awpd?XItOXtqRZ?V0j_PMLkyZR{1mMHzSfTKLtz)sbXL0(gDWzeWK;pw59d1GS4`$$LYFm3mQS8OoL^Czc`~`bFn-l&(|w%s7v5HrAi&nz8I~BwAN55 z)Uv+Vi=-Yzi`HuYYhKp + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoObjectiveVectorDouble< ObjectiveVectorTraits > Member List

This is the complete list of members for moeoObjectiveVectorDouble< ObjectiveVectorTraits >, including all inherited members.

+ + + + + + + + + + + + + + + + + +
dominates(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
maximizing(unsigned int _i)moeoObjectiveVector< ObjectiveVectorTraits, double > [inline, static]
minimizing(unsigned int _i)moeoObjectiveVector< ObjectiveVectorTraits, double > [inline, static]
moeoObjectiveVector(Type _value=Type())moeoObjectiveVector< ObjectiveVectorTraits, double > [inline]
moeoObjectiveVector(std::vector< Type > &_v)moeoObjectiveVector< ObjectiveVectorTraits, double > [inline]
moeoObjectiveVectorDouble(double _value=0.0)moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
moeoObjectiveVectorDouble(std::vector< double > &_v)moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
nObjectives()moeoObjectiveVector< ObjectiveVectorTraits, double > [inline, static]
operator!=(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
operator<(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
operator<=(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
operator==(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
operator>(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
operator>=(const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const moeoObjectiveVectorDouble< ObjectiveVectorTraits > [inline]
setup(unsigned int _nObjectives, std::vector< bool > &_bObjectives)moeoObjectiveVector< ObjectiveVectorTraits, double > [inline, static]
Traits typedefmoeoObjectiveVector< ObjectiveVectorTraits, double >
Type typedefmoeoObjectiveVector< ObjectiveVectorTraits, double >


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.html new file mode 100644 index 000000000..206d867fc --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.html @@ -0,0 +1,351 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorDouble< ObjectiveVectorTraits > Class Template Reference + + + + +
+
+ +

moeoObjectiveVectorDouble< ObjectiveVectorTraits > Class Template Reference

This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e. +More... +

+#include <moeoObjectiveVectorDouble.h> +

+

Inheritance diagram for moeoObjectiveVectorDouble< ObjectiveVectorTraits >: +

+ +moeoObjectiveVector< ObjectiveVectorTraits, double > + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

moeoObjectiveVectorDouble (double _value=0.0)
 Ctor.
 moeoObjectiveVectorDouble (std::vector< double > &_v)
 Ctor from a vector of doubles.
bool dominates (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector dominates _other according to the Pareto dominance relation (but it's better to use a moeoObjectiveVectorComparator object to compare solutions).
bool operator== (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector is equal to _other (according to a tolerance value).
bool operator!= (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector is different than _other (according to a tolerance value).
bool operator< (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector is smaller than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing).
bool operator> (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector is greater than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing).
bool operator<= (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector is smaller than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing).
bool operator>= (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &_other) const
 Returns true if the current objective vector is greater than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing).
+

Detailed Description

+

template<class ObjectiveVectorTraits>
+ class moeoObjectiveVectorDouble< ObjectiveVectorTraits >

+ +This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e. +

+that an objective value is represented using a double, and this for any objective. +

+ +

+Definition at line 27 of file moeoObjectiveVectorDouble.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
moeoObjectiveVectorDouble< ObjectiveVectorTraits >::moeoObjectiveVectorDouble (std::vector< double > &  _v  )  [inline]
+
+
+ +

+Ctor from a vector of doubles. +

+

Parameters:
+ + +
_v the std::vector < double >
+
+ +

+Definition at line 45 of file moeoObjectiveVectorDouble.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::dominates (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector dominates _other according to the Pareto dominance relation (but it's better to use a moeoObjectiveVectorComparator object to compare solutions). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 54 of file moeoObjectiveVectorDouble.h. +

+

+ +

+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator== (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector is equal to _other (according to a tolerance value). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 65 of file moeoObjectiveVectorDouble.h. +

+Referenced by moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator!=(), and moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>=(). +

+

+ +

+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator!= (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector is different than _other (according to a tolerance value). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 82 of file moeoObjectiveVectorDouble.h. +

+References moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator==(). +

+

+ +

+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator< (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector is smaller than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 93 of file moeoObjectiveVectorDouble.h. +

+Referenced by moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator<=(). +

+

+ +

+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator> (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector is greater than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 105 of file moeoObjectiveVectorDouble.h. +

+Referenced by moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>=(). +

+

+ +

+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator<= (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector is smaller than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 116 of file moeoObjectiveVectorDouble.h. +

+References moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator<(). +

+

+ +

+
+
+template<class ObjectiveVectorTraits>
+ + + + + + + + + +
bool moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>= (const moeoObjectiveVectorDouble< ObjectiveVectorTraits > &  _other  )  const [inline]
+
+
+ +

+Returns true if the current objective vector is greater than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +

+

Parameters:
+ + +
_other the other moeoObjectiveVectorDouble object to compare with
+
+ +

+Definition at line 127 of file moeoObjectiveVectorDouble.h. +

+References moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator==(), and moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>(). +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.png b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorDouble.png new file mode 100644 index 0000000000000000000000000000000000000000..93aed2a9238bfa6db97b19203fc1c34bc7c1603c GIT binary patch literal 902 zcmeAS@N?(olHy`uVBq!ia0y~yVDtd816Y`WWao*GPC!Z`z$e7@|Ns9$=Kuc(=Fd-< z0AzvjfddDs5B+}vEalY(fD?{un4ts(y@AP%qq{ukbzlXT{$d1@)JWbC$-QU@7$cDf9Yy z-VyPLkMENi7W5?THmNFo#_Ta`-FL6QFBm>W`P}+w-RM(toAZFmnMKJyY6xbRI7)~jU_-4j8t(6^~Osel*E|_$>PWAS$ zC8?YDPgCJlaNoZF)xMo#m!0#ztJG{%zy5AodffGuny13rgH%3F@yk8m?`@d6GkHmx zcH{yBnUe1lAAMZ9((rNc$JqIdl|o-cpPc;b+iiKZwmzX|mfVTRU7Sn4-Vg1)Q}fXN zgk@|7?}7{c(@h(lwl~!5y&&~4W_!aP*T*&!F1K7`kXmTk;09D67{#1H4X%Z~>KzBY zGyC7){KWr6#dgBx5{8-5U3x!$S*}sOu2fT;XSt`?`H*&{&DM{4SL~K7=lR=up?}+i z#MT=Qai@*rYTJ2Ax_2tb{WxMSudu)KVDs~vCk~tXZwl5pe?0Ku??>03?V8YjF!RmH zAAFqi3@n@He3HJfL+aLweNG!K>n?43@F4X~&58-HY@YBPRfu`~>G~bplnl+gc}0a2 zzsfY-R9rLl%CnWx4haz(*k@KJw4^jUT$puoQ^n6kRxK<7$GR(@d^k|fB>Oa4_3pMw z>%8@DZ{K#jQ1z~#>iN$n0`DG9RJ|Q_B28LNZ}#2mzd5v1A}#mdoqYY%mkI9Gn_lNt z?pqr>Q`&o5sb)t-)l08Rze$=oyMIT`+jVE&tlZ_h`Je3HQRaI8%x8IrbHC#Lr_Hne nf8d7>D1d}LUhiKm^_Nji(bHVe=AjBO(=d3t`njxgN@xNAI4q>V literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits-members.html new file mode 100644 index 000000000..1d292dea8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoObjectiveVectorTraits Member List

This is the complete list of members for moeoObjectiveVectorTraits, including all inherited members.

+ + + + + + + +
bObjmoeoObjectiveVectorTraits [private, static]
maximizing(unsigned int _i)moeoObjectiveVectorTraits [inline, static]
minimizing(unsigned int _i)moeoObjectiveVectorTraits [inline, static]
nObjmoeoObjectiveVectorTraits [private, static]
nObjectives()moeoObjectiveVectorTraits [inline, static]
setup(unsigned int _nObjectives, std::vector< bool > &_bObjectives)moeoObjectiveVectorTraits [inline, static]
tolerance()moeoObjectiveVectorTraits [inline, static]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits.html b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits.html new file mode 100644 index 000000000..539c4ae74 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoObjectiveVectorTraits.html @@ -0,0 +1,183 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorTraits Class Reference + + + + +
+
+ +

moeoObjectiveVectorTraits Class Reference

A traits class for moeoObjectiveVector to specify the number of objectives and which ones have to be minimized or maximized. +More... +

+#include <moeoObjectiveVectorTraits.h> +

+List of all members. + + + + + + + + + + + + + + + + + + + + + + + + +

Static Public Member Functions

static void setup (unsigned int _nObjectives, std::vector< bool > &_bObjectives)
 Parameters setting.
+static unsigned int nObjectives ()
 Returns the number of objectives.
static bool minimizing (unsigned int _i)
 Returns true if the _ith objective have to be minimized.
static bool maximizing (unsigned int _i)
 Returns true if the _ith objective have to be maximized.
+static double tolerance ()
 Returns the tolerance value (to compare solutions).

Static Private Attributes

+static unsigned int nObj
 The number of objectives.
+static std::vector< bool > bObj
 The min/max vector.
+


Detailed Description

+A traits class for moeoObjectiveVector to specify the number of objectives and which ones have to be minimized or maximized. +

+ +

+Definition at line 23 of file moeoObjectiveVectorTraits.h.


Member Function Documentation

+ +
+
+ + + + + + + + + + + + + + + + + + +
static void moeoObjectiveVectorTraits::setup (unsigned int  _nObjectives,
std::vector< bool > &  _bObjectives 
) [inline, static]
+
+
+ +

+Parameters setting. +

+

Parameters:
+ + + +
_nObjectives the number of objectives
_bObjectives the min/max vector (true = min / false = max)
+
+ +

+Definition at line 32 of file moeoObjectiveVectorTraits.h. +

+References bObj, and nObj. +

+

+ +

+
+ + + + + + + + + +
static bool moeoObjectiveVectorTraits::minimizing (unsigned int  _i  )  [inline, static]
+
+
+ +

+Returns true if the _ith objective have to be minimized. +

+

Parameters:
+ + +
_i the index
+
+ +

+Definition at line 67 of file moeoObjectiveVectorTraits.h. +

+References bObj. +

+Referenced by maximizing(). +

+

+ +

+
+ + + + + + + + + +
static bool moeoObjectiveVectorTraits::maximizing (unsigned int  _i  )  [inline, static]
+
+
+ +

+Returns true if the _ith objective have to be maximized. +

+

Parameters:
+ + +
_i the index
+
+ +

+Definition at line 80 of file moeoObjectiveVectorTraits.h. +

+References minimizing(). +

+

+


The documentation for this class was generated from the following files: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator-members.html new file mode 100644 index 000000000..34d641d0e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoOneObjectiveComparator< MOEOT > Member List

This is the complete list of members for moeoOneObjectiveComparator< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoBF< A1, A2, R > [static]
moeoOneObjectiveComparator(unsigned int _obj)moeoOneObjectiveComparator< MOEOT > [inline]
objmoeoOneObjectiveComparator< MOEOT > [private]
operator()(const MOEOT &_moeo1, const MOEOT &_moeo2)moeoOneObjectiveComparator< MOEOT > [inline]
moeoComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.html new file mode 100644 index 000000000..7b15cd99b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.html @@ -0,0 +1,150 @@ + + +ParadisEO-MOEO: moeoOneObjectiveComparator< MOEOT > Class Template Reference + + + + +
+
+ +

moeoOneObjectiveComparator< MOEOT > Class Template Reference

Functor allowing to compare two solutions according to one objective. +More... +

+#include <moeoOneObjectiveComparator.h> +

+

Inheritance diagram for moeoOneObjectiveComparator< MOEOT >: +

+ +moeoComparator< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + +

Public Member Functions

 moeoOneObjectiveComparator (unsigned int _obj)
 Ctor.
const bool operator() (const MOEOT &_moeo1, const MOEOT &_moeo2)
 Returns true if _moeo1 < _moeo2 on the obj objective.

Private Attributes

+unsigned int obj
 the index of objective
+

Detailed Description

+

template<class MOEOT>
+ class moeoOneObjectiveComparator< MOEOT >

+ +Functor allowing to compare two solutions according to one objective. +

+ +

+Definition at line 22 of file moeoOneObjectiveComparator.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoOneObjectiveComparator< MOEOT >::moeoOneObjectiveComparator (unsigned int  _obj  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_obj the index of objective
+
+ +

+Definition at line 30 of file moeoOneObjectiveComparator.h. +

+References moeoOneObjectiveComparator< MOEOT >::obj. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
const bool moeoOneObjectiveComparator< MOEOT >::operator() (const MOEOT &  _moeo1,
const MOEOT &  _moeo2 
) [inline]
+
+
+ +

+Returns true if _moeo1 < _moeo2 on the obj objective. +

+

Parameters:
+ + + +
_moeo1 the first solution
_moeo2 the second solution
+
+ +

+Definition at line 44 of file moeoOneObjectiveComparator.h. +

+References moeoOneObjectiveComparator< MOEOT >::obj. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoOneObjectiveComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..b07c06bb3c3362c6f423c211e15b6f9be80270fc GIT binary patch literal 1066 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K54zMr-Ny)Vxn%%7hy z0muU50|yRNANv0U$Ym@E@(X5gcy=R=fr0ser;B4q#hkaZy(isK;AuOnmVJa*!Q4a7 zWc9xPf=Mk555s?3F3GN2b!?jBHaqTz?>0sqzJD(Fhw!d#_kmV(GAISP@B6arJyQnn z&r7eLuQF%;@$ua8-z7QcD&HsZ@4WFgh9!aZS|yu8l3iw=hnoN$zOaVzd9s(;f!0}vyDhmSEA>(z->&KTu4O*)Qkm=9Jce^^I*cr=0`r(P zUM}Q0VCSc~YSl!3mW2B@GRz7mPcF?q&v3-rlC4be4U57hxe40E7Q0qmtV&it7{}j| z#^qu4I_Gsw;=8?mw;eCNS3>R+L{L$_@ z|4Rqx&UuV4{%zg!+g@!x-v!&;>#_@~Z>_U-_^!Z$;s+q-3Ge#-i-0j-#b}rm5RPkZVc5j=_%4R4`G;- zIO)pC+g2w+873v^g~lISTDLL!s)U%~Jbg>IF%gFA zY+?Ls1oyB8n6^nB_`Id!6hl$%^V*1+O`=V*ava_aJCEeQY7A|-EH^>ZL(`eDfSW;x zdFu}&mc3l(jy6QG{*h78%=of$(}e9i?*yFV%KIf_v75{6*2-T=40kvSvVqY!!FAyM}yle)A*-EnSf3)>xrfN5*{Z9=R`mU@xom8?De>A|neG7UN}8r+|2*v$~a$Y#wx zo*YceSJ2>x~+uJXnza%q+&8xi6{viSwXg=T9KmE_J XIn-!js(9c-P*8cg`njxgN@xNAc|Elx literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment-members.html new file mode 100644 index 000000000..103cfc34e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment-members.html @@ -0,0 +1,43 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoParetoBasedFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoParetoBasedFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &)=0eoUF< eoPop< MOEOT > &, void > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0moeoFitnessAssignment< MOEOT > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.html new file mode 100644 index 000000000..1b5516636 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.html @@ -0,0 +1,61 @@ + + +ParadisEO-MOEO: moeoParetoBasedFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoParetoBasedFitnessAssignment< MOEOT > Class Template Reference

moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies. +More... +

+#include <moeoParetoBasedFitnessAssignment.h> +

+

Inheritance diagram for moeoParetoBasedFitnessAssignment< MOEOT >: +

+ +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase +moeoFastNonDominatedSortingFitnessAssignment< MOEOT > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoParetoBasedFitnessAssignment< MOEOT >

+ +moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies. +

+ +

+Definition at line 22 of file moeoParetoBasedFitnessAssignment.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoParetoBasedFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..2291d4e38b5130e3bd8331af450d48a7441b2c97 GIT binary patch literal 1875 zcma)-dpr~BAIFDIKVeOBoepOrMXWWBY~&VGG|Z(7LuOr(q+jKMaYiJ+$L;NHsodUfr_loQr0O57y}doPV_P7d z%EV#No&ej)!4Lpo=gi3yc3w$k^W|9Ty<cuvK2OyWd(%|5DOIJZTR5S?vWD|<{^1=!3XEuVqZLb7$>^Tl3CfMY`zg6wPhw$ za~*1_Z~~>zK|~`d=bDBP*45p3_H6Ck_{RwGASSIW;DILf%GiK<4n*)#x#LBbGS0H0 zyzCPi9a-(c8r{kpqgIh6A7bXn;C#s}H*v3DUml;!;e4S)+u<;v6br<^q7ADX^F2Sm zWX($taEXBYcM|Ecr<*X*#+J*l+wK_W`$+dlMTn_X+uO9JSBeV!z4=a8d~6eQ;M&Sl{*7f8tIB^h%(rL@XkPO5usDoR z);3s5@dp2~quIK%SSQJO;U==q#NLslzM}` zoGMY0vT&*-uR3J72-g^0H0zN&;WU^9G&Yxd1uE|^QSFJe94Gu%I{Ie6qPW>*bH-zd4mh9jKxh&HF#TLmUrV3Ux~WAB9J`3SsbxZidcERNQ}A>o1u8Y1=#eBlN1udyXk# z2?V&57aAkSjDnjEXg}4FC(b8ZkXtYP9{Y@@^$qk+!3*xs@Lzcdhu+_xd{;dx`Db>V zKQGNc`o>e>$T|t0=<5RIe#V@pzF5dm2@Ru9KOS$}~5M8cL*?5w` z0K{Oz51394oSI@mcd#gpHEDrxZ7u2K1tqpP(E3=K4yLgIh@dM-lEZD!$r15a@MKuS3Svs0F z6%z8}qeoqNrY(_14nn-MP|JVS63JiO{M?@%u_bbH~1+1vs@7y8BvR;>@rlL+vd0nHr$6(D| z;-wEJ505zITAe+l9OqoKGuuv1M>StXc=iqRBe;33Ua#Q#9_E0WMqmzx;OdFG99zv+ z%0KWtbc{ON986f>68~W5;94 zjS}n#20kO1(N9D;VOtGovveWnr^Qd!bamY*Chj!$a11I zbEB>(Tb8u6%;c#~Z}^vwoaXX~ZZv3hV?UF>^?hU1V_WVUhOp`?Qzs*>fPj;Z=o7W} Hff;`SVj-pJ literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator-members.html new file mode 100644 index 000000000..3056832b3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator-members.html @@ -0,0 +1,41 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoParetoObjectiveVectorComparator< ObjectiveVector > Member List

This is the complete list of members for moeoParetoObjectiveVectorComparator< ObjectiveVector >, including all inherited members.

+ + + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)moeoParetoObjectiveVectorComparator< ObjectiveVector > [inline]
moeoObjectiveVectorComparator::operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.html b/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.html new file mode 100644 index 000000000..ac075b51f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.html @@ -0,0 +1,106 @@ + + +ParadisEO-MOEO: moeoParetoObjectiveVectorComparator< ObjectiveVector > Class Template Reference + + + + +
+
+ +

moeoParetoObjectiveVectorComparator< ObjectiveVector > Class Template Reference

This functor class allows to compare 2 objective vectors according to Pareto dominance. +More... +

+#include <moeoParetoObjectiveVectorComparator.h> +

+

Inheritance diagram for moeoParetoObjectiveVectorComparator< ObjectiveVector >: +

+ +moeoObjectiveVectorComparator< ObjectiveVector > +eoBF< A1, A2, R > +eoFunctorBase + +List of all members. + + + + + +

Public Member Functions

const bool operator() (const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)
 Returns true if _objectiveVector1 is dominated by _objectiveVector2.
+

Detailed Description

+

template<class ObjectiveVector>
+ class moeoParetoObjectiveVectorComparator< ObjectiveVector >

+ +This functor class allows to compare 2 objective vectors according to Pareto dominance. +

+ +

+Definition at line 22 of file moeoParetoObjectiveVectorComparator.h.


Member Function Documentation

+ +
+
+
+template<class ObjectiveVector>
+ + + + + + + + + + + + + + + + + + +
const bool moeoParetoObjectiveVectorComparator< ObjectiveVector >::operator() (const ObjectiveVector &  _objectiveVector1,
const ObjectiveVector &  _objectiveVector2 
) [inline]
+
+
+ +

+Returns true if _objectiveVector1 is dominated by _objectiveVector2. +

+

Parameters:
+ + + +
_objectiveVector1 the first objective vector
_objectiveVector2 the second objective vector
+
+ +

+Definition at line 31 of file moeoParetoObjectiveVectorComparator.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.png b/trunk/paradiseo-moeo/doc/html/classmoeoParetoObjectiveVectorComparator.png new file mode 100644 index 0000000000000000000000000000000000000000..790ba77fa113f904facd252df5c418adb32095fc GIT binary patch literal 1501 zcmcIkYgCd47{<(4nmKD`pk`)jY2Hd%)1{UgdhkMGm*Z_JrSlUtkx~-1yd0b36Elqx zl{PP%X%cgYTr{)wm6qDUhD=CT%qw03)6_`D*3bRg&e=K7`@YY6-haTwCwNd?(WX+(fpxZ zbx2_$IGE3bBmoA~%Lw#48lF`>SB)Xg?)%jLQT^k5i`yo`sZngHP-Ej(b{YGDg<08= zYmS!K+gEy27QJyU7{C8urA;jWAGysBYHYz#`L_8IPR99LD5u+(?z7GGJ`mS+v>$fC?CY&iUK3i-z`VbGAD!OmOhdVEm)2#O>|__S3sa*}t$yrHsA>ahB&ZeFpp;Lb}YWJOO}d{qjWU z1vyHrpUjvL0M+z!r)$>>Ij>#sj*^c&u>g(ACzr^Y2Jh4AeM24ITC|O&p!w(Ki|*-R zA;m7U!7SlCTS} zLe&%_icq)7Mh|=!!>LjoRS7(Kyl>F~B0I>dYgDLveVILdF~!M9!neMjYFW8wDC@9$ z^nuz+k96X;v5m9&EV~?Fwq-1nN30SOk~nFpOfs(Tu>x7lvB^Q1ulKYIU|Yika{hKzhJBxg7=-(3)-wHOAs zS9pGfz+AdZVL{S!AlH^Rw4Y_22|k@FKzfI+5kZBZ9>;#!*1wQaTD+fYago@@rD7uO z%HLL!g)9?33B~1vcJij1!VSO|QV+CL{nHT6X=#bSt;~6YP3LRQ0y%48*dUS8_T4NU znOA4^hBuHY*pep=J;r>Zjn-9Yc5LEA!hLD!|85cij*k|na;6@B47DR3KWDXPTXD~| zrn*LQSN)Ip;*BX2a^C~f*7636CTCG-VoHjK@kO_`D<0Ap0 zhOPmzWQ0f*It20I&eVt8-fG#@qSA0^`vQ{T#-chx_FHTn`%K+q`sk`XbOq8mSVel} zPFJ?3BXY3v$-uPXjsf{H*gK;buZUC`#@~=vV21B3idsIWE{&WKDae#F4zFL`;U-5o zkfvp6iu1UJ4U(uD%J-vUWXcl2KQ$G97Py>mlQLW~%!@J){X!SBrT~?e$6}s8C|@sS n7J4y~WK3i5xBLBdEgD@We6J{oa + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoRandomSelect< MOEOT > Member List

This is the complete list of members for moeoRandomSelect< MOEOT >, including all inherited members.

+ + + + + + + + + +
moeoSelectOne::functor_category()eoUF< A1, R > [static]
eoRandomSelect< MOEOT >::functor_category()eoUF< A1, R > [static]
moeoRandomSelect()moeoRandomSelect< MOEOT > [inline]
operator()(const eoPop< MOEOT > &_pop)moeoRandomSelect< MOEOT > [inline, virtual]
moeoSelectOne::operator()(A1)=0eoUF< A1, R > [pure virtual]
moeoSelectOne::setup(const eoPop< MOEOT > &_pop)eoSelectOne< MOEOT > [virtual]
eoRandomSelect< MOEOT >::setup(const eoPop< EOT > &_pop)eoSelectOne< EOT, WorthT > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.html b/trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.html new file mode 100644 index 000000000..b99d6be0f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.html @@ -0,0 +1,74 @@ + + +ParadisEO-MOEO: moeoRandomSelect< MOEOT > Class Template Reference + + + + +
+
+ +

moeoRandomSelect< MOEOT > Class Template Reference

Selection strategy that selects only one element randomly from a whole population. +More... +

+#include <moeoRandomSelect.h> +

+

Inheritance diagram for moeoRandomSelect< MOEOT >: +

+ +moeoSelectOne< MOEOT > +eoRandomSelect< MOEOT > +eoSelectOne< MOEOT > +eoSelectOne< EOT, WorthT > +eoUF< A1, R > +eoUF< A1, R > +eoFunctorBase +eoFunctorBase + +List of all members. + + + + + + + + +

Public Member Functions

moeoRandomSelect ()
 Ctor.
+const MOEOT & operator() (const eoPop< MOEOT > &_pop)
 Return one individual at random by using an eoRandomSelect.
+

Detailed Description

+

template<class MOEOT>
+ class moeoRandomSelect< MOEOT >

+ +Selection strategy that selects only one element randomly from a whole population. +

+ +

+Definition at line 23 of file moeoRandomSelect.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.png b/trunk/paradiseo-moeo/doc/html/classmoeoRandomSelect.png new file mode 100644 index 0000000000000000000000000000000000000000..3347ccc9aa2c29f5881300a0dab4f959d605438a GIT binary patch literal 1901 zcmb_ddpy&N8~)D7X-gdk-*M>S6JwqqELSqkH?GXl#3KCB+S+M zEMO~s8UO&QP=bS<+x7fc1>U(OMw;<+rzvnN-m{K@_?MOI?Xjs)BO`1tf5UxJIA*rk z<>BM=ak)3YXpfvZHw)eQE)kF_+?)x)#{19;j zq7^lwRIFET($=VJ`#b%$wF4*ei1CYo6X!jxzvmyD^Qt8w_O-v5iBkU!J(fZ(QVN4x zl#FZbsVkKaxv&vPeKK{B>ss1!w~h-O zJw?oz9*6k`T^iXY)q5b47&5lUO{(#Bzm*xYoW9)6%l5npxn;k8E2KxLBm#ViGeo3u zSm1q$m?0TeY>S<9zqsM_w+l`7>s}OdX1-p%mhF3b=pHHUU3LqOYzQ*EfrO&-CAIjO zUu)W0wG4Tg5uC53NZYs3;Y0-bO$tT2%C2Hii{d}IE=fQ=>~;J>xb#Nrin5-P>fwDG ze1~5Z3o|9HUISR_m7LBHV}DnH7=w-)xuAl z_B}2~(lcgCF$R-HFLJ#0zxSw3jI}JdQm$4Nlq&7=xHDCDNQbbuA@G+ox@HZUVD9Lv zjCr~{>eP6TAAx%NJvNt1uFhnw?bhzbr+u8xsF(YkTlg-yVvy=Ti^+}<6yESvPnVS@ zrRPb#u^+@$p*SL8HgBXUsE#1%M-64PHQp+>3Ov?u@d@N_0*MUX)Tq?-B`!gHApL2w?S&MlIrZ&D}89cJE z3?1=W?3@Qxqlz$5!Pv4)hu;x&TCg?EJD>87@4YT9NQls}NQYWOyuW1Isa;m}PipQv%2F4K+h^B?NjhMS+y*G|i`I9B|3lsD@ zujP5it!Muu4U4;*of`Wpj(e6Iz*yFjAk;OBL++->L>sL6U`?aVc3WrLPj}#-Tq}P} ziCgC`5F-oPgtr;?e*oJ=dve$t54b0gFOQ>Euq`d!s&;<>Fy)>1Z2yl$dFmmowb%3I z#=jkC?w)tx$nqD!LJfiNYB4#|IgB-&NM*7*eEmh9jQ&+{a{V z(w(2{?npVa1B!U-m+h$F7SYTI_a@iHpDcu4~K z`*8G!Se^atc^0N{xwYHX#%#>MdxMjs=u*)2nhhZwbRCvSQy|}fk0sYli??)aMi9x7 z4w>NN{Z*G|5NFUg*%-?;Vch`hNwFzLI8430nMkiAm&DuUT2+&1F$c%lNA9KB-)xuV nSip1y_`L$W#=p2%c3?gl&G)rSQxSV8ej`9|batr4`^NkUz2ius literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRealVector-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoRealVector-members.html new file mode 100644 index 000000000..cc21fffc2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoRealVector-members.html @@ -0,0 +1,86 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Member List

This is the complete list of members for moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtomType typedefmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >
className() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
ContainerType typedefmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >
Diversity typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
diversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
diversity(const Diversity &_diversityValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO()EO< MOEOObjectiveVector >
EO()EO< MOEOObjectiveVector >
Fitness typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
fitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
fitness(const Fitness &_fitnessValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::fitness(const Fitness &_fitness)EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::fitness(performance_type perf)EO< MOEOObjectiveVector >
fitness_traits typedefEO< MOEOObjectiveVector >
invalid() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate_worth(void)EO< MOEOObjectiveVector >
invalidateDiversity()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateFitness()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateObjectiveVector()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidDiversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidFitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidObjectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
moeoRealVector(unsigned int _size=0, double _value=0.0)moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
moeoVector(unsigned int _size=0, double_value=double())moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > [inline]
ObjectiveVector typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
objectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
objectiveVector(const ObjectiveVector &_objectiveVectorValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
operator<(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > &_moeo) const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > [inline]
MOEO::operator<(const MOEO &_other) const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::operator<(const EO &_eo2) const EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::operator<(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
operator>(const EO &_eo2) const EO< MOEOObjectiveVector >
operator>(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
performance(performance_type perf)EO< MOEOObjectiveVector >
performance(void) const EO< MOEOObjectiveVector >
performance_type typedefEO< MOEOObjectiveVector >
printOn(std::ostream &_os) const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > [inline, virtual]
readFrom(std::istream &_is)moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > [inline, virtual]
storage_type typedefEO< MOEOObjectiveVector >
value(const std::vector< double > &_v)moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > [inline]
worth(worth_type worth)EO< MOEOObjectiveVector >
worth(void) const EO< MOEOObjectiveVector >
worth_type typedefEO< MOEOObjectiveVector >
~EO()EO< MOEOObjectiveVector > [virtual]
~eoObject()eoObject [virtual]
~eoPersistent()eoPersistent [virtual]
~eoPrintable()eoPrintable [virtual]
~MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRealVector.html b/trunk/paradiseo-moeo/doc/html/classmoeoRealVector.html new file mode 100644 index 000000000..b9007ec78 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoRealVector.html @@ -0,0 +1,109 @@ + + +ParadisEO-MOEO: moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Class Template Reference + + + + +
+
+ +

moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity > Class Template Reference

This class is an implementation of a simple double-valued moeoVector. +More... +

+#include <moeoRealVector.h> +

+

Inheritance diagram for moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >: +

+ +moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > +MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > +EO< MOEOObjectiveVector > +eoObject +eoPersistent +eoPrintable + +List of all members. + + + + + +

Public Member Functions

 moeoRealVector (unsigned int _size=0, double _value=0.0)
 Ctor.
+

Detailed Description

+

template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ class moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >

+ +This class is an implementation of a simple double-valued moeoVector. +

+ +

+Definition at line 22 of file moeoRealVector.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity>
+ + + + + + + + + + + + + + + + + + +
moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::moeoRealVector (unsigned int  _size = 0,
double  _value = 0.0 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + +
_size Length of vector (default is 0)
_value Initial value of all elements (default is default value of type GeneType)
+
+ +

+Definition at line 31 of file moeoRealVector.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRealVector.png b/trunk/paradiseo-moeo/doc/html/classmoeoRealVector.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe873b85a551b2cf519603550bb7badfe92fe22 GIT binary patch literal 2896 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 Ma6esl^80K50?O~GPXGV_ literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoReplacement-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoReplacement-members.html new file mode 100644 index 000000000..beb8361f7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoReplacement-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoReplacement< MOEOT > Member List

This is the complete list of members for moeoReplacement< MOEOT >, including all inherited members.

+ + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoReplacement.html b/trunk/paradiseo-moeo/doc/html/classmoeoReplacement.html new file mode 100644 index 000000000..2440855bb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoReplacement.html @@ -0,0 +1,63 @@ + + +ParadisEO-MOEO: moeoReplacement< MOEOT > Class Template Reference + + + + +
+
+ +

moeoReplacement< MOEOT > Class Template Reference

Replacement strategy for multi-objective optimization. +More... +

+#include <moeoReplacement.h> +

+

Inheritance diagram for moeoReplacement< MOEOT >: +

+ +eoReplacement< MOEOT > +eoBF< A1, A2, R > +eoFunctorBase +moeoElitistReplacement< MOEOT > +moeoEnvironmentalReplacement< MOEOT > +moeoGenerationalReplacement< MOEOT > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoReplacement< MOEOT >

+ +Replacement strategy for multi-objective optimization. +

+ +

+Definition at line 22 of file moeoReplacement.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoReplacement.png b/trunk/paradiseo-moeo/doc/html/classmoeoReplacement.png new file mode 100644 index 0000000000000000000000000000000000000000..81188d8ce588a996d142f66693eea26c55fb5800 GIT binary patch literal 2429 zcmd6pc~DbX7RH0N0)i-z4oZu-z-ZtFlm-dVED9oYAV5SW5D*DQ1wyCUT7e*rWeXBX zXq9IJZXlp^qT~T4EV2j*TTom811O3ipaRhlku_wVGBZxsOifMI^dD38-FMHcU!8aB ze&^m(?~E^g&&m~sD-a08N>2|r0s^rVfaB?}mcq~Zkh`Hn)XUYvS9*Wf zIUlm-M&L?OiH#XpGi?GU%slDJ<>i@yos~$OVRD;z3(Sj=ak%sWb;JA%JP;&jX|3=pmsM=9MQ>Wm5Ko8;wlvstgdmO?c`ik=2%P&o5td`@_Y0rZUa zIMU-9(di|bww4)=p1OQY-cw5C(djhLXq!4gL9)n*Zm)-f{8Oo(2_^wD4B8}9Aal7o z5mG=5{#P|FgcWMnEU(w&E<3eMyrl7^bEP!YBlPBmWI|Jf$McYmae0SZGKEY?%8RYA^akP5qv+eAmN7#h`dW@O;1s15tA0SDl83>+1-fq14s`(f?)}| zTDM~A7{G|L?ABY1u|ilY4FRh8^apo-A!;ykZrmV}Sw*#+U&K$J$v*iOE|Cr-;o%iy#lyg=kj_}KC(I93EInZZk3KG|`S5~xx z|C+3W6~<;?Cl0r<6pzRsKUm!2m0oox*9gHLrDAoX1x z_wbqmwblvC9Q2aC?kBKwiT!fpPF7+t)kygt#>-VY2jxkL#c2=ds~v)m+58ZZ269t$scT z69gz;^aWW`n<~PzqXU1^m=u{g^?ysVJQxQkvC8?X628}#{Z}~D#Jp}R@K!sWL(J&w zG?w*jOU4CN77A-kd7_bB6;58Id}SloDb7ytY9-W0VM?W1hVL+1*%1j@7IakC;qJ{)USECs$|vK6&d(WA@Rb+> z+{xnu1b1@NDBPf>i?K%1%9AoF0qC^o z7PHOJv#dT3&LyRLCd*m+u4~FwHv6OUPPgMGTjU<-nPma7XZ}S?tR=I~^|kwdIzV&A l^)pupD|v3snXM|s#J)~johe}^{I7)Y+>Lj;z3afqzXDBKY5)KL literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect-members.html new file mode 100644 index 000000000..3755c6aca --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect-members.html @@ -0,0 +1,44 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoRouletteSelect< MOEOT > Member List

This is the complete list of members for moeoRouletteSelect< MOEOT >, including all inherited members.

+ + + + + + + + +
functor_category()eoUF< A1, R > [static]
moeoRouletteSelect(unsigned int _tSize=2)moeoRouletteSelect< MOEOT > [inline]
operator()(const eoPop< MOEOT > &_pop)moeoRouletteSelect< MOEOT > [inline]
moeoSelectOne::operator()(A1)=0eoUF< A1, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)eoSelectOne< MOEOT > [virtual]
tSizemoeoRouletteSelect< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.html b/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.html new file mode 100644 index 000000000..4b961b441 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.html @@ -0,0 +1,144 @@ + + +ParadisEO-MOEO: moeoRouletteSelect< MOEOT > Class Template Reference + + + + +
+
+ +

moeoRouletteSelect< MOEOT > Class Template Reference

Selection strategy that selects ONE individual by using roulette wheel process. +More... +

+#include <moeoRouletteSelect.h> +

+

Inheritance diagram for moeoRouletteSelect< MOEOT >: +

+ +moeoSelectOne< MOEOT > +eoSelectOne< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + +

Public Member Functions

 moeoRouletteSelect (unsigned int _tSize=2)
 Ctor.
const MOEOT & operator() (const eoPop< MOEOT > &_pop)
 Apply the tournament to the given population.

Protected Attributes

+double & tSize
 size
+

Detailed Description

+

template<class MOEOT>
+ class moeoRouletteSelect< MOEOT >

+ +Selection strategy that selects ONE individual by using roulette wheel process. +

+

Warning:
This selection only uses fitness values (and not diversity values).
+ +

+ +

+Definition at line 24 of file moeoRouletteSelect.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoRouletteSelect< MOEOT >::moeoRouletteSelect (unsigned int  _tSize = 2  )  [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + +
_tSize the number of individuals in the tournament (default: 2)
+
+ +

+Definition at line 32 of file moeoRouletteSelect.h. +

+References moeoRouletteSelect< MOEOT >::tSize. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
const MOEOT& moeoRouletteSelect< MOEOT >::operator() (const eoPop< MOEOT > &  _pop  )  [inline]
+
+
+ +

+Apply the tournament to the given population. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 48 of file moeoRouletteSelect.h. +

+References moeoRouletteSelect< MOEOT >::tSize. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.png b/trunk/paradiseo-moeo/doc/html/classmoeoRouletteSelect.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9a8b943bc75869d3649623917816a6ad330361 GIT binary patch literal 1009 zcmVByWzbg>0oY<4aJr~~zR3=pjbGa2BJTOtz31Fqtk zFINCSUSt*nT#7+x^^XIB4e3D(;3bN_V3P#*dEn0h6d!jQ?8`C0bnAA2r(z(o2p!o8 zEy!6!F+jklvS>t6fC82POy9QLTfXid@n(Qu->U<@zrPj-te-^+P=Epypa2CZKmi{M znEnE?{yUlio(Eu*ql8N8d{H_tXs1^JqKZ|4x}cq&i-IJSb^v}1ponxC0BqFl0C=`e zR{;RYegjA`I3t__0Hg;Xj1~|0=7ezWfp3-wQX}qT@UREH7<2#+#~@`g1>pSi zX?j{N{dwXEz@@)VJOj8|6!2dFrf*xOZ@k_Opt|Yn0qbXx0u-PC1t>rP3Q)ku0;a!! ztpARtfQJB(zaY~cUJM!{X z0G%4G9<+oVfR)lTEL|D^KpO85{f#AR2zw72r8G^f@gR@C4LJ2cDy1?8$SSXlK|MC> zz09K17zm|QW)V7SNex_*dHFrKlBVN}0u-1F@`0f0MGjV{3m + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoScalarFitnessAssignment< MOEOT > Member List

This is the complete list of members for moeoScalarFitnessAssignment< MOEOT >, including all inherited members.

+ + + + + + + +
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
ObjectiveVector typedefmoeoFitnessAssignment< MOEOT >
operator()(eoPop< MOEOT > &)=0eoUF< eoPop< MOEOT > &, void > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)=0moeoFitnessAssignment< MOEOT > [pure virtual]
updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoFitnessAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.html new file mode 100644 index 000000000..afd302633 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.html @@ -0,0 +1,61 @@ + + +ParadisEO-MOEO: moeoScalarFitnessAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoScalarFitnessAssignment< MOEOT > Class Template Reference

moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies. +More... +

+#include <moeoScalarFitnessAssignment.h> +

+

Inheritance diagram for moeoScalarFitnessAssignment< MOEOT >: +

+ +moeoFitnessAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase +moeoAchievementFitnessAssignment< MOEOT > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoScalarFitnessAssignment< MOEOT >

+ +moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies. +

+ +

+Definition at line 22 of file moeoScalarFitnessAssignment.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoScalarFitnessAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..93cce37122d5827d3b3835d06318d647803e9b3f GIT binary patch literal 1934 zcmbtVc~Fzr9t}!eO0l*qWm9YcSzg&CNHicIi3GwXA_h<~tO)^R)v(09r6xp+8q1b( zK1qNAVF@6M22x4NZbWtor4R@bWD1EaN%)#BGo5+=y}p@q?>%?!{N^`v&OP_$1^6K~ zKQ{On0)c3HpE?-?fvA0{;v4EaRdZlEI!m?a1^5Pgfgq@&AlN~tU%aPce~ylhjw~)X zr`oEe1^JzZoR}Yrfk1YfdY^O;zEZqg5}2}NvEQqVzNssLR3DPXct$v#NdkTJJe~Jk zHuK5Qz7SNVW&Ws69ci816YqJ4bZi#C;ke#KNb6G}lU$rS3&dw9?m^eHjk z#^Gsu;gIIp6>U3B(Db*A1ohpX9@AxroB?g-!cqkEHNY}__%)UgtivnDy2zrmQ-;)@ zHU#>G@Lq~~5oTI=L}&ADOLx48iY!9R7Z1~JC0dPprx_cT)y(|Jwdzk2-3{z%v$eMx zbVd*hCsD@`W&kTMm1EPF67t^jab^wX)ya1FYHl>Unr#TQyui622!+!3Q{!tRav&s2ybOnnJ>+CtB=$P-Y$BXlc~xG7b~%1w(DmGA*^y8ZnDDtp4LcC zb}Hcba`$DV)=i~6IDd)B)a5b+!iSTNg~}d_^V<{tS|dUmcc*jhu%3QAFqZR9@A+ew zfpjJYMV74X&X|z`dplW_RpyTHnxB*S;x5TnN>eKKfg`9}VaK{b3%hWMog|GRk0{F% zkG9R_s-H#6@8`^fW-*POu-5y^qks5>;s+mDwc2S3&<&5!w`Ahybsro?qnlXv#3bcy zg3WgV=d*VzHmf=DZry}5Un)Y9>1mz$0=y}uMXU^#b0kC(LMf9>iq-$sb^b^6zmgFi zQm{mhe{6HC8Ltw)g_3_YaV}hF;FD*_s2eBTqEO74Qh4jea+(RHibm!=IUY8uq3J(3 zP+8oIb!>v-yx)!;zu71_${4z0RQmq4+Eqtg|BB^qbir~#Vz-6v%jb-EvL^p1kEZK9 zXJ-n8Vz=yLDolWGFQ#QFGW+m|Luj6BDH|0lClfgd{#b=U_z}YdPSk-$CK|X*jEO?W z0-e7;Z8SA^uKtkc?DTq)9WwmQP%V@g9K?^SW@EMGN%{Q!Su>AYFIhI^NGrRlvxjje z)luwS%*#d@H4~_KTg1&N>!P7odW&jiK|=w%ldAIBddmhS-vzo(;JAN?HCK zH$s(Y@Fp(1VR#rK994w<`ruu`gVx}Kc*_&Rp}pn|nu~Lst87V-SC{e8boB}jSQ*W1 z6o~WJuMQ;1(Y?PwVSm3%OJAANhSPMox^attC1qT;P2O4>Zx-zRZ~6aKd|Ij)KgN_Q zG6Ui8fmM}dD&xkX^*U1vQxz;|Z)?ey1{blj-X&S>Z3>WazyB@C!NkcHF4T4lt7wyC z*D6R3xR|x2zMKfJw@a1362HKHzA`l%3mf8>94K2F&$@8fluv>lEW}y?N)b352QT9E zO|8qqB}X+dU|CDU-WjOzu?L&uTMrj-%-OU2V$Ajh%E%gbtxsvkqJ-RtKLZlaKeH{U z{i!{*uR;WlB49<++uvN%Z(&b(yvlF)-DuVmiS|gjEzt&72~qswux(CWU}?W`rQV{) zuEPNt738YP`BR%M`_AY5QQusH(URFsc7#S;pD34>BoLJ4@cB2Z;9UU@O8S98-*pb- z+HqV$_Yj9_2=7FeF1X2wRie}V{4t-GinLA8IJ-YL6(*LkoCu=+|-uNAHSFKh6 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch-members.html new file mode 100644 index 000000000..0fd7bd13f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch-members.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoSelectFromPopAndArch< MOEOT > Member List

This is the complete list of members for moeoSelectFromPopAndArch< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + +
archmoeoSelectFromPopAndArch< MOEOT > [private]
archSelectOnemoeoSelectFromPopAndArch< MOEOT > [private]
functor_category()eoUF< A1, R > [static]
moeoSelectFromPopAndArch(moeoSelectOne< MOEOT > &_popSelectOne, moeoSelectOne< MOEOT > _archSelectOne, moeoArchive< MOEOT > &_arch, double _ratioFromPop=0.5)moeoSelectFromPopAndArch< MOEOT > [inline]
moeoSelectFromPopAndArch(moeoSelectOne< MOEOT > &_popSelectOne, moeoArchive< MOEOT > &_arch, double _ratioFromPop=0.5)moeoSelectFromPopAndArch< MOEOT > [inline]
operator()(const eoPop< MOEOT > &pop)moeoSelectFromPopAndArch< MOEOT > [inline, virtual]
moeoSelectOne::operator()(A1)=0eoUF< A1, R > [pure virtual]
popSelectOnemoeoSelectFromPopAndArch< MOEOT > [private]
randomSelectOnemoeoSelectFromPopAndArch< MOEOT > [private]
ratioFromPopmoeoSelectFromPopAndArch< MOEOT > [private]
setup(const eoPop< MOEOT > &_pop)moeoSelectFromPopAndArch< MOEOT > [inline, virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.html b/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.html new file mode 100644 index 000000000..d855dc917 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.html @@ -0,0 +1,201 @@ + + +ParadisEO-MOEO: moeoSelectFromPopAndArch< MOEOT > Class Template Reference + + + + +
+
+ +

moeoSelectFromPopAndArch< MOEOT > Class Template Reference

Elitist selection process that consists in choosing individuals in the archive as well as in the current population. +More... +

+#include <moeoSelectFromPopAndArch.h> +

+

Inheritance diagram for moeoSelectFromPopAndArch< MOEOT >: +

+ +moeoSelectOne< MOEOT > +eoSelectOne< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoSelectFromPopAndArch (moeoSelectOne< MOEOT > &_popSelectOne, moeoSelectOne< MOEOT > _archSelectOne, moeoArchive< MOEOT > &_arch, double _ratioFromPop=0.5)
 Ctor.
 moeoSelectFromPopAndArch (moeoSelectOne< MOEOT > &_popSelectOne, moeoArchive< MOEOT > &_arch, double _ratioFromPop=0.5)
 Defaulr ctor - the archive's selection operator is a random selector.
+virtual const MOEOT & operator() (const eoPop< MOEOT > &pop)
 The selection process.
+virtual void setup (const eoPop< MOEOT > &_pop)
 Setups some population stats.

Private Attributes

+moeoSelectOne< MOEOT > & popSelectOne
 The population's selection operator.
+moeoSelectOne< MOEOT > & archSelectOne
 The archive's selection operator.
+moeoArchive< MOEOT > & arch
 The archive.
+double ratioFromPop
 The ratio of selected individuals from the population.
+moeoRandomSelect< MOEOT > randomSelectOne
 A random selection operator (used as default for archSelectOne).
+

Detailed Description

+

template<class MOEOT>
+ class moeoSelectFromPopAndArch< MOEOT >

+ +Elitist selection process that consists in choosing individuals in the archive as well as in the current population. +

+ +

+Definition at line 26 of file moeoSelectFromPopAndArch.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
moeoSelectFromPopAndArch< MOEOT >::moeoSelectFromPopAndArch (moeoSelectOne< MOEOT > &  _popSelectOne,
moeoSelectOne< MOEOT >  _archSelectOne,
moeoArchive< MOEOT > &  _arch,
double  _ratioFromPop = 0.5 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + + + +
_popSelectOne the population's selection operator
_archSelectOne the archive's selection operator
_arch the archive
_ratioFromPop the ratio of selected individuals from the population
+
+ +

+Definition at line 37 of file moeoSelectFromPopAndArch.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoSelectFromPopAndArch< MOEOT >::moeoSelectFromPopAndArch (moeoSelectOne< MOEOT > &  _popSelectOne,
moeoArchive< MOEOT > &  _arch,
double  _ratioFromPop = 0.5 
) [inline]
+
+
+ +

+Defaulr ctor - the archive's selection operator is a random selector. +

+

Parameters:
+ + + + +
_popSelectOne the population's selection operator
_arch the archive
_ratioFromPop the ratio of selected individuals from the population
+
+ +

+Definition at line 48 of file moeoSelectFromPopAndArch.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.png b/trunk/paradiseo-moeo/doc/html/classmoeoSelectFromPopAndArch.png new file mode 100644 index 0000000000000000000000000000000000000000..64ad01a6c0c1249650f582981d3ebbf202b1a50d GIT binary patch literal 1109 zcmV-b1giUqP)q$gGRCt{2+}(Dg zAP@&|x!G%nH^3+8*?pm2_5B}VnGbMGj7>C@di>KiRV4gCCON6I?(nZ;`569A{R(vG z&lMtad#TpOAJLaesQ2?9(7)ib%}}iO7!hq_hg&#MsK(7 zF6L7dB-bR3d0F>Fsa?!BDA1up|5?57C+cJ6^WgJOtpEACuKxA)d0G9+F%KO&bm-8b zLx&C>I`po3->U~#zHS5kEP9mOOwE3zsiwtV$%!1%-Sz({iLo+}7gK_Jauc_DoqJ2Y z=4DJzk|UYYt^UI4-=|9!Mu*^aTlXdzv6_$5R9KwFI(OT6n%|R;OO}_i%6Pl(jk19& z>%OA5S$B*1WI4GqB-PW@IOey9w(D8%()aw!gY&)5Lx+A`@B4|m?_U!q){&39rhes^ zhYlS&bm-8bLx&C>dRM*g)q^Wvw}Jk9^+c9}u@Xy-Yob4#CLw*`oXNL&f@gF~J~;jE zZaB_UkfsMTQ>AHxL%P2^h{_Fck#7l_>J4&UxBI3ng>zK5OiYSXy(LOAGpgG?Qj&*B ziNDwM&9ncE&it%T^`YFEx72yL{oJ?sP2DnZ+Gn%}ujdNwJj-!??wkBKbN3lIdsxoh zI^WQD&wY`BbL*~m0#1J2?dv|~_piIlz`2;0yARE;F|W3Ny&sPG<^?)*=s&CX{Y2gO zuZa`u$j4n%zjDk&hYlS&bm-8bLx&E%tKRqO!IiJuK>yu(o1EOUdYhcwL!I+1nwV&q zlY6L>{qKNHb8?U8o+hui$;o}IH_gdCG53Z!xo6LOo1EOH?qa@8PVOA@3is*Ft2+v;=-#xWmEk z&5iiGZo8vnegglHZb+za=)wA&J04e$%XV;;ZX{(Md54Lhb>m`?riUN{%#G!j9G2Ij z?vr$z8*$wjROf9{oqv<*`FQRij9%yd!T$q3YI^?aR9B$);kTkp+To z>b|YJ(``@YO|#CySadu0W3cx3XP#T!%zdz5^E0;fFbwXj*_rTjf2gm_y>>aStoxl# zUZ+{tz^vV`#{BKN&oM8rcNg-{d~cb4PtlF)k<=vURd bexm*lCi1{ + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoSelectOne< MOEOT > Member List

This is the complete list of members for moeoSelectOne< MOEOT >, including all inherited members.

+ + + + + +
functor_category()eoUF< A1, R > [static]
operator()(A1)=0eoUF< A1, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)eoSelectOne< MOEOT > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.html b/trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.html new file mode 100644 index 000000000..3e1dd6b65 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoSelectOne< MOEOT > Class Template Reference + + + + +
+
+ +

moeoSelectOne< MOEOT > Class Template Reference

Selection strategy for multi-objective optimization that selects only one element from a whole population. +More... +

+#include <moeoSelectOne.h> +

+

Inheritance diagram for moeoSelectOne< MOEOT >: +

+ +eoSelectOne< MOEOT > +eoUF< A1, R > +eoFunctorBase +moeoDetTournamentSelect< MOEOT > +moeoRandomSelect< MOEOT > +moeoRouletteSelect< MOEOT > +moeoSelectFromPopAndArch< MOEOT > +moeoStochTournamentSelect< MOEOT > + +List of all members. + +
+

Detailed Description

+

template<class MOEOT>
+ class moeoSelectOne< MOEOT >

+ +Selection strategy for multi-objective optimization that selects only one element from a whole population. +

+ +

+Definition at line 22 of file moeoSelectOne.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.png b/trunk/paradiseo-moeo/doc/html/classmoeoSelectOne.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d4939f914b3035fc59a7c5330b1e52507a5af8 GIT binary patch literal 2926 zcmd5;Sy)ro7Cw~WXn_+d3KU3yYpsF;soFM-GKs}1P=bn#fd~~NmNY2>YtQ9UqHwzrW<%(rTMqudt1jg)_Q-L=on=0 zC)`KLG|SL`X@0Myx;ok{Lj`0jhQRbHf}l zYx5=rn+QDLuJ$Qr!zrR(KhM1EUHgsK>h;q;qe6h>6EYylIK zK5GXGx|+IFP&8PD*>HyVgeAc~#P2erjmM9zFAQTgXiL+xlvQw-;}w{AWgPN;UBVBG zL$moIbh7N4{%*)kcm)ps34z`6Ah9L{A<5ALEgp@sycn^l%J+{-Zzb1Q&)rgu$vYe| zOCr8ic;)AoJ*<=;qEHmY@?4563l2uK0w zuu)|M4V>6kEzQKPgi12yw&8A%h>vY)T1zcvlT4$fHswce^Z5TCuMG3a%2>y9+CQRr z<|p1wXZEX2zehGaNiZ|YxM0&a=!^!`L+(_a#{pV& zmmp;;pc8+ge(8dm(e!&U^Xls8KFyI4Pz!fQyS5IY)9UiqH?Hc2$dp^x-b_!2*|nxS zTk+G)kZYtO7&*t zwR(kHvZ*2XkdseVz$phaUAgmJ|AOmYU99m1?p(Z#dTTHDT;s&f>vSA8iLR8>O}W<^ zqC_1czqg&*w8EDjl8#hox~GeoVS6ajv5F zeeT5BY9L)%#Q{QoP<}v{H}-0DMb$u9;8$sZiu|yE5_b8b*YHl}Jg$W`8%=3J)xiGMo@)J$`;~a0yZkRRGl+{CXBp99!8V?*e_+{MB(Y=0Q0nqKEL2c?= zAKDwapDGA0x+StATG}^ktETu{m))O=+|pDWS7jIK)fkg9eX2#w3tsiZg>)aeSF-kd z?dlC1Qh8ak$7j~wiH=E=JnEi7_G@2Hep0&>lk{x*@C2DcI6%4YUEY+#DL>1>KicUd z;*swYz=lQNRMN(rz=tc@4^xO9N5N`)ITK#IKc8~sw~-)x&)I=jj%QxkwnXki^}y#B z%0pfUA0O6Y5J)EV_YHi&rE0pvCg-y<>K->EDQ4OAU&l@Tyw_&na%5;IQ>b<@CSNf% zW6Fpn&+|%RjzJu9u-RFnM?LgS4JP1vBND_V$J3uZ%2z* z)6*aNiHE2GhoVt+3sJ%s2bVipkFRx^H~0=*5$LA#afDY?S%USJoC{&s0>b{WzlY5V zNtR#&g2s0{C7>@&O=Wi=JSRDhm;^bmkxWd$4S$kF&{odyNY50#Fh1RenLuQoh;JflM#?0yY2BXQ=Hwc}qCVKPLq5=U_k-lKHd$S9 zRpA2O?j3KASM>ZU_@TD>-tQ?6OD|Jo!rFd^+*s2&#pz>a_;gQWZc|Mn4QwcQ(2r_L zx@@x6&r)96M?@z;)B%=#^xUs*uWMZ3*Xp6Uy!lL@uLBmzeZ_X48Z?8Ln4GQ)m z&EnXW4m6ikHi0mmGj6s#hiXCFK=n%gFl$rw5mX+jT0Vwptf#N0sh*_R*~z-a;C!Kb z=l&11|E$^_ zRsJukI6)^PMa2nPE>1u^>vH;l;=^M!@Y?U~ JL36`h{3jVUiShsd literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment-members.html new file mode 100644 index 000000000..d22188988 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment-members.html @@ -0,0 +1,51 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoSharingDiversityAssignment< MOEOT > Member List

This is the complete list of members for moeoSharingDiversityAssignment< MOEOT >, including all inherited members.

+ + + + + + + + + + + + + + + +
alphamoeoSharingDiversityAssignment< MOEOT > [protected]
defaultDistancemoeoSharingDiversityAssignment< MOEOT > [protected]
distancemoeoSharingDiversityAssignment< MOEOT > [protected]
functor_category()eoUF< eoPop< MOEOT > &, void > [static]
moeoSharingDiversityAssignment(moeoDistance< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=1.0)moeoSharingDiversityAssignment< MOEOT > [inline]
moeoSharingDiversityAssignment(double _nicheSize=0.5, double _alpha=1.0)moeoSharingDiversityAssignment< MOEOT > [inline]
nicheSizemoeoSharingDiversityAssignment< MOEOT > [protected]
ObjectiveVector typedefmoeoSharingDiversityAssignment< MOEOT >
operator()(eoPop< MOEOT > &_pop)moeoSharingDiversityAssignment< MOEOT > [inline, virtual]
setSimilarities(eoPop< MOEOT > &_pop)moeoSharingDiversityAssignment< MOEOT > [inline, protected, virtual]
sh(double _dist)moeoSharingDiversityAssignment< MOEOT > [inline, protected]
updateByDeleting(eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)moeoSharingDiversityAssignment< MOEOT > [inline, virtual]
moeoDiversityAssignment::updateByDeleting(eoPop< MOEOT > &_pop, MOEOT &_moeo)moeoDiversityAssignment< MOEOT > [inline]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< eoPop< MOEOT > &, void > [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.html b/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.html new file mode 100644 index 000000000..9f898d5de --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.html @@ -0,0 +1,347 @@ + + +ParadisEO-MOEO: moeoSharingDiversityAssignment< MOEOT > Class Template Reference + + + + +
+
+ +

moeoSharingDiversityAssignment< MOEOT > Class Template Reference

Sharing assignment scheme originally porposed by: D. +More... +

+#include <moeoSharingDiversityAssignment.h> +

+

Inheritance diagram for moeoSharingDiversityAssignment< MOEOT >: +

+ +moeoDiversityAssignment< MOEOT > +eoUF< eoPop< MOEOT > &, void > +eoFunctorBase +moeoFrontByFrontSharingDiversityAssignment< MOEOT > + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef MOEOT::ObjectiveVector ObjectiveVector
 the objective vector type of the solutions

Public Member Functions

 moeoSharingDiversityAssignment (moeoDistance< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=1.0)
 Ctor.
 moeoSharingDiversityAssignment (double _nicheSize=0.5, double _alpha=1.0)
 Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default.
void operator() (eoPop< MOEOT > &_pop)
 Sets diversity values for every solution contained in the population _pop.
void updateByDeleting (eoPop< MOEOT > &_pop, ObjectiveVector &_objVec)

Protected Member Functions

virtual void setSimilarities (eoPop< MOEOT > &_pop)
 Sets similarities for every solution contained in the population _pop.
double sh (double _dist)
 Sharing function.

Protected Attributes

+moeoDistance< MOEOT, double > & distance
 the distance used to compute the neighborhood of solutions
+moeoEuclideanDistance< MOEOT > defaultDistance
 euclidean distancein the objective space (can be used as default)
+double nicheSize
 neighborhood size in terms of radius distance
+double alpha
 parameter used to regulate the shape of the sharing function
+

Detailed Description

+

template<class MOEOT>
+ class moeoSharingDiversityAssignment< MOEOT >

+ +Sharing assignment scheme originally porposed by: D. +

+E. Goldberg, "Genetic Algorithms in Search, Optimization and Machine Learning", Addision-Wesley, MA, USA (1989). +

+ +

+Definition at line 28 of file moeoSharingDiversityAssignment.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + + + + + + + +
moeoSharingDiversityAssignment< MOEOT >::moeoSharingDiversityAssignment (moeoDistance< MOEOT, double > &  _distance,
double  _nicheSize = 0.5,
double  _alpha = 1.0 
) [inline]
+
+
+ +

+Ctor. +

+

Parameters:
+ + + + +
_distance the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space)
_nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed)
_alpha parameter used to regulate the shape of the sharing function
+
+ +

+Definition at line 42 of file moeoSharingDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoSharingDiversityAssignment< MOEOT >::moeoSharingDiversityAssignment (double  _nicheSize = 0.5,
double  _alpha = 1.0 
) [inline]
+
+
+ +

+Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. +

+

Parameters:
+ + + +
_nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed)
_alpha parameter used to regulate the shape of the sharing function
+
+ +

+Definition at line 51 of file moeoSharingDiversityAssignment.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
void moeoSharingDiversityAssignment< MOEOT >::operator() (eoPop< MOEOT > &  _pop  )  [inline, virtual]
+
+
+ +

+Sets diversity values for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Implements eoUF< eoPop< MOEOT > &, void >. +

+Definition at line 59 of file moeoSharingDiversityAssignment.h. +

+References moeoSharingDiversityAssignment< MOEOT >::setSimilarities(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
void moeoSharingDiversityAssignment< MOEOT >::updateByDeleting (eoPop< MOEOT > &  _pop,
ObjectiveVector _objVec 
) [inline, virtual]
+
+
+ +

+

Warning:
NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account.
+
Parameters:
+ + + +
_pop the population
_objVec the objective vector
+
+
Warning:
NOT IMPLEMENTED, DO NOTHING !
+ +

+Implements moeoDiversityAssignment< MOEOT >. +

+Reimplemented in moeoFrontByFrontSharingDiversityAssignment< MOEOT >. +

+Definition at line 80 of file moeoSharingDiversityAssignment.h. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
virtual void moeoSharingDiversityAssignment< MOEOT >::setSimilarities (eoPop< MOEOT > &  _pop  )  [inline, protected, virtual]
+
+
+ +

+Sets similarities for every solution contained in the population _pop. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Reimplemented in moeoFrontByFrontSharingDiversityAssignment< MOEOT >. +

+Definition at line 102 of file moeoSharingDiversityAssignment.h. +

+References moeoSharingDiversityAssignment< MOEOT >::distance, and moeoSharingDiversityAssignment< MOEOT >::sh(). +

+Referenced by moeoSharingDiversityAssignment< MOEOT >::operator()(). +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
double moeoSharingDiversityAssignment< MOEOT >::sh (double  _dist  )  [inline, protected]
+
+ +

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.png b/trunk/paradiseo-moeo/doc/html/classmoeoSharingDiversityAssignment.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb9a13c27a3fc2417bf22a8ec74a3121aa5b377 GIT binary patch literal 1935 zcmcgtYgAKL7LL^_k5N>Fh!qg4pkhEORl+slQQnw{V0m~!2sUXk+$bQSAf(73I^YOM zGf)g5Q65p~kb)2-B)JLJQBd-L8VrIF(^%K)ulX~xX3dX%&bQY&d+ojU zx4ymq5gf?B9BMu)6G#ZU2Xf*b)*-2$4 z^t<)+^qlK6J~g>3&PEcWP`=Yr3JSGmXJ~-mv9DR$8ZiBa*ZRN`_EM1ieC&D7m!H{r zY?w4|TwNEr?F5--qXN^<$gLvId+qS2V{casbgzA(U);|VLSQKZJ50#DpA~oP>v&!A zx-|aFE}lgcRZ4sP30hj@QGaq3N4xmxDo2o2Iy4y!Dt-A&D5TNLn+!TehQG|(g7CJu zUD9R3#3$G8SG4fc0C=5aGGM{vCdli{*K@YoW;qQ>8U*%;s%jxd0ijEgq!I?%fPDg2 zSr^1Kad+Op`VBy59%oD!cK`Ig96p3Q-cIgT2QB72^xLBc*N`l?y_p|6;QN(m!2n7v zP>>AHtW?4_8(>sn+lSiNr+H8A$i>>|up>VBy2JT${3(DuTm}8A4k9#i7t){!$*>Ds!pi4h8a7r( zfcC|AzuGJA`5_M;SKP$HV`^7qQ^EeuhSY}3x4u0zRr%LAg*?wp*c)QD+fF3;N20WL z6laHA-)fG9)t>vPKD_Y>;n}E`RQD3?d>T;aPSgr#S!G1$O)L4sf)2z-kULr&#I}8g z?Tr^L(LG!QtO461?~Fe4wnLpU?XzC+Es8QNHF4_I+i2l4xFwhhYqFGPS@_rh=?7*I zIktn0L>GMy!jO{8hXVf>t$t5XS=jPzW5MMSd7|z#a$EuHd!SEel18uY|E^EbMt1Af zA4%Cx%XFR>j?Np8Osamcq1{i{ zI!R#WGs4j4CM0pV@3H0mM_ipgj|da(cKr$OIp#d4DjJ(fo|99qB_L;=EJ11;gzl;h zLw60*iKsD+J7&>Fd?6+egQ9$VotH^#vq*2^H_Rkg%7)F8DA!8s(^Gt{L?edO=z9y< zoze?%RCMfS4H!KLPYDuA3!_XwrM4LbLwx*@^-Lc?eKExRsB}X}O*h zQj#!H7pR{DwEoC|Fso+lWH2Hic-nOpM@k+GsO#ABAl$Opp7quaL|c8oV*GTCgVMH( z_nd+#YVo>m#faKXa(%XW`F@lt3+m#yW^4w5)}|Zb5}(__3@(p=zTMWb8ljJpjIr`7 z!j8+@^4TM>oZy{#=U+4`uYa3my( z@!FF%$iQ~^B7Cc#u9M3KVVmJ!efnfL{tK3M>Rs)a z^E)bML|7+wh-#;(ii&-7*UN?VOXCxQA=3ww2y53t2EA&H6n}*g(0XM1mAadY%C{J&M;qcl+zUM)vwoDU zy|wgRCfA{gX%O#|;<$c8dl0ayOff{AOV#Ii=3BDVO4IOgX6-h zP#k@5wd&=j5cVFbjI;e>V7Uw15?roRk-|aODQ3~nif3fA+VT0R W-9Lv^r&OD^Cn_|M7|`mURPY-p2%_cy literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric-members.html new file mode 100644 index 000000000..c32933d6c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoSolutionUnaryMetric< ObjectiveVector, R > Member List

This is the complete list of members for moeoSolutionUnaryMetric< ObjectiveVector, R >, including all inherited members.

+ + + + +
functor_category()eoUF< const ObjectiveVector &, R > [static]
operator()(const ObjectiveVector &)=0eoUF< const ObjectiveVector &, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< const ObjectiveVector &, R > [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.html new file mode 100644 index 000000000..e08c16b97 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.html @@ -0,0 +1,62 @@ + + +ParadisEO-MOEO: moeoSolutionUnaryMetric< ObjectiveVector, R > Class Template Reference + + + + +
+
+ +

moeoSolutionUnaryMetric< ObjectiveVector, R > Class Template Reference

Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoSolutionUnaryMetric< ObjectiveVector, R >: +

+ +moeoUnaryMetric< const ObjectiveVector &, R > +eoUF< const ObjectiveVector &, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + +
+

Detailed Description

+

template<class ObjectiveVector, class R>
+ class moeoSolutionUnaryMetric< ObjectiveVector, R >

+ +Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. +

+ +

+Definition at line 43 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionUnaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..88515c6992b9217ff90778aca470712708c33d75 GIT binary patch literal 2041 zcmcJQc{~(a8^=Y;5{kUC6f;?}M9PwViLzvkSuz>LU`Db{Vi;m(gqw`*>N8n-X{u=! zykim~+_;&xYZz;B`+cAD>hoqy9 zVXeNN>iAK=;9KhSeHrz~<8WKK2UIUwcj6*>&vI%_iW!*2E~5Sf0I7y*9~**%&_Y@0B3ghhJ*Ar zh9`3JTq^CXtoO|Ue35B$me|4(XgMz`UvK7ON_P=WHUOhaWu`_io4ttsb^Urp63s?! z{Njr*v@}TN7(!m;JIvd%5#m>DI&r%N}w=g(oMis9$ns zi?uPP-@1P>-(jhBOIy{j<#tJMmxoCxxwMY+8Zt+C{rR&=A!zqT`M_m?HG^`7Fe}@m zB;7Nxnhv&ss8pG__-H%A;U7POgCNS=o*O(n>X>woN|m1Cw(kPZu5in4-EUX09}B<$ z0Rrb0m+udigWp-{|1y!2(aQL?YcMwi3;5Pg{Jv9B9fu8>6G_vgXDHL0Fprcwebyv4 zBsgzM;jLfZX3T_I!UYptWIjSUcW5waxT+FrHy7|~<_!F9J_u6MziBwIm$|%rfH&cS z=`e_uiul<;g`;%%0YEtupB{e%f6!#!|1k#g>0EYtPN38j-O8;5S|`o!sXeY8m`ca6 z3pyHatYkG3nMc-atFTJ|_y>)t7rGAOtVxdzKtt0sQqyqJnRipqew{z<8}XH|WLWBt zh`p?odI{R;e2h_N5ckFOVY_P~A9c7t7^Jw>(t%2lYFWF;H(MpEf;nWiK~sgY-dQ)j z3j&Fb4thOpji&J+jSh9l4fO7Jl*OTE_kkomQO`BOb>%p}@GwMYU}muql<*-|yC_8dpbZ8Brx(-%2N$2q_nNF3^G|GpB7U0}v5kxPilpj@L&$e>GFJ%C zvI_rKl1M_+3<|Zq%;;s^O@sfSy%VN?oZ+wCTjC(F@a|Pt@X=(0mmiN;?Xa_R<|9yo zz0~t?ojsQbE|TMC;o+mwyUv!k^UfWU<+$(-Q{NLOEbp+57u6@PY*` zK5_S4ITh*HgqAi=q-8Eb%#)8e1D#A~y*#9#AGHI|cE?RFbQr9*cu6Xrq`EfY(_o!T zCm2_L^2qYNr&zTh$-`W)jANDI{5iEVH_Mj4h z!elGWf*e0oaD3(+?OW@gJ{;LnE*Bn4pG9fU%&Vl9V(yB@ZYGO|AZUF8!I~CnGK@A# zr1Sm@&R<3Q8!i8)TO_f(k4WDqb0`S~wHk}1fIt0vtS*nIKzs8%KAWL(q48nVtiMhwmO&O(wakTl#T3F3L zXxEs*Tr6=hU&E&%j))~%vfQ6Ckw%t#o;Nq9YE6hZa6;k0PO9Pm8hMB%dS0tnxK>bg zuF2a0#!sdl8~?|c~*s+aYr9thLDB+Aob N?ylZ04Cj!{-vNPb`RxDz literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric-members.html new file mode 100644 index 000000000..24ba06351 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R > Member List

This is the complete list of members for moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >, including all inherited members.

+ + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.html new file mode 100644 index 000000000..57a91c35f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.html @@ -0,0 +1,63 @@ + + +ParadisEO-MOEO: moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R > Class Template Reference + + + + +
+
+ +

moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R > Class Template Reference

Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >: +

+ +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase +moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R > + +List of all members. + +
+

Detailed Description

+

template<class ObjectiveVector, class R>
+ class moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >

+ +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. +

+ +

+Definition at line 57 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoSolutionVsSolutionBinaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..3b831c9615216c7d52b9dbec9083c45d7d946647 GIT binary patch literal 2700 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 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect-members.html new file mode 100644 index 000000000..9f0dfdb81 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect-members.html @@ -0,0 +1,47 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoStochTournamentSelect< MOEOT > Member List

This is the complete list of members for moeoStochTournamentSelect< MOEOT >, including all inherited members.

+ + + + + + + + + + + +
comparatormoeoStochTournamentSelect< MOEOT > [protected]
defaultComparatormoeoStochTournamentSelect< MOEOT > [protected]
functor_category()eoUF< A1, R > [static]
moeoStochTournamentSelect(moeoComparator< MOEOT > &_comparator, double _tRate=1.0)moeoStochTournamentSelect< MOEOT > [inline]
moeoStochTournamentSelect(double _tRate=1.0)moeoStochTournamentSelect< MOEOT > [inline]
operator()(const eoPop< MOEOT > &_pop)moeoStochTournamentSelect< MOEOT > [inline]
moeoSelectOne::operator()(A1)=0eoUF< A1, R > [pure virtual]
setup(const eoPop< MOEOT > &_pop)eoSelectOne< MOEOT > [virtual]
tRatemoeoStochTournamentSelect< MOEOT > [protected]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A1, R > [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.html b/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.html new file mode 100644 index 000000000..1c9d96f6a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.html @@ -0,0 +1,196 @@ + + +ParadisEO-MOEO: moeoStochTournamentSelect< MOEOT > Class Template Reference + + + + +
+
+ +

moeoStochTournamentSelect< MOEOT > Class Template Reference

Selection strategy that selects ONE individual by stochastic tournament. +More... +

+#include <moeoStochTournamentSelect.h> +

+

Inheritance diagram for moeoStochTournamentSelect< MOEOT >: +

+ +moeoSelectOne< MOEOT > +eoSelectOne< MOEOT > +eoUF< A1, R > +eoFunctorBase + +List of all members. + + + + + + + + + + + + + + + + + + + + + +

Public Member Functions

 moeoStochTournamentSelect (moeoComparator< MOEOT > &_comparator, double _tRate=1.0)
 Full Ctor.
 moeoStochTournamentSelect (double _tRate=1.0)
 Ctor without comparator.
const MOEOT & operator() (const eoPop< MOEOT > &_pop)
 Apply the tournament to the given population.

Protected Attributes

+moeoComparator< MOEOT > & comparator
 the comparator (used to compare 2 individuals)
+moeoFitnessThenDiversityComparator<
+ MOEOT > 
defaultComparator
 a fitness then diversity comparator can be used as default
+double tRate
 the tournament rate
+

Detailed Description

+

template<class MOEOT>
+ class moeoStochTournamentSelect< MOEOT >

+ +Selection strategy that selects ONE individual by stochastic tournament. +

+ +

+Definition at line 24 of file moeoStochTournamentSelect.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + + + + + + + + + + +
moeoStochTournamentSelect< MOEOT >::moeoStochTournamentSelect (moeoComparator< MOEOT > &  _comparator,
double  _tRate = 1.0 
) [inline]
+
+
+ +

+Full Ctor. +

+

Parameters:
+ + + +
_comparator the comparator (used to compare 2 individuals)
_tRate the tournament rate
+
+ +

+Definition at line 33 of file moeoStochTournamentSelect.h. +

+References moeoStochTournamentSelect< MOEOT >::tRate. +

+

+ +

+
+
+template<class MOEOT>
+ + + + + + + + + +
moeoStochTournamentSelect< MOEOT >::moeoStochTournamentSelect (double  _tRate = 1.0  )  [inline]
+
+
+ +

+Ctor without comparator. +

+A moeoFitnessThenDiversityComparator is used as default.

Parameters:
+ + +
_tRate the tournament rate
+
+ +

+Definition at line 53 of file moeoStochTournamentSelect.h. +

+References moeoStochTournamentSelect< MOEOT >::tRate. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOT>
+ + + + + + + + + +
const MOEOT& moeoStochTournamentSelect< MOEOT >::operator() (const eoPop< MOEOT > &  _pop  )  [inline]
+
+
+ +

+Apply the tournament to the given population. +

+

Parameters:
+ + +
_pop the population
+
+ +

+Definition at line 73 of file moeoStochTournamentSelect.h. +

+References moeoStochTournamentSelect< MOEOT >::comparator, and moeoStochTournamentSelect< MOEOT >::tRate. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.png b/trunk/paradiseo-moeo/doc/html/classmoeoStochTournamentSelect.png new file mode 100644 index 0000000000000000000000000000000000000000..640878725c923b1c7eff7a8a12d0736e25c8b8d1 GIT binary patch literal 1089 zcmeAS@N?(olHy`uVBq!ia0vp^UxD}s3p0>B#<;fwNJ#|vgt-3y{~yTw|Np@J`3Vz% zEHFNB;6U}E|4)Ei#*!evU&kFzp2*S`7qt#X6M?EW%aYC-oHD4UuYw5^>%@YH@lXa{b8@p zIuay3eRo{?ag%!{yAA|(7(S8W+G*92^O!fBQ(X zJfHKM1+V93{njdbb+4~F>-3!Gk{y#H_MG4|T9!LIS#gg*@$+leuTC3m&R)B{^RvVZ z57WR$bFNzltr2~GUHry|#OvFl>)h*B|Jif>PxRaP{_0!($It7&-F?h52Pk>CjaS+X z$XLHMdfxB*U#qy^^lxW=?&B4w^i4JJtJAheytiZK^3Pc%#rJqC%iYdB2k+=TUY9<- zrt{Xs&EmClZXZ|wH|6Y2K}&}0*Hz&s0;m3&p|bqYi>ZaLyBGiH{1b5{W@1>|&#Lf~ zXV6Lu57{@--}`G&;#Acy8v=6zUe_9^-M zruR}nF_`-j5AVB{SNX2~`fJ?{_80n=tQ6EuTw%ETgtEGU$Gjr5$2UX&FmF?1>)E>_ zTIacdhu%H!ZytKD_9x!9&dk{1sPp7@`mZA9nOnd9Q}SKACq27OrET9Gt0R)a8^6XW zo$Eg`vRf zfdRbr?X>$7qvuK2tnU4DWA7WBq0hf{^^+5Pw?d0jqRYNgE<1JZZHbE>vtQOH?%U$G&wYHj zbnegnf6OZHemnBJxb&B&>$i()nU@8>AD0h*nIIu`+poWG_gC-R!S7Bzzqhk}o%U^& z-><`7ojM)uEPU??+q#km6?;|&R_)EQw!bxZ{telwc2@RVOaJ}Z;^}_vS@N4@Wl?F? zd6ru`eU~skD9?3IDsK0aezNV7V;l!B%k|tdmG_d(@?7WL*w<4nu}<;L4)eED3#YG~ zx9(uV + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoUnaryMetric< A, R > Member List

This is the complete list of members for moeoUnaryMetric< A, R >, including all inherited members.

+ + + + +
functor_category()eoUF< A, R > [static]
operator()(A)=0eoUF< A, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< A, R > [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.html new file mode 100644 index 000000000..ea583c5d5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.html @@ -0,0 +1,61 @@ + + +ParadisEO-MOEO: moeoUnaryMetric< A, R > Class Template Reference + + + + +
+
+ +

moeoUnaryMetric< A, R > Class Template Reference

Base class for unary metrics. +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoUnaryMetric< A, R >: +

+ +eoUF< A, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + +
+

Detailed Description

+

template<class A, class R>
+ class moeoUnaryMetric< A, R >

+ +Base class for unary metrics. +

+ +

+Definition at line 29 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoUnaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..faf9e9ecc158731c8ac2fe77ce2566f655940ca2 GIT binary patch literal 956 zcmeAS@N?(olHy`uVBq!ia0y~yVDtmBJ6M>3WYunYcOWGZ;1lBd|Nnm=^Z)+?^XDf_ z0J6aNz<~qRhyFhSav4j4{DK)Ap4~`eU|#7z^`_buuKex7 zyI@kRX*z#L>iMXw#vS)Ui^FQ=st<0SG)sAw^|c2bw`w#uNKW36`L?6%v~2Ow&Aqb} zto=Y#9t+>H>%eoHd z^JZD!&Mh~(xcAkcQ~EvW!e28~TOBV%C*A(F$4@u>8OuMH$seb_3>VV48uZ@u%E$Zt zS)Fe>y;J;Sl&T*IW!ik4pO87P`~0!%FO}D`*p-T$|ITkUsl}?}`SstuK1&w%J+kzX z-I)H~MM|sso8OX!n+P%O-gkv~!DYT$=p0C!#~# zrgX_U>8tZPCk1&+oxCidST!x_c<}CbOicc{jg9LRD|V@=-99`eH&vtZ*t6ajnU(vx zlRsYhdD8wv$O7?QoAL_l*PA|BqW(i~?G@uS=l8s5On(t_vf|y=TT^U$J&oo$X1u%F zy?w5z?MunoGpAhom?b(-Yum>k#d{}o?X60z-PZejOGVr2(8{!H&yQ`+tIc~>dn+&I z^Bip>+v0b%*(=MJZ@E&Pv935YB=G(3z&Dp{zOCt9JM-%+-0MU;xBDa@xOrLLVrry2e)ch|dyC)P2Jo?Pz!= zdF;rE9r@o@IsNFFa_NnQ|7LDA{g{7}{+!oBq*(u-UA5D9ak}uK`(3sQPyYTmwLsiv zb8_FypOfV0y{o!ZzjWTa2@8M$@RifNl4;32rYAZ1ag1W;4L++qwOuTG$7J66E0_D1 zb + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > Member List

This is the complete list of members for moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AtomType typedefmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >
className() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]
ContainerType typedefmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >
Diversity typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
diversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
diversity(const Diversity &_diversityValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO()EO< MOEOObjectiveVector >
EO()EO< MOEOObjectiveVector >
Fitness typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
fitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
fitness(const Fitness &_fitnessValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::fitness(const Fitness &_fitness)EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::fitness(performance_type perf)EO< MOEOObjectiveVector >
fitness_traits typedefEO< MOEOObjectiveVector >
invalid() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidate_worth(void)EO< MOEOObjectiveVector >
invalidateDiversity()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateFitness()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidateObjectiveVector()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidDiversity() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidFitness() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
invalidObjectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
moeoVector(unsigned int _size=0, GeneType _value=GeneType())moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > [inline]
ObjectiveVector typedefMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >
objectiveVector() const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
objectiveVector(const ObjectiveVector &_objectiveVectorValue)MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
operator<(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > &_moeo) const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > [inline]
MOEO::operator<(const MOEO &_other) const MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline]
EO< MOEOObjectiveVector >::operator<(const EO &_eo2) const EO< MOEOObjectiveVector >
EO< MOEOObjectiveVector >::operator<(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
operator>(const EO &_eo2) const EO< MOEOObjectiveVector >
operator>(const EO< Fitness, Traits > &other) const EO< MOEOObjectiveVector >
performance(performance_type perf)EO< MOEOObjectiveVector >
performance(void) const EO< MOEOObjectiveVector >
performance_type typedefEO< MOEOObjectiveVector >
printOn(std::ostream &_os) const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > [inline, virtual]
readFrom(std::istream &_is)moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > [inline, virtual]
storage_type typedefEO< MOEOObjectiveVector >
value(const std::vector< GeneType > &_v)moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > [inline]
worth(worth_type worth)EO< MOEOObjectiveVector >
worth(void) const EO< MOEOObjectiveVector >
worth_type typedefEO< MOEOObjectiveVector >
~EO()EO< MOEOObjectiveVector > [virtual]
~eoObject()eoObject [virtual]
~eoPersistent()eoPersistent [virtual]
~eoPrintable()eoPrintable [virtual]
~MOEO()MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > [inline, virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVector.html b/trunk/paradiseo-moeo/doc/html/classmoeoVector.html new file mode 100644 index 000000000..36eafc894 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoVector.html @@ -0,0 +1,264 @@ + + +ParadisEO-MOEO: moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > Class Template Reference + + + + +
+
+ +

moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > Class Template Reference

Base class for fixed length chromosomes, just derives from MOEO and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). +More... +

+#include <moeoVector.h> +

+

Inheritance diagram for moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >: +

+ +MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity > +EO< MOEOObjectiveVector > +eoObject +eoPersistent +eoPrintable + +List of all members. + + + + + + + + + + + + + + + + + + + + + + + + +

Public Types

+typedef GeneType AtomType
 the atomic type
+typedef std::vector< GeneType > ContainerType
 the container type

Public Member Functions

 moeoVector (unsigned int _size=0, GeneType _value=GeneType())
 Default ctor.
void value (const std::vector< GeneType > &_v)
 We can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor.
bool operator< (const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > &_moeo) const
 To avoid conflicts between MOEO::operator< and std::vector<GeneType>::operator<.
virtual void printOn (std::ostream &_os) const
 Writing object.
virtual void readFrom (std::istream &_is)
 Reading object.
+

Detailed Description

+

template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType>
+ class moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >

+ +Base class for fixed length chromosomes, just derives from MOEO and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). +

+GeneType must have the following methods: void ctor (needed for the std::vector<>), copy ctor. +

+ +

+Definition at line 25 of file moeoVector.h.


Constructor & Destructor Documentation

+ +
+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType>
+ + + + + + + + + + + + + + + + + + +
moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::moeoVector (unsigned int  _size = 0,
GeneType  _value = GeneType() 
) [inline]
+
+
+ +

+Default ctor. +

+

Parameters:
+ + + +
_size Length of vector (default is 0)
_value Initial value of all elements (default is default value of type GeneType)
+
+ +

+Definition at line 47 of file moeoVector.h. +

+

+


Member Function Documentation

+ +
+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType>
+ + + + + + + + + +
void moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::value (const std::vector< GeneType > &  _v  )  [inline]
+
+
+ +

+We can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor. +

+

Parameters:
+ + +
_v a vector of GeneType
+
+ +

+Definition at line 56 of file moeoVector.h. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType>
+ + + + + + + + + +
bool moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::operator< (const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > &  _moeo  )  const [inline]
+
+
+ +

+To avoid conflicts between MOEO::operator< and std::vector<GeneType>::operator<. +

+

Parameters:
+ + +
_moeo the object to compare with
+
+ +

+Definition at line 79 of file moeoVector.h. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType>
+ + + + + + + + + +
virtual void moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::printOn (std::ostream &  _os  )  const [inline, virtual]
+
+
+ +

+Writing object. +

+

Parameters:
+ + +
_os output stream
+
+ +

+Reimplemented from MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >. +

+Reimplemented in moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >. +

+Definition at line 89 of file moeoVector.h. +

+

+ +

+
+
+template<class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType>
+ + + + + + + + + +
virtual void moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::readFrom (std::istream &  _is  )  [inline, virtual]
+
+
+ +

+Reading object. +

+

Parameters:
+ + +
_is input stream
+
+ +

+Reimplemented from MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >. +

+Reimplemented in moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >. +

+Definition at line 102 of file moeoVector.h. +

+

+


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVector.png b/trunk/paradiseo-moeo/doc/html/classmoeoVector.png new file mode 100644 index 0000000000000000000000000000000000000000..a40378e79e784bb17c3e67e6e11eb056761073fd GIT binary patch literal 2359 zcmb_eX;c$g8ZC*A;({Qp?TBnfK@ZBJKr1wYh(bhm1UnEAfwV{xRF*Wd1eHxu0n>_=eJqPQ~Jy%U@JrDZsQ!14zs8lwVmLADbp--c+ zu`%J1azs@wi1Bv!0USnO-~nJs2gYfS?@vWYaln=Gotpa$jmjS8#u?yI+B_d(UDq@ z3qB7;$a>&DslP`U3u`pf z5}C!qk)X&^wjWrQMq!2O5Z)0i$RU1)4$3++wV2W!t2!4f*}K682;pU$#VmZJ0pW+n zP0IFa;#;j(Yw4z#Z!AM;raQ#|k8(0K9M*pBc5zy4u>AZOkZSmUZW^NPSE6>Q^=aQ? z8!i%`_bItYm@@c-MWU+KA)~`0PpV4R;F;lhxYCE{nC@) zDt=yLvdM>UyL?AQq&+(59#FTi|W@38Y&NuRl|{meEGOkpTIKZw#yNco8D&O zhx>a>OrJ$SQ%BGl)xtAR<2P{FO!q;3Y-5|H1}J$VIdooUS6@Aae}x zRH*?R)86D&vQvyP-t19i?X~J7Q88zyn$b4EH(I*D*-Q;!pVQ(LgEEwZ)_=ZQqSE<) zcs-DnmpK`4oqS#8fInRPg`xin5(U9y%Amz>S3c+tnM>nXEdsuD9Vc_(eeYBG#!$m> zvP*FF_pSZ1u*DofcUW%8LC|c2t4$Y)9`I5^@a1d@nBw_0O=pM6sfmqo`FnnQL5lcZ zx)}b>-zS=WG0=+W)8Q=YqUJT@MCtxHNY)tP7REO9!>->DS&^Q+Tsk<;@#cwJ!sQzr zpWeUc=fx&U0_{OEZ~U3GXjlL)K_ujWq>eq@d;P8OA96l1LMdF!iE;3*+LW`SY9`5Y>O zv%hX+0)399lie<3=@@2+NO>kOI*{{@;4liC>(fQ_0f+>u)-lE`24@GcFgjZ_Sbq}T1GH^Pa)hoxz z^)6v@9a!IG%Bpe`E{pZ;6N|!&0S&~^USjF^RpbVuDP-MEilEh;+~#&8dj8;U(}a6k zZLz(~w4MSIl-wyzi{Nl-aTlJqzpY1NqdLivYEbgPobI(?ec^~deRiFw3+B|5R<@_d zMhzd{l32R;pejW5IQ@#>ErSO!+a7~a%aHf8Hwj4(aXq(p)F*^sOkvSG?9eT8*Isu1 zfdili03{pSJx{2(8MJvDoPWl3DlcCA*y!IG{)uo+c)zmV3^YAoI2bL9U`eLfuz|J5sfayffZ?<;e>YNvmh-K@}EvQQ4?sGNqAof7YXXfpJJ zP>G_IitRcVzcD0G+9&EtD=4vZf7(m9TsAnQ3kL`~Twl*K>?8Y_dY6B~CwR8cd5+zi z*vl>4A624zK@75Qa&t4>W-X9HIL8%T5$7=}Pi%a7d22r-H?H~0WkH5pRa*mvCaJ}a zLiE$`7tBt@L-95}hrQu|@pDw}C$ITHy)${1^G2u!bCg6{3>;Cdws zeU<-vf&4_w3q8@P=4Txv!z$~|rrm!ccO({IH@f1U*7@8XuZzz`NXPu(Zp*dsEs%w7 zb19TOkm$n1U+of-Vu=&Am?&Fi;3&uzm{VJ%AIz!wg2@N$3AS%QzrNC+f878<<8vT)b6WFtXsN;RB@X9ZC6^8)&c+G!0}tL&6B$*KiG_)(V( zu|KAQQOSqpk__wxqG(Nzc + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoVectorUnaryMetric< ObjectiveVector, R > Member List

This is the complete list of members for moeoVectorUnaryMetric< ObjectiveVector, R >, including all inherited members.

+ + + + +
functor_category()eoUF< const std::vector< ObjectiveVector > &, R > [static]
operator()(const std::vector< ObjectiveVector > &)=0eoUF< const std::vector< ObjectiveVector > &, R > [pure virtual]
~eoFunctorBase()eoFunctorBase [virtual]
~eoUF()eoUF< const std::vector< ObjectiveVector > &, R > [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.html new file mode 100644 index 000000000..61cf1863e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.html @@ -0,0 +1,62 @@ + + +ParadisEO-MOEO: moeoVectorUnaryMetric< ObjectiveVector, R > Class Template Reference + + + + +
+
+ +

moeoVectorUnaryMetric< ObjectiveVector, R > Class Template Reference

Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors). +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoVectorUnaryMetric< ObjectiveVector, R >: +

+ +moeoUnaryMetric< const std::vector< ObjectiveVector > &, R > +eoUF< const std::vector< ObjectiveVector > &, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + +
+

Detailed Description

+

template<class ObjectiveVector, class R>
+ class moeoVectorUnaryMetric< ObjectiveVector, R >

+ +Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors). +

+ +

+Definition at line 50 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoVectorUnaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9c163bf4aac2c37766be9f0ecc36f89a08a11d GIT binary patch literal 2011 zcmd5-Yc!kb7XHwgmbTK%6s@DtQD%BUX;q^niVkXohDOK)#m$-bsaUqKKjz2$c=vwZwfFmHKhJ*N zByY6qW}RI+003-ucXPo2faZ!CH>}fA$3!p5I(0Je{?_-TN~Kamm8yZkxR9nsYp0>1 z;dYa1M19q`fkFEKj$^%70APKjyUPh*Qm#DD@A0!^TTbq=WAPtF8Q;<}I&9cxIYZTs z$H0CP^g8UT)f4(S_!y+s+L^Z>YZ6W?!?K0(x_g*lP-vz!w0=_Kh*5xi*c)`~MsBOF zZ#3|+C&pB~Am@EJ2xjRPL@nXnvKG1W=NMrnbrLAO8{L)h)a*VC1xXRIMFUy1pG+{P zO-7sU?|0o)aGt~eYuKMc)03+8onD* zqX&wG)@0JV755Q6%aAYEI^T8gqzUF8haBLOunbTPdz*ppdgWQCBkkZ)djMfAJ|gol z`nG>9{w=<1r?|~Qgx9*d@`A+|zhWvLl~DGEz>_4dtTkx+15N3DH$j0qO|-Z{R24f< z0NXYgIqERAHY~*yY~K)k3-C-_JmL`765qM?vN{(DZcBCpOf9!PHvsJfUE{l*8hf|c z#eLzlKFx6gz^LD9{*#MB`EKYlO>H@>VA67sl(XBhYp4gQTTOG3n{YUkc6?jZ#*3U~ zajE~$r7Tuua=L$|P1a6{?~m?c`-AZ@cPNG`x^2j;M49fvza}j&{V#_odk&HN1lHO5 zy|#P|W&=^vYiiuuvk2{ju4+@CL;>f@!Hwc^40zih34in3oV$QVsFB=;-BwV z%?!UPG0|_FQy`cXt>-w#^6enU96DaqQWWBTbgY_U;g*?CMx04|d`j_TJ*)NWLo;88tcFdA z!kW87u}Tt7weLFB=E)V19fEKgOM?7!tPM5>GUQ-s2KhXDCXo0n)VgD^iEqVex^&Qb zyctW62;*mXiZ|6qFED~pJ0lP)Hx)0h>U+$aM+vd}!h)rG|5+SUp6wkE7^o#2ZoU%3 zp&8!ipoEH+50^lZ7^)(PWJrb;+{^4`OAi+=G7>QG^rei-;Guf*0ItHGo|5w~>D;mO z{N-1|+S!CGx1eS01Jlv|bv|#NzlUNYMZ=-UtZ{LG;b7i_J2;AHnAm;ftl_rilpKFW zz#{dh*uIgmnVSb@7Zo^EYmbti`yOUnLOJ-?6n>Rkz$*T@+=E^7fW)Gt*9Q4F>)ZZ( zV&~_mr|=tb72n8BPXA^gAI0`Zuw~VW>U^RBUS)4p--#1#E%>ysL=TY8Iv$SYt@8yS zUGO)+ON6kGJS>jsmEkyNPlVU}YRc7|aG0t{_Ae^UXI}0n^t97TfLkz-j=5f$!AwT= zmu4|eYs?2I^zlf_Y2j1^c45|ef81cZlGPEktKL&h-13_iUw}ua)P+<17G_P<#g>mm zV6a|>;<+HKsy+x zvE!!^kI<)Ja}nT=WzyX3=r+TxflHA{%0#l6j1bdbL&__O{8hquxX`DZ-7mN#^(M$A zROjgza#-y5Xxkp1c0G5sb5pGJ&{CeWy#yR?M8XxWb4Ca+aIym#^_rfqvQyNhaQOZF zNgnleck~<#b@`_KqNn{Xv=O)4Y#Ju|j2(W-85!Fh)-h_h+X7X?M$HfKp&w|}rq|?9 zHY%ao!P4cW6sdr!{DeEikO_plNWJADdf97vqBh9 zf^&KHl%wiQFYP+r=H@^ugoMKsb<yYUc{`k{?U(OAt6OQx7 z5zopN%M}E(YTWyK57np~Tdj(A=vgTIBuh1)ZyJy*fqOL3H7dCK=d7Hy72w~0Yo&`QUCw| literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric-members.html b/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric-members.html new file mode 100644 index 000000000..004d21c87 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric-members.html @@ -0,0 +1,40 @@ + + +ParadisEO-MOEO: Member List + + + + +
+
+ +

moeoVectorVsVectorBinaryMetric< ObjectiveVector, R > Member List

This is the complete list of members for moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >, including all inherited members.

+ + + + +
functor_category()eoBF< A1, A2, R > [static]
operator()(A1, A2)=0eoBF< A1, A2, R > [pure virtual]
~eoBF()eoBF< A1, A2, R > [virtual]
~eoFunctorBase()eoFunctorBase [virtual]


Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.html b/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.html new file mode 100644 index 000000000..a655a54f4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.html @@ -0,0 +1,62 @@ + + +ParadisEO-MOEO: moeoVectorVsVectorBinaryMetric< ObjectiveVector, R > Class Template Reference + + + + +
+
+ +

moeoVectorVsVectorBinaryMetric< ObjectiveVector, R > Class Template Reference

Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors). +More... +

+#include <moeoMetric.h> +

+

Inheritance diagram for moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >: +

+ +moeoBinaryMetric< A1, A2, R > +eoBF< A1, A2, R > +moeoMetric +eoFunctorBase +eoFunctorBase + +List of all members. + +
+

Detailed Description

+

template<class ObjectiveVector, class R>
+ class moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >

+ +Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors). +

+ +

+Definition at line 64 of file moeoMetric.h.


The documentation for this class was generated from the following file: +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.png b/trunk/paradiseo-moeo/doc/html/classmoeoVectorVsVectorBinaryMetric.png new file mode 100644 index 0000000000000000000000000000000000000000..f8617fb5cede52887576a1c73d8bbc563ff261b7 GIT binary patch literal 1856 zcmb7FdsNcd7N&%;>nk;()WWRP5z)$ghGtHhnn~spn+qAHsiCdsx=J9o`m^T#>+JNulo*IwVZ_c_`A zXfJIIBMlG;r0wJF5dZ?MZ&2Y5u$pSt8TN})nJxZDgFM&P)>Lq9t)r|g{GTfHaddQa zq&--Bsamch2A~5$2gRZ&5a^2`9}oAS)Z*FV*~AJbUC-Msh?5M&p35|ByTH=h zGv+^F1c#CC~G|?`3wrDD;|3T%1GY=VJ-c_6~gIPHg>d&6)+W39O5mFO@ zH+Hs_CW?lPaH6@>Gn87)*iqJSydz-Rlownp$B^LD`o^aRVSI$ciG1O)2`&7g=ulY! zCI({KN?G0ftqs1=b`;8jG3vJ89a{|@)3G|Q#MP3~+idV9A+i-V=6!dLVmCfLjc{kM zo?H4OpN^rO%y#w4kDJpFhlgHX;TYgw0j9jbacJe8=gMa_FY6DE25Y?9ngVg-rzyp9 zHGkxW9Edxx{Yw~_OSy&79q)v%+Ac=5u~%{@)DnZXlzDA#FwB80%1J~>@4{j-5mIy; zqh)e3{)mvw3{y9tQ8w?^{Wq!q9qBJPSqV$VM90b5Tt1oM0#=%Ue~(DjAwir=C$27i zCpNc2^w?KV?CLXnOI?2Z`j(o4%S*QLA=sMO!4X3-ic8tr&IUW&B!zk{z65Q?Pq43{ z=A?uJfb$8?Rd+ibkN!)Ej}G^Y&urSO8w zLipsAO<4B`^xDTS&wrLes-JBC%J#sdwvfxX8xCex^Beq9A8u;P55Blu}7<#Bcf*=`uotkUZyTfNk zSky?|ve!IzZ?2n+)Q>}*@(*{OzMf!^ouICveCv94^7xlk+an;&D zIu|s|FspShMr{=L5oJ?ji!BZA%;^q>{;L}Ae^J~l|INc z8Dc$SS!58tq+NdAqFQB3^*ZxYeF3+1 zADiSOH>sP_mKdW&i{`L(&l}dMUX_J=x~dM+GHDN}UO5PSnYy_Cv%dNhjz3rTKg54> zYTnm;(nl}t^kc_s*gqSP()~IA3*)8Rrg~$~8Q!#cBe+Ip;!GltY5b_0gx!Js+pZo- z4bs4&OgEdQXEG?N?pb$fTT0AO zSuqbYpE!+%+7x}CGiWI&%)8&Si)PFlW!^amd(Ak8>gxZFTRcp*;$EfOb8DV8XqKgi*$d0bd?V|lv@V%0nTB$=;gG18%HO{;Q5MnQ1c}2&S$8}x5)?*~EpHQX9 zT>pbBdnjLCezz-~kQBOS=EKE=BiO3?d5w$@sZY@)SE-PTTMJltZFx>-NsM>g8c$OU p=aCWrU#5@VNl9q4W2U~sEv$!htk?-eReg6LA5XML{a4|XUjdL-bCCc5 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/doxygen.css b/trunk/paradiseo-moeo/doc/html/doxygen.css new file mode 100644 index 000000000..5d583694e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/doxygen.css @@ -0,0 +1,358 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.nav { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} +A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} +A.codeRef:link { font-weight: normal; color: #0000FF} +A.codeRef:visited { font-weight: normal; color: #0000FF} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { background: #e8eef2; + font-weight: bold; +} +HR { height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; +} +.memnav { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eef3f5; + border-width: 1px; + border-style: solid; + border-color: #dedeee; + -moz-border-radius: 8px 8px 8px 8px; +} +.memname { + white-space: nowrap; + font-weight: bold; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #d5e1e8; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #84b0c7; + font-weight: bold; + -moz-border-radius: 8px 8px 8px 8px; +} +.paramkey { + text-align: right; +} +.paramtype { + white-space: nowrap; +} +.paramname { + color: #602020; + font-style: italic; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +.directory { font-size: 9pt; font-weight: bold; } +.directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; } +.directory > h3 { margin-top: 0; } +.directory p { margin: 0px; white-space: nowrap; } +.directory div { display: none; margin: 0px; } +.directory img { vertical-align: -30%; } + diff --git a/trunk/paradiseo-moeo/doc/html/doxygen.png b/trunk/paradiseo-moeo/doc/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a274bbaffdd67f6d784c894d9cf28729db0e14 GIT binary patch literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/files.html b/trunk/paradiseo-moeo/doc/html/files.html new file mode 100644 index 000000000..a7a5f1dcc --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/files.html @@ -0,0 +1,102 @@ + + +ParadisEO-MOEO: File Index + + + + +
+
+

ParadisEO-MOEO File List

Here is a list of all documented files with brief descriptions: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
index.h [code]
make_checkpoint_moeo.h [code]
make_continue_moeo.h [code]
make_ea_moeo.h [code]
MOEO.h [code]
moeoAchievementFitnessAssignment.h [code]
moeoAdditiveEpsilonBinaryMetric.h [code]
moeoAggregativeComparator.h [code]
moeoAlgo.h [code]
moeoArchive.h [code]
moeoArchiveObjectiveVectorSavingUpdater.h [code]
moeoArchiveUpdater.h [code]
moeoBinaryMetricSavingUpdater.h [code]
moeoBitVector.h [code]
moeoCombinedLS.h [code]
moeoComparator.h [code]
moeoContributionMetric.h [code]
moeoConvertPopToObjectiveVectors.h [code]
moeoCriterionBasedFitnessAssignment.h [code]
moeoCrowdingDistanceDiversityAssignment.h [code]
moeoDetTournamentSelect.h [code]
moeoDistance.h [code]
moeoDistanceMatrix.h [code]
moeoDiversityAssignment.h [code]
moeoDiversityThenFitnessComparator.h [code]
moeoDummyDiversityAssignment.h [code]
moeoDummyFitnessAssignment.h [code]
moeoEA.h [code]
moeoEasyEA.h [code]
moeoElitistReplacement.h [code]
moeoEntropyMetric.h [code]
moeoEnvironmentalReplacement.h [code]
moeoEuclideanDistance.h [code]
moeoEvalFunc.h [code]
moeoFastNonDominatedSortingFitnessAssignment.h [code]
moeoFitnessAssignment.h [code]
moeoFitnessThenDiversityComparator.h [code]
moeoFrontByFrontCrowdingDistanceDiversityAssignment.h [code]
moeoFrontByFrontSharingDiversityAssignment.h [code]
moeoGDominanceObjectiveVectorComparator.h [code]
moeoGenerationalReplacement.h [code]
moeoHybridLS.h [code]
moeoHypervolumeBinaryMetric.h [code]
moeoIBEA.h [code]
moeoIndicatorBasedFitnessAssignment.h [code]
moeoLS.h [code]
moeoManhattanDistance.h [code]
moeoMetric.h [code]
moeoNormalizedDistance.h [code]
moeoNormalizedSolutionVsSolutionBinaryMetric.h [code]
moeoNSGA.h [code]
moeoNSGAII.h [code]
moeoObjectiveObjectiveVectorComparator.h [code]
moeoObjectiveVector.h [code]
moeoObjectiveVectorComparator.h [code]
moeoObjectiveVectorDouble.h [code]
moeoObjectiveVectorTraits.cpp [code]
moeoObjectiveVectorTraits.h [code]
moeoOneObjectiveComparator.h [code]
moeoParetoBasedFitnessAssignment.h [code]
moeoParetoObjectiveVectorComparator.h [code]
moeoRandomSelect.h [code]
moeoRealVector.h [code]
moeoReplacement.h [code]
moeoRouletteSelect.h [code]
moeoScalarFitnessAssignment.h [code]
moeoSelectFromPopAndArch.h [code]
moeoSelectOne.h [code]
moeoSelectors.h [code]
moeoSharingDiversityAssignment.h [code]
moeoStochTournamentSelect.h [code]
moeoVector.h [code]
+
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/ftv2blank.png b/trunk/paradiseo-moeo/doc/html/ftv2blank.png new file mode 100644 index 0000000000000000000000000000000000000000..493c3c0b615ade5b22027bde773faf2c0e076d66 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr2qYM%T@!Q%(o7{me!&ckj8p!u14)&*MwA5S zr6z#mEsk^N1FBF3sc_EE%}vcKVF=AhO-xa6_jFST&P^;T z2~I3aEm8;rVk12R#UIz>f`J-DJY5_^DsClP9B62eH+WF*G=YJMp~A-KbWwke5Kx}M M)78&qol`;+0EL(^EC2ui literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2doc.png b/trunk/paradiseo-moeo/doc/html/ftv2doc.png new file mode 100644 index 0000000000000000000000000000000000000000..f72999f92172cca6edaa2538286b3e369bec9f49 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^5yjnX4egh%q=bp-`Pe zR7&bp17l3gfhmh7Fm(iZ2eAfco|q!h5)>qKG?UBh!IC9QGMbJAHf6IEiufk_g|d7~ qkWqJ4k(|I-Aeo-5U~n{Fnc?dN!3Uwu?t6hQVDNPHb6Mw<&;$TLIZ`G7 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2folderclosed.png b/trunk/paradiseo-moeo/doc/html/ftv2folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..d6d063440cbf13c4128dacd96661b6fce58abf26 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^55uo^`BphW;jCHO69?}tw{JfcdnZ<*@N=4I z?xF5Qc|QYEmKAIZ;JRGVHe=bn*tx1_|J^^vyg*oVM#A1kZlFULJYD@<);T3K0RTgB BWg7qh literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2folderopen.png b/trunk/paradiseo-moeo/doc/html/ftv2folderopen.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe2c913cf493ee37ad8e3a5132382138d93ac92 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^5u(C zYP)Mg%H-DB+{J~>rPn_#pYTax?r*V6ubqGX{lvROQ{?n5_cbm+cQAOm`njxgN@xNA D92;js literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2lastnode.png b/trunk/paradiseo-moeo/doc/html/ftv2lastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b9ba90cb0cf71c8ce662956bfee7d64cf60fa6 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6UZ?L@CkAK|NlRbNhD}!Xpp$P zU;Pg)ksC(lf|p%(p+w2Gk+!>EaktaVt4N i!r*{E4>QXNV>t$uAA#a^n)TVt_DW*G8-srQl%FeIsRSdYm zeDdtWec}u&7@8h5rqv#p7g*pRdwwmugmlS-+cHV~j}#7`Nwj9m+AU)JGGo`8z_}`K z?s#Xsy%Z;1_jl5Y+?Gum8WyK6`MBvup0SAOKJ)mWcHyteJ?WLL>>-)=?&<$H&t5oH Vd!azZ1yDdSc)I$ztaD0e0sw}(dc*(# literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2mlastnode.png b/trunk/paradiseo-moeo/doc/html/ftv2mlastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..09ceb6adb01054ce799ad20c0e818ab9272f2df2 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr#LU3Jc=+&fg$isFPOjJ*AaIJQGm()YSDb0rfjgNefXW#>UHx3vIVCg! E0ORy6RsaA1 literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2mnode.png b/trunk/paradiseo-moeo/doc/html/ftv2mnode.png new file mode 100644 index 0000000000000000000000000000000000000000..3254c05112199fbc80aad313611c58a5b388792d GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6Ub2s@Ck7}aNq!ti3c<^Gz9OH zn+a6GSQ6wH%;50sMjDVKR^l2_5}cn_Ql40p%8;I!W>k=uu3)5RqGz-?&YcgaLd(;| zF{I*Fa>4?=2W(CyOv{5p*uLi}G<-ambjQcb>&~4!CzK3KXWY6d$*{eWU47N}X+XCz OFnGH9xvXPg)ksC(lf|p%(p+w2Gk+y>EaktaVt4N l!r*{E4>Lv;t literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2plastnode.png b/trunk/paradiseo-moeo/doc/html/ftv2plastnode.png new file mode 100644 index 0000000000000000000000000000000000000000..0b07e00913d8069ebbb51bd7fd6d70d8bba88f75 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr#LU3Jc=+&MJ literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2pnode.png b/trunk/paradiseo-moeo/doc/html/ftv2pnode.png new file mode 100644 index 0000000000000000000000000000000000000000..2001b797ba2b98a4127f1d3efca64aef08bf6d51 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6Ub2s@Ck7}aNq!ti3c<^Gz9OH zn+a6GSQ6wH%;50sMjDVKR^l2_5}cn_Ql40p%8;I!W>k=uu3)5RqGz-?&Ycga!obtT zF{I*Fa>4?=2W(Dkd1@Anj~<0|oqBMOmqox%*rjK-r)THv+0v0L%h-agt(X~hWwYzA SIxU|Ma*U^|pUXO@geCywmoZiV literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/ftv2vertline.png b/trunk/paradiseo-moeo/doc/html/ftv2vertline.png new file mode 100644 index 0000000000000000000000000000000000000000..b330f3a33c0085c183ff39fc56b1b274160c1da0 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRr!py+H=+kU?6UZ?L@CkAK|NlRbNhD}!Xpp$P zU;Pg)ksC(lf|p%(p+w2Gqgt>EaktaVt4N e!r*{^G#i7W2*a|cHZQDzQVgE1elF{r5}E+)J2fZ( literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/functions.html b/trunk/paradiseo-moeo/doc/html/functions.html new file mode 100644 index 000000000..3204c156a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/functions.html @@ -0,0 +1,294 @@ + + +ParadisEO-MOEO: Class Members + + + + +
+
+ + +
+ +
+ +

+Here is a list of all documented class members with links to the class documentation for each member: +

+

- a -

+

- b -

+

- c -

+

- d -

+

- e -

+

- f -

+

- g -

+

- h -

+

- i -

+

- k -

+

- l -

+

- m -

+

- n -

+

- o -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+

- v -

+

- w -

+

- ~ -

+
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/functions_func.html b/trunk/paradiseo-moeo/doc/html/functions_func.html new file mode 100644 index 000000000..b24648c17 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/functions_func.html @@ -0,0 +1,202 @@ + + +ParadisEO-MOEO: Class Members - Functions + + + + +
+
+ + +
+ +
+ +

+  +

+

- a -

+

- c -

+

- d -

+

- e -

+

- f -

+

- h -

+

- i -

+

- l -

+

- m -

+

- n -

+

- o -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+

- v -

+

- ~ -

+
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/functions_type.html b/trunk/paradiseo-moeo/doc/html/functions_type.html new file mode 100644 index 000000000..3fa5ccc92 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/functions_type.html @@ -0,0 +1,54 @@ + + +ParadisEO-MOEO: Class Members - Typedefs + + + + +
+
+ + +  +

+

+
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/functions_vars.html b/trunk/paradiseo-moeo/doc/html/functions_vars.html new file mode 100644 index 000000000..d3d61272e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/functions_vars.html @@ -0,0 +1,181 @@ + + +ParadisEO-MOEO: Class Members - Variables + + + + +
+
+ + +
+ +
+ +

+  +

+

- a -

+

- b -

+

- c -

+

- d -

+

- e -

+

- f -

+

- g -

+

- i -

+

- k -

+

- l -

+

- m -

+

- n -

+

- o -

+

- p -

+

- r -

+

- s -

+

- t -

+

- v -

+

- w -

+
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/hierarchy.html b/trunk/paradiseo-moeo/doc/html/hierarchy.html new file mode 100644 index 000000000..4b6195ec0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/hierarchy.html @@ -0,0 +1,289 @@ + + +ParadisEO-MOEO: Hierarchical Index + + + + +
+
+ +

ParadisEO-MOEO Class Hierarchy

This inheritance list is sorted roughly, but not completely, alphabetically: +
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/index.html b/trunk/paradiseo-moeo/doc/html/index.html new file mode 100644 index 000000000..7e73d848d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/index.html @@ -0,0 +1,8 @@ + + +ParadisEO-MOEO + + + + + diff --git a/trunk/paradiseo-moeo/doc/html/index_8h-source.html b/trunk/paradiseo-moeo/doc/html/index_8h-source.html new file mode 100644 index 000000000..1a026b6f5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/index_8h-source.html @@ -0,0 +1,29 @@ + + +ParadisEO-MOEO: index.h Source File + + + + +
+
+

index.h

00001 
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/installdox b/trunk/paradiseo-moeo/doc/html/installdox new file mode 100755 index 000000000..1628445b3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/installdox @@ -0,0 +1,117 @@ +#!/usr/bin/perl + +%subst = ( "eo.doxytag", ""); +$quiet = 0; + +if (open(F,"search.cfg")) +{ + $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; + $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; +} + +while ( @ARGV ) { + $_ = shift @ARGV; + if ( s/^-// ) { + if ( /^l(.*)/ ) { + $v = ($1 eq "") ? shift @ARGV : $1; + ($v =~ /\/$/) || ($v .= "/"); + $_ = $v; + if ( /(.+)\@(.+)/ ) { + if ( exists $subst{$1} ) { + $subst{$1} = $2; + } else { + print STDERR "Unknown tag file $1 given with option -l\n"; + &usage(); + } + } else { + print STDERR "Argument $_ is invalid for option -l\n"; + &usage(); + } + } + elsif ( /^q/ ) { + $quiet = 1; + } + elsif ( /^\?|^h/ ) { + &usage(); + } + else { + print STDERR "Illegal option -$_\n"; + &usage(); + } + } + else { + push (@files, $_ ); + } +} + +foreach $sub (keys %subst) +{ + if ( $subst{$sub} eq "" ) + { + print STDERR "No substitute given for tag file `$sub'\n"; + &usage(); + } + elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) + { + print "Substituting $subst{$sub} for each occurence of tag file $sub\n"; + } +} + +if ( ! @files ) { + if (opendir(D,".")) { + foreach $file ( readdir(D) ) { + $match = ".html"; + next if ( $file =~ /^\.\.?$/ ); + ($file =~ /$match/) && (push @files, $file); + ($file =~ "tree.js") && (push @files, $file); + } + closedir(D); + } +} + +if ( ! @files ) { + print STDERR "Warning: No input files given and none found!\n"; +} + +foreach $f (@files) +{ + if ( ! $quiet ) { + print "Editing: $f...\n"; + } + $oldf = $f; + $f .= ".bak"; + unless (rename $oldf,$f) { + print STDERR "Error: cannot rename file $oldf\n"; + exit 1; + } + if (open(F,"<$f")) { + unless (open(G,">$oldf")) { + print STDERR "Error: opening file $oldf for writing\n"; + exit 1; + } + if ($oldf ne "tree.js") { + while () { + s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; + print G "$_"; + } + } + else { + while () { + s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; + print G "$_"; + } + } + } + else { + print STDERR "Warning file $f does not exist\n"; + } + unlink $f; +} + +sub usage { + print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; + print STDERR "Options:\n"; + print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; + print STDERR " -q Quiet mode\n\n"; + exit 1; +} diff --git a/trunk/paradiseo-moeo/doc/html/main.html b/trunk/paradiseo-moeo/doc/html/main.html new file mode 100644 index 000000000..4b318cd38 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/main.html @@ -0,0 +1,38 @@ + + +ParadisEO-MOEO: Welcome to ParadisEO-MOEO + + + + +
+
+

Welcome to ParadisEO-MOEO

+

+

1.0

+intro

+ParadisEO-MOEO is a white-box object-oriented generic framework dedicated to the flexible design of evolutionary multi-objective algorithms. This paradigm-free software embeds some features and techniques for Pareto-based resolution and aims to provide a set of classes allowing to ease and speed up the development of computationally efficient programs. It is based on a clear conceptual distinction between the solution methods and the multi-objective problems they are intended to solve. This separation confers a maximum design and code reuse. ParadisEO-MOEO provides a broad range of archive-related features (such as elitism or performance metrics) and the most common Pareto-based fitness assignment strategies (MOGA, NSGA, SPEA, IBEA and more). Furthermore, parallel and distributed models as well as hybridization mechanisms can be applied to an algorithm designed within ParadisEO-MOEO using the whole version of ParadisEO.

+Tutorials

+Tutorials for ParadisEO-MOEO are available here.

+install

+The installation procedure of the package is detailed in the README file in the top-directory of the source-tree.

+design

+For an introduction to the design of ParadisEO-MOEO, you can look at the ParadisEO website.
Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/make__checkpoint__moeo_8h-source.html b/trunk/paradiseo-moeo/doc/html/make__checkpoint__moeo_8h-source.html new file mode 100644 index 000000000..6526cf7d9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/make__checkpoint__moeo_8h-source.html @@ -0,0 +1,189 @@ + + +ParadisEO-MOEO: make_checkpoint_moeo.h Source File + + + + +
+
+

make_checkpoint_moeo.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // make_checkpoint_moeo.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MAKE_CHECKPOINT_MOEO_H_
+00014 #define MAKE_CHECKPOINT_MOEO_H_
+00015 
+00016 #include <stdlib.h>
+00017 #include <sstream>
+00018 #include <eoContinue.h>
+00019 #include <eoEvalFuncCounter.h>
+00020 #include <utils/checkpointing>
+00021 #include <utils/selectors.h>
+00022 #include <utils/eoParser.h>
+00023 #include <utils/eoState.h>
+00024 #include <metric/moeoContributionMetric.h>
+00025 #include <metric/moeoEntropyMetric.h>
+00026 #include <utils/moeoArchiveUpdater.h>
+00027 #include <utils/moeoArchiveObjectiveVectorSavingUpdater.h>
+00028 #include <utils/moeoBinaryMetricSavingUpdater.h>
+00029 
+00030 bool testDirRes(std::string _dirName, bool _erase);
+00031 
+00041 template < class MOEOT >
+00042 eoCheckPoint < MOEOT > & do_make_checkpoint_moeo (eoParser & _parser, eoState & _state, eoEvalFuncCounter < MOEOT > & _eval, eoContinue < MOEOT > & _continue, eoPop < MOEOT > & _pop, moeoArchive < MOEOT > & _archive)
+00043 {
+00044     eoCheckPoint < MOEOT > & checkpoint = _state.storeFunctor(new eoCheckPoint < MOEOT > (_continue));
+00045     /* the objective vector type */
+00046     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00047     
+00049     // Counters
+00051     // is nb Eval to be used as counter?
+00052     //bool useEval = _parser.getORcreateParam(true, "useEval", "Use nb of eval. as counter (vs nb of gen.)", '\0', "Output").value();
+00053     // Create anyway a generation-counter parameter
+00054     eoValueParam<unsigned int> *generationCounter = new eoValueParam<unsigned int>(0, "Gen.");
+00055     // Create an incrementor (sub-class of eoUpdater).
+00056     eoIncrementor<unsigned int> & increment = _state.storeFunctor( new eoIncrementor<unsigned int>(generationCounter->value()) );
+00057     // Add it to the checkpoint
+00058     checkpoint.add(increment);
+00059     // dir for DISK output
+00060     std::string & dirName =  _parser.getORcreateParam(std::string("Res"), "resDir", "Directory to store DISK outputs", '\0', "Output").value();
+00061     // shoudl we empty it if exists
+00062     eoValueParam<bool>& eraseParam = _parser.getORcreateParam(true, "eraseDir", "erase files in dirName if any", '\0', "Output");
+00063     bool dirOK = false;            // not tested yet
+00064 
+00065     // Dump of the whole population
+00066     //-----------------------------
+00067     bool printPop = _parser.getORcreateParam(false, "printPop", "Print sorted pop. every gen.", '\0', "Output").value();
+00068     eoSortedPopStat<MOEOT> * popStat;
+00069     if ( printPop ) // we do want pop dump
+00070     {
+00071         popStat = & _state.storeFunctor(new eoSortedPopStat<MOEOT>);
+00072         checkpoint.add(*popStat);
+00073     }
+00074 
+00076     // State savers
+00078     // feed the state to state savers
+00079     // save state every N  generation
+00080     eoValueParam<unsigned int>& saveFrequencyParam = _parser.createParam((unsigned int)(0), "saveFrequency", "Save every F generation (0 = only final state, absent = never)", '\0', "Persistence" );
+00081     if (_parser.isItThere(saveFrequencyParam))
+00082     {
+00083         // first make sure dirName is OK
+00084         if (! dirOK )
+00085             dirOK = testDirRes(dirName, eraseParam.value()); // TRUE
+00086         unsigned int freq = (saveFrequencyParam.value()>0 ? saveFrequencyParam.value() : UINT_MAX );
+00087 #ifdef _MSVC
+00088         std::string stmp = dirName + "\generations";
+00089 #else
+00090         std::string stmp = dirName + "/generations";
+00091 #endif
+00092         eoCountedStateSaver *stateSaver1 = new eoCountedStateSaver(freq, _state, stmp);
+00093         _state.storeFunctor(stateSaver1);
+00094         checkpoint.add(*stateSaver1);
+00095     }
+00096     // save state every T seconds
+00097     eoValueParam<unsigned int>& saveTimeIntervalParam = _parser.getORcreateParam((unsigned int)(0), "saveTimeInterval", "Save every T seconds (0 or absent = never)", '\0',"Persistence" );
+00098     if (_parser.isItThere(saveTimeIntervalParam) && saveTimeIntervalParam.value()>0)
+00099     {
+00100         // first make sure dirName is OK
+00101         if (! dirOK )
+00102             dirOK = testDirRes(dirName, eraseParam.value()); // TRUE
+00103 #ifdef _MSVC
+00104         std::string stmp = dirName + "\time";
+00105 #else
+00106         std::string stmp = dirName + "/time";
+00107 #endif
+00108         eoTimedStateSaver *stateSaver2 = new eoTimedStateSaver(saveTimeIntervalParam.value(), _state, stmp);
+00109         _state.storeFunctor(stateSaver2);
+00110         checkpoint.add(*stateSaver2);
+00111     }
+00112 
+00114     // Archive
+00116     // update the archive every generation
+00117     bool updateArch = _parser.getORcreateParam(true, "updateArch", "Update the archive at each gen.", '\0', "Evolution Engine").value();
+00118     if (updateArch)
+00119     {
+00120         moeoArchiveUpdater < MOEOT > * updater = new moeoArchiveUpdater < MOEOT > (_archive, _pop);
+00121         _state.storeFunctor(updater);
+00122         checkpoint.add(*updater);
+00123     }
+00124     // store the objective vectors contained in the archive every generation
+00125     bool storeArch = _parser.getORcreateParam(false, "storeArch", "Store the archive's objective vectors at each gen.", '\0', "Output").value();
+00126     if (storeArch)
+00127     {
+00128         if (! dirOK )
+00129             dirOK = testDirRes(dirName, eraseParam.value()); // TRUE
+00130 #ifdef _MSVC
+00131         std::string stmp = dirName + "\arch";
+00132 #else
+00133         std::string stmp = dirName + "/arch";
+00134 #endif
+00135         moeoArchiveObjectiveVectorSavingUpdater < MOEOT > * save_updater = new moeoArchiveObjectiveVectorSavingUpdater < MOEOT > (_archive, stmp);
+00136         _state.storeFunctor(save_updater);
+00137         checkpoint.add(*save_updater);
+00138     }
+00139     // store the contribution of the non-dominated solutions
+00140     bool cont = _parser.getORcreateParam(false, "contribution", "Store the contribution of the archive at each gen.", '\0', "Output").value();
+00141     if (cont)
+00142     {
+00143         if (! dirOK )
+00144             dirOK = testDirRes(dirName, eraseParam.value()); // TRUE
+00145 #ifdef _MSVC
+00146         std::string stmp = dirName + "\contribution";
+00147 #else
+00148         std::string stmp = dirName + "/contribution";
+00149 #endif
+00150         moeoContributionMetric < ObjectiveVector > * contribution = new moeoContributionMetric < ObjectiveVector >;
+00151         moeoBinaryMetricSavingUpdater < MOEOT > * contribution_updater = new moeoBinaryMetricSavingUpdater < MOEOT > (*contribution, _archive, stmp);
+00152         _state.storeFunctor(contribution_updater);
+00153         checkpoint.add(*contribution_updater);
+00154     }
+00155     // store the entropy of the non-dominated solutions
+00156     bool ent = _parser.getORcreateParam(false, "entropy", "Store the entropy of the archive at each gen.", '\0', "Output").value();
+00157     if (ent)
+00158     {
+00159         if (! dirOK )
+00160             dirOK = testDirRes(dirName, eraseParam.value()); // TRUE
+00161 #ifdef _MSVC
+00162         std::string stmp = dirName + "\entropy";
+00163 #else
+00164         std::string stmp = dirName + "/entropy";
+00165 #endif
+00166         moeoEntropyMetric < ObjectiveVector > * entropy = new moeoEntropyMetric < ObjectiveVector >;
+00167         moeoBinaryMetricSavingUpdater < MOEOT > * entropy_updater = new moeoBinaryMetricSavingUpdater < MOEOT > (*entropy, _archive, stmp);
+00168         _state.storeFunctor(entropy_updater);
+00169         checkpoint.add(*entropy_updater);
+00170     }
+00171 
+00172     // and that's it for the (control and) output
+00173     return checkpoint;
+00174 }
+00175 
+00176 #endif /*MAKE_CHECKPOINT_MOEO_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/make__continue__moeo_8h-source.html b/trunk/paradiseo-moeo/doc/html/make__continue__moeo_8h-source.html new file mode 100644 index 000000000..1aebccc1e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/make__continue__moeo_8h-source.html @@ -0,0 +1,123 @@ + + +ParadisEO-MOEO: make_continue_moeo.h Source File + + + + +
+
+

make_continue_moeo.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // make_continue_moeo.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MAKE_CONTINUE_MOEO_H_
+00014 #define MAKE_CONTINUE_MOEO_H_
+00015 
+00016 #include <eoCombinedContinue.h>
+00017 #include <eoGenContinue.h>
+00018 #include <eoEvalContinue.h>
+00019 #include <eoFitContinue.h>
+00020 #include <eoTimeContinue.h>
+00021 #ifndef _MSC_VER
+00022 #include <eoCtrlCContinue.h>
+00023 #endif
+00024 #include <utils/eoParser.h>
+00025 #include <utils/eoState.h>
+00026 
+00027 
+00033 template <class MOEOT>
+00034 eoCombinedContinue<MOEOT> * make_combinedContinue(eoCombinedContinue<MOEOT> *_combined, eoContinue<MOEOT> *_cont)
+00035 {
+00036     if (_combined)                 // already exists
+00037         _combined->add(*_cont);
+00038     else
+00039         _combined = new eoCombinedContinue<MOEOT>(*_cont);
+00040     return _combined;
+00041 }
+00042 
+00043 
+00050 template <class MOEOT>
+00051 eoContinue<MOEOT> & do_make_continue_moeo(eoParser& _parser, eoState& _state, eoEvalFuncCounter<MOEOT> & _eval)
+00052 {
+00053     // the combined continue - to be filled
+00054     eoCombinedContinue<MOEOT> *continuator = NULL;
+00055     // First the eoGenContinue - need a default value so you can run blind
+00056     // but we also need to be able to avoid it <--> 0
+00057     eoValueParam<unsigned int>& maxGenParam = _parser.createParam((unsigned int)(100), "maxGen", "Maximum number of generations (0 = none)",'G',"Stopping criterion");
+00058     if (maxGenParam.value()) // positive: -> define and store
+00059     {
+00060         eoGenContinue<MOEOT> *genCont = new eoGenContinue<MOEOT>(maxGenParam.value());
+00061         _state.storeFunctor(genCont);
+00062         // and "add" to combined
+00063         continuator = make_combinedContinue<MOEOT>(continuator, genCont);
+00064     }
+00065     // maxEval
+00066     eoValueParam<unsigned long>& maxEvalParam = _parser.getORcreateParam((unsigned long)(0), "maxEval", "Maximum number of evaluations (0 = none)", 'E', "Stopping criterion");
+00067     if (maxEvalParam.value())
+00068     {
+00069         eoEvalContinue<MOEOT> *evalCont = new eoEvalContinue<MOEOT>(_eval, maxEvalParam.value());
+00070         _state.storeFunctor(evalCont);
+00071         // and "add" to combined
+00072         continuator = make_combinedContinue<MOEOT>(continuator, evalCont);
+00073     }
+00074     // maxTime
+00075     eoValueParam<unsigned long>& maxTimeParam = _parser.getORcreateParam((unsigned long)(0), "maxTime", "Maximum running time in seconds (0 = none)", 'T', "Stopping criterion");
+00076     if (maxTimeParam.value()) // positive: -> define and store
+00077     {
+00078         eoTimeContinue<MOEOT> *timeCont = new eoTimeContinue<MOEOT>(maxTimeParam.value());
+00079         _state.storeFunctor(timeCont);
+00080         // and "add" to combined
+00081         continuator = make_combinedContinue<MOEOT>(continuator, timeCont);
+00082     }
+00083     // CtrlC
+00084 #ifndef _MSC_VER
+00085     // the CtrlC interception (Linux only I'm afraid)
+00086     eoCtrlCContinue<MOEOT> *ctrlCCont;
+00087     eoValueParam<bool>& ctrlCParam = _parser.createParam(true, "CtrlC", "Terminate current generation upon Ctrl C",'C', "Stopping criterion");
+00088     if (_parser.isItThere(ctrlCParam))
+00089     {
+00090         ctrlCCont = new eoCtrlCContinue<MOEOT>;
+00091         // store
+00092         _state.storeFunctor(ctrlCCont);
+00093         // add to combinedContinue
+00094         continuator = make_combinedContinue<MOEOT>(continuator, ctrlCCont);
+00095     }
+00096 #endif
+00097     // now check that there is at least one!
+00098     if (!continuator)
+00099         throw std::runtime_error("You MUST provide a stopping criterion");
+00100     // OK, it's there: store in the eoState
+00101     _state.storeFunctor(continuator);
+00102     // and return
+00103     return *continuator;
+00104 }
+00105 
+00106 #endif /*MAKE_CONTINUE_MOEO_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/make__ea__moeo_8h-source.html b/trunk/paradiseo-moeo/doc/html/make__ea__moeo_8h-source.html new file mode 100644 index 000000000..d98a33f5c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/make__ea__moeo_8h-source.html @@ -0,0 +1,291 @@ + + +ParadisEO-MOEO: make_ea_moeo.h Source File + + + + +
+
+

make_ea_moeo.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // make_ea_moeo.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MAKE_EA_MOEO_H_
+00014 #define MAKE_EA_MOEO_H_
+00015 
+00016 #include <stdlib.h>
+00017 #include <eoContinue.h>
+00018 #include <eoEvalFunc.h>
+00019 #include <eoGeneralBreeder.h>
+00020 #include <eoGenOp.h>
+00021 #include <utils/eoParser.h>
+00022 #include <utils/eoState.h>
+00023 
+00024 #include <algo/moeoEA.h>
+00025 #include <algo/moeoEasyEA.h>
+00026 #include <archive/moeoArchive.h>
+00027 #include <comparator/moeoAggregativeComparator.h>
+00028 #include <comparator/moeoComparator.h>
+00029 #include <comparator/moeoDiversityThenFitnessComparator.h>
+00030 #include <comparator/moeoFitnessThenDiversityComparator.h>
+00031 #include <diversity/moeoDiversityAssignment.h>
+00032 #include <diversity/moeoDummyDiversityAssignment.h>
+00033 #include <diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h>
+00034 #include <diversity/moeoFrontByFrontSharingDiversityAssignment.h>
+00035 #include <fitness/moeoFastNonDominatedSortingFitnessAssignment.h>
+00036 #include <fitness/moeoDummyFitnessAssignment.h>
+00037 #include <fitness/moeoFitnessAssignment.h>
+00038 #include <fitness/moeoIndicatorBasedFitnessAssignment.h>
+00039 #include <metric/moeoAdditiveEpsilonBinaryMetric.h>
+00040 #include <metric/moeoHypervolumeBinaryMetric.h>
+00041 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
+00042 #include <replacement/moeoElitistReplacement.h>
+00043 #include <replacement/moeoEnvironmentalReplacement.h>
+00044 #include <replacement/moeoGenerationalReplacement.h>
+00045 #include <replacement/moeoReplacement.h>
+00046 #include <selection/moeoDetTournamentSelect.h>
+00047 #include <selection/moeoRandomSelect.h>
+00048 #include <selection/moeoStochTournamentSelect.h>
+00049 #include <selection/moeoSelectOne.h>
+00050 #include <selection/moeoSelectors.h>
+00051 
+00052 
+00062 template < class MOEOT >
+00063 moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalFunc < MOEOT > & _eval, eoContinue < MOEOT > & _continue, eoGenOp < MOEOT > & _op, moeoArchive < MOEOT > & _archive)
+00064 {
+00065 
+00066     /* the objective vector type */
+00067     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00068 
+00069 
+00070     /* the fitness assignment strategy */
+00071     std::string & fitnessParam = _parser.createParam(std::string("FastNonDominatedSorting"), "fitness",
+00072                             "Fitness assignment scheme: Dummy, FastNonDominatedSorting or IndicatorBased", 'F',
+00073                             "Evolution Engine").value();
+00074     std::string & indicatorParam = _parser.createParam(std::string("Epsilon"), "indicator",
+00075                               "Binary indicator for IndicatorBased: Epsilon, Hypervolume", 'i',
+00076                               "Evolution Engine").value();
+00077     double rho = _parser.createParam(1.1, "rho", "reference point for the hypervolume indicator", 'r',
+00078                                      "Evolution Engine").value();
+00079     double kappa = _parser.createParam(0.05, "kappa", "Scaling factor kappa for IndicatorBased", 'k',
+00080                                        "Evolution Engine").value();
+00081     moeoFitnessAssignment < MOEOT > * fitnessAssignment;
+00082     if (fitnessParam == std::string("Dummy"))
+00083     {
+00084         fitnessAssignment = new moeoDummyFitnessAssignment < MOEOT> ();
+00085     }
+00086     else if (fitnessParam == std::string("FastNonDominatedSorting"))
+00087     {
+00088         fitnessAssignment = new moeoFastNonDominatedSortingFitnessAssignment < MOEOT> ();
+00089     }
+00090     else if (fitnessParam == std::string("IndicatorBased"))
+00091     {
+00092         // metric
+00093         moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > *metric;
+00094         if (indicatorParam == std::string("Epsilon"))
+00095         {
+00096             metric = new moeoAdditiveEpsilonBinaryMetric < ObjectiveVector >;
+00097         }
+00098         else if (indicatorParam == std::string("Hypervolume"))
+00099         {
+00100             metric = new moeoHypervolumeBinaryMetric < ObjectiveVector > (rho);
+00101         }
+00102         else
+00103         {
+00104             std::string stmp = std::string("Invalid binary quality indicator: ") + indicatorParam;
+00105             throw std::runtime_error(stmp.c_str());
+00106         }
+00107         fitnessAssignment = new moeoIndicatorBasedFitnessAssignment < MOEOT > (*metric, kappa);
+00108     }
+00109     else
+00110     {
+00111         std::string stmp = std::string("Invalid fitness assignment strategy: ") + fitnessParam;
+00112         throw std::runtime_error(stmp.c_str());
+00113     }
+00114     _state.storeFunctor(fitnessAssignment);
+00115 
+00116 
+00117     /* the diversity assignment strategy */
+00118     eoValueParam<eoParamParamType> & diversityParam = _parser.createParam(eoParamParamType("Dummy"), "diversity",
+00119             "Diversity assignment scheme: Dummy, Sharing(nicheSize) or Crowding", 'D', "Evolution Engine");
+00120     eoParamParamType & diversityParamValue = diversityParam.value();
+00121     moeoDiversityAssignment < MOEOT > * diversityAssignment;
+00122     if (diversityParamValue.first == std::string("Dummy"))
+00123     {
+00124         diversityAssignment = new moeoDummyDiversityAssignment < MOEOT> ();
+00125     }
+00126     else if (diversityParamValue.first == std::string("Sharing"))
+00127     {
+00128         double nicheSize;
+00129         if (!diversityParamValue.second.size())   // no parameter added
+00130         {
+00131             std::cerr << "WARNING, no niche size given for Sharing, using 0.5" << std::endl;
+00132             nicheSize = 0.5;
+00133             diversityParamValue.second.push_back(std::string("0.5"));
+00134         }
+00135         else
+00136         {
+00137             nicheSize = atoi(diversityParamValue.second[0].c_str());
+00138         }
+00139         diversityAssignment = new moeoFrontByFrontSharingDiversityAssignment < MOEOT> (nicheSize);
+00140     }
+00141     else if (diversityParamValue.first == std::string("Crowding"))
+00142     {
+00143         diversityAssignment = new moeoFrontByFrontCrowdingDistanceDiversityAssignment < MOEOT> ();
+00144     }
+00145     else
+00146     {
+00147         std::string stmp = std::string("Invalid diversity assignment strategy: ") + diversityParamValue.first;
+00148         throw std::runtime_error(stmp.c_str());
+00149     }
+00150     _state.storeFunctor(diversityAssignment);
+00151 
+00152 
+00153     /* the comparator strategy */
+00154     std::string & comparatorParam = _parser.createParam(std::string("FitnessThenDiversity"), "comparator",
+00155                                "Comparator scheme: FitnessThenDiversity, DiversityThenFitness or Aggregative", 'C', "Evolution Engine").value();
+00156     moeoComparator < MOEOT > * comparator;
+00157     if (comparatorParam == std::string("FitnessThenDiversity"))
+00158     {
+00159         comparator = new moeoFitnessThenDiversityComparator < MOEOT> ();
+00160     }
+00161     else if (comparatorParam == std::string("DiversityThenFitness"))
+00162     {
+00163         comparator = new moeoDiversityThenFitnessComparator < MOEOT> ();
+00164     }
+00165     else if (comparatorParam == std::string("Aggregative"))
+00166     {
+00167         comparator = new moeoAggregativeComparator < MOEOT> ();
+00168     }
+00169     else
+00170     {
+00171         std::string stmp = std::string("Invalid comparator strategy: ") + comparatorParam;
+00172         throw std::runtime_error(stmp.c_str());
+00173     }
+00174     _state.storeFunctor(comparator);
+00175 
+00176 
+00177     /* the selection strategy */
+00178     eoValueParam < eoParamParamType > & selectionParam = _parser.createParam(eoParamParamType("DetTour(2)"), "selection",
+00179             "Selection scheme: DetTour(T), StochTour(t) or Random", 'S', "Evolution Engine");
+00180     eoParamParamType & ppSelect = selectionParam.value();
+00181     moeoSelectOne < MOEOT > * select;
+00182     if (ppSelect.first == std::string("DetTour"))
+00183     {
+00184         unsigned int tSize;
+00185         if (!ppSelect.second.size()) // no parameter added
+00186         {
+00187             std::cerr << "WARNING, no parameter passed to DetTour, using 2" << std::endl;
+00188             tSize = 2;
+00189             // put back 2 in parameter for consistency (and status file)
+00190             ppSelect.second.push_back(std::string("2"));
+00191         }
+00192         else // parameter passed by user as DetTour(T)
+00193         {
+00194             tSize = atoi(ppSelect.second[0].c_str());
+00195         }
+00196         select = new moeoDetTournamentSelect < MOEOT > (*comparator, tSize);
+00197     }
+00198     else if (ppSelect.first == std::string("StochTour"))
+00199     {
+00200         double tRate;
+00201         if (!ppSelect.second.size()) // no parameter added
+00202         {
+00203             std::cerr << "WARNING, no parameter passed to StochTour, using 1" << std::endl;
+00204             tRate = 1;
+00205             // put back 1 in parameter for consistency (and status file)
+00206             ppSelect.second.push_back(std::string("1"));
+00207         }
+00208         else // parameter passed by user as StochTour(T)
+00209         {
+00210             tRate = atof(ppSelect.second[0].c_str());
+00211         }
+00212         select = new moeoStochTournamentSelect < MOEOT > (*comparator, tRate);
+00213     }
+00214     /*
+00215     else if (ppSelect.first == string("Roulette"))
+00216     {
+00217         // TO DO !
+00218         // ...
+00219     }
+00220     */
+00221     else if (ppSelect.first == std::string("Random"))
+00222     {
+00223         select = new moeoRandomSelect <MOEOT > ();
+00224     }
+00225     else
+00226     {
+00227         std::string stmp = std::string("Invalid selection strategy: ") + ppSelect.first;
+00228         throw std::runtime_error(stmp.c_str());
+00229     }
+00230     _state.storeFunctor(select);
+00231 
+00232 
+00233     /* the replacement strategy */
+00234     std::string & replacementParam = _parser.createParam(std::string("Elitist"), "replacement",
+00235                                 "Replacement scheme: Elitist, Environmental or Generational", 'R', "Evolution Engine").value();
+00236     moeoReplacement < MOEOT > * replace;
+00237     if (replacementParam == std::string("Elitist"))
+00238     {
+00239         replace = new moeoElitistReplacement < MOEOT> (*fitnessAssignment, *diversityAssignment, *comparator);
+00240     }
+00241     else if (replacementParam == std::string("Environmental"))
+00242     {
+00243         replace = new moeoEnvironmentalReplacement < MOEOT> (*fitnessAssignment, *diversityAssignment, *comparator);
+00244     }
+00245     else if (replacementParam == std::string("Generational"))
+00246     {
+00247         replace = new moeoGenerationalReplacement < MOEOT> ();
+00248     }
+00249     else
+00250     {
+00251         std::string stmp = std::string("Invalid replacement strategy: ") + replacementParam;
+00252         throw std::runtime_error(stmp.c_str());
+00253     }
+00254     _state.storeFunctor(replace);
+00255 
+00256 
+00257     /* the number of offspring  */
+00258     eoValueParam < eoHowMany > & offspringRateParam = _parser.createParam(eoHowMany(1.0), "nbOffspring",
+00259             "Number of offspring (percentage or absolute)", 'O', "Evolution Engine");
+00260 
+00261 
+00262     // the general breeder
+00263     eoGeneralBreeder < MOEOT > * breed = new eoGeneralBreeder < MOEOT > (*select, _op, offspringRateParam.value());
+00264     _state.storeFunctor(breed);
+00265     // the eoEasyEA
+00266     moeoEA < MOEOT > * algo = new moeoEasyEA < MOEOT > (_continue, _eval, *breed, *replace, *fitnessAssignment, *diversityAssignment);
+00267     _state.storeFunctor(algo);
+00268     return *algo;
+00269 
+00270 }
+00271 
+00272 #endif /*MAKE_EA_MOEO_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoAchievementFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoAchievementFitnessAssignment_8h-source.html new file mode 100644 index 000000000..a39aee5f5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoAchievementFitnessAssignment_8h-source.html @@ -0,0 +1,135 @@ + + +ParadisEO-MOEO: moeoAchievementFitnessAssignment.h Source File + + + + +
+
+

moeoAchievementFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoAchievementFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOACHIEVEMENTFITNESSASSIGNMENT_H_
+00014 #define MOEOACHIEVEMENTFITNESSASSIGNMENT_H_
+00015 
+00016 #include <vector>
+00017 #include <eoPop.h>
+00018 #include <fitness/moeoScalarFitnessAssignment.h>
+00019 
+00023 template < class MOEOT >
+00024 class moeoAchievementFitnessAssignment : public moeoScalarFitnessAssignment < MOEOT >
+00025 {
+00026 public:
+00027 
+00029     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00030 
+00031 
+00038     moeoAchievementFitnessAssignment(ObjectiveVector & _reference, std::vector < double > & _lambdas, double _spn=0.0001) : reference(_reference), lambdas(_lambdas), spn(_spn)
+00039     {
+00040         // consistency check
+00041         if ((spn < 0.0) || (spn > 1.0))
+00042         {
+00043             std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n";
+00044             spn = 0.0001;
+00045         }
+00046     }
+00047 
+00048 
+00054     moeoAchievementFitnessAssignment(ObjectiveVector & _reference, double _spn=0.0001) : reference(_reference), spn(_spn)
+00055     {
+00056         // compute the default values for lambdas
+00057         lambdas  = std::vector < double > (ObjectiveVector::nObjectives());
+00058         for (unsigned int i=0 ; i<lambdas.size(); i++)
+00059         {
+00060             lambdas[i] = 1.0 / ObjectiveVector::nObjectives();
+00061         }
+00062         // consistency check
+00063         if ((spn < 0.0) || (spn > 1.0))
+00064         {
+00065             std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n";
+00066             spn = 0.0001;
+00067         }
+00068     }
+00069 
+00070 
+00075     virtual void operator()(eoPop < MOEOT > & _pop)
+00076     {
+00077         for (unsigned int i=0; i<_pop.size() ; i++)
+00078         {
+00079             compute(_pop[i]);
+00080         }
+00081     }
+00082 
+00083 
+00089     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00090     {
+00091         // nothing to do ;-)
+00092     }
+00093 
+00094 
+00099     void setReference(const ObjectiveVector & _reference)
+00100     {
+00101         reference = _reference;
+00102     }
+00103 
+00104 
+00105 private:
+00106 
+00108     ObjectiveVector reference;
+00110     std::vector < double > lambdas;
+00112     double spn;
+00113 
+00114 
+00118     double inf() const
+00119     {
+00120         return std::numeric_limits<double>::max();
+00121     }
+00122 
+00123 
+00128     void compute(MOEOT & _moeo)
+00129     {
+00130         unsigned int nobj = MOEOT::ObjectiveVector::nObjectives();
+00131         double temp;
+00132         double min = inf();
+00133         double sum = 0;
+00134         for (unsigned int obj=0; obj<nobj; obj++)
+00135         {
+00136             temp = lambdas[obj] * (reference[obj] - _moeo.objectiveVector()[obj]);
+00137             min = std::min(min, temp);
+00138             sum += temp;
+00139         }
+00140         _moeo.fitness(min + spn*sum);
+00141     }
+00142 
+00143 };
+00144 
+00145 #endif /*MOEOACHIEVEMENTFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoAdditiveEpsilonBinaryMetric_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoAdditiveEpsilonBinaryMetric_8h-source.html new file mode 100644 index 000000000..97ff079c3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoAdditiveEpsilonBinaryMetric_8h-source.html @@ -0,0 +1,92 @@ + + +ParadisEO-MOEO: moeoAdditiveEpsilonBinaryMetric.h Source File + + + + +
+
+

moeoAdditiveEpsilonBinaryMetric.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoAdditiveEpsilonBinaryMetric.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOADDITIVEEPSILONBINARYMETRIC_H_
+00014 #define MOEOADDITIVEEPSILONBINARYMETRIC_H_
+00015 
+00016 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
+00017 
+00023 template < class ObjectiveVector >
+00024 class moeoAdditiveEpsilonBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double >
+00025 {
+00026 public:
+00027 
+00035     double operator()(const ObjectiveVector & _o1, const ObjectiveVector & _o2)
+00036     {
+00037         // computation of the epsilon value for the first objective
+00038         double result = epsilon(_o1, _o2, 0);
+00039         // computation of the epsilon value for the other objectives
+00040         double tmp;
+00041         for (unsigned int i=1; i<ObjectiveVector::Traits::nObjectives(); i++)
+00042         {
+00043             tmp = epsilon(_o1, _o2, i);
+00044             result = std::max(result, tmp);
+00045         }
+00046         // returns the maximum epsilon value
+00047         return result;
+00048     }
+00049 
+00050 
+00051 private:
+00052 
+00054     using moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > :: bounds;
+00055 
+00056 
+00064     double epsilon(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned int _obj)
+00065     {
+00066         double result;
+00067         // if the objective _obj have to be minimized
+00068         if (ObjectiveVector::Traits::minimizing(_obj))
+00069         {
+00070             // _o1[_obj] - _o2[_obj]
+00071             result = ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() );
+00072         }
+00073         // if the objective _obj have to be maximized
+00074         else
+00075         {
+00076             // _o2[_obj] - _o1[_obj]
+00077             result = ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() );
+00078         }
+00079         return result;
+00080     }
+00081 
+00082 };
+00083 
+00084 #endif /*MOEOADDITIVEEPSILONBINARYMETRIC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoAggregativeComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoAggregativeComparator_8h-source.html new file mode 100644 index 000000000..fa12a0409 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoAggregativeComparator_8h-source.html @@ -0,0 +1,68 @@ + + +ParadisEO-MOEO: moeoAggregativeComparator.h Source File + + + + +
+
+

moeoAggregativeComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoAggregativeComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOAGGREGATIVECOMPARATOR_H_
+00014 #define MOEOAGGREGATIVECOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoAggregativeComparator : public moeoComparator < MOEOT >
+00023 {
+00024 public:
+00025 
+00031     moeoAggregativeComparator(double _weightFitness = 1.0, double _weightDiversity = 1.0) : weightFitness(_weightFitness), weightDiversity(_weightDiversity)
+00032     {}
+00033 
+00034 
+00040     const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00041     {
+00042         return ( weightFitness * _moeo1.fitness() + weightDiversity * _moeo1.diversity() ) < ( weightFitness * _moeo2.fitness() + weightDiversity * _moeo2.diversity() );
+00043     }
+00044 
+00045 
+00046 private:
+00047 
+00049     double weightFitness;
+00051     double weightDiversity;
+00052 
+00053 };
+00054 
+00055 #endif /*MOEOAGGREGATIVECOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoAlgo_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoAlgo_8h-source.html new file mode 100644 index 000000000..4b2e58423 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoAlgo_8h-source.html @@ -0,0 +1,46 @@ + + +ParadisEO-MOEO: moeoAlgo.h Source File + + + + +
+
+

moeoAlgo.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoAlgo.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOALGO_H_
+00014 #define MOEOALGO_H_
+00015 
+00019 class moeoAlgo {};
+00020 
+00021 #endif /*MOEOALGO_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoArchiveObjectiveVectorSavingUpdater_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoArchiveObjectiveVectorSavingUpdater_8h-source.html new file mode 100644 index 000000000..d7f130935 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoArchiveObjectiveVectorSavingUpdater_8h-source.html @@ -0,0 +1,104 @@ + + +ParadisEO-MOEO: moeoArchiveObjectiveVectorSavingUpdater.h Source File + + + + +
+
+

moeoArchiveObjectiveVectorSavingUpdater.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoArchiveObjectiveVectorSavingUpdater.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_
+00014 #define MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_
+00015 
+00016 #include <fstream>
+00017 #include <string>
+00018 #include <eoPop.h>
+00019 #include <utils/eoUpdater.h>
+00020 #include <archive/moeoArchive.h>
+00021 
+00022 #define MAX_BUFFER_SIZE 1000
+00023 
+00027 template < class MOEOT >
+00028 class moeoArchiveObjectiveVectorSavingUpdater : public eoUpdater
+00029 {
+00030 public:
+00031 
+00039     moeoArchiveObjectiveVectorSavingUpdater (moeoArchive<MOEOT> & _arch, const std::string & _filename, bool _count = false, int _id = -1) :
+00040             arch(_arch), filename(_filename), count(_count), counter(0), id(_id)
+00041     {}
+00042 
+00043 
+00047     void operator()() {
+00048         char buff[MAX_BUFFER_SIZE];
+00049         if (count)
+00050         {
+00051             if (id == -1)
+00052             {
+00053                 sprintf (buff, "%s.%u", filename.c_str(), counter ++);
+00054             }
+00055             else
+00056             {
+00057                 sprintf (buff, "%s.%u.%u", filename.c_str(), id, counter ++);
+00058             }
+00059         }
+00060         else
+00061         {
+00062             if (id == -1)
+00063             {
+00064                 sprintf (buff, "%s", filename.c_str());
+00065             }
+00066             else
+00067             {
+00068                 sprintf (buff, "%s.%u", filename.c_str(), id);
+00069             }
+00070             counter ++;
+00071         }
+00072         std::ofstream f(buff);
+00073         for (unsigned int i = 0; i < arch.size (); i++)
+00074             f << arch[i].objectiveVector() << std::endl;
+00075         f.close ();
+00076     }
+00077 
+00078 
+00079 private:
+00080 
+00082     moeoArchive<MOEOT> & arch;
+00084     std::string filename;
+00086     bool count;
+00088     unsigned int counter;
+00090     int id;
+00091 
+00092 };
+00093 
+00094 #endif /*MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoArchiveUpdater_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoArchiveUpdater_8h-source.html new file mode 100644 index 000000000..6131a2f3e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoArchiveUpdater_8h-source.html @@ -0,0 +1,69 @@ + + +ParadisEO-MOEO: moeoArchiveUpdater.h Source File + + + + +
+
+

moeoArchiveUpdater.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoArchiveUpdater.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOARCHIVEUPDATER_H_
+00014 #define MOEOARCHIVEUPDATER_H_
+00015 
+00016 #include <eoPop.h>
+00017 #include <utils/eoUpdater.h>
+00018 #include <archive/moeoArchive.h>
+00019 
+00023 template < class MOEOT >
+00024 class moeoArchiveUpdater : public eoUpdater
+00025 {
+00026 public:
+00027 
+00033     moeoArchiveUpdater(moeoArchive < MOEOT > & _arch, const eoPop < MOEOT > & _pop) : arch(_arch), pop(_pop)
+00034     {}
+00035 
+00036 
+00040     void operator()() {
+00041         arch.update(pop);
+00042     }
+00043 
+00044 
+00045 private:
+00046 
+00048     moeoArchive < MOEOT > & arch;
+00050     const eoPop < MOEOT > & pop;
+00051 
+00052 };
+00053 
+00054 #endif /*MOEOARCHIVEUPDATER_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoArchive_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoArchive_8h-source.html new file mode 100644 index 000000000..980d0b09e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoArchive_8h-source.html @@ -0,0 +1,172 @@ + + +ParadisEO-MOEO: moeoArchive.h Source File + + + + +
+
+

moeoArchive.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoArchive.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOARCHIVE_H_
+00014 #define MOEOARCHIVE_H_
+00015 
+00016 #include <eoPop.h>
+00017 #include <comparator/moeoObjectiveVectorComparator.h>
+00018 #include <comparator/moeoParetoObjectiveVectorComparator.h>
+00019 
+00023 template < class MOEOT >
+00024 class moeoArchive : public eoPop < MOEOT >
+00025 {
+00026 public:
+00027 
+00028     using eoPop < MOEOT > :: size;
+00029     using eoPop < MOEOT > :: operator[];
+00030     using eoPop < MOEOT > :: back;
+00031     using eoPop < MOEOT > :: pop_back;
+00032 
+00033 
+00037     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00038 
+00039 
+00044     moeoArchive() : eoPop < MOEOT >(), comparator(paretoComparator)
+00045     {}
+00046 
+00047 
+00052     moeoArchive(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : eoPop < MOEOT >(), comparator(_comparator)
+00053     {}
+00054 
+00055 
+00060     bool dominates (const ObjectiveVector & _objectiveVector) const
+00061     {
+00062         for (unsigned int i = 0; i<size(); i++)
+00063         {
+00064             // if _objectiveVector is dominated by the ith individual of the archive...
+00065             if ( comparator(_objectiveVector, operator[](i).objectiveVector()) )
+00066             {
+00067                 return true;
+00068             }
+00069         }
+00070         return false;
+00071     }
+00072 
+00073 
+00078     bool contains (const ObjectiveVector & _objectiveVector) const
+00079     {
+00080         for (unsigned int i = 0; i<size(); i++)
+00081         {
+00082             if (operator[](i).objectiveVector() == _objectiveVector)
+00083             {
+00084                 return true;
+00085             }
+00086         }
+00087         return false;
+00088     }
+00089 
+00090 
+00095     void update (const MOEOT & _moeo)
+00096     {
+00097         // first step: removing the dominated solutions from the archive
+00098         for (unsigned int j=0; j<size();)
+00099         {
+00100             // if the jth solution contained in the archive is dominated by _moeo
+00101             if ( comparator(operator[](j).objectiveVector(), _moeo.objectiveVector()) )
+00102             {
+00103                 operator[](j) = back();
+00104                 pop_back();
+00105             }
+00106             else if (_moeo.objectiveVector() == operator[](j).objectiveVector())
+00107             {
+00108                 operator[](j) = back();
+00109                 pop_back();
+00110             }
+00111             else
+00112             {
+00113                 j++;
+00114             }
+00115         }
+00116         // second step: is _moeo dominated?
+00117         bool dom = false;
+00118         for (unsigned int j=0; j<size(); j++)
+00119         {
+00120             // if _moeo is dominated by the jth solution contained in the archive
+00121             if ( comparator(_moeo.objectiveVector(), operator[](j).objectiveVector()) )
+00122             {
+00123                 dom = true;
+00124                 break;
+00125             }
+00126         }
+00127         if (!dom)
+00128         {
+00129             push_back(_moeo);
+00130         }
+00131     }
+00132 
+00133 
+00138     void update (const eoPop < MOEOT > & _pop)
+00139     {
+00140         for (unsigned int i=0; i<_pop.size(); i++)
+00141         {
+00142             update(_pop[i]);
+00143         }
+00144     }
+00145 
+00146 
+00151     bool equals (const moeoArchive < MOEOT > & _arch)
+00152     {
+00153         for (unsigned int i=0; i<size(); i++)
+00154         {
+00155             if (! _arch.contains(operator[](i).objectiveVector()))
+00156             {
+00157                 return false;
+00158             }
+00159         }
+00160         for (unsigned int i=0; i<_arch.size() ; i++)
+00161         {
+00162             if (! contains(_arch[i].objectiveVector()))
+00163             {
+00164                 return false;
+00165             }
+00166         }
+00167         return true;
+00168     }
+00169 
+00170 
+00171 private:
+00172 
+00174     moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
+00176     moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
+00177 
+00178 };
+00179 
+00180 #endif /*MOEOARCHIVE_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoBinaryMetricSavingUpdater_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoBinaryMetricSavingUpdater_8h-source.html new file mode 100644 index 000000000..46326934f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoBinaryMetricSavingUpdater_8h-source.html @@ -0,0 +1,98 @@ + + +ParadisEO-MOEO: moeoBinaryMetricSavingUpdater.h Source File + + + + +
+
+

moeoBinaryMetricSavingUpdater.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoBinaryMetricSavingUpdater.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOBINARYMETRICSAVINGUPDATER_H_
+00014 #define MOEOBINARYMETRICSAVINGUPDATER_H_
+00015 
+00016 #include <fstream>
+00017 #include <string>
+00018 #include <vector>
+00019 #include <eoPop.h>
+00020 #include <utils/eoUpdater.h>
+00021 #include <metric/moeoMetric.h>
+00022 
+00027 template < class MOEOT >
+00028 class moeoBinaryMetricSavingUpdater : public eoUpdater
+00029 {
+00030 public:
+00031 
+00033     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00034 
+00035 
+00042     moeoBinaryMetricSavingUpdater (moeoVectorVsVectorBinaryMetric < ObjectiveVector, double > & _metric, const eoPop < MOEOT > & _pop, std::string _filename) :
+00043             metric(_metric), pop(_pop), filename(_filename), counter(1)
+00044     {}
+00045 
+00046 
+00050     void operator()() {
+00051         if (pop.size()) {
+00052             if (firstGen) {
+00053                 firstGen = false;
+00054             }
+00055             else {
+00056                 // creation of the two Pareto sets
+00057                 std::vector < ObjectiveVector > from;
+00058                 std::vector < ObjectiveVector > to;
+00059                 for (unsigned int i=0; i<pop.size(); i++)
+00060                     from.push_back(pop[i].objectiveVector());
+00061                 for (unsigned int i=0 ; i<oldPop.size(); i++)
+00062                     to.push_back(oldPop[i].objectiveVector());
+00063                 // writing the result into the file
+00064                 std::ofstream f (filename.c_str(), std::ios::app);
+00065                 f << counter++ << ' ' << metric(from,to) << std::endl;
+00066                 f.close();
+00067             }
+00068             oldPop = pop;
+00069         }
+00070     }
+00071 
+00072 
+00073 private:
+00074 
+00076     moeoVectorVsVectorBinaryMetric < ObjectiveVector, double > & metric;
+00078     const eoPop < MOEOT > & pop;
+00080     eoPop< MOEOT > oldPop;
+00082     std::string filename;
+00084     bool firstGen;
+00086     unsigned int counter;
+00087 
+00088 };
+00089 
+00090 #endif /*MOEOBINARYMETRICSAVINGUPDATER_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoBitVector_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoBitVector_8h-source.html new file mode 100644 index 000000000..da8256f9b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoBitVector_8h-source.html @@ -0,0 +1,86 @@ + + +ParadisEO-MOEO: moeoBitVector.h Source File + + + + +
+
+

moeoBitVector.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoBitVector.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOBITVECTOR_H_
+00014 #define MOEOBITVECTOR_H_
+00015 
+00016 #include <core/moeoVector.h>
+00017 
+00021 template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity >
+00022 class moeoBitVector : public moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >
+00023 {
+00024 public:
+00025 
+00026     using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: begin;
+00027     using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: end;
+00028     using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: resize;
+00029     using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: size;
+00030 
+00031 
+00037     moeoBitVector(unsigned int _size = 0, bool _value = false) : moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >(_size, _value)
+00038     {}
+00039 
+00040 
+00045     virtual void printOn(std::ostream & _os) const
+00046     {
+00047         MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn(_os);
+00048         _os << ' ';
+00049         _os << size() << ' ';
+00050         std::copy(begin(), end(), std::ostream_iterator<bool>(_os));
+00051     }
+00052 
+00053 
+00058     virtual void readFrom(std::istream & _is)
+00059     {
+00060         MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom(_is);
+00061         unsigned int s;
+00062         _is >> s;
+00063         std::string bits;
+00064         _is >> bits;
+00065         if (_is)
+00066         {
+00067             resize(bits.size());
+00068             std::transform(bits.begin(), bits.end(), begin(), std::bind2nd(std::equal_to<char>(), '1'));
+00069         }
+00070     }
+00071 
+00072 };
+00073 
+00074 #endif /*MOEOBITVECTOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoCombinedLS_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoCombinedLS_8h-source.html new file mode 100644 index 000000000..c075b23f5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoCombinedLS_8h-source.html @@ -0,0 +1,76 @@ + + +ParadisEO-MOEO: moeoCombinedLS.h Source File + + + + +
+
+

moeoCombinedLS.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoCombinedLS.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOCOMBINEDLS_H_
+00014 #define MOEOCOMBINEDLS_H_
+00015 
+00016 #include <vector>
+00017 #include <algo/moeoLS.h>
+00018 #include <archive/moeoArchive.h>
+00019 
+00024 template < class MOEOT, class Type >
+00025 class moeoCombinedLS : public moeoLS < MOEOT, Type >
+00026 {
+00027 public:
+00028 
+00033     moeoCombinedLS(moeoLS < MOEOT, Type > & _first_mols)
+00034     {
+00035         combinedLS.push_back (& _first_mols);
+00036     }
+00037 
+00042     void add(moeoLS < MOEOT, Type > & _mols)
+00043     {
+00044         combinedLS.push_back(& _mols);
+00045     }
+00046 
+00053     void operator () (Type _type, moeoArchive < MOEOT > & _arch)
+00054     {
+00055         for (unsigned int i=0; i<combinedLS.size(); i++)
+00056             combinedLS[i] -> operator()(_type, _arch);
+00057     }
+00058 
+00059 
+00060 private:
+00061 
+00063     std::vector< moeoLS < MOEOT, Type > * >  combinedLS;
+00064 
+00065 };
+00066 
+00067 #endif /*MOEOCOMBINEDLS_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoComparator_8h-source.html new file mode 100644 index 000000000..7641a447d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoComparator_8h-source.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: moeoComparator.h Source File + + + + +
+
+

moeoComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOCOMPARATOR_H_
+00014 #define MOEOCOMPARATOR_H_
+00015 
+00016 #include <eoFunctor.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoComparator : public eoBF < const MOEOT &, const MOEOT &, const bool > {};
+00023 
+00024 #endif /*MOEOCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoContributionMetric_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoContributionMetric_8h-source.html new file mode 100644 index 000000000..241c775a1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoContributionMetric_8h-source.html @@ -0,0 +1,110 @@ + + +ParadisEO-MOEO: moeoContributionMetric.h Source File + + + + +
+
+

moeoContributionMetric.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoContributionMetric.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOCONTRIBUTIONMETRIC_H_
+00014 #define MOEOCONTRIBUTIONMETRIC_H_
+00015 
+00016 #include <comparator/moeoParetoObjectiveVectorComparator.h>
+00017 #include <metric/moeoMetric.h>
+00018 
+00023 template < class ObjectiveVector >
+00024 class moeoContributionMetric : public moeoVectorVsVectorBinaryMetric < ObjectiveVector, double >
+00025 {
+00026 public:
+00027 
+00033     double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
+00034         unsigned int c  = card_C(_set1, _set2);
+00035         unsigned int w1 = card_W(_set1, _set2);
+00036         unsigned int n1 = card_N(_set1, _set2);
+00037         unsigned int w2 = card_W(_set2, _set1);
+00038         unsigned int n2 = card_N(_set2, _set1);
+00039         return (double) (c / 2.0 + w1 + n1) / (c + w1 + n1 + w2 + n2);
+00040     }
+00041 
+00042 
+00043 private:
+00044 
+00046     moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
+00047     
+00048     
+00054     unsigned int card_C (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
+00055         unsigned int c=0;
+00056         for (unsigned int i=0; i<_set1.size(); i++)
+00057             for (unsigned int j=0; j<_set2.size(); j++)
+00058                 if (_set1[i] == _set2[j]) {
+00059                     c++;
+00060                     break;
+00061                 }
+00062         return c;
+00063     }
+00064 
+00065 
+00071     unsigned int card_W (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
+00072         unsigned int w=0;
+00073         for (unsigned int i=0; i<_set1.size(); i++)
+00074             for (unsigned int j=0; j<_set2.size(); j++)
+00075                 if (paretoComparator(_set2[j], _set1[i]))
+00076                 {
+00077                     w++;
+00078                     break;
+00079                 }
+00080         return w;
+00081     }
+00082 
+00083 
+00089     unsigned int card_N (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
+00090         unsigned int n=0;
+00091         for (unsigned int i=0; i<_set1.size(); i++) {
+00092             bool domin_rel = false;
+00093             for (unsigned int j=0; j<_set2.size(); j++)
+00094                 if ( (paretoComparator(_set2[j], _set1[i])) || (paretoComparator(_set1[i], _set2[j])) )
+00095                 {
+00096                     domin_rel = true;
+00097                     break;
+00098                 }
+00099             if (! domin_rel)
+00100                 n++;
+00101         }
+00102         return n;
+00103     }
+00104 
+00105 };
+00106 
+00107 #endif /*MOEOCONTRIBUTIONMETRIC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoConvertPopToObjectiveVectors_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoConvertPopToObjectiveVectors_8h-source.html new file mode 100644 index 000000000..b396c2b85 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoConvertPopToObjectiveVectors_8h-source.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoConvertPopToObjectiveVectors.h Source File + + + + +
+
+

moeoConvertPopToObjectiveVectors.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoConvertPopToObjectiveVectors.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOPOPTOOBJECTIVEVECTORS_H_
+00014 #define MOEOPOPTOOBJECTIVEVECTORS_H_
+00015 
+00016 #include <vector>
+00017 #include <eoFunctor.h>
+00018 
+00022 template < class MOEOT, class ObjectiveVector = typename MOEOT::ObjectiveVector >
+00023 class moeoConvertPopToObjectiveVectors : public eoUF < const eoPop < MOEOT >, const std::vector < ObjectiveVector > >
+00024 {
+00025 public:
+00026 
+00031     const std::vector < ObjectiveVector > operator()(const eoPop < MOEOT > _pop)
+00032     {
+00033         std::vector < ObjectiveVector > result;
+00034         result.resize(_pop.size());
+00035         for (unsigned int i=0; i<_pop.size(); i++)
+00036         {
+00037             result.push_back(_pop[i].objectiveVector());
+00038         }
+00039         return result;
+00040     }
+00041 
+00042 };
+00043 
+00044 #endif /*MOEOPOPTOOBJECTIVEVECTORS_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoCriterionBasedFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoCriterionBasedFitnessAssignment_8h-source.html new file mode 100644 index 000000000..7d57cf485 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoCriterionBasedFitnessAssignment_8h-source.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: moeoCriterionBasedFitnessAssignment.h Source File + + + + +
+
+

moeoCriterionBasedFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoCriterionBasedFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOCRITERIONBASEDFITNESSASSIGNMENT_H_
+00014 #define MOEOCRITERIONBASEDFITNESSASSIGNMENT_H_
+00015 
+00016 #include <fitness/moeoFitnessAssignment.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoCriterionBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > {};
+00023 
+00024 #endif /*MOEOCRITERIONBASEDFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoCrowdingDistanceDiversityAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoCrowdingDistanceDiversityAssignment_8h-source.html new file mode 100644 index 000000000..35538f414 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoCrowdingDistanceDiversityAssignment_8h-source.html @@ -0,0 +1,124 @@ + + +ParadisEO-MOEO: moeoCrowdingDistanceDiversityAssignment.h Source File + + + + +
+
+

moeoCrowdingDistanceDiversityAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoCrowdingDistanceDiversityAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_
+00014 #define MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_
+00015 
+00016 #include <eoPop.h>
+00017 #include <comparator/moeoOneObjectiveComparator.h>
+00018 #include <diversity/moeoDiversityAssignment.h>
+00019 
+00024 template < class MOEOT >
+00025 class moeoCrowdingDistanceDiversityAssignment : public moeoDiversityAssignment < MOEOT >
+00026 {
+00027 public:
+00028 
+00030     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00031 
+00032 
+00036     double inf() const
+00037     {
+00038         return std::numeric_limits<double>::max();
+00039     }
+00040 
+00041 
+00045     double tiny() const
+00046     {
+00047         return 1e-6;
+00048     }
+00049 
+00050 
+00055     void operator()(eoPop < MOEOT > & _pop)
+00056     {
+00057         if (_pop.size() <= 2)
+00058         {
+00059             for (unsigned int i=0; i<_pop.size(); i++)
+00060             {
+00061                 _pop[i].diversity(inf());
+00062             }
+00063         }
+00064         else
+00065         {
+00066             setDistances(_pop);
+00067         }
+00068     }
+00069 
+00070 
+00078     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00079     {
+00080         std::cout << "WARNING : updateByDeleting not implemented in moeoCrowdingDiversityAssignment" << std::endl;
+00081     }
+00082 
+00083 
+00084 protected:
+00085 
+00090     virtual void setDistances (eoPop < MOEOT > & _pop)
+00091     {
+00092         double min, max, distance;
+00093         unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives();
+00094         // set diversity to 0
+00095         for (unsigned int i=0; i<_pop.size(); i++)
+00096         {
+00097             _pop[i].diversity(0);
+00098         }
+00099         // for each objective
+00100         for (unsigned int obj=0; obj<nObjectives; obj++)
+00101         {
+00102             // comparator
+00103             moeoOneObjectiveComparator < MOEOT > objComp(obj);
+00104             // sort
+00105             std::sort(_pop.begin(), _pop.end(), objComp);
+00106             // min & max
+00107             min = _pop[0].objectiveVector()[obj];
+00108             max = _pop[_pop.size()-1].objectiveVector()[obj];
+00109             // set the diversity value to infiny for min and max
+00110             _pop[0].diversity(inf());
+00111             _pop[_pop.size()-1].diversity(inf());
+00112             for (unsigned int i=1; i<_pop.size()-1; i++)
+00113             {
+00114                 distance = (_pop[i+1].objectiveVector()[obj] - _pop[i-1].objectiveVector()[obj]) / (max-min);
+00115                 _pop[i].diversity(_pop[i].diversity() + distance);
+00116             }
+00117         }
+00118     }
+00119 
+00120 };
+00121 
+00122 #endif /*MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDetTournamentSelect_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDetTournamentSelect_8h-source.html new file mode 100644 index 000000000..f4352f2da --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDetTournamentSelect_8h-source.html @@ -0,0 +1,92 @@ + + +ParadisEO-MOEO: moeoDetTournamentSelect.h Source File + + + + +
+
+

moeoDetTournamentSelect.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDetTournamentSelect.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODETTOURNAMENTSELECT_H_
+00014 #define MOEODETTOURNAMENTSELECT_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 #include <comparator/moeoFitnessThenDiversityComparator.h>
+00018 #include <selection/moeoSelectOne.h>
+00019 #include <selection/moeoSelectors.h>
+00020 
+00024 template < class MOEOT > class moeoDetTournamentSelect:public moeoSelectOne < MOEOT >
+00025 {
+00026 public:
+00027 
+00033     moeoDetTournamentSelect (moeoComparator < MOEOT > & _comparator, unsigned int _tSize = 2) : comparator (_comparator), tSize (_tSize)
+00034     {
+00035         // consistency check
+00036         if (tSize < 2)
+00037         {
+00038             std::
+00039             cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
+00040             tSize = 2;
+00041         }
+00042     }
+00043 
+00044 
+00049     moeoDetTournamentSelect (unsigned int _tSize = 2) : comparator (defaultComparator), tSize (_tSize)
+00050     {
+00051         // consistency check
+00052         if (tSize < 2)
+00053         {
+00054             std::
+00055             cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
+00056             tSize = 2;
+00057         }
+00058     }
+00059 
+00060 
+00065     const MOEOT & operator() (const eoPop < MOEOT > &_pop)
+00066     {
+00067         // use the selector
+00068         return mo_deterministic_tournament (_pop, tSize, comparator);
+00069     }
+00070 
+00071 
+00072 protected:
+00073 
+00075     moeoComparator < MOEOT > & comparator;
+00077     moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
+00079     unsigned int tSize;
+00080 
+00081 };
+00082 
+00083 #endif /*MOEODETTOURNAMENTSELECT_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDistanceMatrix_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDistanceMatrix_8h-source.html new file mode 100644 index 000000000..983827cd1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDistanceMatrix_8h-source.html @@ -0,0 +1,91 @@ + + +ParadisEO-MOEO: moeoDistanceMatrix.h Source File + + + + +
+
+

moeoDistanceMatrix.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDistanceMatrix.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODISTANCEMATRIX_H_
+00014 #define MOEODISTANCEMATRIX_H_
+00015 
+00016 #include <vector>
+00017 #include <eoFunctor.h>
+00018 #include <distance/moeoDistance.h>
+00019 
+00023 template < class MOEOT , class Type >
+00024 class moeoDistanceMatrix : public eoUF < const eoPop < MOEOT > &, void > , public std::vector< std::vector < Type > >
+00025 {
+00026 public:
+00027 
+00028     using std::vector< std::vector < Type > > :: size;
+00029     using std::vector< std::vector < Type > > :: operator[];
+00030 
+00031 
+00037     moeoDistanceMatrix (unsigned int _size, moeoDistance < MOEOT , Type > & _distance) : distance(_distance)
+00038     {
+00039         this->resize(_size);
+00040         for (unsigned int i=0; i<_size; i++)
+00041         {
+00042             this->operator[](i).resize(_size);
+00043         }
+00044     }
+00045 
+00046 
+00051     void operator()(const eoPop < MOEOT > & _pop)
+00052     {
+00053         // 1 - setup the bounds (if necessary)
+00054         distance.setup(_pop);
+00055         // 2 - compute distances
+00056         this->operator[](0).operator[](0) = Type();
+00057         for (unsigned int i=0; i<size(); i++)
+00058         {
+00059             this->operator[](i).operator[](i) = Type();
+00060             for (unsigned int j=0; j<i; j++)
+00061             {
+00062                 this->operator[](i).operator[](j) = distance(_pop[i], _pop[j]);
+00063                 this->operator[](j).operator[](i) = this->operator[](i).operator[](j);
+00064             }
+00065         }
+00066     }
+00067 
+00068 
+00069 private:
+00070 
+00072     moeoDistance < MOEOT , Type > & distance;
+00073 
+00074 };
+00075 
+00076 #endif /*MOEODISTANCEMATRIX_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDistance_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDistance_8h-source.html new file mode 100644 index 000000000..7956e4a19 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDistance_8h-source.html @@ -0,0 +1,64 @@ + + +ParadisEO-MOEO: moeoDistance.h Source File + + + + +
+
+

moeoDistance.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDistance.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODISTANCE_H_
+00014 #define MOEODISTANCE_H_
+00015 
+00016 #include <eoFunctor.h>
+00017 
+00021 template < class MOEOT , class Type >
+00022 class moeoDistance : public eoBF < const MOEOT &, const MOEOT &, const Type >
+00023 {
+00024 public:
+00025 
+00030     virtual void setup(const eoPop < MOEOT > & _pop)
+00031     {}
+00032 
+00033 
+00040     virtual void setup(double _min, double _max, unsigned int _obj)
+00041     {}
+00042 
+00043 
+00049     virtual void setup(eoRealInterval _realInterval, unsigned int _obj)
+00050     {}
+00051 
+00052 };
+00053 
+00054 #endif /*MOEODISTANCE_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDiversityAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDiversityAssignment_8h-source.html new file mode 100644 index 000000000..3347a0657 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDiversityAssignment_8h-source.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoDiversityAssignment.h Source File + + + + +
+
+

moeoDiversityAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDiversityAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODIVERSITYASSIGNMENT_H_
+00014 #define MOEODIVERSITYASSIGNMENT_H_
+00015 
+00016 #include <eoFunctor.h>
+00017 #include <eoPop.h>
+00018 
+00022 template < class MOEOT >
+00023 class moeoDiversityAssignment : public eoUF < eoPop < MOEOT > &, void >
+00024 {
+00025 public:
+00026 
+00028     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00029 
+00030 
+00036     virtual void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) = 0;
+00037 
+00038 
+00044     void updateByDeleting(eoPop < MOEOT > & _pop, MOEOT & _moeo)
+00045     {
+00046         updateByDeleting(_pop, _moeo.objectiveVector());
+00047     }
+00048 
+00049 };
+00050 
+00051 #endif /*MOEODIVERSITYASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDiversityThenFitnessComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDiversityThenFitnessComparator_8h-source.html new file mode 100644 index 000000000..bf28f667f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDiversityThenFitnessComparator_8h-source.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoDiversityThenFitnessComparator.h Source File + + + + +
+
+

moeoDiversityThenFitnessComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDiversityThenFitnessComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODIVERSITYTHENFITNESSCOMPARATOR_H_
+00014 #define MOEODIVERSITYTHENFITNESSCOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoDiversityThenFitnessComparator : public moeoComparator < MOEOT >
+00023 {
+00024 public:
+00025 
+00031     const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00032     {
+00033         if (_moeo1.diversity() == _moeo2.diversity())
+00034         {
+00035             return _moeo1.fitness() < _moeo2.fitness();
+00036         }
+00037         else
+00038         {
+00039             return _moeo1.diversity() < _moeo2.diversity();
+00040         }
+00041     }
+00042 
+00043 };
+00044 
+00045 #endif /*MOEODIVERSITYTHENFITNESSCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDummyDiversityAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDummyDiversityAssignment_8h-source.html new file mode 100644 index 000000000..e1def22a3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDummyDiversityAssignment_8h-source.html @@ -0,0 +1,74 @@ + + +ParadisEO-MOEO: moeoDummyDiversityAssignment.h Source File + + + + +
+
+

moeoDummyDiversityAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDummyDiversityAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODUMMYDIVERSITYASSIGNMENT_H_
+00014 #define MOEODUMMYDIVERSITYASSIGNMENT_H_
+00015 
+00016 #include<diversity/moeoDiversityAssignment.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoDummyDiversityAssignment : public moeoDiversityAssignment < MOEOT >
+00023 {
+00024 public:
+00025 
+00027     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00028 
+00029 
+00034     void operator () (eoPop < MOEOT > & _pop)
+00035     {
+00036         for (unsigned int idx = 0; idx<_pop.size (); idx++)
+00037         {
+00038             if (_pop[idx].invalidDiversity())
+00039             {
+00040                 // set the diversity to 0
+00041                 _pop[idx].diversity(0.0);
+00042             }
+00043         }
+00044     }
+00045 
+00046 
+00052     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00053     {
+00054         // nothing to do...  ;-)
+00055     }
+00056 
+00057 };
+00058 
+00059 #endif /*MOEODUMMYDIVERSITYASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoDummyFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoDummyFitnessAssignment_8h-source.html new file mode 100644 index 000000000..0f798d182 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoDummyFitnessAssignment_8h-source.html @@ -0,0 +1,74 @@ + + +ParadisEO-MOEO: moeoDummyFitnessAssignment.h Source File + + + + +
+
+

moeoDummyFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoDummyFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEODUMMYFITNESSASSIGNMENT_H_
+00014 #define MOEODUMMYFITNESSASSIGNMENT_H_
+00015 
+00016 #include <fitness/moeoFitnessAssignment.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoDummyFitnessAssignment : public moeoFitnessAssignment < MOEOT >
+00023 {
+00024 public:
+00025 
+00027     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00028 
+00029 
+00034     void operator () (eoPop < MOEOT > & _pop)
+00035     {
+00036         for (unsigned int idx = 0; idx<_pop.size (); idx++)
+00037         {
+00038             if (_pop[idx].invalidFitness())
+00039             {
+00040                 // set the diversity to 0
+00041                 _pop[idx].fitness(0.0);
+00042             }
+00043         }
+00044     }
+00045 
+00046 
+00052     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00053     {
+00054         // nothing to do...  ;-)
+00055     }
+00056 
+00057 };
+00058 
+00059 #endif /*MOEODUMMYFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoEA_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoEA_8h-source.html new file mode 100644 index 000000000..2e755d41b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoEA_8h-source.html @@ -0,0 +1,50 @@ + + +ParadisEO-MOEO: moeoEA.h Source File + + + + +
+
+

moeoEA.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoEA.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOEA_H_
+00014 #define MOEOEA_H_
+00015 
+00016 #include <eoAlgo.h>
+00017 #include <algo/moeoAlgo.h>
+00018 
+00022 template < class MOEOT >
+00023 class moeoEA : public moeoAlgo, public eoAlgo < MOEOT > {};
+00024 
+00025 #endif /*MOEOEA_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoEasyEA_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoEasyEA_8h-source.html new file mode 100644 index 000000000..7a428189f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoEasyEA_8h-source.html @@ -0,0 +1,169 @@ + + +ParadisEO-MOEO: moeoEasyEA.h Source File + + + + +
+
+

moeoEasyEA.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoEasyEA.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef _MOEOEASYEA_H
+00014 #define _MOEOEASYEA_H
+00015 
+00016 #include <apply.h>
+00017 #include <eoBreed.h>
+00018 #include <eoContinue.h>
+00019 #include <eoMergeReduce.h>
+00020 #include <eoPopEvalFunc.h>
+00021 #include <eoSelect.h>
+00022 #include <eoTransform.h>
+00023 #include <algo/moeoEA.h>
+00024 #include <diversity/moeoDiversityAssignment.h>
+00025 #include <diversity/moeoDummyDiversityAssignment.h>
+00026 #include <fitness/moeoFitnessAssignment.h>
+00027 #include <replacement/moeoReplacement.h>
+00028 
+00032 template < class MOEOT >
+00033 class moeoEasyEA: public moeoEA < MOEOT >
+00034 {
+00035 public:
+00036 
+00047     moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace,
+00048                moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
+00049             :
+00050             continuator(_continuator), eval (_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
+00051             fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
+00052     {}
+00053 
+00054 
+00065     moeoEasyEA(eoContinue < MOEOT > & _continuator, eoPopEvalFunc < MOEOT > & _popEval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace,
+00066                moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
+00067             :
+00068             continuator(_continuator), eval (dummyEval), loopEval(dummyEval), popEval(_popEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
+00069             fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
+00070     {}
+00071 
+00072 
+00084     moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce,
+00085                moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
+00086             :
+00087             continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(_merge,_reduce), replace(mergeReduce),
+00088             fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
+00089     {}
+00090 
+00091 
+00103     moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, moeoReplacement < MOEOT > & _replace,
+00104                moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
+00105             :
+00106             continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(dummyMerge, dummyReduce), replace(_replace),
+00107             fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
+00108     {}
+00109 
+00110 
+00123     moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce,
+00124                moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false)
+00125             :
+00126             continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(_merge,_reduce), replace(mergeReduce),
+00127             fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection)
+00128     {}
+00129 
+00130 
+00135     virtual void operator()(eoPop < MOEOT > & _pop)
+00136     {
+00137         eoPop < MOEOT > offspring, empty_pop;
+00138         popEval(empty_pop, _pop); // A first eval of pop.
+00139         bool firstTime = true;
+00140         do
+00141         {
+00142             try
+00143             {
+00144                 unsigned int pSize = _pop.size();
+00145                 offspring.clear(); // new offspring
+00146                 // fitness and diversity assignment (if you want to or if it is the first generation)
+00147                 if (evalFitAndDivBeforeSelection || firstTime)
+00148                 {
+00149                     firstTime = false;
+00150                     fitnessEval(_pop);
+00151                     diversityEval(_pop);
+00152                 }
+00153                 breed(_pop, offspring);
+00154                 popEval(_pop, offspring); // eval of parents + offspring if necessary
+00155                 replace(_pop, offspring); // after replace, the new pop. is in _pop
+00156                 if (pSize > _pop.size())
+00157                 {
+00158                     throw std::runtime_error("Population shrinking!");
+00159                 }
+00160                 else if (pSize < _pop.size())
+00161                 {
+00162                     throw std::runtime_error("Population growing!");
+00163                 }
+00164             }
+00165             catch (std::exception& e)
+00166             {
+00167                 std::string s = e.what();
+00168                 s.append( " in moeoEasyEA");
+00169                 throw std::runtime_error( s );
+00170             }
+00171         } while (continuator(_pop));
+00172     }
+00173 
+00174 
+00175 protected:
+00176 
+00178     eoContinue < MOEOT > & continuator;
+00180     eoEvalFunc < MOEOT > & eval;
+00182     eoPopLoopEval < MOEOT > loopEval;
+00184     eoPopEvalFunc < MOEOT > & popEval;
+00186     eoSelectTransform < MOEOT > selectTransform;
+00188     eoBreed < MOEOT > & breed;
+00190     eoMergeReduce < MOEOT > mergeReduce;
+00192     moeoReplacement < MOEOT > & replace;
+00194     moeoFitnessAssignment < MOEOT > & fitnessEval;
+00196     moeoDiversityAssignment < MOEOT > & diversityEval;
+00198     bool evalFitAndDivBeforeSelection;
+00200     class eoDummyEval : public eoEvalFunc < MOEOT >
+00201     { public: 
+00202         void operator()(MOEOT &) {}} dummyEval;
+00204     class eoDummySelect : public eoSelect < MOEOT >
+00205     { public: 
+00206         void operator()(const eoPop < MOEOT > &, eoPop < MOEOT > &) {} } dummySelect;
+00208     class eoDummyTransform : public eoTransform < MOEOT >
+00209     { public: 
+00210         void operator()(eoPop < MOEOT > &) {} } dummyTransform;
+00212     eoNoElitism < MOEOT > dummyMerge;
+00214     eoTruncate < MOEOT > dummyReduce;
+00215 
+00216 };
+00217 
+00218 #endif /*MOEOEASYEA_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoElitistReplacement_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoElitistReplacement_8h-source.html new file mode 100644 index 000000000..3ee869f98 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoElitistReplacement_8h-source.html @@ -0,0 +1,114 @@ + + +ParadisEO-MOEO: moeoElitistReplacement.h Source File + + + + +
+
+

moeoElitistReplacement.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoElitistReplacement.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOELITISTREPLACEMENT_H_
+00014 #define MOEOELITISTREPLACEMENT_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 #include <comparator/moeoFitnessThenDiversityComparator.h>
+00018 #include <diversity/moeoDiversityAssignment.h>
+00019 #include <diversity/moeoDummyDiversityAssignment.h>
+00020 #include <fitness/moeoFitnessAssignment.h>
+00021 #include <replacement/moeoReplacement.h>
+00022 
+00026 template < class MOEOT > class moeoElitistReplacement:public moeoReplacement < MOEOT >
+00027 {
+00028 public:
+00029 
+00036     moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment, moeoComparator < MOEOT > & _comparator) :
+00037             fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (_comparator)
+00038     {}
+00039 
+00040 
+00046     moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment) :
+00047             fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (defaultComparator)
+00048     {}
+00049 
+00050 
+00056     moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoComparator < MOEOT > & _comparator) :
+00057             fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (_comparator)
+00058     {}
+00059 
+00060 
+00066     moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment) :
+00067             fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (defaultComparator)
+00068     {}
+00069 
+00070 
+00076     void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring)
+00077     {
+00078         unsigned int sz = _parents.size ();
+00079         // merges offspring and parents into a global population
+00080         _parents.reserve (_parents.size () + _offspring.size ());
+00081         std::copy (_offspring.begin (), _offspring.end (), back_inserter (_parents));
+00082         // evaluates the fitness and the diversity of this global population
+00083         fitnessAssignment (_parents);
+00084         diversityAssignment (_parents);
+00085         // sorts the whole population according to the comparator
+00086         std::sort(_parents.begin(), _parents.end(), comparator);
+00087         // finally, resize this global population
+00088         _parents.resize (sz);
+00089         // and clear the offspring population
+00090         _offspring.clear ();
+00091     }
+00092 
+00093 
+00094 protected:
+00095 
+00097     moeoFitnessAssignment < MOEOT > & fitnessAssignment;
+00099     moeoDiversityAssignment < MOEOT > & diversityAssignment;
+00101     moeoDummyDiversityAssignment < MOEOT > defaultDiversity;
+00103     moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
+00105     class Cmp
+00106     {
+00107     public:
+00112         Cmp(moeoComparator < MOEOT > & _comp) : comp(_comp)
+00113         {}
+00119         bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00120         {
+00121             return comp(_moeo2,_moeo1);
+00122         }
+00123     private:
+00125         moeoComparator < MOEOT > & comp;
+00126     } comparator;
+00127 
+00128 };
+00129 
+00130 #endif /*MOEOELITISTREPLACEMENT_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoEntropyMetric_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoEntropyMetric_8h-source.html new file mode 100644 index 000000000..00992dcdb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoEntropyMetric_8h-source.html @@ -0,0 +1,174 @@ + + +ParadisEO-MOEO: moeoEntropyMetric.h Source File + + + + +
+
+

moeoEntropyMetric.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoEntropyMetric.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOENTROPYMETRIC_H_
+00014 #define MOEOENTROPYMETRIC_H_
+00015 
+00016 #include <vector>
+00017 #include <comparator/moeoParetoObjectiveVectorComparator.h>
+00018 #include <metric/moeoMetric.h>
+00019 
+00024 template < class ObjectiveVector >
+00025 class moeoEntropyMetric : public moeoVectorVsVectorBinaryMetric < ObjectiveVector, double >
+00026 {
+00027 public:
+00028 
+00034     double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) {
+00035         // normalization
+00036         std::vector< ObjectiveVector > set1 = _set1;
+00037         std::vector< ObjectiveVector > set2= _set2;
+00038         removeDominated (set1);
+00039         removeDominated (set2);
+00040         prenormalize (set1);
+00041         normalize (set1);
+00042         normalize (set2);
+00043 
+00044         // making of PO*
+00045         std::vector< ObjectiveVector > star; // rotf :-)
+00046         computeUnion (set1, set2, star);
+00047         removeDominated (star);
+00048 
+00049         // making of PO1 U PO*
+00050         std::vector< ObjectiveVector > union_set1_star; // rotf again ...
+00051         computeUnion (set1, star, union_set1_star);
+00052 
+00053         unsigned int C = union_set1_star.size();
+00054         float omega=0;
+00055         float entropy=0;
+00056 
+00057         for (unsigned int i=0 ; i<C ; i++) {
+00058             unsigned int N_i = howManyInNicheOf (union_set1_star, union_set1_star[i], star.size());
+00059             unsigned int n_i = howManyInNicheOf (set1, union_set1_star[i], star.size());
+00060             if (n_i > 0) {
+00061                 omega += 1.0 / N_i;
+00062                 entropy += (float) n_i / (N_i * C) * log (((float) n_i / C) / log (2.0));
+00063             }
+00064         }
+00065         entropy /= - log (omega);
+00066         entropy *= log (2.0);
+00067         return entropy;
+00068     }
+00069 
+00070 
+00071 private:
+00072 
+00074     std::vector<double> vect_min_val;
+00076     std::vector<double> vect_max_val;
+00078     moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
+00079 
+00080 
+00085     void removeDominated(std::vector < ObjectiveVector > & _f) {
+00086         for (unsigned int i=0 ; i<_f.size(); i++) {
+00087             bool dom = false;
+00088             for (unsigned int j=0; j<_f.size(); j++)
+00089                 if (i != j && paretoComparator(_f[i],_f[j]))
+00090                 {
+00091                     dom = true;
+00092                     break;
+00093                 }
+00094             if (dom) {
+00095                 _f[i] = _f.back();
+00096                 _f.pop_back();
+00097                 i--;
+00098             }
+00099         }
+00100     }
+00101 
+00102 
+00107     void prenormalize (const std::vector< ObjectiveVector > & _f) {
+00108         vect_min_val.clear();
+00109         vect_max_val.clear();
+00110 
+00111         for (unsigned int i=0 ; i<ObjectiveVector::nObjectives(); i++) {
+00112             float min_val = _f.front()[i], max_val = min_val;
+00113             for (unsigned int j=1 ; j<_f.size(); j++) {
+00114                 if (_f[j][i] < min_val)
+00115                     min_val = _f[j][i];
+00116                 if (_f[j][i]>max_val)
+00117                     max_val = _f[j][i];
+00118             }
+00119             vect_min_val.push_back(min_val);
+00120             vect_max_val.push_back (max_val);
+00121         }
+00122     }
+00123 
+00124 
+00129     void normalize (std::vector< ObjectiveVector > & _f) {
+00130         for (unsigned int i=0 ; i<ObjectiveVector::nObjectives(); i++)
+00131             for (unsigned int j=0; j<_f.size(); j++)
+00132                 _f[j][i] = (_f[j][i] - vect_min_val[i]) / (vect_max_val[i] - vect_min_val[i]);
+00133     }
+00134 
+00135 
+00142     void computeUnion(const std::vector< ObjectiveVector > & _f1, const std::vector< ObjectiveVector > & _f2, std::vector< ObjectiveVector > & _f) {
+00143         _f = _f1 ;
+00144         for (unsigned int i=0; i<_f2.size(); i++) {
+00145             bool b = false;
+00146             for (unsigned int j=0; j<_f1.size(); j ++)
+00147                 if (_f1[j] == _f2[i]) {
+00148                     b = true;
+00149                     break;
+00150                 }
+00151             if (! b)
+00152                 _f.push_back(_f2[i]);
+00153         }
+00154     }
+00155 
+00156 
+00160     unsigned int howManyInNicheOf (const std::vector< ObjectiveVector > & _f, const ObjectiveVector & _s, unsigned int _size) {
+00161         unsigned int n=0;
+00162         for (unsigned int i=0 ; i<_f.size(); i++) {
+00163             if (euclidianDistance(_f[i], _s) < (_s.size() / (double) _size))
+00164                 n++;
+00165         }
+00166         return n;
+00167     }
+00168 
+00169 
+00173     double euclidianDistance (const ObjectiveVector & _set1, const ObjectiveVector & _to, unsigned int _deg = 2) {
+00174         double dist=0;
+00175         for (unsigned int i=0; i<_set1.size(); i++)
+00176             dist += pow(fabs(_set1[i] - _to[i]), (int)_deg);
+00177         return pow(dist, 1.0 / _deg);
+00178     }
+00179 
+00180 };
+00181 
+00182 #endif /*MOEOENTROPYMETRIC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoEnvironmentalReplacement_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoEnvironmentalReplacement_8h-source.html new file mode 100644 index 000000000..4f32ef39c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoEnvironmentalReplacement_8h-source.html @@ -0,0 +1,128 @@ + + +ParadisEO-MOEO: moeoEnvironmentalReplacement.h Source File + + + + +
+
+

moeoEnvironmentalReplacement.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoEnvironmentalReplacement.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOENVIRONMENTALREPLACEMENT_H_
+00014 #define MOEOENVIRONMENTALREPLACEMENT_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 #include <comparator/moeoFitnessThenDiversityComparator.h>
+00018 #include <diversity/moeoDiversityAssignment.h>
+00019 #include <fitness/moeoFitnessAssignment.h>
+00020 #include <replacement/moeoReplacement.h>
+00021 
+00026 template < class MOEOT > class moeoEnvironmentalReplacement:public moeoReplacement < MOEOT >
+00027 {
+00028 public:
+00029 
+00031     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00032 
+00033 
+00040     moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment, moeoComparator < MOEOT > & _comparator) :
+00041             fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (_comparator)
+00042     {}
+00043 
+00044 
+00050     moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment) :
+00051             fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (defaultComparator)
+00052     {}
+00053 
+00054 
+00060     moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoComparator < MOEOT > & _comparator) :
+00061             fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (_comparator)
+00062     {}
+00063 
+00064 
+00070     moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment) :
+00071             fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (defaultComparator)
+00072     {}
+00073 
+00074 
+00080     void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring)
+00081     {
+00082         unsigned int sz = _parents.size();
+00083         // merges offspring and parents into a global population
+00084         _parents.reserve (_parents.size() + _offspring.size());
+00085         std::copy (_offspring.begin(), _offspring.end(), back_inserter(_parents));
+00086         // evaluates the fitness and the diversity of this global population
+00087         fitnessAssignment (_parents);
+00088         diversityAssignment (_parents);
+00089         // remove individuals 1 by 1 and update the fitness values
+00090         unsigned int worstIdx;
+00091         ObjectiveVector worstObjVec;
+00092         while (_parents.size() > sz)
+00093         {
+00094             // the individual to delete
+00095             worstIdx = std::min_element(_parents.begin(), _parents.end(), comparator) - _parents.begin();
+00096             worstObjVec = _parents[worstIdx].objectiveVector();
+00097             // remove the woorst individual
+00098             _parents[worstIdx] = _parents.back();
+00099             _parents.pop_back();
+00100             // update of the fitness and diversity values
+00101             fitnessAssignment.updateByDeleting(_parents, worstObjVec);
+00102             diversityAssignment.updateByDeleting(_parents, worstObjVec);
+00103 
+00104         }
+00105         // clear the offspring population
+00106         _offspring.clear ();
+00107     }
+00108 
+00109 
+00110 protected:
+00111 
+00113     moeoFitnessAssignment < MOEOT > & fitnessAssignment;
+00115     moeoDiversityAssignment < MOEOT > & diversityAssignment;
+00117     moeoDummyDiversityAssignment < MOEOT > defaultDiversity;
+00119     moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
+00121     class Cmp
+00122     {
+00123     public:
+00128         Cmp(moeoComparator < MOEOT > & _comp) : comp(_comp)
+00129         {}
+00135         bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00136         {
+00137             return comp(_moeo1,_moeo2);
+00138         }
+00139     private:
+00141         moeoComparator < MOEOT > & comp;
+00142     } comparator;
+00143 
+00144 };
+00145 
+00146 #endif /*MOEOENVIRONMENTALREPLACEMENT_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoEuclideanDistance_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoEuclideanDistance_8h-source.html new file mode 100644 index 000000000..e8a4ecefd --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoEuclideanDistance_8h-source.html @@ -0,0 +1,75 @@ + + +ParadisEO-MOEO: moeoEuclideanDistance.h Source File + + + + +
+
+

moeoEuclideanDistance.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoEuclideanDistance.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOEUCLIDEANDISTANCE_H_
+00014 #define MOEOEUCLIDEANDISTANCE_H_
+00015 
+00016 #include <math.h>
+00017 #include <distance/moeoNormalizedDistance.h>
+00018 
+00023 template < class MOEOT >
+00024 class moeoEuclideanDistance : public moeoNormalizedDistance < MOEOT >
+00025 {
+00026 public:
+00027 
+00029     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00030 
+00031 
+00037     const double operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00038     {
+00039         double result = 0.0;
+00040         double tmp1, tmp2;
+00041         for (unsigned int i=0; i<ObjectiveVector::nObjectives(); i++)
+00042         {
+00043             tmp1 = (_moeo1.objectiveVector()[i] - bounds[i].minimum()) / bounds[i].range();
+00044             tmp2 = (_moeo2.objectiveVector()[i] - bounds[i].minimum()) / bounds[i].range();
+00045             result += (tmp1-tmp2) * (tmp1-tmp2);
+00046         }
+00047         return sqrt(result);
+00048     }
+00049 
+00050 
+00051 private:
+00052 
+00054     using moeoNormalizedDistance < MOEOT > :: bounds;
+00055 
+00056 };
+00057 
+00058 #endif /*MOEOEUCLIDEANDISTANCE_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoEvalFunc_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoEvalFunc_8h-source.html new file mode 100644 index 000000000..e0a789f5d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoEvalFunc_8h-source.html @@ -0,0 +1,52 @@ + + +ParadisEO-MOEO: moeoEvalFunc.h Source File + + + + +
+
+

moeoEvalFunc.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoEvalFunc.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOEVALFUNC_H_
+00014 #define MOEOEVALFUNC_H_
+00015 
+00016 #include <eoEvalFunc.h>
+00017 
+00018 /*
+00019  * Functor that evaluates one MOEO by setting all its objective values.
+00020  */
+00021 template < class MOEOT >
+00022 class moeoEvalFunc : public eoEvalFunc< MOEOT > {};
+00023 
+00024 #endif /*MOEOEVALFUNC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoFastNonDominatedSortingFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoFastNonDominatedSortingFitnessAssignment_8h-source.html new file mode 100644 index 000000000..28ea12c77 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoFastNonDominatedSortingFitnessAssignment_8h-source.html @@ -0,0 +1,222 @@ + + +ParadisEO-MOEO: moeoFastNonDominatedSortingFitnessAssignment.h Source File + + + + +
+
+

moeoFastNonDominatedSortingFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoFastNonDominatedSortingFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_
+00014 #define MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_
+00015 
+00016 #include <vector>
+00017 #include <eoPop.h>
+00018 #include <comparator/moeoObjectiveObjectiveVectorComparator.h>
+00019 #include <comparator/moeoObjectiveVectorComparator.h>
+00020 #include <comparator/moeoParetoObjectiveVectorComparator.h>
+00021 #include <fitness/moeoParetoBasedFitnessAssignment.h>
+00022 
+00023 
+00031 template < class MOEOT >
+00032 class moeoFastNonDominatedSortingFitnessAssignment : public moeoParetoBasedFitnessAssignment < MOEOT >
+00033 {
+00034 public:
+00035 
+00037     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00038 
+00039 
+00043     moeoFastNonDominatedSortingFitnessAssignment() : comparator(paretoComparator)
+00044     {}
+00045 
+00046 
+00051     moeoFastNonDominatedSortingFitnessAssignment(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : comparator(_comparator)
+00052     {}
+00053 
+00054 
+00059     void operator()(eoPop < MOEOT > & _pop)
+00060     {
+00061         // number of objectives for the problem under consideration
+00062         unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives();
+00063         if (nObjectives == 1)
+00064         {
+00065             // one objective
+00066             oneObjective(_pop);
+00067         }
+00068         else if (nObjectives == 2)
+00069         {
+00070             // two objectives (the two objectives function is still to implement)
+00071             mObjectives(_pop);
+00072         }
+00073         else if (nObjectives > 2)
+00074         {
+00075             // more than two objectives
+00076             mObjectives(_pop);
+00077         }
+00078         else
+00079         {
+00080             // problem with the number of objectives
+00081             throw std::runtime_error("Problem with the number of objectives in moeoNonDominatedSortingFitnessAssignment");
+00082         }
+00083         // a higher fitness is better, so the values need to be inverted
+00084         double max = _pop[0].fitness();
+00085         for (unsigned int i=1 ; i<_pop.size() ; i++)
+00086         {
+00087             max = std::max(max, _pop[i].fitness());
+00088         }
+00089         for (unsigned int i=0 ; i<_pop.size() ; i++)
+00090         {
+00091             _pop[i].fitness(max - _pop[i].fitness());
+00092         }
+00093     }
+00094 
+00095 
+00101     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00102     {
+00103         for (unsigned int i=0; i<_pop.size(); i++)
+00104         {
+00105             // if _pop[i] is dominated by _objVec
+00106             if ( comparator(_pop[i].objectiveVector(), _objVec) )
+00107             {
+00108                 _pop[i].fitness(_pop[i].fitness()+1);
+00109             }
+00110         }
+00111     }
+00112 
+00113 
+00114 private:
+00115 
+00117     moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
+00119     moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
+00121     class ObjectiveComparator : public moeoComparator < MOEOT >
+00122     {
+00123     public:
+00129          const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00130          {
+00131                 return cmp(_moeo1.objectiveVector(), _moeo2.objectiveVector());
+00132          }
+00133     private:
+00135         moeoObjectiveObjectiveVectorComparator < ObjectiveVector > cmp;
+00136     } objComparator;
+00137 
+00138 
+00143     void oneObjective (eoPop < MOEOT > & _pop)
+00144     {
+00145         // sorts the population in the ascending order
+00146         std::sort(_pop.begin(), _pop.end(), objComparator);
+00147         // assign fitness values
+00148         unsigned int rank = 1;
+00149         _pop[_pop.size()-1].fitness(rank);
+00150         for (unsigned int i=_pop.size()-2; i>=0; i--)
+00151         {
+00152             if (_pop[i].objectiveVector() != _pop[i+1].objectiveVector())
+00153             {
+00154                 rank++;
+00155             }
+00156             _pop[i].fitness(rank);
+00157         }
+00158     }
+00159 
+00160 
+00165     void twoObjectives (eoPop < MOEOT > & _pop)
+00166     {
+00167         //... TO DO !
+00168     }
+00169 
+00170 
+00175     void mObjectives (eoPop < MOEOT > & _pop)
+00176     {
+00177         // S[i] = indexes of the individuals dominated by _pop[i]
+00178         std::vector < std::vector<unsigned int> > S(_pop.size());
+00179         // n[i] = number of individuals that dominate the individual _pop[i]
+00180         std::vector < unsigned int > n(_pop.size(), 0);
+00181         // fronts: F[i] = indexes of the individuals contained in the ith front
+00182         std::vector < std::vector<unsigned int> > F(_pop.size()+2);
+00183         // used to store the number of the first front
+00184         F[1].reserve(_pop.size());
+00185         for (unsigned int p=0; p<_pop.size(); p++)
+00186         {
+00187             for (unsigned int q=0; q<_pop.size(); q++)
+00188             {
+00189                 // if q is dominated by p
+00190                 if ( comparator(_pop[q].objectiveVector(), _pop[p].objectiveVector()) )
+00191                 {
+00192                     // add q to the set of solutions dominated by p
+00193                     S[p].push_back(q);
+00194                 }
+00195                 // if p is dominated by q
+00196                 else if  ( comparator(_pop[p].objectiveVector(), _pop[q].objectiveVector()) )
+00197                 {
+00198                     // increment the domination counter of p
+00199                     n[p]++;
+00200                 }
+00201             }
+00202             // if no individual dominates p
+00203             if (n[p] == 0)
+00204             {
+00205                 // p belongs to the first front
+00206                 _pop[p].fitness(1);
+00207                 F[1].push_back(p);
+00208             }
+00209         }
+00210         // front counter
+00211         unsigned int counter=1;
+00212         unsigned int p,q;
+00213         while (! F[counter].empty())
+00214         {
+00215             // used to store the number of the next front
+00216             F[counter+1].reserve(_pop.size());
+00217             for (unsigned int i=0; i<F[counter].size(); i++)
+00218             {
+00219                 p = F[counter][i];
+00220                 for (unsigned int j=0; j<S[p].size(); j++)
+00221                 {
+00222                     q = S[p][j];
+00223                     n[q]--;
+00224                     // if no individual dominates q anymore
+00225                     if (n[q] == 0)
+00226                     {
+00227                         // q belongs to the next front
+00228                         _pop[q].fitness(counter+1);
+00229                         F[counter+1].push_back(q);
+00230                     }
+00231                 }
+00232             }
+00233             counter++;
+00234         }
+00235     }
+00236 
+00237 };
+00238 
+00239 #endif /*MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoFitnessAssignment_8h-source.html new file mode 100644 index 000000000..d0f3db615 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoFitnessAssignment_8h-source.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoFitnessAssignment.h Source File + + + + +
+
+

moeoFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOFITNESSASSIGNMENT_H_
+00014 #define MOEOFITNESSASSIGNMENT_H_
+00015 
+00016 #include <eoFunctor.h>
+00017 #include <eoPop.h>
+00018 
+00022 template < class MOEOT >
+00023 class moeoFitnessAssignment : public eoUF < eoPop < MOEOT > &, void >
+00024 {
+00025 public:
+00026 
+00028     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00029 
+00030 
+00036     virtual void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) = 0;
+00037 
+00038 
+00044     void updateByDeleting(eoPop < MOEOT > & _pop, MOEOT & _moeo)
+00045     {
+00046         updateByDeleting(_pop, _moeo.objectiveVector());
+00047     }
+00048 
+00049 };
+00050 
+00051 #endif /*MOEOFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoFitnessThenDiversityComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoFitnessThenDiversityComparator_8h-source.html new file mode 100644 index 000000000..2b7a11737 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoFitnessThenDiversityComparator_8h-source.html @@ -0,0 +1,65 @@ + + +ParadisEO-MOEO: moeoFitnessThenDiversityComparator.h Source File + + + + +
+
+

moeoFitnessThenDiversityComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoFitnessThenDiversityComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOFITNESSTHENDIVERSITYCOMPARATOR_H_
+00014 #define MOEOFITNESSTHENDIVERSITYCOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoFitnessThenDiversityComparator : public moeoComparator < MOEOT >
+00023 {
+00024 public:
+00025 
+00031     const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00032     {
+00033         if (_moeo1.fitness() == _moeo2.fitness())
+00034         {
+00035             return _moeo1.diversity() < _moeo2.diversity();
+00036         }
+00037         else
+00038         {
+00039             return _moeo1.fitness() < _moeo2.fitness();
+00040         }
+00041     }
+00042 
+00043 };
+00044 
+00045 #endif /*MOEOFITNESSTHENDIVERSITYCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoFrontByFrontCrowdingDistanceDiversityAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoFrontByFrontCrowdingDistanceDiversityAssignment_8h-source.html new file mode 100644 index 000000000..13f8f38e1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoFrontByFrontCrowdingDistanceDiversityAssignment_8h-source.html @@ -0,0 +1,139 @@ + + +ParadisEO-MOEO: moeoFrontByFrontCrowdingDistanceDiversityAssignment.h Source File + + + + +
+
+

moeoFrontByFrontCrowdingDistanceDiversityAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoFrontByFrontCrowdingDistanceDiversityAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_
+00014 #define MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_
+00015 
+00016 #include <diversity/moeoCrowdingDistanceDiversityAssignment.h>
+00017 #include <comparator/moeoFitnessThenDiversityComparator.h>
+00018 
+00024 template < class MOEOT >
+00025 class moeoFrontByFrontCrowdingDistanceDiversityAssignment : public moeoCrowdingDistanceDiversityAssignment < MOEOT >
+00026 {
+00027 public:
+00028 
+00030     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00031 
+00032 
+00040     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00041     {
+00042         std::cout << "WARNING : updateByDeleting not implemented in moeoFrontByFrontCrowdingDistanceDiversityAssignment" << std::endl;
+00043     }
+00044 
+00045 
+00046 private:
+00047 
+00048     using moeoCrowdingDistanceDiversityAssignment < MOEOT >::inf;
+00049     using moeoCrowdingDistanceDiversityAssignment < MOEOT >::tiny;
+00050 
+00055     void setDistances (eoPop < MOEOT > & _pop)
+00056     {
+00057         unsigned int a,b;
+00058         double min, max, distance;
+00059         unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives();
+00060         // set diversity to 0 for every individual
+00061         for (unsigned int i=0; i<_pop.size(); i++)
+00062         {
+00063             _pop[i].diversity(0.0);
+00064         }
+00065         // sort the whole pop according to fitness values
+00066         moeoFitnessThenDiversityComparator < MOEOT > fitnessComparator;
+00067         std::sort(_pop.begin(), _pop.end(), fitnessComparator);
+00068         // compute the crowding distance values for every individual "front" by "front" (front : from a to b)
+00069         a = 0;                                  // the front starts at a
+00070         while (a < _pop.size())
+00071         {
+00072             b = lastIndex(_pop,a);      // the front ends at b
+00073             // if there is less than 2 individuals in the front...
+00074             if ((b-a) < 2)
+00075             {
+00076                 for (unsigned int i=a; i<=b; i++)
+00077                 {
+00078                     _pop[i].diversity(inf());
+00079                 }
+00080             }
+00081             // else...
+00082             else
+00083             {
+00084                 // for each objective
+00085                 for (unsigned int obj=0; obj<nObjectives; obj++)
+00086                 {
+00087                     // sort in the descending order using the values of the objective 'obj'
+00088                     moeoOneObjectiveComparator < MOEOT > objComp(obj);
+00089                     std::sort(_pop.begin()+a, _pop.begin()+b+1, objComp);
+00090                     // min & max
+00091                     min = _pop[b].objectiveVector()[obj];
+00092                     max = _pop[a].objectiveVector()[obj];
+00093                     // avoid extreme case
+00094                     if (min == max)
+00095                     {
+00096                         min -= tiny();
+00097                         max += tiny();
+00098                     }
+00099                     // set the diversity value to infiny for min and max
+00100                     _pop[a].diversity(inf());
+00101                     _pop[b].diversity(inf());
+00102                     // set the diversity values for the other individuals
+00103                     for (unsigned int i=a+1; i<b; i++)
+00104                     {
+00105                         distance = (_pop[i-1].objectiveVector()[obj] - _pop[i+1].objectiveVector()[obj]) / (max-min);
+00106                         _pop[i].diversity(_pop[i].diversity() + distance);
+00107                     }
+00108                 }
+00109             }
+00110             // go to the next front
+00111             a = b+1;
+00112         }
+00113     }
+00114 
+00115 
+00121     unsigned int lastIndex (eoPop < MOEOT > & _pop, unsigned int _start)
+00122     {
+00123         unsigned int i=_start;
+00124         while ( (i<_pop.size()-1) && (_pop[i].fitness()==_pop[i+1].fitness()) )
+00125         {
+00126             i++;
+00127         }
+00128         return i;
+00129     }
+00130 
+00131 };
+00132 
+00133 #endif /*MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoFrontByFrontSharingDiversityAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoFrontByFrontSharingDiversityAssignment_8h-source.html new file mode 100644 index 000000000..2a4944749 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoFrontByFrontSharingDiversityAssignment_8h-source.html @@ -0,0 +1,108 @@ + + +ParadisEO-MOEO: moeoFrontByFrontSharingDiversityAssignment.h Source File + + + + +
+
+

moeoFrontByFrontSharingDiversityAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoFrontByFrontSharingDiversityAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_
+00014 #define MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_
+00015 
+00016 #include <diversity/moeoSharingDiversityAssignment.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoFrontByFrontSharingDiversityAssignment : public moeoSharingDiversityAssignment < MOEOT >
+00023 {
+00024 public:
+00025 
+00027     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00028 
+00029 
+00036     moeoFrontByFrontSharingDiversityAssignment(moeoDistance<MOEOT,double> & _distance, double _nicheSize = 0.5, double _alpha = 2.0) : moeoSharingDiversityAssignment < MOEOT >(_distance, _nicheSize, _alpha)
+00037     {}
+00038 
+00039 
+00045     moeoFrontByFrontSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 2.0) : moeoSharingDiversityAssignment < MOEOT >(_nicheSize, _alpha)
+00046     {}
+00047 
+00048 
+00056     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00057     {
+00058         std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl;
+00059     }
+00060 
+00061 
+00062 private:
+00063 
+00064     using moeoSharingDiversityAssignment < MOEOT >::distance;
+00065     using moeoSharingDiversityAssignment < MOEOT >::nicheSize;
+00066     using moeoSharingDiversityAssignment < MOEOT >::sh;
+00067     using moeoSharingDiversityAssignment < MOEOT >::operator();
+00068 
+00069 
+00074     void setSimilarities(eoPop < MOEOT > & _pop)
+00075     {
+00076         // compute distances between every individuals
+00077         moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance);
+00078         dMatrix(_pop);
+00079         // sets the distance to bigger than the niche size for every couple of solutions that do not belong to the same front
+00080         for (unsigned int i=0; i<_pop.size(); i++)
+00081         {
+00082             for (unsigned int j=0; j<i; j++)
+00083             {
+00084                 if (_pop[i].fitness() != _pop[j].fitness())
+00085                 {
+00086                     dMatrix[i][j] = nicheSize;
+00087                     dMatrix[j][i] = nicheSize;
+00088                 }
+00089             }
+00090         }
+00091         // compute similarities
+00092         double sum;
+00093         for (unsigned int i=0; i<_pop.size(); i++)
+00094         {
+00095             sum = 0.0;
+00096             for (unsigned int j=0; j<_pop.size(); j++)
+00097             {
+00098                 sum += sh(dMatrix[i][j]);
+00099             }
+00100             _pop[i].diversity(sum);
+00101         }
+00102     }
+00103 
+00104 };
+00105 
+00106 #endif /*MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoGDominanceObjectiveVectorComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoGDominanceObjectiveVectorComparator_8h-source.html new file mode 100644 index 000000000..bbfb174f5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoGDominanceObjectiveVectorComparator_8h-source.html @@ -0,0 +1,109 @@ + + +ParadisEO-MOEO: moeoGDominanceObjectiveVectorComparator.h Source File + + + + +
+
+

moeoGDominanceObjectiveVectorComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoGDominanceObjectiveVectorComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOGDOMINANCEOBJECTIVEVECTORCOMPARATOR_H_
+00014 #define MOEOGDOMINANCEOBJECTIVEVECTORCOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoObjectiveVectorComparator.h>
+00017 
+00024 template < class ObjectiveVector >
+00025 class moeoGDominanceObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector >
+00026 {
+00027 public:
+00028 
+00033     moeoGDominanceObjectiveVectorComparator(ObjectiveVector & _ref) : ref(_ref)
+00034     {}
+00035 
+00036 
+00042     const bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)
+00043     {
+00044         unsigned int flag1 = flag(_objectiveVector1);
+00045         unsigned int flag2 = flag(_objectiveVector2);
+00046         if (flag2==0)
+00047         {
+00048             // cannot dominate
+00049             return false;
+00050         }
+00051         else if ( (flag2==1) && (flag1==0) )
+00052         {
+00053             // is dominated
+00054             return true;
+00055         }
+00056         else // (flag1==1) && (flag2==1)
+00057         {
+00058             // both are on the good region, so let's use the classical Pareto dominance
+00059             return paretoComparator(_objectiveVector1, _objectiveVector2);
+00060         }
+00061     }
+00062 
+00063 
+00064 private:
+00065 
+00067     ObjectiveVector & ref;
+00069     moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
+00070 
+00071 
+00076     unsigned int flag(const ObjectiveVector & _objectiveVector)
+00077     {
+00078         unsigned int result=1;
+00079         for (unsigned int i=0; i<ref.nObjectives(); i++)
+00080         {
+00081             if (_objectiveVector[i] > ref[i])
+00082             {
+00083                 result=0;
+00084             }
+00085         }
+00086         if (result==0)
+00087         {
+00088             result=1;
+00089             for (unsigned int i=0; i<ref.nObjectives(); i++)
+00090             {
+00091                 if (_objectiveVector[i] < ref[i])
+00092                 {
+00093                     result=0;
+00094                 }
+00095             }
+00096         }
+00097         return result;
+00098     }
+00099 
+00100 };
+00101 
+00102 #endif /*MOEOGDOMINANCEOBJECTIVEVECTORCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoGenerationalReplacement_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoGenerationalReplacement_8h-source.html new file mode 100644 index 000000000..7d8f5386f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoGenerationalReplacement_8h-source.html @@ -0,0 +1,59 @@ + + +ParadisEO-MOEO: moeoGenerationalReplacement.h Source File + + + + +
+
+

moeoGenerationalReplacement.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoGenerationalReplacement.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOGENERATIONALREPLACEMENT_H_
+00014 #define MOEOGENERATIONALREPLACEMENT_H_
+00015 
+00016 #include <eoReplacement.h>
+00017 #include <replacement/moeoReplacement.h>
+00018 
+00022 template < class MOEOT >
+00023 class moeoGenerationalReplacement : public moeoReplacement < MOEOT >, public eoGenerationalReplacement < MOEOT >
+00024 {
+00025 public:
+00026 
+00032     void operator()(eoPop < MOEOT > & _parents, eoPop < MOEOT > & _offspring)
+00033     {
+00034         eoGenerationalReplacement < MOEOT >::operator ()(_parents, _offspring);
+00035     }
+00036 
+00037 };
+00038 
+00039 #endif /*MOEOGENERATIONALREPLACEMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoHybridLS_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoHybridLS_8h-source.html new file mode 100644 index 000000000..a813775a0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoHybridLS_8h-source.html @@ -0,0 +1,86 @@ + + +ParadisEO-MOEO: moeoHybridLS.h Source File + + + + +
+
+

moeoHybridLS.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoHybridLS.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOHYBRIDLS_H_
+00014 #define MOEOHYBRIDLS_H_
+00015 
+00016 #include <eoContinue.h>
+00017 #include <eoPop.h>
+00018 #include <eoSelect.h>
+00019 #include <utils/eoUpdater.h>
+00020 #include <algo/moeoLS.h>
+00021 #include <archive/moeoArchive.h>
+00022 
+00027 template < class MOEOT >
+00028 class moeoHybridLS : public eoUpdater
+00029 {
+00030 public:
+00031 
+00039     moeoHybridLS (eoContinue < MOEOT > & _term, eoSelect < MOEOT > & _select, moeoLS < MOEOT, MOEOT > & _mols, moeoArchive < MOEOT > & _arch) :
+00040             term(_term), select(_select), mols(_mols), arch(_arch)
+00041     {}
+00042 
+00043 
+00047     void operator () ()
+00048     {
+00049         if (! term (arch))
+00050         {
+00051             // selection of solutions
+00052             eoPop < MOEOT > selectedSolutions;
+00053             select(arch, selectedSolutions);
+00054             // apply the local search to every selected solution
+00055             for (unsigned int i=0; i<selectedSolutions.size(); i++)
+00056             {
+00057                 mols(selectedSolutions[i], arch);
+00058             }
+00059         }
+00060     }
+00061 
+00062 
+00063 private:
+00064 
+00066     eoContinue < MOEOT > & term;
+00068     eoSelect < MOEOT > & select;
+00070     moeoLS < MOEOT, MOEOT > & mols;
+00072     moeoArchive < MOEOT > & arch;
+00073 
+00074 };
+00075 
+00076 #endif /*MOEOHYBRIDLS_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoHypervolumeBinaryMetric_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoHypervolumeBinaryMetric_8h-source.html new file mode 100644 index 000000000..4d6f7d29f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoHypervolumeBinaryMetric_8h-source.html @@ -0,0 +1,141 @@ + + +ParadisEO-MOEO: moeoHypervolumeBinaryMetric.h Source File + + + + +
+
+

moeoHypervolumeBinaryMetric.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoHypervolumeBinaryMetric.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOHYPERVOLUMEBINARYMETRIC_H_
+00014 #define MOEOHYPERVOLUMEBINARYMETRIC_H_
+00015 
+00016 #include <stdexcept>
+00017 #include <comparator/moeoParetoObjectiveVectorComparator.h>
+00018 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
+00019 
+00028 template < class ObjectiveVector >
+00029 class moeoHypervolumeBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double >
+00030 {
+00031 public:
+00032 
+00037     moeoHypervolumeBinaryMetric(double _rho = 1.1) : rho(_rho)
+00038     {
+00039         // not-a-maximization problem check
+00040         for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
+00041         {
+00042             if (ObjectiveVector::Traits::maximizing(i))
+00043             {
+00044                 throw std::runtime_error("Hypervolume binary metric not yet implemented for a maximization problem in moeoHypervolumeBinaryMetric");
+00045             }
+00046         }
+00047         // consistency check
+00048         if (rho < 1)
+00049         {
+00050             std::cout << "Warning, value used to compute the reference point rho for the hypervolume calculation must not be smaller than 1" << std::endl;
+00051             std::cout << "Adjusted to 1" << std::endl;
+00052             rho = 1;
+00053         }
+00054     }
+00055 
+00056 
+00063     double operator()(const ObjectiveVector & _o1, const ObjectiveVector & _o2)
+00064     {
+00065         double result;
+00066         // if _o2 is dominated by _o1
+00067         if ( paretoComparator(_o2,_o1) )
+00068         {
+00069             result = - hypervolume(_o1, _o2, ObjectiveVector::Traits::nObjectives()-1);
+00070         }
+00071         else
+00072         {
+00073             result = hypervolume(_o2, _o1, ObjectiveVector::Traits::nObjectives()-1);
+00074         }
+00075         return result;
+00076     }
+00077 
+00078 
+00079 private:
+00080 
+00082     double rho;
+00084     using moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > :: bounds;
+00086     moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
+00087 
+00088 
+00096     double hypervolume(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned int _obj, const bool _flag = false)
+00097     {
+00098         double result;
+00099         double range = rho * bounds[_obj].range();
+00100         double max = bounds[_obj].minimum() + range;
+00101         // value of _1 for the objective _obj
+00102         double v1 = _o1[_obj];
+00103         // value of _2 for the objective _obj (if _flag=true, v2=max)
+00104         double v2;
+00105         if (_flag)
+00106         {
+00107             v2 = max;
+00108         }
+00109         else
+00110         {
+00111             v2 = _o2[_obj];
+00112         }
+00113         // computation of the volume
+00114         if (_obj == 0)
+00115         {
+00116             if (v1 < v2)
+00117             {
+00118                 result = (v2 - v1) / range;
+00119             }
+00120             else
+00121             {
+00122                 result = 0;
+00123             }
+00124         }
+00125         else
+00126         {
+00127             if (v1 < v2)
+00128             {
+00129                 result = ( hypervolume(_o1, _o2, _obj-1, true) * (v2 - v1) / range ) + ( hypervolume(_o1, _o2, _obj-1) * (max - v2) / range );
+00130             }
+00131             else
+00132             {
+00133                 result = hypervolume(_o1, _o2, _obj-1) * (max - v2) / range;
+00134             }
+00135         }
+00136         return result;
+00137     }
+00138 
+00139 };
+00140 
+00141 #endif /*MOEOHYPERVOLUMEBINARYMETRIC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoIBEA_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoIBEA_8h-source.html new file mode 100644 index 000000000..ff9c5b47d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoIBEA_8h-source.html @@ -0,0 +1,133 @@ + + +ParadisEO-MOEO: moeoIBEA.h Source File + + + + +
+
+

moeoIBEA.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoIBEA.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOIBEA_H_
+00014 #define MOEOIBEA_H_
+00015 
+00016 
+00017 #include <eoBreed.h>
+00018 #include <eoContinue.h>
+00019 #include <eoEvalFunc.h>
+00020 #include <eoGenContinue.h>
+00021 #include <eoGeneralBreeder.h>
+00022 #include <eoGenOp.h>
+00023 #include <eoPopEvalFunc.h>
+00024 #include <eoSGAGenOp.h>
+00025 #include <algo/moeoEA.h>
+00026 #include <diversity/moeoDummyDiversityAssignment.h>
+00027 #include <fitness/moeoIndicatorBasedFitnessAssignment.h>
+00028 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
+00029 #include <replacement/moeoEnvironmentalReplacement.h>
+00030 #include <selection/moeoDetTournamentSelect.h>
+00031 
+00037 template < class MOEOT >
+00038 class moeoIBEA : public moeoEA < MOEOT >
+00039 {
+00040 public:
+00041 
+00043     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00044 
+00045 
+00054     moeoIBEA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) :
+00055             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2),
+00056             fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed)
+00057     {}
+00058 
+00059 
+00068     moeoIBEA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) :
+00069             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2),
+00070             fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed)
+00071     {}
+00072 
+00073 
+00085     moeoIBEA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) :
+00086             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select (2),
+00087             fitnessAssignment(_metric, _kappa), replace (fitnessAssignment, dummyDiversityAssignment), defaultSGAGenOp(_crossover, _pCross, _mutation, _pMut),
+00088             genBreed (select, defaultSGAGenOp), breed (genBreed)
+00089     {}
+00090 
+00091 
+00100     moeoIBEA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) :
+00101             continuator(_continuator), popEval(_eval), select(2),
+00102             fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed)
+00103     {}
+00104 
+00105 
+00114     moeoIBEA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) :
+00115             continuator(_continuator), popEval(_eval), select(2),
+00116             fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed)
+00117     {}
+00118 
+00119 
+00124     virtual void operator () (eoPop < MOEOT > &_pop)
+00125     {
+00126         eoPop < MOEOT > offspring, empty_pop;
+00127         popEval (empty_pop, _pop);      // a first eval of _pop
+00128         // evaluate fitness and diversity
+00129         fitnessAssignment(_pop);
+00130         dummyDiversityAssignment(_pop);
+00131         do
+00132         {
+00133             // generate offspring, worths are recalculated if necessary
+00134             breed (_pop, offspring);
+00135             // eval of offspring
+00136             popEval (_pop, offspring);
+00137             // after replace, the new pop is in _pop. Worths are recalculated if necessary
+00138             replace (_pop, offspring);
+00139         } while (continuator (_pop));
+00140     }
+00141 
+00142 
+00143 protected:
+00144 
+00146     eoGenContinue < MOEOT > defaultGenContinuator;
+00148     eoContinue < MOEOT > & continuator;
+00150     eoPopLoopEval < MOEOT > popEval;
+00152     moeoDetTournamentSelect < MOEOT > select;
+00154     moeoIndicatorBasedFitnessAssignment < MOEOT > fitnessAssignment;
+00156     moeoDummyDiversityAssignment < MOEOT > dummyDiversityAssignment;
+00158     moeoEnvironmentalReplacement < MOEOT > replace;
+00160     eoSGAGenOp < MOEOT > defaultSGAGenOp;
+00162     eoGeneralBreeder < MOEOT > genBreed;
+00164     eoBreed < MOEOT > & breed;
+00165 
+00166 };
+00167 
+00168 #endif /*MOEOIBEA_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoIndicatorBasedFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoIndicatorBasedFitnessAssignment_8h-source.html new file mode 100644 index 000000000..7a80d0d75 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoIndicatorBasedFitnessAssignment_8h-source.html @@ -0,0 +1,185 @@ + + +ParadisEO-MOEO: moeoIndicatorBasedFitnessAssignment.h Source File + + + + +
+
+

moeoIndicatorBasedFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoIndicatorBasedFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOINDICATORBASEDFITNESSASSIGNMENT_H_
+00014 #define MOEOINDICATORBASEDFITNESSASSIGNMENT_H_
+00015 
+00016 #include <math.h>
+00017 #include <vector>
+00018 #include <eoPop.h>
+00019 #include <fitness/moeoFitnessAssignment.h>
+00020 #include <metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h>
+00021 #include <utils/moeoConvertPopToObjectiveVectors.h>
+00022 
+00028 template < class MOEOT >
+00029 class moeoIndicatorBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT >
+00030 {
+00031 public:
+00032 
+00034     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00035 
+00036 
+00042     moeoIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa = 0.05) : metric(_metric), kappa(_kappa)
+00043     {}
+00044 
+00045 
+00050     void operator()(eoPop < MOEOT > & _pop)
+00051     {
+00052         // 1 - setting of the bounds
+00053         setup(_pop);
+00054         // 2 - computing every indicator values
+00055         computeValues(_pop);
+00056         // 3 - setting fitnesses
+00057         setFitnesses(_pop);
+00058     }
+00059 
+00060 
+00066     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00067     {
+00068         std::vector < double > v;
+00069         v.resize(_pop.size());
+00070         for (unsigned int i=0; i<_pop.size(); i++)
+00071         {
+00072             v[i] = metric(_objVec, _pop[i].objectiveVector());
+00073         }
+00074         for (unsigned int i=0; i<_pop.size(); i++)
+00075         {
+00076             _pop[i].fitness( _pop[i].fitness() + exp(-v[i]/kappa) );
+00077         }
+00078     }
+00079 
+00080 
+00087     double updateByAdding(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00088     {
+00089         std::vector < double > v;
+00090         // update every fitness values to take the new individual into account
+00091         v.resize(_pop.size());
+00092         for (unsigned int i=0; i<_pop.size(); i++)
+00093         {
+00094             v[i] = metric(_objVec, _pop[i].objectiveVector());
+00095         }
+00096         for (unsigned int i=0; i<_pop.size(); i++)
+00097         {
+00098             _pop[i].fitness( _pop[i].fitness() - exp(-v[i]/kappa) );
+00099         }
+00100         // compute the fitness of the new individual
+00101         v.clear();
+00102         v.resize(_pop.size());
+00103         for (unsigned int i=0; i<_pop.size(); i++)
+00104         {
+00105             v[i] = metric(_pop[i].objectiveVector(), _objVec);
+00106         }
+00107         double result = 0;
+00108         for (unsigned int i=0; i<v.size(); i++)
+00109         {
+00110             result -= exp(-v[i]/kappa);
+00111         }
+00112         return result;
+00113     }
+00114 
+00115 
+00116 protected:
+00117 
+00119     moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & metric;
+00121     double kappa;
+00123     std::vector < std::vector<double> > values;
+00124 
+00125 
+00130     void setup(const eoPop < MOEOT > & _pop)
+00131     {
+00132         double min, max;
+00133         for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
+00134         {
+00135             min = _pop[0].objectiveVector()[i];
+00136             max = _pop[0].objectiveVector()[i];
+00137             for (unsigned int j=1; j<_pop.size(); j++)
+00138             {
+00139                 min = std::min(min, _pop[j].objectiveVector()[i]);
+00140                 max = std::max(max, _pop[j].objectiveVector()[i]);
+00141             }
+00142             // setting of the bounds for the objective i
+00143             metric.setup(min, max, i);
+00144         }
+00145     }
+00146 
+00147 
+00152     void computeValues(const eoPop < MOEOT > & _pop)
+00153     {
+00154         values.clear();
+00155         values.resize(_pop.size());
+00156         for (unsigned int i=0; i<_pop.size(); i++)
+00157         {
+00158             values[i].resize(_pop.size());
+00159             for (unsigned int j=0; j<_pop.size(); j++)
+00160             {
+00161                 if (i != j)
+00162                 {
+00163                     values[i][j] = metric(_pop[i].objectiveVector(), _pop[j].objectiveVector());
+00164                 }
+00165             }
+00166         }
+00167     }
+00168 
+00169 
+00174     void setFitnesses(eoPop < MOEOT > & _pop)
+00175     {
+00176         for (unsigned int i=0; i<_pop.size(); i++)
+00177         {
+00178             _pop[i].fitness(computeFitness(i));
+00179         }
+00180     }
+00181 
+00182 
+00187     double computeFitness(const unsigned int _idx)
+00188     {
+00189         double result = 0;
+00190         for (unsigned int i=0; i<values.size(); i++)
+00191         {
+00192             if (i != _idx)
+00193             {
+00194                 result -= exp(-values[i][_idx]/kappa);
+00195             }
+00196         }
+00197         return result;
+00198     }
+00199 
+00200 };
+00201 
+00202 #endif /*MOEOINDICATORBASEDFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoLS_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoLS_8h-source.html new file mode 100644 index 000000000..bd10dd70a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoLS_8h-source.html @@ -0,0 +1,51 @@ + + +ParadisEO-MOEO: moeoLS.h Source File + + + + +
+
+

moeoLS.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoLS.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOLS_H_
+00014 #define MOEOLS_H_
+00015 
+00016 #include <eoFunctor.h>
+00017 #include <algo/moeoAlgo.h>
+00018 #include <archive/moeoArchive.h>
+00019 
+00024 template < class MOEOT, class Type >
+00025 class moeoLS: public moeoAlgo, public eoBF < Type, moeoArchive < MOEOT > &, void > {};
+00026 
+00027 #endif /*MOEOLS_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoManhattanDistance_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoManhattanDistance_8h-source.html new file mode 100644 index 000000000..8daa675e9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoManhattanDistance_8h-source.html @@ -0,0 +1,75 @@ + + +ParadisEO-MOEO: moeoManhattanDistance.h Source File + + + + +
+
+

moeoManhattanDistance.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoManhattanDistance.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOMANHATTANDISTANCE_H_
+00014 #define MOEOMANHATTANDISTANCE_H_
+00015 
+00016 #include <math.h>
+00017 #include <distance/moeoNormalizedDistance.h>
+00018 
+00023 template < class MOEOT >
+00024 class moeoManhattanDistance : public moeoNormalizedDistance < MOEOT >
+00025 {
+00026 public:
+00027 
+00029     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00030 
+00031 
+00037     const double operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00038     {
+00039         double result = 0.0;
+00040         double tmp1, tmp2;
+00041         for (unsigned int i=0; i<ObjectiveVector::nObjectives(); i++)
+00042         {
+00043             tmp1 = (_moeo1.objectiveVector()[i] - bounds[i].minimum()) / bounds[i].range();
+00044             tmp2 = (_moeo2.objectiveVector()[i] - bounds[i].minimum()) / bounds[i].range();
+00045             result += fabs(tmp1-tmp2);
+00046         }
+00047         return result;
+00048     }
+00049 
+00050 
+00051 private:
+00052 
+00054     using moeoNormalizedDistance < MOEOT > :: bounds;
+00055 
+00056 };
+00057 
+00058 #endif /*MOEOMANHATTANDISTANCE_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoMetric_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoMetric_8h-source.html new file mode 100644 index 000000000..d46556be8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoMetric_8h-source.html @@ -0,0 +1,74 @@ + + +ParadisEO-MOEO: moeoMetric.h Source File + + + + +
+
+

moeoMetric.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoMetric.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOMETRIC_H_
+00014 #define MOEOMETRIC_H_
+00015 
+00016 #include <vector>
+00017 #include <eoFunctor.h>
+00018 
+00022 class moeoMetric : public eoFunctorBase {};
+00023 
+00024 
+00028 template < class A, class R >
+00029 class moeoUnaryMetric : public eoUF < A, R >, public moeoMetric {};
+00030 
+00031 
+00035 template < class A1, class A2, class R >
+00036 class moeoBinaryMetric : public eoBF < A1, A2, R >, public moeoMetric {};
+00037 
+00038 
+00042 template < class ObjectiveVector, class R >
+00043 class moeoSolutionUnaryMetric : public moeoUnaryMetric < const ObjectiveVector &, R > {};
+00044 
+00045 
+00049 template < class ObjectiveVector, class R >
+00050 class moeoVectorUnaryMetric : public moeoUnaryMetric < const std::vector < ObjectiveVector > &, R > {};
+00051 
+00052 
+00056 template < class ObjectiveVector, class R >
+00057 class moeoSolutionVsSolutionBinaryMetric : public moeoBinaryMetric < const ObjectiveVector &, const ObjectiveVector &, R > {};
+00058 
+00059 
+00063 template < class ObjectiveVector, class R >
+00064 class moeoVectorVsVectorBinaryMetric : public moeoBinaryMetric < const std::vector < ObjectiveVector > &, const std::vector < ObjectiveVector > &, R > {};
+00065 
+00066 
+00067 #endif /*MOEOMETRIC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoNSGAII_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoNSGAII_8h-source.html new file mode 100644 index 000000000..d2b9a4726 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoNSGAII_8h-source.html @@ -0,0 +1,128 @@ + + +ParadisEO-MOEO: moeoNSGAII.h Source File + + + + +
+
+

moeoNSGAII.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoNSGAII.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEONSGAII_H_
+00014 #define MOEONSGAII_H_
+00015 
+00016 #include <eoBreed.h>
+00017 #include <eoContinue.h>
+00018 #include <eoEvalFunc.h>
+00019 #include <eoGenContinue.h>
+00020 #include <eoGeneralBreeder.h>
+00021 #include <eoGenOp.h>
+00022 #include <eoPopEvalFunc.h>
+00023 #include <eoSGAGenOp.h>
+00024 #include <algo/moeoEA.h>
+00025 #include <diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h>
+00026 #include <fitness/moeoFastNonDominatedSortingFitnessAssignment.h>
+00027 #include <replacement/moeoElitistReplacement.h>
+00028 #include <selection/moeoDetTournamentSelect.h>
+00029 
+00036 template < class MOEOT >
+00037 class moeoNSGAII: public moeoEA < MOEOT >
+00038 {
+00039 public:
+00040 
+00047     moeoNSGAII (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op) :
+00048             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2),
+00049             replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00050     {}
+00051 
+00052 
+00059     moeoNSGAII (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op) :
+00060             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2),
+00061             replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00062     {}
+00063 
+00064 
+00074     moeoNSGAII (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut) :
+00075             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select (2),
+00076             replace (fitnessAssignment, diversityAssignment), defaultSGAGenOp(_crossover, _pCross, _mutation, _pMut),
+00077             genBreed (select, defaultSGAGenOp), breed (genBreed)
+00078     {}
+00079 
+00080 
+00087     moeoNSGAII (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op) :
+00088             continuator(_continuator), popEval(_eval), select(2),
+00089             replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00090     {}
+00091 
+00092 
+00099     moeoNSGAII (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op) :
+00100             continuator(_continuator), popEval(_eval), select(2),
+00101             replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00102     {}
+00103 
+00104 
+00109     virtual void operator () (eoPop < MOEOT > &_pop)
+00110     {
+00111         eoPop < MOEOT > offspring, empty_pop;
+00112         popEval (empty_pop, _pop);      // a first eval of _pop
+00113         // evaluate fitness and diversity
+00114         fitnessAssignment(_pop);
+00115         diversityAssignment(_pop);
+00116         do
+00117         {
+00118             // generate offspring, worths are recalculated if necessary
+00119             breed (_pop, offspring);
+00120             // eval of offspring
+00121             popEval (_pop, offspring);
+00122             // after replace, the new pop is in _pop. Worths are recalculated if necessary
+00123             replace (_pop, offspring);
+00124         } while (continuator (_pop));
+00125     }
+00126 
+00127 
+00128 protected:
+00129 
+00131     eoGenContinue < MOEOT > defaultGenContinuator;
+00133     eoContinue < MOEOT > & continuator;
+00135     eoPopLoopEval < MOEOT > popEval;
+00137     moeoDetTournamentSelect < MOEOT > select;
+00139     moeoFastNonDominatedSortingFitnessAssignment < MOEOT > fitnessAssignment;
+00141     moeoFrontByFrontCrowdingDistanceDiversityAssignment  < MOEOT > diversityAssignment;
+00143     moeoElitistReplacement < MOEOT > replace;
+00145     eoSGAGenOp < MOEOT > defaultSGAGenOp;
+00147     eoGeneralBreeder < MOEOT > genBreed;
+00149     eoBreed < MOEOT > & breed;
+00150 
+00151 };
+00152 
+00153 #endif /*MOEONSGAII_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoNSGA_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoNSGA_8h-source.html new file mode 100644 index 000000000..6e1ea5807 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoNSGA_8h-source.html @@ -0,0 +1,128 @@ + + +ParadisEO-MOEO: moeoNSGA.h Source File + + + + +
+
+

moeoNSGA.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoNSGA.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEONSGA_H_
+00014 #define MOEONSGA_H_
+00015 
+00016 #include <eoBreed.h>
+00017 #include <eoContinue.h>
+00018 #include <eoEvalFunc.h>
+00019 #include <eoGenContinue.h>
+00020 #include <eoGeneralBreeder.h>
+00021 #include <eoGenOp.h>
+00022 #include <eoPopEvalFunc.h>
+00023 #include <eoSGAGenOp.h>
+00024 #include <algo/moeoEA.h>
+00025 #include <diversity/moeoFrontByFrontSharingDiversityAssignment.h>
+00026 #include <fitness/moeoFastNonDominatedSortingFitnessAssignment.h>
+00027 #include <replacement/moeoElitistReplacement.h>
+00028 #include <selection/moeoDetTournamentSelect.h>
+00029 
+00036 template < class MOEOT >
+00037 class moeoNSGA: public moeoEA < MOEOT >
+00038 {
+00039 public:
+00040 
+00048     moeoNSGA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, double _nicheSize = 0.5) :
+00049             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2),
+00050             diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00051     {}
+00052 
+00053 
+00061     moeoNSGA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, double _nicheSize = 0.5) :
+00062             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2),
+00063             diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00064     {}
+00065 
+00066 
+00077     moeoNSGA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut, double _nicheSize = 0.5) :
+00078             defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select (2),
+00079             diversityAssignment(_nicheSize), replace (fitnessAssignment, diversityAssignment),
+00080             defaultSGAGenOp(_crossover, _pCross, _mutation, _pMut), genBreed (select, defaultSGAGenOp), breed (genBreed)
+00081     {}
+00082 
+00083 
+00091     moeoNSGA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, double _nicheSize = 0.5) :
+00092             continuator(_continuator), popEval(_eval), select(2),
+00093             diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00094     {}
+00095 
+00096 
+00104     moeoNSGA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, double _nicheSize = 0.5) :
+00105             continuator(_continuator), popEval(_eval), select(2),
+00106             diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed)
+00107     {}
+00108 
+00109 
+00114     virtual void operator () (eoPop < MOEOT > &_pop)
+00115     {
+00116         eoPop < MOEOT > offspring, empty_pop;
+00117         popEval (empty_pop, _pop);      // a first eval of _pop
+00118         // evaluate fitness and diversity
+00119         fitnessAssignment(_pop);
+00120         diversityAssignment(_pop);
+00121         do
+00122         {
+00123             // generate offspring, worths are recalculated if necessary
+00124             breed (_pop, offspring);
+00125             // eval of offspring
+00126             popEval (_pop, offspring);
+00127             // after replace, the new pop is in _pop. Worths are recalculated if necessary
+00128             replace (_pop, offspring);
+00129         } while (continuator (_pop));
+00130     }
+00131 
+00132 
+00133 protected:
+00134 
+00136     eoGenContinue < MOEOT > defaultGenContinuator;
+00138     eoContinue < MOEOT > & continuator;
+00140     eoPopLoopEval < MOEOT > popEval;
+00142     moeoDetTournamentSelect < MOEOT > select;
+00144     moeoFastNonDominatedSortingFitnessAssignment < MOEOT > fitnessAssignment;
+00146     moeoFrontByFrontSharingDiversityAssignment  < MOEOT > diversityAssignment;
+00148     moeoElitistReplacement < MOEOT > replace;
+00150     eoSGAGenOp < MOEOT > defaultSGAGenOp;
+00152     eoGeneralBreeder < MOEOT > genBreed;
+00154     eoBreed < MOEOT > & breed;
+00155 
+00156 };
+00157 
+00158 #endif /*MOEONSGAII_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoNormalizedDistance_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoNormalizedDistance_8h-source.html new file mode 100644 index 000000000..4ed0102c4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoNormalizedDistance_8h-source.html @@ -0,0 +1,114 @@ + + +ParadisEO-MOEO: moeoNormalizedDistance.h Source File + + + + +
+
+

moeoNormalizedDistance.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoNormalizedDistance.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEONORMALIZEDDISTANCE_H_
+00014 #define MOEONORMALIZEDDISTANCE_H_
+00015 
+00016 #include <vector>
+00017 #include <utils/eoRealBounds.h>
+00018 #include <distance/moeoDistance.h>
+00019 
+00023 template < class MOEOT , class Type = double >
+00024 class moeoNormalizedDistance : public moeoDistance < MOEOT , Type >
+00025 {
+00026 public:
+00027 
+00029     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00030 
+00031 
+00035     moeoNormalizedDistance()
+00036     {
+00037         bounds.resize(ObjectiveVector::Traits::nObjectives());
+00038         // initialize bounds in case someone does not want to use them
+00039         for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
+00040         {
+00041             bounds[i] = eoRealInterval(0,1);
+00042         }
+00043     }
+00044 
+00045 
+00049     static double tiny()
+00050     {
+00051         return 1e-6;
+00052     }
+00053 
+00054 
+00059     virtual void setup(const eoPop < MOEOT > & _pop)
+00060     {
+00061         double min, max;
+00062         for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
+00063         {
+00064             min = _pop[0].objectiveVector()[i];
+00065             max = _pop[0].objectiveVector()[i];
+00066             for (unsigned int j=1; j<_pop.size(); j++)
+00067             {
+00068                 min = std::min(min, _pop[j].objectiveVector()[i]);
+00069                 max = std::max(max, _pop[j].objectiveVector()[i]);
+00070             }
+00071             // setting of the bounds for the objective i
+00072             setup(min, max, i);
+00073         }
+00074     }
+00075 
+00076 
+00083     virtual void setup(double _min, double _max, unsigned int _obj)
+00084     {
+00085         if (_min == _max)
+00086         {
+00087             _min -= tiny();
+00088             _max += tiny();
+00089         }
+00090         bounds[_obj] = eoRealInterval(_min, _max);
+00091     }
+00092 
+00093 
+00099     virtual void setup(eoRealInterval _realInterval, unsigned int _obj)
+00100     {
+00101         bounds[_obj] = _realInterval;
+00102     }
+00103 
+00104 
+00105 protected:
+00106 
+00108     std::vector < eoRealInterval > bounds;
+00109 
+00110 };
+00111 
+00112 #endif /*MOEONORMALIZEDDISTANCE_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoNormalizedSolutionVsSolutionBinaryMetric_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoNormalizedSolutionVsSolutionBinaryMetric_8h-source.html new file mode 100644 index 000000000..efaabe1fd --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoNormalizedSolutionVsSolutionBinaryMetric_8h-source.html @@ -0,0 +1,93 @@ + + +ParadisEO-MOEO: moeoNormalizedSolutionVsSolutionBinaryMetric.h Source File + + + + +
+
+

moeoNormalizedSolutionVsSolutionBinaryMetric.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoNormalizedSolutionVsSolutionBinaryMetric.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEONORMALIZEDSOLUTIONVSSOLUTIONBINARYMETRIC_H_
+00014 #define MOEONORMALIZEDSOLUTIONVSSOLUTIONBINARYMETRIC_H_
+00015 
+00016 #include <vector>
+00017 #include <utils/eoRealBounds.h>
+00018 #include <metric/moeoMetric.h>
+00019 
+00025 template < class ObjectiveVector, class R >
+00026 class moeoNormalizedSolutionVsSolutionBinaryMetric : public moeoSolutionVsSolutionBinaryMetric < ObjectiveVector, R >
+00027 {
+00028 public:
+00029 
+00033     moeoNormalizedSolutionVsSolutionBinaryMetric()
+00034     {
+00035         bounds.resize(ObjectiveVector::Traits::nObjectives());
+00036         // initialize bounds in case someone does not want to use them
+00037         for (unsigned int i=0; i<ObjectiveVector::Traits::nObjectives(); i++)
+00038         {
+00039             bounds[i] = eoRealInterval(0,1);
+00040         }
+00041     }
+00042 
+00043 
+00050     void setup(double _min, double _max, unsigned int _obj)
+00051     {
+00052         if (_min == _max)
+00053         {
+00054             _min -= tiny();
+00055             _max += tiny();
+00056         }
+00057         bounds[_obj] = eoRealInterval(_min, _max);
+00058     }
+00059 
+00060 
+00066     virtual void setup(eoRealInterval _realInterval, unsigned int _obj)
+00067     {
+00068         bounds[_obj] = _realInterval;
+00069     }
+00070 
+00071 
+00075     static double tiny()
+00076     {
+00077         return 1e-6;
+00078     }
+00079 
+00080 
+00081 protected:
+00082 
+00084     std::vector < eoRealInterval > bounds;
+00085 
+00086 };
+00087 
+00088 #endif /*MOEONORMALIZEDSOLUTIONVSSOLUTIONBINARYMETRIC_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoObjectiveObjectiveVectorComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoObjectiveObjectiveVectorComparator_8h-source.html new file mode 100644 index 000000000..18797cb6a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoObjectiveObjectiveVectorComparator_8h-source.html @@ -0,0 +1,72 @@ + + +ParadisEO-MOEO: moeoObjectiveObjectiveVectorComparator.h Source File + + + + +
+
+

moeoObjectiveObjectiveVectorComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoObjectiveObjectiveVectorComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOOBJECTIVEOBJECTIVEVECTORCOMPARATOR_H_
+00014 #define MOEOOBJECTIVEOBJECTIVEVECTORCOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoObjectiveVectorComparator.h>
+00017 
+00021 template < class ObjectiveVector >
+00022 class moeoObjectiveObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector >
+00023 {
+00024 public:
+00025 
+00031     const bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)
+00032     {
+00033         for (unsigned int i=0; i<ObjectiveVector::nObjectives(); i++)
+00034         {
+00035             if ( fabs(_objectiveVector1[i] - _objectiveVector2[i]) > ObjectiveVector::Traits::tolerance() )
+00036             {
+00037                 if (_objectiveVector1[i] < _objectiveVector2[i])
+00038                 {
+00039                     return true;
+00040                 }
+00041                 else
+00042                 {
+00043                     return false;
+00044                 }
+00045             }
+00046         }
+00047         return false;
+00048     }
+00049 
+00050 };
+00051 
+00052 #endif /*MOEOOBJECTIVEOBJECTIVEVECTORCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorComparator_8h-source.html new file mode 100644 index 000000000..c3548e492 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorComparator_8h-source.html @@ -0,0 +1,50 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorComparator.h Source File + + + + +
+
+

moeoObjectiveVectorComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoObjectiveVectorComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOOBJECTIVEVECTORCOMPARATOR_H_
+00014 #define MOEOOBJECTIVEVECTORCOMPARATOR_H_
+00015 
+00016 #include <math.h>
+00017 #include <eoFunctor.h>
+00018 
+00023 template < class ObjectiveVector >
+00024 class moeoObjectiveVectorComparator : public eoBF < const ObjectiveVector &, const ObjectiveVector &, const bool > {};
+00025 
+00026 #endif /*MOEOOBJECTIVEVECTORCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorDouble_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorDouble_8h-source.html new file mode 100644 index 000000000..d355d833c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorDouble_8h-source.html @@ -0,0 +1,140 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorDouble.h Source File + + + + +
+
+

moeoObjectiveVectorDouble.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoObjectiveVectorDouble.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOOBJECTIVEVECTORDOUBLE_H_
+00014 #define MOEOOBJECTIVEVECTORDOUBLE_H_
+00015 
+00016 #include <iostream>
+00017 #include <math.h>
+00018 #include <comparator/moeoObjectiveObjectiveVectorComparator.h>
+00019 #include <comparator/moeoParetoObjectiveVectorComparator.h>
+00020 #include <core/moeoObjectiveVector.h>
+00021 
+00026 template < class ObjectiveVectorTraits >
+00027 class moeoObjectiveVectorDouble : public moeoObjectiveVector < ObjectiveVectorTraits, double >
+00028 {
+00029 public:
+00030 
+00031     using moeoObjectiveVector < ObjectiveVectorTraits, double >::size;
+00032     using moeoObjectiveVector < ObjectiveVectorTraits, double >::operator[];
+00033 
+00037     moeoObjectiveVectorDouble(double _value = 0.0) : moeoObjectiveVector < ObjectiveVectorTraits, double > (_value)
+00038     {}
+00039 
+00040 
+00045     moeoObjectiveVectorDouble(std::vector < double > & _v) : moeoObjectiveVector < ObjectiveVectorTraits, double > (_v)
+00046     {}
+00047 
+00048 
+00054     bool dominates(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00055     {
+00056         moeoParetoObjectiveVectorComparator < moeoObjectiveVectorDouble<ObjectiveVectorTraits> > comparator;
+00057         return comparator(_other, *this);
+00058     }
+00059 
+00060 
+00065     bool operator==(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00066     {
+00067         for (unsigned int i=0; i < size(); i++)
+00068         {
+00069             if ( fabs(operator[](i) - _other[i]) > ObjectiveVectorTraits::tolerance() )
+00070             {
+00071                 return false;
+00072             }
+00073         }
+00074         return true;
+00075     }
+00076 
+00077 
+00082     bool operator!=(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00083     {
+00084         return ! operator==(_other);
+00085     }
+00086 
+00087 
+00093     bool operator<(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00094     {
+00095         moeoObjectiveObjectiveVectorComparator < moeoObjectiveVectorDouble < ObjectiveVectorTraits > > cmp;
+00096         return cmp(*this, _other);
+00097     }
+00098 
+00099 
+00105     bool operator>(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00106     {
+00107         return _other < *this;
+00108     }
+00109 
+00110 
+00116     bool operator<=(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00117     {
+00118         return operator==(_other) || operator<(_other);
+00119     }
+00120 
+00121 
+00127     bool operator>=(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const
+00128     {
+00129         return operator==(_other) || operator>(_other);
+00130     }
+00131 
+00132 };
+00133 
+00134 
+00140 template < class ObjectiveVectorTraits >
+00141 std::ostream & operator<<(std::ostream & _os, const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _objectiveVector)
+00142 {
+00143     for (unsigned int i=0; i<_objectiveVector.size(); i++)
+00144     {
+00145         _os << _objectiveVector[i] << '\t';
+00146     }
+00147     return _os;
+00148 }
+00149 
+00155 template < class ObjectiveVectorTraits >
+00156 std::istream & operator>>(std::istream & _is, moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _objectiveVector)
+00157 {
+00158     _objectiveVector = moeoObjectiveVectorDouble < ObjectiveVectorTraits > ();
+00159     for (unsigned int i=0; i<_objectiveVector.size(); i++)
+00160     {
+00161         _is >> _objectiveVector[i];
+00162     }
+00163     return _is;
+00164 }
+00165 
+00166 #endif /*MOEOOBJECTIVEVECTORDOUBLE_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8cpp-source.html b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8cpp-source.html new file mode 100644 index 000000000..ffb67b688 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8cpp-source.html @@ -0,0 +1,45 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorTraits.cpp Source File + + + + +
+
+

moeoObjectiveVectorTraits.cpp

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoObjectiveVectorTraits.cpp
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #include <core/moeoObjectiveVectorTraits.h>
+00014 
+00015 // The static variables of the moeoObjectiveVectorTraits class need to be allocated
+00016 unsigned int moeoObjectiveVectorTraits::nObj;
+00017 std::vector < bool > moeoObjectiveVectorTraits::bObj;
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8h-source.html new file mode 100644 index 000000000..fd69a2a6a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVectorTraits_8h-source.html @@ -0,0 +1,107 @@ + + +ParadisEO-MOEO: moeoObjectiveVectorTraits.h Source File + + + + +
+
+

moeoObjectiveVectorTraits.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoObjectiveVectorTraits.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOOBJECTIVEVECTORTRAITS_H_
+00014 #define MOEOOBJECTIVEVECTORTRAITS_H_
+00015 
+00016 #include <iostream>
+00017 #include <stdexcept>
+00018 #include <vector>
+00019 
+00023 class moeoObjectiveVectorTraits
+00024 {
+00025 public:
+00026 
+00032     static void setup(unsigned int _nObjectives, std::vector < bool > & _bObjectives)
+00033     {
+00034         // in case the number of objectives was already set to a different value
+00035         if ( nObj && (nObj != _nObjectives) ) {
+00036             std::cout << "WARNING\n";
+00037             std::cout << "WARNING : the number of objectives are changing\n";
+00038             std::cout << "WARNING : Make sure all existing objects are destroyed\n";
+00039             std::cout << "WARNING\n";
+00040         }
+00041         // number of objectives
+00042         nObj = _nObjectives;
+00043         // min/max vector
+00044         bObj = _bObjectives;
+00045         // in case the number of objectives and the min/max vector size don't match
+00046         if (nObj != bObj.size())
+00047             throw std::runtime_error("Number of objectives and min/max size don't match in moeoObjectiveVectorTraits::setup");
+00048     }
+00049 
+00050 
+00054     static unsigned int nObjectives()
+00055     {
+00056         // in case the number of objectives would not be assigned yet
+00057         if (! nObj)
+00058             throw std::runtime_error("Number of objectives not assigned in moeoObjectiveVectorTraits");
+00059         return nObj;
+00060     }
+00061 
+00062 
+00067     static bool minimizing(unsigned int _i)
+00068     {
+00069         // in case there would be a wrong index
+00070         if (_i >= bObj.size())
+00071             throw std::runtime_error("Wrong index in moeoObjectiveVectorTraits");
+00072         return bObj[_i];
+00073     }
+00074 
+00075 
+00080     static bool maximizing(unsigned int _i) {
+00081         return (! minimizing(_i));
+00082     }
+00083 
+00084 
+00088     static double tolerance()
+00089     {
+00090         return 1e-6;
+00091     }
+00092 
+00093 
+00094 private:
+00095 
+00097     static unsigned int nObj;
+00099     static std::vector < bool > bObj;
+00100 
+00101 };
+00102 
+00103 #endif /*MOEOOBJECTIVEVECTORTRAITS_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoObjectiveVector_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVector_8h-source.html new file mode 100644 index 000000000..cc622de2f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoObjectiveVector_8h-source.html @@ -0,0 +1,88 @@ + + +ParadisEO-MOEO: moeoObjectiveVector.h Source File + + + + +
+
+

moeoObjectiveVector.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoObjectiveVector.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOOBJECTIVEVECTOR_H_
+00014 #define MOEOOBJECTIVEVECTOR_H_
+00015 
+00016 #include <vector>
+00017 
+00024 template < class ObjectiveVectorTraits, class ObjectiveVectorType >
+00025 class moeoObjectiveVector : public std::vector < ObjectiveVectorType >
+00026 {
+00027 public:
+00028 
+00030     typedef ObjectiveVectorTraits Traits;
+00032     typedef ObjectiveVectorType Type;
+00033 
+00034 
+00038     moeoObjectiveVector(Type _value = Type()) : std::vector < Type > (ObjectiveVectorTraits::nObjectives(), _value)
+00039     {}
+00040 
+00041 
+00046     moeoObjectiveVector(std::vector < Type > & _v) : std::vector < Type > (_v)
+00047     {}
+00048 
+00049 
+00055     static void setup(unsigned int _nObjectives, std::vector < bool > & _bObjectives)
+00056     {
+00057         ObjectiveVectorTraits::setup(_nObjectives, _bObjectives);
+00058     }
+00059 
+00060 
+00064     static unsigned int nObjectives()
+00065     {
+00066         return ObjectiveVectorTraits::nObjectives();
+00067     }
+00068 
+00069 
+00074     static bool minimizing(unsigned int _i)
+00075     {
+00076         return ObjectiveVectorTraits::minimizing(_i);
+00077     }
+00078 
+00079 
+00084     static bool maximizing(unsigned int _i)
+00085     {
+00086         return ObjectiveVectorTraits::maximizing(_i);
+00087     }
+00088 
+00089 };
+00090 
+00091 #endif /*MOEOOBJECTIVEVECTOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoOneObjectiveComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoOneObjectiveComparator_8h-source.html new file mode 100644 index 000000000..dedc860fa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoOneObjectiveComparator_8h-source.html @@ -0,0 +1,72 @@ + + +ParadisEO-MOEO: moeoOneObjectiveComparator.h Source File + + + + +
+
+

moeoOneObjectiveComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoOneObjectiveComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOONEOBJECTIVECOMPARATOR_H_
+00014 #define MOEOONEOBJECTIVECOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoOneObjectiveComparator : public moeoComparator < MOEOT >
+00023 {
+00024 public:
+00025 
+00030     moeoOneObjectiveComparator(unsigned int _obj) : obj(_obj)
+00031     {
+00032         if (obj > MOEOT::ObjectiveVector::nObjectives())
+00033         {
+00034             throw std::runtime_error("Problem with the index of objective in moeoOneObjectiveComparator");
+00035         }
+00036     }
+00037 
+00038 
+00044     const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2)
+00045     {
+00046         return _moeo1.objectiveVector()[obj] < _moeo2.objectiveVector()[obj];
+00047     }
+00048 
+00049 
+00050 private:
+00051 
+00053     unsigned int obj;
+00054 
+00055 };
+00056 
+00057 #endif /*MOEOONEOBJECTIVECOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoParetoBasedFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoParetoBasedFitnessAssignment_8h-source.html new file mode 100644 index 000000000..e5651bc5a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoParetoBasedFitnessAssignment_8h-source.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: moeoParetoBasedFitnessAssignment.h Source File + + + + +
+
+

moeoParetoBasedFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoParetoBasedFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOPARETOBASEDFITNESSASSIGNMENT_H_
+00014 #define MOEOPARETOBASEDFITNESSASSIGNMENT_H_
+00015 
+00016 #include <fitness/moeoFitnessAssignment.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoParetoBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > {};
+00023     
+00024 #endif /*MOEOPARETOBASEDFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoParetoObjectiveVectorComparator_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoParetoObjectiveVectorComparator_8h-source.html new file mode 100644 index 000000000..018a6f043 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoParetoObjectiveVectorComparator_8h-source.html @@ -0,0 +1,90 @@ + + +ParadisEO-MOEO: moeoParetoObjectiveVectorComparator.h Source File + + + + +
+
+

moeoParetoObjectiveVectorComparator.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoParetoObjectiveVectorComparator.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOPARETOOBJECTIVEVECTORCOMPARATOR_H_
+00014 #define MOEOPARETOOBJECTIVEVECTORCOMPARATOR_H_
+00015 
+00016 #include <comparator/moeoObjectiveVectorComparator.h>
+00017 
+00021 template < class ObjectiveVector >
+00022 class moeoParetoObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector >
+00023 {
+00024 public:
+00025 
+00031     const bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)
+00032     {
+00033         bool dom = false;
+00034         for (unsigned int i=0; i<ObjectiveVector::nObjectives(); i++)
+00035         {
+00036             // first, we have to check if the 2 objective values are not equal for the ith objective
+00037             if ( fabs(_objectiveVector1[i] - _objectiveVector2[i]) > ObjectiveVector::Traits::tolerance() )
+00038             {
+00039                 // if the ith objective have to be minimized...
+00040                 if (ObjectiveVector::minimizing(i))
+00041                 {
+00042                     if (_objectiveVector1[i] > _objectiveVector2[i])
+00043                     {
+00044                         dom = true;             //_objectiveVector1[i] is not better than _objectiveVector2[i]
+00045                     }
+00046                     else
+00047                     {
+00048                         return false;   //_objectiveVector2 cannot dominate _objectiveVector1
+00049                     }
+00050                 }
+00051                 // if the ith objective have to be maximized...
+00052                 else if (ObjectiveVector::maximizing(i))
+00053                 {
+00054                     if (_objectiveVector1[i] > _objectiveVector2[i])
+00055                     {
+00056                         dom = true;             //_objectiveVector1[i] is not better than _objectiveVector2[i]
+00057                     }
+00058                     else
+00059                     {
+00060                         return false;   //_objectiveVector2 cannot dominate _objectiveVector1
+00061                     }
+00062                 }
+00063             }
+00064         }
+00065         return dom;
+00066     }
+00067 
+00068 };
+00069 
+00070 #endif /*MOEOPARETOOBJECTIVEVECTORCOMPARATOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoRandomSelect_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoRandomSelect_8h-source.html new file mode 100644 index 000000000..29e058b81 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoRandomSelect_8h-source.html @@ -0,0 +1,62 @@ + + +ParadisEO-MOEO: moeoRandomSelect.h Source File + + + + +
+
+

moeoRandomSelect.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoRandomSelect.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEORANDOMSELECT_H_
+00014 #define MOEORANDOMSELECT_H_
+00015 
+00016 #include <eoRandomSelect.h>
+00017 #include <selection/moeoSelectOne.h>
+00018 
+00019 
+00023 template < class MOEOT > class moeoRandomSelect:public moeoSelectOne < MOEOT >, public eoRandomSelect <MOEOT >
+00024 {
+00025 public:
+00026 
+00030     moeoRandomSelect(){}
+00031 
+00032 
+00036     const MOEOT & operator () (const eoPop < MOEOT > &_pop)
+00037     {
+00038         return eoRandomSelect < MOEOT >::operator ()(_pop);
+00039     }
+00040 
+00041 };
+00042 
+00043 #endif /*MOEORANDOMSELECT_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoRealVector_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoRealVector_8h-source.html new file mode 100644 index 000000000..5012f01ef --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoRealVector_8h-source.html @@ -0,0 +1,56 @@ + + +ParadisEO-MOEO: moeoRealVector.h Source File + + + + +
+
+

moeoRealVector.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoRealVector.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOREALVECTOR_H_
+00014 #define MOEOREALVECTOR_H_
+00015 
+00016 #include <core/moeoVector.h>
+00017 
+00021 template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity >
+00022 class moeoRealVector : public moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >
+00023 {
+00024 public:
+00025 
+00031     moeoRealVector(unsigned int _size = 0, double _value = 0.0) : moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >(_size, _value)
+00032     {}
+00033 
+00034 };
+00035 
+00036 #endif /*MOEOREALVECTOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoReplacement_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoReplacement_8h-source.html new file mode 100644 index 000000000..c3d0705c0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoReplacement_8h-source.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: moeoReplacement.h Source File + + + + +
+
+

moeoReplacement.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoReplacement.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOREPLACEMENT_H_
+00014 #define MOEOREPLACEMENT_H_
+00015 
+00016 #include <eoReplacement.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoReplacement : public eoReplacement < MOEOT > {};
+00023 
+00024 #endif /*MOEOREPLACEMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoRouletteSelect_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoRouletteSelect_8h-source.html new file mode 100644 index 000000000..17edfe42e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoRouletteSelect_8h-source.html @@ -0,0 +1,77 @@ + + +ParadisEO-MOEO: moeoRouletteSelect.h Source File + + + + +
+
+

moeoRouletteSelect.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoRouletteSelect.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOROULETTESELECT_H_
+00014 #define MOEOROULETTESELECT_H_
+00015 
+00016 #include <selection/moeoSelectOne.h>
+00017 #include <selection/moeoSelectors.h>
+00018 
+00023 template < class MOEOT >
+00024 class moeoRouletteSelect:public moeoSelectOne < MOEOT >
+00025 {
+00026 public:
+00027 
+00032     moeoRouletteSelect (unsigned int _tSize = 2) : tSize (_tSize)
+00033     {
+00034         // consistency check
+00035         if (tSize < 2)
+00036         {
+00037             std::
+00038             cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n";
+00039             tSize = 2;
+00040         }
+00041     }
+00042 
+00043 
+00048     const MOEOT & operator  () (const eoPop < MOEOT > & _pop)
+00049     {
+00050         // use the selector
+00051         return mo_roulette_wheel(_pop,tSize);
+00052     }
+00053 
+00054 
+00055 protected:
+00056 
+00058     double & tSize;
+00059 
+00060 };
+00061 
+00062 #endif /*MOEOROULETTESELECT_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoScalarFitnessAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoScalarFitnessAssignment_8h-source.html new file mode 100644 index 000000000..f47b5c2c0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoScalarFitnessAssignment_8h-source.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: moeoScalarFitnessAssignment.h Source File + + + + +
+
+

moeoScalarFitnessAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoScalarFitnessAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOSCALARFITNESSASSIGNMENT_H_
+00014 #define MOEOSCALARFITNESSASSIGNMENT_H_
+00015 
+00016 #include <fitness/moeoFitnessAssignment.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoScalarFitnessAssignment : public moeoFitnessAssignment < MOEOT > {};
+00023     
+00024 #endif /*MOEOSCALARFITNESSASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoSelectFromPopAndArch_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoSelectFromPopAndArch_8h-source.html new file mode 100644 index 000000000..a30ffbec8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoSelectFromPopAndArch_8h-source.html @@ -0,0 +1,93 @@ + + +ParadisEO-MOEO: moeoSelectFromPopAndArch.h Source File + + + + +
+
+

moeoSelectFromPopAndArch.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoSelectFormPopAndArch.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOSELECTONEFROMPOPANDARCH_H_
+00014 #define MOEOSELECTONEFROMPOPANDARCH_H_
+00015 
+00016 #include <eoPop.h>
+00017 #include <utils/eoRNG.h>
+00018 #include <archive/moeoArchive.h>
+00019 #include <selection/moeoSelectOne.h>
+00020 #include <selection/moeoRandomSelect.h>
+00021 
+00025 template < class MOEOT >
+00026 class moeoSelectFromPopAndArch : public moeoSelectOne < MOEOT >
+00027 {
+00028 public:
+00029 
+00037     moeoSelectFromPopAndArch (moeoSelectOne < MOEOT > & _popSelectOne, moeoSelectOne < MOEOT > _archSelectOne, moeoArchive < MOEOT > & _arch, double _ratioFromPop=0.5)
+00038             : popSelectOne(_popSelectOne), archSelectOne(_archSelectOne), arch(_arch), ratioFromPop(_ratioFromPop)
+00039     {}
+00040 
+00041 
+00048     moeoSelectFromPopAndArch (moeoSelectOne < MOEOT > & _popSelectOne, moeoArchive < MOEOT > & _arch, double _ratioFromPop=0.5)
+00049             : popSelectOne(_popSelectOne), archSelectOne(randomSelectOne), arch(_arch), ratioFromPop(_ratioFromPop)
+00050     {}
+00051 
+00052 
+00056     virtual const MOEOT & operator () (const eoPop < MOEOT > & pop)
+00057     {
+00058         if (arch.size() > 0)
+00059             if (rng.flip(ratioFromPop))
+00060                 return popSelectOne(pop);
+00061             else
+00062                 return archSelectOne(arch);
+00063         else
+00064             return popSelectOne(pop);
+00065     }
+00066 
+00067 
+00071     virtual void setup (const eoPop < MOEOT > & _pop)
+00072     {
+00073         popSelectOne.setup(_pop);
+00074     }
+00075 
+00076 
+00077 private:
+00078 
+00080     moeoSelectOne < MOEOT > & popSelectOne;
+00082     moeoSelectOne < MOEOT > & archSelectOne;
+00084     moeoArchive < MOEOT > & arch;
+00086     double ratioFromPop;
+00088     moeoRandomSelect < MOEOT > randomSelectOne;
+00089 
+00090 };
+00091 
+00092 #endif /*MOEOSELECTONEFROMPOPANDARCH_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoSelectOne_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoSelectOne_8h-source.html new file mode 100644 index 000000000..9687d37b3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoSelectOne_8h-source.html @@ -0,0 +1,49 @@ + + +ParadisEO-MOEO: moeoSelectOne.h Source File + + + + +
+
+

moeoSelectOne.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoSelectOne.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOSELECTONE_H_
+00014 #define MOEOSELECTONE_H_
+00015 
+00016 #include <eoSelectOne.h>
+00017 
+00021 template < class MOEOT >
+00022 class moeoSelectOne : public eoSelectOne < MOEOT > {};
+00023 
+00024 #endif /*MOEOSELECTONE_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoSelectors_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoSelectors_8h-source.html new file mode 100644 index 000000000..50e046771 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoSelectors_8h-source.html @@ -0,0 +1,186 @@ + + +ParadisEO-MOEO: moeoSelectors.h Source File + + + + +
+
+

moeoSelectors.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoSelectors.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOSELECTORS_H_
+00014 #define MOEOSELECTORS_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 
+00018 
+00019 template <class It,class MOEOT>
+00020 It mo_deterministic_tournament(It _begin, It _end, unsigned int _t_size,moeoComparator<MOEOT>& _comparator ,eoRng& _gen = rng)
+00021 {
+00022     It best = _begin + _gen.random(_end - _begin);
+00023 
+00024     for (unsigned int i = 0; i < _t_size - 1; ++i)
+00025     {
+00026         It competitor = _begin + _gen.random(_end - _begin);
+00027         // compare the two individuals by using the comparator
+00028         if (_comparator(*best, *competitor))
+00029             // best "better" than competitor
+00030             best=competitor;
+00031     }
+00032     return best;
+00033 }
+00034 
+00035 
+00036 template <class MOEOT>
+00037 const MOEOT& mo_deterministic_tournament(const eoPop<MOEOT>& _pop, unsigned int _t_size,moeoComparator<MOEOT>& _comparator, eoRng& _gen = rng)
+00038 {
+00039     return *mo_deterministic_tournament(_pop.begin(), _pop.end(),_t_size,_comparator, _gen);
+00040 }
+00041 
+00042 
+00043 template <class MOEOT>
+00044 MOEOT& mo_deterministic_tournament(eoPop<MOEOT>& _pop, unsigned int _t_size,moeoComparator<MOEOT>& _comparator,eoRng& _gen = rng)
+00045 {
+00046     return *mo_deterministic_tournament(_pop.begin(), _pop.end(), _t_size,_comparator, _gen);
+00047 }
+00048 
+00049 
+00050 template <class It,class MOEOT>
+00051 It mo_stochastic_tournament(It _begin, It _end, double _t_rate,moeoComparator<MOEOT>& _comparator ,eoRng& _gen = rng)
+00052 {
+00053     It i1 = _begin + _gen.random(_end - _begin);
+00054     It i2 = _begin + _gen.random(_end - _begin);
+00055 
+00056     bool return_better = _gen.flip(_t_rate);
+00057 
+00058     if (_comparator(*i1, *i2))
+00059     {
+00060         if (return_better) return i2;
+00061         // else
+00062 
+00063         return i1;
+00064     }
+00065     else
+00066     {
+00067         if (return_better) return i1;
+00068         // else
+00069     }
+00070     // else
+00071 
+00072     return i2;
+00073 }
+00074 
+00075 
+00076 template <class MOEOT>
+00077 const MOEOT& mo_stochastic_tournament(const eoPop<MOEOT>& _pop, double _t_rate,moeoComparator<MOEOT>& _comparator, eoRng& _gen = rng)
+00078 {
+00079     return *mo_stochastic_tournament(_pop.begin(), _pop.end(), _t_rate,_comparator, _gen);
+00080 }
+00081 
+00082 
+00083 template <class MOEOT>
+00084 MOEOT& mo_stochastic_tournament(eoPop<MOEOT>& _pop, double _t_rate, eoRng& _gen = rng)
+00085 {
+00086     return *mo_stochastic_tournament(_pop.begin(), _pop.end(), _t_rate, _gen);
+00087 }
+00088 
+00089 
+00090 template <class It>
+00091 It mo_roulette_wheel(It _begin, It _end, double total, eoRng& _gen = rng)
+00092 {
+00093 
+00094     float roulette = _gen.uniform(total);
+00095 
+00096     if (roulette == 0.0)           // covers the case where total==0.0
+00097         return _begin + _gen.random(_end - _begin); // uniform choice
+00098 
+00099     It i = _begin;
+00100 
+00101     while (roulette > 0.0)
+00102     {
+00103         roulette -= static_cast<double>(*(i++));
+00104     }
+00105 
+00106     return --i;
+00107 }
+00108 
+00109 
+00110 template <class MOEOT>
+00111 const MOEOT& mo_roulette_wheel(const eoPop<MOEOT>& _pop, double total, eoRng& _gen = rng)
+00112 {
+00113     float roulette = _gen.uniform(total);
+00114 
+00115     if (roulette == 0.0)           // covers the case where total==0.0
+00116         return _pop[_gen.random(_pop.size())]; // uniform choice
+00117 
+00118     typename eoPop<MOEOT>::const_iterator i = _pop.begin();
+00119 
+00120     while (roulette > 0.0)
+00121     {
+00122         roulette -= static_cast<double>((i++)->fitness());
+00123     }
+00124 
+00125     return *--i;
+00126 }
+00127 
+00128 
+00129 template <class MOEOT>
+00130 MOEOT& mo_roulette_wheel(eoPop<MOEOT>& _pop, double total, eoRng& _gen = rng)
+00131 {
+00132     float roulette = _gen.uniform(total);
+00133 
+00134     if (roulette == 0.0)           // covers the case where total==0.0
+00135         return _pop[_gen.random(_pop.size())]; // uniform choice
+00136 
+00137     typename eoPop<MOEOT>::iterator i = _pop.begin();
+00138 
+00139     while (roulette > 0.0)
+00140     {
+00141         // fitness only
+00142         roulette -= static_cast<double>((i++)->fitness());
+00143     }
+00144 
+00145     return *--i;
+00146 }
+00147 
+00148 
+00149 #endif /*MOEOSELECTORS_H_*/
+00150 
+00151 
+00152 
+00153 
+00154 
+00155 
+00156 
+00157 
+00158 
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoSharingDiversityAssignment_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoSharingDiversityAssignment_8h-source.html new file mode 100644 index 000000000..b45b7d307 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoSharingDiversityAssignment_8h-source.html @@ -0,0 +1,131 @@ + + +ParadisEO-MOEO: moeoSharingDiversityAssignment.h Source File + + + + +
+
+

moeoSharingDiversityAssignment.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoSharingDiversityAssignment.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOSHARINGDIVERSITYASSIGNMENT_H_
+00014 #define MOEOSHARINGDIVERSITYASSIGNMENT_H_
+00015 
+00016 #include <eoPop.h>
+00017 #include <comparator/moeoDiversityThenFitnessComparator.h>
+00018 #include <distance/moeoDistance.h>
+00019 #include <distance/moeoDistanceMatrix.h>
+00020 #include <distance/moeoEuclideanDistance.h>
+00021 #include <diversity/moeoDiversityAssignment.h>
+00022 
+00027 template < class MOEOT >
+00028 class moeoSharingDiversityAssignment : public moeoDiversityAssignment < MOEOT >
+00029 {
+00030 public:
+00031 
+00033     typedef typename MOEOT::ObjectiveVector ObjectiveVector;
+00034 
+00035 
+00042     moeoSharingDiversityAssignment(moeoDistance<MOEOT,double> & _distance, double _nicheSize = 0.5, double _alpha = 1.0) : distance(_distance), nicheSize(_nicheSize), alpha(_alpha)
+00043     {}
+00044 
+00045 
+00051     moeoSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 1.0) : distance(defaultDistance), nicheSize(_nicheSize), alpha(_alpha)
+00052     {}
+00053 
+00054 
+00059     void operator()(eoPop < MOEOT > & _pop)
+00060     {
+00061         // 1 - set simuilarities
+00062         setSimilarities(_pop);
+00063         // 2 - a higher diversity is better, so the values need to be inverted
+00064         moeoDiversityThenFitnessComparator < MOEOT > divComparator;
+00065         double max = std::max_element(_pop.begin(), _pop.end(), divComparator)->diversity();
+00066         for (unsigned int i=0 ; i<_pop.size() ; i++)
+00067         {
+00068             _pop[i].diversity(max - _pop[i].diversity());
+00069         }
+00070     }
+00071 
+00072 
+00080     void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec)
+00081     {
+00082         std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl;
+00083     }
+00084 
+00085 
+00086 protected:
+00087 
+00089     moeoDistance < MOEOT , double > & distance;
+00091     moeoEuclideanDistance < MOEOT > defaultDistance;
+00093     double nicheSize;
+00095     double alpha;
+00096 
+00097 
+00102     virtual void setSimilarities(eoPop < MOEOT > & _pop)
+00103     {
+00104         // compute distances between every individuals
+00105         moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance);
+00106         dMatrix(_pop);
+00107         // compute similarities
+00108         double sum;
+00109         for (unsigned int i=0; i<_pop.size(); i++)
+00110         {
+00111             sum = 0.0;
+00112             for (unsigned int j=0; j<_pop.size(); j++)
+00113             {
+00114                 sum += sh(dMatrix[i][j]);
+00115             }
+00116             _pop[i].diversity(sum);
+00117         }
+00118     }
+00119 
+00120 
+00125     double sh(double _dist)
+00126     {
+00127         double result;
+00128         if (_dist < nicheSize)
+00129         {
+00130             result = 1.0 - pow(_dist / nicheSize, alpha);
+00131         }
+00132         else
+00133         {
+00134             result = 0.0;
+00135         }
+00136         return result;
+00137     }
+00138 
+00139 };
+00140 
+00141 
+00142 #endif /*MOEOSHARINGDIVERSITYASSIGNMENT_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoStochTournamentSelect_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoStochTournamentSelect_8h-source.html new file mode 100644 index 000000000..ac40336ba --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoStochTournamentSelect_8h-source.html @@ -0,0 +1,100 @@ + + +ParadisEO-MOEO: moeoStochTournamentSelect.h Source File + + + + +
+
+

moeoStochTournamentSelect.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoStochTournamentSelect.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOSTOCHTOURNAMENTSELECT_H_
+00014 #define MOEOSTOCHTOURNAMENTSELECT_H_
+00015 
+00016 #include <comparator/moeoComparator.h>
+00017 #include <comparator/moeoFitnessThenDiversityComparator.h>
+00018 #include <selection/moeoSelectOne.h>
+00019 #include <selection/moeoSelectors.h>
+00020 
+00024 template < class MOEOT > class moeoStochTournamentSelect:public moeoSelectOne <MOEOT>
+00025 {
+00026 public:
+00027 
+00033     moeoStochTournamentSelect (moeoComparator < MOEOT > & _comparator, double _tRate = 1.0) : comparator (_comparator), tRate (_tRate)
+00034     {
+00035         // consistency checks
+00036         if (tRate < 0.5)
+00037         {
+00038             std::cerr << "Warning, Tournament rate should be > 0.5\nAdjusted to 0.55\n";
+00039             tRate = 0.55;
+00040         }
+00041         if (tRate > 1)
+00042         {
+00043             std::cerr << "Warning, Tournament rate should be < 1\nAdjusted to 1\n";
+00044             tRate = 1;
+00045         }
+00046     }
+00047     
+00048 
+00053     moeoStochTournamentSelect (double _tRate = 1.0) : comparator (defaultComparator), tRate (_tRate)
+00054     {
+00055         // consistency checks
+00056         if (tRate < 0.5)
+00057         {
+00058             std::cerr << "Warning, Tournament rate should be > 0.5\nAdjusted to 0.55\n";
+00059             tRate = 0.55;
+00060         }
+00061         if (tRate > 1)
+00062         {
+00063             std::cerr << "Warning, Tournament rate should be < 1\nAdjusted to 1\n";
+00064             tRate = 1;
+00065         }
+00066     }
+00067 
+00068 
+00073     const MOEOT & operator() (const eoPop < MOEOT > &_pop)
+00074     {
+00075         // use the selector
+00076         return mo_stochastic_tournament(_pop,tRate,comparator);
+00077     }
+00078 
+00079 
+00080 protected:
+00081 
+00083     moeoComparator < MOEOT > & comparator;
+00085     moeoFitnessThenDiversityComparator < MOEOT > defaultComparator;
+00087     double tRate;
+00088 
+00089 };
+00090 
+00091 #endif /*MOEOSTOCHTOURNAMENTSELECT_H_ */
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/moeoVector_8h-source.html b/trunk/paradiseo-moeo/doc/html/moeoVector_8h-source.html new file mode 100644 index 000000000..129a0e0a4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/moeoVector_8h-source.html @@ -0,0 +1,134 @@ + + +ParadisEO-MOEO: moeoVector.h Source File + + + + +
+
+

moeoVector.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
+00002 
+00003 //-----------------------------------------------------------------------------
+00004 // moeoVector.h
+00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007
+00006 /*
+00007     This library...
+00008 
+00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
+00010  */
+00011 //-----------------------------------------------------------------------------
+00012 
+00013 #ifndef MOEOVECTOR_H_
+00014 #define MOEOVECTOR_H_
+00015 
+00016 #include <iterator>
+00017 #include <vector>
+00018 #include <core/MOEO.h>
+00019 
+00024 template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType >
+00025 class moeoVector : public MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >, public std::vector < GeneType >
+00026 {
+00027 public:
+00028 
+00029     using MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity > :: invalidate;
+00030     using std::vector < GeneType > :: operator[];
+00031     using std::vector < GeneType > :: begin;
+00032     using std::vector < GeneType > :: end;
+00033     using std::vector < GeneType > :: resize;
+00034     using std::vector < GeneType > :: size;
+00035 
+00037     typedef GeneType AtomType;
+00039     typedef std::vector < GeneType > ContainerType;
+00040 
+00041 
+00047     moeoVector(unsigned int _size = 0, GeneType _value = GeneType()) :
+00048             MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >(), std::vector<GeneType>(_size, _value)
+00049     {}
+00050      
+00051     
+00056     void value(const std::vector < GeneType > & _v)
+00057     {
+00058         if (_v.size() != size())           // safety check
+00059         {
+00060             if (size())            // NOT an initial empty std::vector
+00061             {
+00062                 std::cout << "Warning: Changing size in moeoVector assignation"<<std::endl;
+00063                 resize(_v.size());
+00064             }
+00065             else
+00066             {
+00067                 throw std::runtime_error("Size not initialized in moeoVector");
+00068             }
+00069         }
+00070         std::copy(_v.begin(), _v.end(), begin());
+00071         invalidate();
+00072     }
+00073 
+00074 
+00079     bool operator<(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType> & _moeo) const
+00080     {
+00081         return MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::operator<(_moeo);
+00082     }
+00083 
+00084 
+00089     virtual void printOn(std::ostream & _os) const
+00090     {
+00091         MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn(_os);
+00092         _os << ' ';
+00093         _os << size() << ' ';
+00094         std::copy(begin(), end(), std::ostream_iterator<AtomType>(_os, " "));
+00095     }
+00096 
+00097 
+00102     virtual void readFrom(std::istream & _is)
+00103     {
+00104         MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom(_is);
+00105         unsigned int sz;
+00106         _is >> sz;
+00107         resize(sz);
+00108         unsigned int i;
+00109         for (i = 0; i < sz; ++i)
+00110         {
+00111             AtomType atom;
+00112             _is >> atom;
+00113             operator[](i) = atom;
+00114         }
+00115     }
+00116 
+00117 };
+00118 
+00119 
+00125 template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType >
+00126 bool operator<(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType> & _moeo1, const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType> & _moeo2)
+00127 {
+00128     return _moeo1.operator<(_moeo2);
+00129 }
+00130 
+00131 
+00137 template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity, class GeneType >
+00138 bool operator>(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType> & _moeo1, const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType> & _moeo2)
+00139 {
+00140     return _moeo1.operator>(_moeo2);
+00141 }
+00142 
+00143 #endif /*MOEOVECTOR_H_*/
+

Generated on Tue Jun 26 15:13:04 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/pages.html b/trunk/paradiseo-moeo/doc/html/pages.html new file mode 100644 index 000000000..afd538851 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/pages.html @@ -0,0 +1,33 @@ + + +ParadisEO-MOEO: Page Index + + + + +
+
+

ParadisEO-MOEO Related Pages

Here is a list of all related documentation pages: +
Generated on Tue Jun 26 15:11:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/search.idx b/trunk/paradiseo-moeo/doc/html/search.idx new file mode 100644 index 0000000000000000000000000000000000000000..e3d1d6fbc5191eeb2b11fb7099c6d251bdcdb4ab GIT binary patch literal 528395 zcmeEv4VYC`)&CLBxp!1lQZzKu5m8Y=`BDcM5tWpTii#57&|y9<%*C0xUgw^3=H6kj_kI3ai{}~k z*V_B+{o8A=z4qE4cig8Zf6lXihJYbp2p9r}fFWQA7y^cXAz%m?0)~JgU~ejkT5<0)~JgU`+{M~`S&7L1La-;oVmUC}M+&%bv$n#Uj;O}hw?Uc0iB+pNO-}B3S374G@|Ap+g z{|o^`zz{G53;{#n{fU5I_I1qH%klT$TtR=&qdb4l)13dJu+sjX^AP{0=kMj_`MpjQ zn!PST+z!v*`&bF@oeA@p#}F_C-oFU=dtVx>oWJ)2@o=w$V_^;Wy$WO8?{%w2dw#DU zhJNz+y*9?e7BB=1f&c#q_`No9CH!80ELjaez9>$x;5HJMZ-w600`a-ON{)f(whxh+ZJbb`f4*Lf@8H=ZY-v>6rK6iJDw+KVP z5O{wg;2(HIr;7Opp4usnBK!kCg}=-2cQ5|_;`#lsU(oL~{GAih`~9XP{B;idA3ZXR zH;*A;2)zFg@IP7;tCauIFDJrZ4a5GS1zP{mdn5606#R!B8v4y+2>h!d;2+lTuhyhk zd;G($kB7@g$HE%$%L}#vzdXKXP#SX$0Yl*ZjeuV+=XNVF8_?JMyFOS&1%ir+)^1pwe+vOkLlk4vvzK`c0j=lfGhlK6%53dOQW&M8F@gA{ONjD1DA7MrZ*;zz}%fAm9)9 zbF41@ksa~yQF0G37Kwm=)K8L89QKu$T2!HO$Vc5U4pbLbN@c5V3Xn{9zi+Iv{`|2V_UC^wjQ8i`U6A>52HL+SCF$23 z=-k3t;xL1G3;{#n1A%~l&3LY-e@)??5dRvH5&ku|g>CS!?H~HhV+j1aAmCs7MbE#s z_5<5o|Jn;;b@#7bk_hjJg*D(`x37B5H3a@`5%8}&&hxK}>(C!0F#PM{_xt_pJ{eZu zzYcHuU-wQJj(YqBCxtvlnG3u!#b>=1fapdo}uDyT){V33!Yp$ws z5d%3jGduWp#0Ysu#88%LElwN9@doXz&9Lgs22 zn!hR6G`KF;m~FyW>dISlE%|KI^v)0)q0^Om$0b{UD%R_!>jdSY2D6ZOW84 zfS?Jr=2BLA{j*JV*;?w4!Sb2bOapy`zU5O}KCNj;?CWK$E&-k(m4aYKW5biSo6!vwRv z!9yu-g*SNk5caM1h8{nJqSg&Po+H}5p(iwjZ6YSUVUss>=!qu|#(yVKaEmvzV%XrJ zBTuHlc5mp&3M$}6ct(yOPcL{X$WxA_k>nZV4I46KIQc5zVd`=445OHd@K8xN&V`5b z&-aE68#;K{2rgrpH+<;HgNF~}l+_+QoNJv|F?`tI3JJ7(75RE9VzYP3Ddg_(s;Ha6 z!U!$w!vXRQtg3Ekt|y2VF5^h)&0G`HZSksVS~3|LK?`?Q)x$!0)*R|@<{qhUnW8UZlHf<5YtjpM^$Z0 zuC+BcGeZ*KX5Xu-%eFLCH`1qWu0Q|@t=aq>3}*iP&EpW)ny&`q6UF2LMFu1kwV)7H z-AYW+nBiL7+)-7RnGT9Y1GotC4e_cVeOjrgMdPYm35zDOZ(0^#sY3;7G8n&^a3Fy8 zmL*jpd2ZR}Re`Q4)7q*Pyk#e18Zxd4xAsP;r8QsGm}?;3x^;xoyN}&EUL#_ay>&^| zG?0I_ylNV8=~w4gO(Q<|>f)+t4b{|$udZU>Da7g&T<=w37?E$ISCyqteYK-1OI@_M zAKcmG8B&!cXF?T38+jIbRToq@Hxqv>UgcFaR5#YtRa4fl_4QEUOpd&R*hiK4+G6%n zJ-*&h)tJe*WNYF7##n9KH&#_a7E;u+RgKm3$tC?j*D{@IxMV8DNgbEWt7>e^v*<(0 zZR5SFrfhA!%J19eR>cS8H+y?kxn@v)b3|3hr86OxaxIGbw?L7vXCC@ipQ;=+;#6?I3ax=_J)TvkP> z-Lb)|!cb`C3f=K+6{azY-A*3Y@ppC*1z3~ndM8qN9KgSPNL4e?AzvNQN5|~)#a>l7 z9T3GD1ToDu z%mlA0Kc|`c|L*##yesGKxmEd=>ZVoayP zl&0QZUX^zKiXl}qDK+m^&B|n_*XP}kq_~wXDikCXxz4MuX+=p~>lM#>G#6%OW}Kk7 z$FHtc(REL6^0(9pC)~3DA&hmDaqoDqx{ij|y_4WVonYB}?|cL}c@aD;A@5yE>C8y? zt{`tKCey*QGOZ1nIh1|9S3PYS@YB(7@5btBfPs=ayz1%GTQbv;B&BZ+!#V1idv{b% zuWp&e{r)|_dU{K>^Ot+o*+#0y_Xc^PF2mu9>V}5gEUC`-8p1Rp-9aIER#xhyv2r|9 zQ^u9~>V{d>bJ)8Uu@tqTx}lXbASbx6j+%2{FAq{AJG~7en}U5k$WZbOsHPf!zoNQH z$LaTXRyS2Q%xPs|wW@D*6J=O6z=K3;$TD=R#=|dyc2ylkGexryP*ql~Vn6g1U`pZj z)flu?xm6oI3@-9?xS4TqOQwO;G{oIsNpa*EPoC%iyMJSK%k(zK2tO#(0DbHS1FBnU zvf!E)s>Tn76lUBXOmP0AiSCC(JQkuqoD`Gjt5+ik-f?9=utHKP#{;XqY8ovMti$|B zBKpBHcxbFX*ax0QH-a84rvSxPl81%wgJ8p%)!ByXng(j^gOjRf=2+@KIMrhXjw0td z4f???(M+XddbdPiv-)`0k;(UQH%HE5p;tL-T7meW$7eYj)IRTB)`_ zn#570JW{9`(OGC=@1j zRS&POi74n4v92cDf>~yIeKkSxaJv^SE*{=mlgm-(KeCvV8S*Tv0k@H7JyVfyqgT_C ztERHo4pjAL?FjbqsCyK^wM`@NA6-?$V))UuHEr1j9@dX;_G+m2f9!d+5ORdpPb$4y z=Ix(MuB~pVtD@;J6vZs280OA(D{8B2D9}QK zYu#Fuel+2|Zi9z8vi1UA1W@?d+WK5ha&NA!hvHQWe4!goi6GW7RJF&)*XHV|)sIg?zD6Fpk545Xlj0i4(~<@D zGN>P)9gV1JYo;|F)%Nj4lu*zrA75HfKuHfJ{#d`g5QpH;Tt(^QKSxqiz8a$efhQ)b z#D8J|`}hk_tVV8Dby<1a(1!{G^@g$JY0GEYnxu{!=D7%FTq0BEkYw zR=XRXb>GKelqqtg_6Wm_J$p`xn{!hNgoMdw>DCFC|r&?2`Xtb7F5!~Pv)sG zC!3zcx0|N5VUB-@)2fPm-0-p&|-p_q)}X~@i$d7^!ld`!~TBNuTF zihBwz&tS?TZ(m142s|}_0<_qWsqrb|Hn&WsWNsSPIig-YHBqRut;}mrF^i$+xs#uo zPgxtXwOq@m7J0Rp%<>uKpr@8fm}>phnp&6zFvu{2t8{&;9g5p5*9}i?as;GPKea8o zwE5LCDF+F^de*DWw=_VpV2=OQW)A5Gf3?l^@~?Ix9^@Ohc(rZlZYJKi)2pMxf3wnq zenCrh#_Tt1!Ugbew$(wGX~;FZndWIwxxJcqnRJ$Z2R#&-JOx z)FAS?`KTpS!E6(YGm2RyWIWeAx3(@*%X$>0Y(VpXdJVVlxv(~rv{ODwUH5#Me3Jlu z9-nCe-w@wFU+&R*GTX#P4vH8=VU|B!;`0@S1?ltS;LnkD>iLNwI@)i~Pl-pVcKUpM z7%x-4>zC*AVLS@_ZF3mXjKA9+S?T_Fd6@1N5HC!kWMq9|F_L0k_`$jc4J2qG*U`(X%V7a`L8huO3F#WK1I8$q zCajSOQwC{DraFwPP$LjksAC*LBWUE$bI+X5-Em0^x|6a7j%mkH+ppe?C`=Y%Vn7q@a40ySKv zywsPYbUFLdI1Yx(tCyNN?E2=VB^(O7EY|Tat>#43>7|`sM&|#Q7iO>sLDb7j5JNKm zrPIQPc{QJq7oGvqepU>n7v}tWkvgpdR#4|2LnU1UC2}@97t~nO>hl)&& zM-Pw5$~N%%bl9n2y3A80w)DxsfC@28(B)b>rw@!}CvB3mjX-r_+s)L`Y8(r-N^Tb? zji=hd$_1Ed-P~F&cC0Ov&~Oa2MC??e7KK9F6e+8r(9%fk>`wSZ66a-d1%aH2BmlKy zKr~=(=6VA>LcK^WmP^fxq^v^yblM_gVB~Xa3zdv@$d(OU!9+K`f;L5J$DC2kvpFwy zsDiKHW88`SpVN(lrOG$nfzNqDA}_#1M^|bNb@SH=vLc*8UlK< z!p6S)r%EnZ2Sz*%=&=-v$1b3+kgX?Ln?K>(BGlrt*^eN?zoW!w*v=+7=6=QB6=5X=|r3 z{&Dmol;yyb{*j8Pa;P=b z*L!=J=GH946iRq~oR*y+mx1SmvqXW;b}VJs1? zmr#aR>aTD1GBa}xyucKz!=Di$(h$Ud&bylZ`7$1WrS}2;yaAdvn}fFXCQ|Hguu{2g zO;|q4+qT}NiPE)gtCAw^FKfNbY+6$OWh-1PLb7>YJ^!_gg6JM3{k2bKcAh3J@|Qb5 z&FX)x^rpd(Nxt#ZfD;qsr@;=uJ@D7H-ZZRa+OQZSlAY5sWRQ5H%quKO-xx%D6^Q*? zUl*yc{%wMbh^a1ro6Nfz$nZalTsn(dMC@1}+4k76o$0{dNO=pHc#DMEO<~w)u_Z$D zBZXGG)R+eQ);g>egu0zp4TE9aghQJATbrh3XNzx#H;tB%qA0%YPix4r9qsMjv`Ion z`nUVJ?UJ_#l4lr2O~6`@5Py3z=w}UXt!K`AyTOAwnxbb<11o20X_56#AH+@1kdpn* zz-hFJO}@%$IWnSh72cUB0nt9+sq?16?vR<4YoSHLJI&KtG8d9(5!u+uvlJd)$Gtnw zo7UDsTNaJd%kNI*aVp|KA8lw8rVlD zG|`(5kq+Al1*X8_fU$@E3wqXj_0Yn|w*VgQn4sr24@gs_@59psQIWZ5Fhs^h6xG{v z3PHAs_o2x28u)XY!-Fi z8DWBSuP}-z%EJ&7kggJ>2ZfQup+UML3=@j!DIV<>q5YhQGXM~o4X}(e;{|D~qloG< z5Vc^&cB|rG&#j^2jO0CcgvSJ&ya@L4qX#a6y?VP~V!sZV_Zm?=$qABRuc?KSisWA8 zQk~SG0$0bQ!h$vx3Mx?VUFKrL#Tkm&dq6T$3)y>op^#V(00kQE)V&vGo2ch{^&?nj zX6xAG8T3L!U?il3&480SXCHtMafZ2&0%%HI2CM5}pXC&n<#Dku;L$>;!}gt62-E&T zu-_o=GhY4%`;FC(;{M!k3K2uk(eoQb-yFtKXddOpZVma@5-VUdi1tG<+e2FVRBvDf z0<@C?eLUK#33`{q^pYpZMUB{hke8(#+P^)U=SuIt$(zwe){0>N zE#3t`S<`e;1M&F&+da1f9URcxyC9Q6U1@Y5koPWV%FQBHJYc>TZcGOUEP~Y<$O~)- ztZ%4pgJRDj@PN&fL>abu*nXc*cK_gjov>_kY#*F-sinCPv3&-4*kPi!^r?V{+zB33 zUdZgA&t%noDNxstqw4fo+K_{No_woF@{^o7ux~?-K6l_0k2I9vzEc1L@V!H1{lQGwvY^}KLVqe;+r04SLdbbY5b zk}-meRzcqe$-}(UcXlHg+8On}^BOaAs$sn2n)F@h%rQaVRURKb2>R|ItD*G5!BgOO zjX(G@j@QN?ynut;rw6ZgNesln>kv9Y&^x%p!=4HC^1(YBbJMBShm^^D9URi95t|s? z^@j{3wb<EGT)NVavCdU>iX<;OjTT;gIeuVS7QWN=MXFw+w%{7*arPaG` zp$L*FI#C9#hJ%kxAadD#b3ItP=*dLuEJ9tETE~>t@%A)Rq!YvitujtCmuPsQSdx&c z-4DHhvM{uxXUg0GysmSi+i0EG(g@*w5ezhL9WWDTkYq&=1*0=+gJA0<%Os=Mk1brZ zsZZMwZspQ-e#w`oN<@^1?&P_Q@`U1(m9K9ypYE9GdTmz)44?uE>w_4}d~^txE-MVoN;G-Ok+IGhxD`u? zJ|v%)0tYh*i}R(OK>cnHHkaoqigw-*#FM8@!2*QZu!hi zoN6nVkcSDiOS(gQ6J2!4UoNu+f9ueGoLX4c$G&kWODbnCj;#Hah+1;!Bq||h+$}{p zl_(2pe9V9nE3$!$gkd`qmkEc?rUd%vJn|$Y6vekwyz3x@597*(y+<)TE+Qv*It>aU zT0zCMVh*ovDVp9v=_KgOefD*d*rP_p&ZGt9>xr(5p-*LPCz|fc8e}+}#adBbqttO! zT!H;4s-A1X2X}(Q*Kt4(f(D0gp>P7zLUwdeB8?fSKQjATK5Hd2E`=Gc^l zs`t-FXoZ1^`}!}AM2D8vpg(tDR7`d%k2%Gi3TzcOO5eG;F;U*1`wC}I!U_5a?umBe`AJyiQ7R6msMcq6=pTim7YN;Y>1CSfqf`!5tig)ER=(xpQ2@b}_Ya zryR*$r|qN?I;2rz77Z2qBX>rlwRg)S-FsBIP`IhI=q!oyj~c;bC6osu7#|W8>!726 z0OlG}tdF`(yfjBpkekwZrb5!utWQMdB#LVYzf+_O!xoZ+IhrL*OpT>j`CfEOGx3G> zTt7B7!;BmOc_4RsLCi;!xX(K$#VRyVK)@o6?0cxoz}fVv?rOJ`frWv{?2^M|;M&HJ zeQ9_N+)Q5yqe72}xEO;c(wNtd@wk#*>RtHCF};|Kte#G3?1u73`53uw&=#N^HA>7d z$Bd&-?q*gP6=vgMeu~Av5EIsmNe7DGaU(DEASyz zhQ&>n6qD(@B~(%>frq&mba{$9mWOpit5#0tZIR~3Zk1ab!Ewy%CDv;w^|%4_RcGow zjz!+C^k*JJ$F1OeYO*UibdOt2bfFDKVWlrK`^aLPg3K0ebe1-Z8^m1^RfRw}sDet= zC2u0b6iO2@kVt8c<|@8qro!hD8Qq+tz)}iySD0xxFg$~O&Ki*&UGQN%XJ5+MdG?4C zaj#J|+1@^wA&D+;yCXv4B`%@QhWr_Nk|Gtb3|<~16$%jxl)A1+Dn6Ac5!>Iex)z4h zs8MpmA~=4?d(0mh!pBz@DZ?2*O4NjV?Re(@T`wR?mR?!3l_V^WpIao8fFSELqM6?X zjhqV)j*s_~fG_1x2`jmTqS_uMZ=mE|w2$a`EJoMqh&+K=nvR3WM=5F`mDiGM!!bx~ zAG2YAq9;H()Yz(7^%*)C7n~p?kcmizhwcnrgp7ogIFCz0gdPTnapwsvMG69y`Vx+hLlmN%aGuhu2y2qqeHmu?hA?2t*+oK9v3 zN|`DtPJgDDxe^oh3B@gzIQpN0JkO09b*YBeN^)T{D^XL*!;DQ@6jae{T@iw3lZ8a; z#GM{yjwEnThY8rFja8fbI82Qu4do6FlaLX09Lkef7)deZQYn>Ol@vEf;v%;hf}vw2 zuCRn2iV;STN0!4wC%eLQohN+@Jm{8XFtkpRiz5_L@faO7%3%;jyIymdld1Ei=n#Q0 z+oISvJEt$DqeX>F>{QJal%*?^STQ~u$}G}#u3eQ&A7?J=x)|-NfyYpWj$M^HYLpm) zYUUIUfd@mk?m8RpC`N8e219r3I*TkJhWWduBteS%9caO@-n*ub)?-+|UDFr#JckY3 zH8tPV42F$h%F^2r1>wcW591-xg$;AmsPHsaFpNh_QQPFGQT*M)UB$v2L+J3BDv>e9 z3B!1Jm7q-A>M$OJVWOTfr)Bi86H--W z#O#_j!CAv){B$Ru(_Mzk80t=r!a1{GxQwLkP{v;5i(px zme4yZb`1A|WqY`cs|0CmTnv{Hlps;yWY8oMp%_RC|B=-GRkM`c1ep9jW9b90PVY= zEgZQUzDY>krh{-ubPr}SsxJi>!l>nlUP%(n0~Fsk z86RWC5d)IR@luCKa`N;+qSr@MmLk(Dw84n+U6Rnryb+VSB%!_-F|`y)5eYh?!4a3- zlt?yXHfPxN_5$+76-uhwyl!U}on*wqZf9`D%n?hvog?1K%e$Sgh+;NkRkw3PKhu>T zO{F8&QqCf~C&Ir)5-8J#l9}R->L^JUn@2}%ElKBYEyl@rlq7f0T?8lkOybU_!$y zwR}yjkJgbQksCHK&~e^*zi+#1nQw9FzPfPcB6rC#xee zw8d@U#}io!cHXDJIisjuPjg82P zRo%$p#%0A?rcItPL1%SZK2&TdMH*E+DxM{(?ry#o{m$myD`9u2iA%TbPKE^6j`Vjg za}h;rWbfT80!MqpzCiUy_S?Pe`B{bCVOsHwo77#TUY1Zgpbn;)Td zDnatNda_Y0o_6zKLeYA%@Y?NyinW4;+HRMWSnrQyakty0M6ZC2WHA^mqVy4wqL7Gy z?A8$zQG~nqEgIV*IlEbOF_3pKt8}vfVB3nzT{z&5%P4%gZ4`^gZk()=hINAwts2Dw zvm3MtCLYC-vRnD&%62e{Wn;H;@WZCTC>Dp^%1}g@je%b5!uUE{XYN+F(?Bmqf*SZxiL96L`f&`KT?0RP|9^ zwre2KF{8^13C`#TZipLHMh_~`BvL90DFxHX=y8SEut!HvEJPO5u}4oSq?a;gp&_H| z3uFZo%IJI{*0n<46rntq6;jbSwbhJXP>2rW7IR$J#}tdmHoO!9yY#mAklX^4O@%>D@T+fjjoa^#}ZX&l0a9= z(Y2x_PAElNJf7g2Ts*0;6Hr-Kio)&WRPtagRzrRLHmKx*TOiT1y~R)Iiu~^`H8p}| zKzB1ln#Lla`}wrNtK*35sx<`|)^SD%I@d%wg15NTOwDSrx2Ad(u9@~7~G zA<-)3PvPl;;DY6k$J?6r21{S)rApTqO~d?sNqtFbsQ)N{FBsb{WMNaNHFA zU{NHuL@7#Oxjjl#Ky!>2jqi--m|oHJ2%=;9MiUg%F#{+zv>1dQIaXM589Qc3ESpe| z8Wo;U9#dI7ou3g7#*8nTS|k$Vdd#FE@rB_#h8ZPM@8n(BG0Zugh}^3RGB1u{7V1nB zeUV}ei?9TZoH!STESf}(SX`tLno;f5G;fY!ZY^3&K`zj5ssv-0V|PJ$I8!qJ?t+p| zrH)~S-UT6@1s=mJz6-)i{x-AvE-1$^B{O`2QW&bx+ov-3mmrGYe?FB5LJ87X&!5U8 zqZDPd|4)sN7GZm>V?Ku$(dBWs;8YnO5nEhzC^0V-O#`;4%FrpATwnp-Lq1i;Q7KY- zVLmvOhmR~s5>1R&DJC*cok}%~UJMZKj>b^Y4V}s2<;-S+@GgNXB@9y;^Oz)dx4@Cb z;)rx%G1B-4mlPw>V-BY-r&N*CFp@;BCde0yrOk;kt2|w& zqdj8>c1@BPD`RP3|DVR9XAm_;6rW$T)O-)Zaw{?k0^QLHpPAs z5vd=;kN%M}7iEyUQp?f@2S2t>W4L}F!^imz)!MP0XD5WeKSweX>LvY{O>oZSFq%SjUU-)MoTVP#1n1Fm&Ki#&h&g9{ zVy}Ag22m&`Z^<>W3^{ikBB&1MF7%?(@!TaEVm0{O^&0%*c_5xLLWAW4k13~!i5lU; zD>O`rYc;^Ds`K(1k1EGc4i3VP^86D`*r|n&p*EafronOt^Z9)=CW@6n z^iSSBJwNvIu=Mq?k7?<6{#5r{uJShH`S@v>!jH)wO$4*GYQ#a9Xd5Y~(r>cX!8Q)FF8&NR&)Y}oV@if&O{GtXHOZ@V3&3ccP zJos4(%DkzWeiSpP*@8Iti^@UGb_5Vv+Z(PsJzI<0F{EnL)l+7^XD(u+ZZ0C)!iR$E zR=VFI3+fwCG(UidZ1wF0Dt^4Pert2C1q3_?XUn{1S14$+eVUt(A3F48@|HJKMY4mC zO!qdj^+>`m-ja77#SO*}JOIb{3St8D)tBj58{cuQ`XuB0)K0G6$qRGwKlFAG?z0 zZf7j!MEndii{Kf{5TplvW~@Y!^ov-*jE&8Z=+*Si8Cxh-qA%zLKUJEB(*^iMc!E;( zqzmvVJPy!;^Or=@?C8lqm;BW=S)9-%)$jtU1pN>MeeZ%*9^TWZpW6;DzyN4#t=G=K zV1o>hhQ1zMK$N@<6FgWUn4=p|(I$Ekw_!`eLdjE5V?CEm1ek$^0CBy^X=)%t< z%g-4G%^UGq%FF}3xkJ*asTcayVZVloE6p$&=PelE}Q*IyF33-ioS6e&r!(MO`Q? zKXVb}fyZFpT0{pBbLA^Ef>6(obGfNrd8(+YK>2wB6DKSVe_k`lFGJ-?QgC*BthE`9 zrQF-&Ek#sYnJb+>+=f0FjAf-f^dGbh49U4(Z6na6YzxYwFSd>K+c$R@|oA2p+ z8I-=n!)3<|y};jwz56-JC2cDyn%+;=x2?mJHI!2LsiUB6eJlSEbgzeq|T zl6DVf5AtkkW!29~lUWP#s|5JLKcviBB9a+mMk_yixkMp#_NvxQ<^uZKoRugk%KLNH zAVMu4)Qmaph~V2ub9PDr7>D|sSHVS;O6$~%d%;6;_u{_rB+eOKJV0_59@C|gFP;d> z=yzE**p#xKVfMc=+3zDf^{UJbvox(t7+BL|X#^eCdK# z*MFBTc2*mTT?aq?m~rr>GSA74FO2{ic%>haUxuWO9l-kXD*D-bNn7u=;>BT@u!(RZ z`^mS%Yt2o|&*GnF3@#r;zt4&2%PS%R@bW1LaLcY(+KT4^YcqqUPya8ueNHpds|3+yhxk3$(Y zw&r=oeDyZcgXHJAh@a>Cg)p)8{N9|?ot&EAkITi+OOTkrFT}Sn`^*=mzZPN2vWSWB z-Y{u~^H)X}1QfB8BXE*{RtSi=rko?3!dn@AM*5m@oP>M9)GgPb6wlZ z7{94ZF;E>*4fzGq;M%!TsuUXj&QGQLjkMs}<(wWB9@nnoD4aU08^%)W+O-_P?;YTw z%S!sqTK@J1j+ffVQYQKyTlnPYwbD$-z1ME$T&U@FW$=+ZAXZK!fQNp{qZ`f0+<;c5_V%Gq})OE=!nFl7;H2}etS#`+8QSbp;_R?6T&BJ7xbdx0%pXo z73U)#TQGz(fF&c1UQih?1)JpjJ2Cw21>-rkH)s|Bb~Jzn|AJ+R zrLj+PW5G(qH@hE;xE@`C`+Y=o!(!?t8bvp(XwA3LPm%{WtmZfo5jU)pmQZ|qq@EPs zL`hW2jbJE!3yXq%B7~LN91KNW*pf;4##rZ4Gj1H@wYKrQTsKy<@~=YNIIgv=X0ZDy z<>1DtUhAxCo`G&`@LK7YXl|VC<*P4{n%=kwEs@{OSvUkg(NaU^&xMoV<5vb2)_ZyU z%0g2X+6~otA-x@jshxfnn1Yw(@w2(411wyS$FDt-XR$k9x^NlAIQ?v4JH>LAtsc&! zgYc%lu;)_DZ4HPZ2*0^BkKc13&k8!S4$rqh!wbuAZ2&Pi9&t-SmEo1`(pC6f2-ewe z2OW}bAAls%RmnfZBe6>6eF{~&6F;|)r&x+vgdcDtcey9R`}S3ENowD|79JAUw{P_L z=TvUr0xrPM_>fMRqu=2QzB4y!#QV{;R)7|S4=W2ELM)%{?!QCA+kr4`aZ{_zK;akz$W36w+Ala95GvA5|36i8+ zF|Np#-HM44iS&D1)|xrt;m3QXN-DMV9%xteOWg$Ez4#dX!r1rrX={e%f}#g{ZKNTQ zw*hNB_d8ej?vS6Z4!$=)7Jm1Y!=*Cst88l})#JYL-b`YM`zCoai68Ep>Z#@azJ~Ce z;P(g4#9{bqEUQ7XYAXj^2i@;^d<~wLO83`^Oa;~b&E$<-0bI>#guS~HxO%=2Q*~Ca zKq16+4QIu(W_ybZ8mV2|P zJr9oXW>I?{9P7=(>VkX|W>wP{9$f6r!hj~ ziR0QmG-6h!`U2Li9~v+5L^5d>mG@AyH>(~+53b1(uRSz(Ry|H#kZ=Ah8SZNkB|rSL zW+6yfysgfwS;)F0D1$+6zdkJ-meC zMf-Vpxrc2myh2z?6HrIlcXn0p2XS|G+%;$Pn^V z^&gqw&B?WqXEI!3y+_u07iIGoi9Y^FyQlBuJ+jl2f4-OM`F(hMc&WONiaY;1?4}=s zyhl8K&do~?zh2_bUo7qwudrLT?>+2#UeA&=p0|gWcJy(7k1$W6obJY$6~?Ki}I_jq=x4^r=98s@g|;RRdA75p!KE%c}M-K*e#d~U(N zL@?uWBG?9RpXF%Khn=vCf2V*w>hh6KhGhqT6W(KNT-n;UDfiuUkv=Z;YtOJf-Ro1- zEBt1(j>UPRbD7}1ieGX4Q;YT!_XmFpaY&s-e6^RCTJV^Q+s_ML#P$-#RO*l)a$IWU zkHtL`V$Un{Qkh0BC(dAh@LGo5)YUh^MVa5dO5E3=K~Z?extyNvy_Cc0LoVeom#g1(oFbPvUm)plnExAp?cf0n#@>2=_Rj^JE`fm=W zzw~RksN0th758z>tQ6k*MR8wy04^|p>m_!}_N6gGb-}l^zg+)#-a%gQQyE*~*xe-M z=ok*(d6e@9@4UrsIHnJyenERm;GDYVRZ0KK<#6%s?@E1BE3TIKRqG`F$-Oz8KJzdR zr)L}@uF8rx&X#Z}GtghZ6#0|7=JS&GS?r(S8)dzOXP6H*9l>d-oWuKS38(vG{v&+a zJ0#DZPcR+#8;=pf3-w*_b&gNpHi5%jrsLU=SCc$?c^}F1JK{AeXRp#SaaXuGoI3L> z#-;Mq@KOAol=9M?O%hff`UQ=x2(K(VlEd8A{%69UV*23uI`*fRFW_(-i(`uLh+rAK zCtgW;sblBxcT%UH1Q$Hya8FGT-c8j#FY!EPLC<3gbcwzc9z(hthpD2xhV%rlr8dd@ zkoJT(L!LY==xl#36OTtPb>Z>Ll~9yp)t9m++=>uHsbuR^&;UwGc$Uhu-faKRTI^)K8d#D^&J zrE%=0Q&r*)B-sj_CbWv%yh7Z^XTa_4rC%KccVEbzpTjM~ALe{6yR1{5uG8@C&&apS z_IeQIP(9JFE{^@&$3qaG_JZfAKOqMOkgUd>K99x=+Of`I_p3i6jC$YsB~C931T$`9 zr#S%n^7m+N1N|RKZ%cXUHwi0}Uzn$V|4a45!F_ihFSW-z@|~WSzy+4Q$wm7)@i@lZcnl zwmBqQ;l5ZQ?q(+|wh|5`XAcScE%@)%2xA`m$KTjZ9V%ls_4%U^#gSJoqHp1v< zUI!t33xbsXbt)6?-P_?J{@&Z*qW_=XU*eyCQrs8zbMDRTrh8V3J5==V^vCB(xQ_ZA zb~cMKm3ctKPY-)nJ@YNHQTiBd*?-!v)!FvoE+vp?0W}e-AU)Z zXDMUPe6aTbp*id^xZsOHqRXV_ZkG5z)BKP4?KD55Kg*|!TVKoW|4td;Ter>&bwQ_F zt8V9ceZ9cxU%{V<$HA+~IbY}cPZDnt&$~H4Imh4psHB&|^z`RAJ$>yB&Lx?SwwIc- zlXLaoNH2%(*lDiDdUm&U$o&htlCE!5M{?_&P>0-Om!Mdw^CHpU-YjNLy;UwXKCqxD_KmKG5#|7&|_65IPgfOsq zXE3{|GPh1Rlw>Jn>R34Be!|T+HCG`F8LM;cO+yg|-#)!V+^rvHH(fabE@bG~2PB+1 zQ{4GY&g~HQZdtRW*SazKi`OOomrnQCCi87s*(${Q_)B}K9&f|d`5tw<{T@9ZfZZ0`6%;4S4(&ZwHx7~ zBPD#Xn+NAMOZb)_i~Hya;%@i`T+lz+CgI;woe=*0T@v256fW@l%bODZ$6R*P2T?wZ z*S^0H_we(@9lBK9&+H2qcz%ARgwJ_U+!}}T<#iJN>6Jpa{%i?vl71`OTgoFHBY0~P zr-_{rbvcseN4Up}j+3f9R??l`l{)`^DeEjaRL2{pihDb?t;{R)MYf5~MmX>8H-OJ> ze*?1BwIkR`^8m_-%?k)~yZRO8htr5x5&x-E;euxq?Mq#_RN{3W`4;JLpyT-j`E)+n zU-~qC&^w$S&M&8utN}h}2v4Nle3QOzvBW#v1Sir_unv0h9=Irb-ZNyMM{#y4b~rngK*IOUb?_Yt@7vDUfDhrrheNKdajJ$VCyqNn|8eNI*kwLLOl-T`1CYdXP_RJ()h$!yGHo3Y|lM8 z{J&ckY|Gi3_e0PlM*K;L_NmH46IZgze%c<<3wiKTdRf;_Tk3u_Omj&KcDA`+KR65wD>>j1lTF zv7eOp+24w*`uyi;4S?_c$8>RdT{RGE=szKhe3{23zD?wFDk=9a`L?8A@pYk}e+*oV zHI;|o{G+5}bCK(#^3kmyQffnGc?n%p<>fCMK!1>zYM1^?sV@1fjEB^7!gs0Po-F0F zd__BA@)dT(zmU8HE`Oo90Jx~UeS_KseEv2AE^vQ~bVcM>IjrlNy$Mh7_r6n{D|BgH z@060)hi?)3!RIQLew90*) zZ036AhdcMH;DeEW@Z8VB#r$!}TX1`MX`L^wbaG@tR_Ly85m)z7)JF0x!W;Q- zr}2;a|L5P~_VLooq<_=j?u9Vq!?!2FE%(yIu7uyZ8{k4d@Vtb2>%7$NRD1p8 za(oxzPWuAj%fuQz^(&HF7?-cU4i~tN{)OcI{P7%SUe@`|&0Fc@Jf-uJn~x}u+P6E| zubtgGwC#l$cW2!LIr(#vL#XE$zs2<=zwTe9FD0I!@zotHu%A;@-uFg+?CmYP11`#r z;RT#xc+s~ox4lSX3u$ccf_v7TlK0Y|v72VQHF)^y(Gvb9>7b~ivty@!U&&#%oplhO zLXPxxa;QJ)x9GQ#{{a{E`QmbMFO_kbdYI-5;4zZsS(N$h^>8r`|8zH8%-{P~v&%X` zvh07l%t$}$USx7lOZO?9y`61s&MwF{JDvY{z5{k{Uf{Osewo`3W4`LRklUF$RWMBb z#_9jMe>3rBq+`7q?#qC$lKZ8_>clvUY);w;3id&gMQRTwKgwQ9_@ZBQ|EZefGy1{p z6H#A={GohNLoy$2RsKlw#ZLxG86jU_Z89S--??&#qJ#sBINiRdxNm;J<;VVMxCe}VPPg_E-2_;u zZW3GTAYS$2O3J=AGFrNd>L z9_UuNvCp_GaR~YD-1A(X4|%~a1TQTo)ywtgM@jzzF51tIS5ueLqD1?d+-N@| z{6Mp$|6~@sVSjV~0w3)+hpqBH%Ve#uo>w@|)#cWgrA&9GM9*)8XCtng$?4oTyrxJY zjPb_%f~eCCB)c&m@qQ=j(0eJ|Ak8> zJnIPw>%N%UozyOR3zCVSbj_>$^i7#(Qf_>t{%exZ{qQqVp6;Wm{YuB-3of4-E(Vs zQ}U^umt_FHr)N#>lW`S}j|UvzJ@IkL$7iQNujdM!-M64a!>+QvH)t_u#>O=IVoxWt z_i5m=LV2Kltz*5CmLurg*(d?S(F=Yxs&fDNFUDv&TtT*RKEbM-Hb|Hn_DAx8;UsB+adZSQdq6%b?S^ zamPBS+Sc{#5Z4p^q~HCl*fLT&W|Y_UERo72cb2Fy&*3|+&2)B0&PSm?dx~sI4fv|G z=Y)^J1wNyGEAD9O7lc{21pU>YM;JQso0q{w_^mmdp6)Z4!|A>w;er==J%oN7?ZyPJ zix9q;^ctKSNWaeXT-JSC;KyFA=84fF&t0Tn!QK3Omk0G}B0UaqI>y4j#T**SNYE*N zx_wbyYmr?;#su^hXFp0E?0A~bj49@DmG?jM5Pvgu-jU9|Lfpg|vXBR~FVyb$5us13 z{g3AhV5NG^Rc}d~lwWlG>sd3k59-=7InU_+YjXq{Th#P;m#IB<{x@ zW;q!H=?mSMyZ*_v_|4`yx+gZj%&YbG`(wHvi=7?~-xN)1-GrVq0 zC-o^V+wH{_{3Ne&MupFh0JrNu#^LliALn`zourZe2U)ms-!NYLfaFrCbEauG*Rp+B z$BF9HZ=c0wX*nt7bLHd59_I8Ad*x5XJb@+4TRyV^o@9GIB$YtuS5ss~Bk>VGcoL$`_hl&n?KuZ#R<%)&Wq-%yVT zzw73faE+ikpz3%ubcml-NBhG^fEbmfOJmMvp_0mSe~O#-PxeDjw$8y zg#0Mz|2Wt6yE}mwWG?TM0>=SgL>P78JpzQ;)(_hg+oF|6pnJ0I7Gbtg(7byv<1V~I zx)a7s`*%1_%7CpbvIZ^8rO|m6X8}r`hu1yyQ=V0O zy3PwacHUUb^i&7cXSqIK`@4(p>Ky%np03|gd?p5c%zK|$wdY*KC#PeP#^1J&Asdq_l2Jf(~8N8$GoO5NZUAE^t zTu$^npV-+*7JmqYj$*YJ1JzrPGF(Ety(79zWutTRzBKJx>Y$17Z3Pr~K( zB3$0Xh0Eg`4G5#RtRqEh5S7^--j^UJmEU~LrT}Ld~O`^ zY@db8=l9Uzzzw}|$&(N2T{j0dT?!08Wq%W2AaC(`W!})A4`jO9< zkoy$V$+;jpA4KbL>X*nF-aoG9xYWe|6!%uKZKU2I-a#2>IDP+9k~bWWe_bl+(Q(OZ z0@5$gM>JJZ{`no^-Y`|%P=5zMsvW}FbkvsPc}GK^{W{aD-80$y&y=G-l5iC3F+ zVh-NzxmRt^wKt<&V3nMUc@GEYigZnO6rWu}JKcIRykB*Itp8JeMsod9N637V8cntrw4e7>kuPR%K=_;&q}=~_Q0REi z74cc(LAaNkEH0lRLYU7GVII-BN9_~eary<{=K|fzsgh6ETzm%x@xS=B#PeMk;OdhO z1fJ(RF$f=WfP|0y1=EFh33c6k%I771id*;Uo*~~gM1H<&2v_GJzFULv4?ZmUe)t!0 z`K$}#AHQG1KR;XC-?(+GyQi0ah1O-D<2yNU`R*cIy}PLM*-o+H>ls*;!?Jgd{^zrQ zG=?E3RF*i~eem*c_#5F`dtX`Gq}-ZX&Ore?l{vaky>W`vjqh#X8$ll7p7_K5;Kt`T zP0lVNuil$Ilhz23p|eGY)-#HHPUEpk&abxM(7wTX1=@VYTrQLB+QJ7|yYSgBl<(%1 zFmEriH=tiRFZ7!sdvMR>@27xP#|PiDM40cJz;*nV{>ryFPx^V%4|_&rD%KHv4+?b{Nw@=>2_$!^ ze2g1D8;7)y-Ns>^Zz)aAO(E@9nvxi&sKc*Mlk|&^8;2!cCEdd5KIkM2e59Vb3} zfcEMhqRJuNLsT2Hv(=?ul(kmM-Bk|H?jE|9zneblI&qJgC9a-APWLPBLNcYhJv&{4P+ah=<1_aS=Dn&ROrHwxtijIZ-U$fTfVyte z{mA6|1W8>^_f*x6>Gno>Y&!c+s1JsBl)$TzGaM=lx!zhI_gyMS?PaQu7wl!=uWtwj zDR&;5+v)5*sg85Fy?oD6WxDEzEi(iQmD##~cb1f==kvKvy4HxUCD>28TJ(K|s2_Ff z^!^59iR$W|*4k*Nvni+5&K25Xp_BZNtP6R}hqiH)$GRZCrT3cMyw5lkTMxC};xGZ< zB<$gIX1LQGes`WM*d7R8d(wIj-_tV+x?ih%a(ZuC@93<4O6c9bZMdd5^DvH2Pv0o6 z-qly$*0Ze}pOAFjYwvW2A9gjBmu%yN?xS*(@8@H_(Ea@O4wNN*R*>Pqma(ICx%!Fb zlyEOE_~~+lF{XZVqPS0!Z3W?{MW*Y$v_N&i)D}(;>(%Q?3G+OH`b{`n!m3NpaO;oe z!4m&v(P>jR3O1>QvL}%G3h7?JUUg@+YpE`G-(*R@pL7V&J$SshKXtO;@wpP#a~Q8S zN;o_-@G}W3etXn$IK7Y9fYSYUO8Dpp#8o@kpcV-ar@0$^b&As^PLugG)XmRw_O$U* z&-7<675X|yKV!9oFYGO@p3~s@7X7H_HS`R_O}`g9?O#2o@#J|D|5U5EDziHThfw$T zXzfAz0Q%CMVMuQ${fFW(7W97CZ@$8Dp>0NWHQnF1;=_`zwwd)#2Y7mi#Or-7-Ivxm zOV`QC{b;q->HhO=zv6PzkB$&m&)2;yb7EO)1IIJ}hI@d}F?Em1*(k!jsDymcbv3nH z>=_tS;kh)7iO}9r%8&i2cH&XUFtDQXu@$O+a_%7H)P*-zsWe%4iFJ{CX8ee65O_KjfMi`lF&f9~PtwY}zn z9^)ptf28|HTt3#oYV%MV$De7f3Ep&aBlQlIhw-+*o4-_!uuTIz^oh45{W7uzK^CbE zV-YFf$fvSO-*i!V6WjkmIZk%P_kp4|;fZda7j4!vLA(zQn}ph%SRX_Bn;+u3qA>1@0g2m#{l8E_V?T&+9huht3DRmolBc=@zbS>VGcr zx^}+U(eXVc^pnm9U!}2+e&RcLz=iP#A1rrs@Iy3zfL_@0lin%z zVBHTa;0v4B3!>)+Z&2I7v%24{``fy&ea)-<&2YauJSPj;+5b$W5zj&1GtY_~E!eGa z=03URReNP(&C6wk?~Gv$>-1ih(Qf|dKH;&1yUu)%P`<6}Pp0K{6!DPCcJiaWZm&2! zqyu4Ktom+-a6s7UyCGKmPC?Wr3yj#F4n5-aqq$5upCxsWeMa(QKaTHPfj`vlt9OT# z4}LNbbm&LEZ$xf8hq<0_eun+wy<@#UTp_Yn=4hf$t{vEcwn{!UmU8 z+nMS>dR{HGO?7a2Y4@h4?ssuNxwCpCYjrPP-<%5f`fr$8sE^*EaBDFx!|mI#|Dr!S zT8#UWe0T@bq}HARwdR7MaQ458DG-&gXyNvi=5_fe~X3`4gS*IgZAkro%0o zt~~6T*cOv;KA6s67|(}q>h{99HQey=aN$6Br!hH z2W1`BeZ`Hf3n4eyHbm|doX-0di8GVoe3lrKVs}FSxiT3$M^o@SOgqJk94*Km=oG&r zJb?w%LdKnYpVax1p{{O7`_(Tc&e>d8hjVYCr*)s+?ZfjJJH1}YypC*y$p2IwyJh>z z{7CgoS6#_*q+0}=I)v^XXG7f9#NqU)?}>Y^j7`=<29Vx>GB-GR`s5ozH+h+}j zX4>;PnS49%I$Hq>GMTL;5g+!$6v+cAk$Q?D}RRkc#5kVbnH+@L`#d8q4(q1# z1K0DnVjCfU>QvcVVn3gKpftq0dkh7?lL;K}{BFO9)|)BavvPY?;hvD5ztTMycfN|p z^E0;#R(gM=C-DpTl+V{gcDZx>)Stl)T8}^nIx2Tar-Iyz5v&m=MS<4Bag2A z`pbGO{T%Ta@eKMx@8LSTgRajxpW3+9mf&mxZ0prKN4hWV^wn@5SM9Q@bL!bk-9Oi} zmf@W{Y7^S5@BJ6C-^x5lx+(6$ANVNOzvS9X*CaY_bxq>Nyv{wmU$V#5{Oz!;lTMbh z6LKj$qo;Bsv^!u9O`d7c^{(0r_1(MV83(=t0iIPGMC|SZ@JOC{;5!hQf7Je_XR6eW zbL;20E#VtU`o4^N1BrRVotJ z#6MW4Yuzpuyi#j#lDt|6S0;}G)qz>J1@@8iQU$vb=IR%&=Q21?iF4e9zuu=|8NhF3 zqW|6441bq}?K!0T?CHwHzF6`%6x3Ed#@YRK@9EpyI8S))`wKKyz)No3%l4qb6+)wL zJtzC31oq57Jl07cf~?vl|C|@@3x#8Z?`%P*(z~ecOiu7pGnX0OP1SdSk~aRg&*Hkv z8VPl9@3HHCY^S>wYV%iHzurMsoBkAv_CWOGM8UVDLF-@pmai2YsarFIqF1JM5c&WV!$JFP-jYHuLi z6L9tmm-y`!jz(eQ>q7dY3o0hk)_; z=?+O(JE8KW?h)u+-`OjL?xK&1t8ZoNo~7OezUe?oSG$hNKHWRuH6GS}y2e{MUg%?M zJG4vh4(lF)z8j}|1@4@xzS$n`8SvdA*g5z6HkZqKfX;);WA2V-c-BkrUWV^UK-b_k z1=(M4ujr?f;TCkH@Q&CEf^EsQncfl8JwDy9Pwvn2x3KrewhQ#R?g8FUYcTNQ6EnFj z;oI-w-r!V;cXmPDBTNUPmxSjObZ_vJ#A~o&pEr>6rDxPjSoa8Tzg*&DdxVftMfV61 zUv!TU@-e(Of;|`au4wp_hdWGBDOyXCobe)-HF#6+4Ok{sgzDems*Wx-m9oq9g7oNuo=TdhDOV73H*(S9qi>`sW zcKag!UU)}}5Jg zoCnv9McpTh-$e#r>fG1Mt?6|ROulEJdb*xbSAG4|W4T`GPfr(D&z#l&T*B@gYFg(& zw`Y~sx$Q2Hp+Ca6XukV^g!OF@-G|kE@F#yO>3WAu_dK57Eb)9k2IV~`>&kGymghdS zS9NH2r|kc6_ulcgoK^Ywp`1MdOz7?WcJ>(lMAG}s^6qdwo{YMl2zw@7E|TwS&{qs;UM zxlbL}t(aXTzOUx9>sqv)<#RG(Nj0CMKew|uUba7hmXQx%VL2xz2NZrb`d!s{OJ^B< z;$W}in!*^<1`^+ZJeuuCqGjnHNc>ktZykNNi2u@>(;8dFhrQv8)+b?-od*yOD*8YW zPb4h(0^VRQeuDTi*$Rk1`;N)J#Fr6MTG0hZ9FOcTs`eGKtBAC6W_=NjES+Q3$Diya zPOyC~(xlQci>B1s`58ZZFAuafzLCd#3v)8sxZJ?^HpeR;6!Ei=xh?Wf;k>f^Vnw_4 zqP=>=mSN3!|4Y6lu4?oz*NU$X-p6%-e7py}H>V#6XP{*N=nLiQxVoI%=uG^kJQV9j zu_^96L_W;jMf9cUO2rQP)DcWym6u0c=*9k?a(b)<`UC(?J%~t6b$*C0`MZb(BX`Of%U+cWe4FI($a?_+9cVn zuw%lsI4!|CD3b{JFs|`FVA)J}6m4-Nhn4+}^VpOX{qS+fkG+p{Jk}`f+41`%=M~O+ zn!OjU;sclPcgSP-Lg4ktgNHpA?TGX&_D9K&b*_ufl$^L~XXW(D#>QPD9xLv#iZ4O= zB*y2bFJwESeS&OrG{+@B6OAf4n&zBnQOSEGzY)zTIgDb0RsAzbo+5vrE(;Ki8RK1u zrW6KK{+mkj6O6akn&c*$w7HWapU7rNw4>xAl0nFhLVlopO-YYXJ(Ei7)%QHk z3;8>UdQb2)aqR@TXwWzKUZB_&jvX3a_j_NHWyp_GoTJi9$PQBa3F4kWKg-9VWOT8&M{7Ym;v_JWu1)!&wjO(z|ax zyHq#p`sw%WnefsdeF^In=A2`4Yd?pCrGEWROQW>k`~}NkU3%wZd{E;F{tkX*Wf$Ok z{^rj{R?eb5UO0X2=}!m)j`HTEUDfZ60U&ped4qP#3M6XFk z$h{tIaGRJIQ}c&LQ*$gTu}u27l9_GbYKFsk@Y*o>5b1_!cKFN5`ILpSd60a+{`JdXi+UD|`RdKmq|4ydo zc#3bK?HAT^#Eaexe4?FO(JzW<68Tvc=2rG5@-LusLpmaz50WkWxe)cp+V>?}zT@Z7 zKFkC83DABnc}8j9Mw_)ybALuY&42jQ}b0ClCo47`>&UCK&IhaJc4&Tvf;hd(< zpEdlvBo^!&&*a!DeM7eE(rJp`*IDFe0ryv7V1(On+u>-FE1TMg*C?FXP9u|6aUV}S zC%nFmjUzUqJ)!$OmhFJB>1uPNLqw~R#tCxSu%Dt%jg$5<@vqWditf;Sk&kH6vYc}T zK1%ak^GUR=bd;Q%NUwcSw65qC%`?%yqEFlIfMD7 z{Z}-m=o0bkq)Xs$RC3khFl^!c)jZZdExu9mRjxghFZrtGwdfDcYw0j4;~dvgssHG&cvrPsbdcl_o-B$^D@ZUNKeMOoloojt2ZG?Fw?1W^CmxuQl z_i9}D{xg^_Irf%z71kqSEwBgp9$CbW%YQI+uZN$9yl4aCHDTN(^Jly!(46Po*vgLQ zEcC1&4D=MP)CHjq#vls33iyzSzk;sF&)?AYi2IjrVs1Z2-e`}4yuP1t>}Aj8c3kCs z12kpiaUk!az6>qs z7~e9+PcHL+xet`$*x;V>O#4nbE=^@9VrO$1lp~@LqeB z%iCznRq?6NaD8ARJy}&hCcT&RQbqsXaSb50)BEqtaoGIv^LTB@H*#s8fo@oSlf)-$ z-;r**vj52MSKNoL{}hf}a%0y~OP;FzNOY+7rN{il(o2UeyMnl9X#HZmw0=wL7SFYA z_r98aOCk;!bEF_YQOtz!9VEx*H}Sr5j!16d=SRd*M!E`Xvl>%eeo`FA8so-9JFGWa zAKiZl_mD;F<$Ld9+PH33trw0T)`_o=gnP2D3F2SzO{W3>gZ+*Eqa_3Ny_st$$P+R5 z-*jJGu`hln@KabjM+8|q))f6dnYt?moS<#s-C+~fQ# z?n#Ap5&bI_-@~4YabS^7F-{!I8*QG1Pv_Z*bQizL`lFa8mAE8%>=NiZ-JYni?H`$^ zafI=dvFz!??RoZlcAXt-*Qflzu1|0I^+LP8F7U%>!v`K`*AKtKuCn9#ft8mG@5JZH zUy5X+76tJ=zF-;%A2+DN?_(!2d-qW$Q?AZzh+ zE|!mZ74MP9?-R#VZEPGIZK2}J~rik7u!|5KNu3NC$k^Xzo-0q z%I~4-ulnPx`rXvG@oyp@v+`HDUVE@-Xw0~#aF+hTHv7gGoM6`&;|KeX+IHS$)`t%s zX=xt&P+k|;iF&HzPMWRo&AxH*iZY7hSiA=w_-BDf#6BiERQ5;LxjUaH9jB=e@3M|4 zlVt2s?29~O0*?ZD6XTbH{{6)hnKtf?x4$mSYK&c{Cf(ZZ+uC!+qC|gw^i$?Do&w{k zI?fGyH0t`lZ)f`CUqe3p{))}(B-)unujOrsI8xUq#IigOWt2**H1bQKdShD1Qa||@ zth;f_>+HJyZEQp1l{dHF;upv#gtdlmt~4L`3ezSx`!>^x&)nEREVIvtav*o5|77I3 zN|04zEM%)m+kE^!^cbd#cG=|VptnrFY3X&&2{#;VGoNGc{rqeE-IMJ1Yr~$6`W){Y zZ78d@kn*iju|2c1HuMu?F23jIw(m!~NZCO~UI}yKi#`@FJ{ft#{vK?KjIY$Y#%peZ z=jgNBiY0$^KmJbs{-2m9`N17{wJ~vJE(iG2Hh{f}6#eDIQ2ecIFQ*~{&mO)fOvE&0G*?0MK~(9VOd z^&MV0UTz;4ebv76G`s`8@oIrk595Wg`{CnwRlGCKPp3PQcixcc4!T;?uF=jAb4fOc zPA?~Sc_Gsz{}S5eW$T^O$X0e(Ls-xMV&ihqRlQAzgtZpN8N8IQ)y8o@V_C^f-)mRN zbhJ-t?OtHCMwF%aT0SV22|AAV2eA&>r_0Vf)Vukq|FU<#V`I`CL{N)8p6YRJA*vR28%9(o@u zb7v?UZIS%TEL&G9*n*3 zDYB(zIUn1{a^wdud4cJMlF#3o&y#Ov%%7j**jwKHalUKZBJAH7vqQsL#MN!~lIz}p zzZ19fQyEO7J(zo~@d;|zoDV+txtF+4J&uXn*d{LsdjiJoJw`Wk9$gSHVR&|p|Fo;y z)LM*hn-{uI+z$@hL{R$?^QbAM)Mi|M(el zm5<;z=GeJ^Z`XhQ7O(kUhV#bLM4F`kWtLIqPcgoaex*GZts=Vl{7d;fIq1W7J<;ZF z@|O+%=34*$<(9X%*RGGUv!d~?vE}*WkKu}TijG@AV<*3`Z_hKz?KNd<+L(nkhcZ;w z-|b}C9M4-l*WSs;Vf0&qdHH=`@4i0S-tQgGyp7I#?CNDV9vRMFtVz+si+F}T$1+{= z^FT-WK6#X_(d1`$@@F_lw%ru>7+bwNI;@v`UL_y3b1}D>Mq1JZxbpnBdDZxrYcXFV z+5)5OOKi-O8`{~M$jAJyXIdRPhu%EpZ_eR!yp789|NYju!mnOr=RnC^yf(12OCcg-vIspt7kB;=%3_w z?02%m)(7oD8)1LK_p0W7=A-Pn_Ak*;9}nvp=_~P;S)c0lckHkGzgX`cZFc`^@)yA| zzyAZQ&KG>0*JQ8tLJYgFv!}&%J@~lEdEaY0wwF``(ev&u{*%K);}!dM7_3g*1&9Y+9Pn zHF=G+;A6wQ4D%T>=?^@f@8UjI<(Kzghwo)a9(}HePri!NW5-&1lV{$P>64EetrNai z^0lyEh5A6Nf78p;dHSSt`7U|G#kkt~-TX$M_gb?YC$}$;{uJEzLgSa=d=2?PLtWjz ztI{ObKM~LIeftmOm1!;u`!&W*z8n7VOiSZ50@EwszZvZro;7}K`$Jw9Xcga&MRO-! z7ROb7GA{c$>x+I3?(mmZ|DF%=nw;+Eug;CXw{tr8pW)}qe|?$hb31;t>4Vnx#&=J} zyD+}k7u<&=`*FQ6N6`P?gZw?dw|tGbkCDbT!<@o+$j8X>VNbyC=l-r;<=^&}kLK^> zv_L0d-}LiM{ypR?gx}l!RkEBzUxM^#>(Bqr^2PN48HvXNXgufTeAoEI!z|4$zF=4R z%$JXR`NkJd``WXR4*e5P`=RgHZ|7+f_kGVcd7kn;cvH9k-TXy3E6`50_n!C}exLJc zTpJq}pTovDzsLLY!hVc4JjG}u=Fv08y9;?RSH5aE>&ACpYw07l9BV>6mh*s(+wNqZ z#?Ghk$})Z5Nj_xf59ji2Z|Ui7$7`g+{@@At9qPrJ_~||E-93yRNJQI5{v7px+2&SG z-<`tz$#=iRysV#e9L@&knZuam^j}!>7=u69X4i>*&*U{fV*cd2J9rIazxi|RhnTC8 zHpDpkeZzTgekb=q#QR5|%d&YNeF&pHn_ZS2X;jIz?)3Z<&1A z&g}5qcow6j8h5ubO#a6E_N9+{9;^-88>7und#8}Y3Ca&lIAg_yZ zA+PsA2gm1z8?)yPV$}Sem@ZFGoS5Ak?#k{riShFE#K8GI@l@d+?R>wT^LgxA?8%Jr zWoeTKJ~6f>d5O_)9H%ecGd?#woR>`-MZZ7w@R-K@aQbuN#=<@7cU!WOzWe5ZR`K_g z3n3llLCSwlEH`O~y~v&?XTL1JCw|MGTMQe!-~5Tr8_Y54r0sd*@sG>%UK-Ysr>7qf zPea*<-6scsFQ!ROK0m*IQCKgY{-LSgqy3ao;7S>Vm(jc=rnT5P;W_5TJHy(7eBtV& z_}+Ysc)53dQ+(cd+@5%EvIa}D`QN9;=MBbZ_q?xgdsDw>tRIzm zTFkroW!>ln{v7l7!9TUK z{?^U`?gjhuK5c&V0kMq6jSAoM!G(R~4$q8fl708i@Bc~P5VCplxu}nH6#7rT7FY7M zxRS5+c7OJsv5ZZ|l=F7e4~^dwpW*j^lh@h!@=If0ijWb*MC8}jkEl8?ug ze0(SeXS-rKN%mTa;l%Hj1pdq0K%W49Paola&-ep&Z}AfB-eSUqd(c*h(vHXP=|joxH=`dQ ztd;AZ7xOkA_=LnxAR~ADbKt4wfvqw*VUdI<$1a`+0vYu9&C4{2?)Yqy33^pWNm!zen3BOTd*f1TXKWFOF$9zk6Z4 zZ?v_>FdkKzcwWZO^ZVbsS4@*U=YH|N@z3vw_ZD-~)Bj_B=52n*_R{1hXUDXS zf4)b&Pj(dOpEniC`_H3d8pD8D*^SRX#-F3Flr!K;IfK{zraKZW#x@Aou!dV7Aq z_gne>+wK_e6Zo4@dW)fFd6TDqFMrPXdG_3JN?ty(kbZw+zV|oo7-S6oe6Q_e+_#?g z%lO>nfFTXe)c3uC&l}gWv1yzj9su*?d4+NrKi$eT{aU!kx&C#Vn$?uxL-Xk-YY@{Qi3nkN2Bj z&HK~1T`xXw?8?_u<4ymZKfmpV^ZQ+!`8}~%-dI_=i7_X%fm5tQ?aec$v4kAf{>T_=w+QOehb)mGS`P3vwmpduV>YW0v2) zF(0!=;hahC{;rrNc~U;d8uu=IQ_7$5T_|t1dXk$RlII)0CBJ{tb@Tgw+Z*pKmV~!) z^Lg=k<6hs)@1Lppg}Nwvz?Cuw&-bzC#IzQx*4vU^kUu}KKubR(pQ9EB)YDUUtGor; z?$w{p%lY>1c)xk6$_K_ozBn9*T=qo+8t)KmqwIql@--uzvTUB@JF<#X78XQU{(t`r z+mYjwL3;^r@7Ptz1d6yo!)v2GvO$hGOUQeEg_wH6Vsm}I>||?`<4L*yGY)(M&v7R6 z{_1v5zwBYI;JMpe^IRaF9PO*%@rjpkyMl=6zW>3jFZu#}fbGS}1N(fQJn9y9tzxr__P_hPyizyn{!-@rk;r!R;!7-#`-KeWUvk}N;Te1Zbl-$4%B4IN za^?#@X=#ar3Eu^H2I{vl{^QT`U4#1{+Njtp7yYL_=YEYcSSI$J5+)pVTy`qbg))(b zJO{4)=D@oC) z;!zzJ#5Hw0(YcVrSA8kS=k4kC9b!Bj$E%0@xm^e75yu2aI~}#B9N+8E-w^uqVIagXcMZDo?zUd!^m&expQsoQLa zF>lbnmz_Tv^No#DH%ul3nwe`8V@y0W_WLis4rSs>9vAOv*MaxK>}_1iIwN+Em_1-6 z;jkZ_yZ^A?PHKo)~AW1JVpg zPkAn`!UQhDZ3~A<9X<9%VFXvRE859S73AG{};1ec6qz zoy0?;9O2t(vyb7bv#{>+wtXMBc0659c`31{wr* zD;3;HgL44inBN}x++Ue|6X$0Y))m(uXg%r@kw@$09>72GY!h1Xuj`YlD;&FE78oSE3n*7JP?Y^CP*c(4$bn@oMPqXxH z%OzVr^Q($<-?e&kUy^~A#o1Z)xj?_G`1Z76#`PLjZbLSKv@gT+LyTu>$Sh%uKN0##8XfH+ErfD@ z7S1wUon~zO&zJ4@FaLz~C0Bj9UF925ah+xRC*KM3Z*=JS%pYw)f7|$Pv#G>-m+wsZ z>{EQ`*11*>X;!4G`e69IFW7te*c3fXo(t*aOF}%5Y!O8-&u(S;#`NcRp+}Dxcd6>qFP)ykGUmVVIT;<3A4PUh1 z+VACW;oZi|G_>DWc;-fo`TIAPU;JC#|DR&dx&Ncx;_Gw{_&nAeZG6dSsTiAtzLC*> z#SrHCfVEiV2XzjJFVuN(t#eqv@%Gpkc`o2e84#|r2hlm9^(20hK9#Y*iLaDxkNC@y zzr5?^=fV-Uw|W(e=Q#Wf`=oqw>%0(us`Em8D$fnj{yaC(&gyv~UpeCW>GKTf_IIov z`WnGF$)}8bbUyP`d$051IXAT5^5H?g80F~PPz>ZMpRDsk@eQ=6>HLsy9?_)oSt9LFs1=`TgEiNRqN&LZ)1DRmpg22HBY~H2%aB=KhX5V`QS=_@)-LVM-99VWo&`h z*|s5BiDWt23!`sk$#qD}V$EnTl%E#uZKNgfUVd8XHwV8ZqZKWuwJuz@*7iSr%K8-j z=v>c!lZHb%q|tEY8bp7hAHP>HT|!z4-%x8s{`pA5AiZb{`OS;6B#aUD^|*QrN!b8W zo_xVyvwX?!8}c_M|JkCYJ?5774xMjNHYpj8`x~Rr2-gS1F;$t8Su4i5#z=8owa(l( z4|yU#vjR_Mx-9f(>~t{khu}432TNT=;P2o^l6oe{g=otO{_x9>#&i584lP_ywcj4w z%;ZMctFP9>^KcFFVqB^3MxDeX;d zmc{&~ZVbPPQ^1w@BwQ5_lxr91s87XnVp?z|t_)ZC*n4=8yW%&oU*Y-|`%O6z^3ygJ zSK@^5p7I|2ri>ofSGo+7`WXDC4jJi)k;0YOK3qS0Pb-&rPW&b&2J#wW5hb??=R4+- zY!W?Yw_>VO#$S!!B6|w=0b#LzG5#JuHKBYA?W)@Rx*x|pE(-F<7A|6&Z-jY&bF>Nb zUB2bnHk|FE(L_@{E36ZgQH|a8@sHVary(K@Af8NqQ{*p2apiUPaeN{7dClWlP9m8v z&nlcDI#Z&K26XIao@Z?qR-V{+i~)7p)=uH*6Y93ZGn^@osSh-3{07uo-*kBj0a?U{EXp!)Ul!M z@<0CO^Vx@zpKpCX-eb;2+d0fL>1ahihz{_w@-o8M zVvff05Wo78i}4I=k@!LMgZOJ)Wiw8^9QGR7`Dstn9`Tr-a|4i5NEtzd6@&6-{*M(bmp};VTmI6Bu{Nmu~xJd(Zetpm{{6SLHSG z+4LW`u=JPPS26h*&e?cg1Ilf72S0Z)MTh|8r;N5A$%2 zrgd7DW9>8^+x7d~m`Aca>S?P!w|t+7by9&omR=xy zZ?u)?7RFm=kIyIS#O2RWK8{2m5qpokibqZyKYm~QU)CSe=isfjzQo^lo;htUTQS+P zEs9I6nCSAgLM#{RAm4!bBb!3`;hGv&#r){u`zc=UlMk~tJ@p%QC59X2oaZ#&-yLet zWe@E(h(;Ts9^x61o_q+#>5sNCy32vCiF>&Bn%A(O>W8zne@X#*fmRmJYzr&--G%(>$uIDuPqKVf*?#o%ZgR=8tOwuj zZ@y;v90wHr^pU5<9P&7%4axQ?^TBvY=HvK?#wU-la^z?AGhxp~I?48mYyZwH~Ub|LhFgh#3^b6(x{qNdUvKGl!Bva8IFWI~3Sof=4j-Q48 zxJ)GZhTi%QQiuX}pcC(k*Z{akA%Qy~?LmMU664py{rf1#7-oN-F zySn~>dwUi8;broj^8hiXmG_BfMWpW}ySWj{#(kt&L337Pe25m3ETlqTkudyXekcJZtT*X>N`4RLZk`d`Fas5K0@ksWiN*^U!ds-`z9zvUA zY#7{M`dS|g+`CLDj9;X!D}CYEQf7~JMHw-!lyQb{g*oCh3dbhKfkgYiVBf~*8|;;m z!4O-6?;yWFluhFI>&~@)DOM%FpU;Qt7&vX1xU8xgQzeY?ru#8(xZiU5G|p-50={gi zZ_FV7#8^>|7xqK&oS%LN+Zt&FVwN%Y{$QIuk8vh3u5KG0-x1Rscu2I-6vs(8T;^!qooa9Bb1XU&JfR^m99;OSIQ(&yD*K+U`C`k`KPv z%5XpQEMw6+E01MT31~A_)WPh);i^@xL$rP#sWMgd2H}2^h=K4#PI%>$L9(%LttNhjN;g6 zKXIRU(I+~~#2!W27_P#edCVC30?K817(4DsNb5XU=^gDEG4`(CNFslR^uo*01`TOm zc4K~9Yk$})uy44J1@8O8+KWGQc~s6P4s*Pb;%-UL{G(g4?1;6e?gaByI3CG?nER&>cV<)c~avo-?ZPtnw9V{NGBS(8lOvXn6G+6=8rKx zrMHZ@6{lsTZ>-Ks=?&$RM==Pd|6%1;@g=*Du;)*?#IBmhiq|FGiEty*16Jd9N#FNj zmybAZHo5c(R<6^aB|L)bZHo2<5zFBijl{7LVUFZylI{bo5oibd=BkVHDbj!i`a|E; zX%my-ROuD$GgaA=%Zie!EGJ@vk;l(o(Hqg9_4D6o{eS!Y{CYXB=6|Sb?Z5a{b`|X+ z9n>C|PoHM8s$}mEt&HbB!>%e@GTa)PCi%>FnU-VXd?nB3MYO_P8JM$kxRJVNSi>F< zhG#aTiapDHNtiEvn|HQnLDwJY7|cbdN9|pZwP0LGv->_bcOT?U7z^LOv`KQZtrsxx*^$ah({9dAi1t^JCf@PpTo6{ zwJzC-ov+XD{@|b-$={-Hu!^2Sh>WZVx8#x zVf*pB)PDR{`*r>(Mh@GL_reRYANWl=?RpyxokP;?|Mg#5z3eB_Ntg2Jf4AqtS;|MP z&YPyLogSt<8|!asa`;5J#HYT&@=3SbVDu~20_};Bt`alYY~e+>0>^lb4!YoEAvd^7q*LD|wH6Q7Pe^cN7)LhtduFz(aagd2THI`v>Dda;xz29bQ zkM!?(rl-5rMwDAC-k;>r!ZQAB#IzA>E*+FGu|+1Q#5@-rB^m60nH*JkG_HHKU09?_n-m|BdufzS!Cq9h zZ<0x9eClKq8mEhnw*L6oa!>gEZT8GDnykll7o_3Hr(*ALf1(NP!pmzXj}?P`%;kp* zWrk5!2->46qY>>P8c>)t(v8?xq{sY@*8YLekH_U$6V)p`2lrl_LzKhe>iTc9-2*)* zeJl4@{QjlyO|;#^JaXBq^pmD5!Xk(@Elk2y|_w7bdv zhbzW%&z?+f0Z}q*Ddt=mv%>JUxsYg{;=oKL!Ke#U+BhU`PkBbkiw?>f7LW0&r+ zibp41in@g_cb;tyFD{%o=~blnehcrNkWR&Sl&+6_5n?autRuaO_oP#CJ^R-74J5x1 zj=3tw(03vIihPn|$lgVCen4X_U9xccCtkwzG3L1BYLcG`Pp^3=e7yK1$;I5KfOvS}(s}M`>@-FdtQ+Zn zVZ7$_P&lI;nhqC2d~@vq9CNI7`8$xTLo&^0p33ym|3OjC<7q=%aybP06S3I1 zkG|`1e^%hfLff%#3&S1ti22^A7(4T^Di8-lXF6p#|Hsed`}*07enni-!eb_b|qhK8JC2dL_{Px^Kw7 zpSnwY2hkR?t7kpfgJmBtT}1TNk8(wCkxoJxuItvh&h=B(fjCW-^WmVEr1w#*M(KS> zCxvodM-gqP(GTTOKRi$L-?DZ;P`=`_U-W1ECS21_V@6x^xZXgQ`a5C%V;cV^oF|oW zCG8?SC-p!WKk1E0w_&W^=a2L?qL)MmaejHZfoIY9O9zzb8#%@x*9l=>`nO^kzIK-0 z|KL&|3-s6N@@N<0vXH!d$UH82gw5xB*j}H1?$fuDvz?^Y^9g;JM#uN?7GB~b57l&{B$4|5CKGSMlo7d&sWode6gq%+(t{ zjOik;PCu-8Ea!{2G`OK#g|xykMe?fMAUvq-P*a)^bprDX#ax)%^BJa+`Rj>Xb^jfv7ntYuJR{A zOeua>F`M$Ypm?~#TuM(|jgNajqY27bMC>(^TT5Q;7(lM0m*0lt(YVa{QsD~!`ni10 z{X=?|h}%NnT^GS|jAMuAq&>nOhp~z@4DNYeg)zi;l-yo&jK8}t>yi#P`G@=AcaZ<$ zTev?Vdx!CLdkXHolGjL&C^?Dfb?FnY^5+}E;Rr8eaddH(xLwEQd+y9OY`*7QT=D$E ztJv>o>mHav(9gn*ux|L1;kShxpoCvWe(^pZ{($Av{>HTrU6%Ga;+v8F<3SdLD|L0a z3h(T^_NL^@!avIw3VAD}|H_B0p05U(I@(#nMdQqKESJ_<^qs=7L;I;?L^|T9QCCB)^0QLBO(x4s%>GnDuA^T{ZsXUvIzDhTg@b##dJ{Q9E%U1tm27Y~|U8Q4| z?CS|nvFF4Np?vulk#0dg8YuTc`zX&tI`YTidI9pIKAxxeEg2fId3f#^S>Y`jq;HT; z_^+{`&WQZlZ z1gr=7nxI?_=}D*HDp?TaUuZ9}jkwZI0qmGeFaj?odk4{OlttmWWS_Kyz;D_?;Cjs7{Q5VkXs-cUAdJWFx@-t39?UcNAdJrgZf^^LLZG)qtW3zSb^8EA)mD2d*d zER7fg)I;AHNLRJbxXW)_dGxu2@`QD3or~xAP1(<#aebHlzS{#Vebt^rzL`q?dXT?r z=W!gehjMAVfU9K5l={N*P!+Y^R^ceyg zQhX5g#VBWy9m^x%VEvJd{ZY5D-=fh=b}lGK_Oq0c;`dWSeq8An3D>F}4CQ`kA9)g7 zWjjKjR%j<>tjH&QHu*OE{>ziBT*+QZ=OVvk|4#2FFS@(6m%0Gtlm1(Nhlz2-^Yfl= z=>k~@x+VGueeGHHTNp^$zu)4rq_=(#&(R+7m(n@>b6CeH|DRuC z*LNA6su<~}lR!Dbms8IRzWqbrvGl@Rl5R%%(p`{;Lq6GF(&h%g<+JOP-Vgcg`i!qT z>aK499k%oLcw9@qTTt%h&#->D z{dD3yp80e^e|{YHb&O91haewf$UFy&leL3?yL#9!!}UkFf(L9g zS&rcw0$=yL5!V@M>JrTiT9&jf_IlZ>h_4sUOSGJDUZTN-H;}(R$tr|5(3$KuM^Rs< zvr4!%`o+W8=*-aGFWsc}Tww+!`<71xtqJO1G1gTXNA$n*GLDV(7156y#~iV|eC*1+ zB4p6wxrA>d&5v;-O^vH`V4~rq3zMEo`fKUHgjbdxk83K(&A`8W|1oUiobJnI|2bwZ z@a?Eux+3|`zTj+ouDTasv?EsV(DRu->QPU;#C}UJ_h-KDg{77b$iEr!Tvgc^c|`Db zl8uQ6lkQL$5$S?m&K6~2(hW-|>~+O9%a&5}q^fg~eUx-Br9C$6QSY-p%IAS%aB~fX z?|`;D&L?@7(Z|Fc$j*j(I;FSF2r+; z#nw^0axTd~P?V{lE|+I=P0-fE`MQ#QN066bF3vssi+Q;Pap~aODVG5ME%^iG4R}sp z2)LHy2KXN2|Hbd)N_i`;?rU9qz3pY-OUa+3|I*#cW`=w;+Dbke@446ED!y450m(8; zdmz#Y|2Dj?^;ve)n#<%{K^JSUB!7zfs0&7Z`AQX^8s)#6Rv!6Eq}Sf6SPhD2EWVI? zF3OWVHSzuUExu3uopj6M-?TSrjd3ocy_(D9&rrYQ&79kKFHDp6bgfOdv5a=tva@y> zT+~%pZAc{Z)tcd%fcDEKOLoT%E>@+W8~`4haCAN~^mfq5?56YUjM zpQ_{+kWT!8)~tM{^6bHT()m~~q~~$fn&#dEKRlw}MW>S^RObM517(itY(7TIHq zUS32O({2Op(AiO zeB7r{eu;iVJ4*B$e!IUIlf@&Suurx07}C2vVx+q+?_oY5pXe>eYess?@&2+8KWO7v z&Y$wx4*Z>;?Fr-SK%b=X|Jye+ed2T}^HB#CWX9Kya$3pk8`=l7-v7d6{0;e#^!aN1 zF8ZVSBrGQRFFe=TBsy9BcI+iFRMb<0XQ!STSNBV0I%=$iZ{O0|&UiFIK8=35oH)uY z-S4*K)XDdQ93rIsoq|8rqO2Kvu_Uv;EWLXyhie4SMMsJ*6K|xo5a$BM!fBZjUP<(` zbb#_FbIn&+JrSz`{HrkgxBqKE&q8p}knNDfddOec7@}7bMzLdzJ4woYV5JBcJY! z8wUOR4}zW+ZIZ8EVZ0=t7MAOt53qFfnTzzobV+_o9X-ZBV!BM95`EjczPs@k*SB)2 za?Fe0WX~nvtH|S`Z}5oWI*sX*Cp+IQ%$DQ?Oplh^zoIOc$Amq)AzI4M{K)6IewOs=@7~P%BRO8gl@{kE?%6J*m2>>i z%{DAv3DyeZS)$F1r-^xgm0-hxHaz%=?2E<5#dF3j#Fa5}aXmNi@3;y}BYX_wb6{^^ z91e`T2Pv!*+Xf($#5c}g;%xI4yI~3WUP(OmUx?Ust z!gskL`z`)dxK7Py-|wQ_qgtlq7V^zns~^@wS` z$41lzOSem&2|SN*svZX^;`=4nkqklp4aNKDToMl?o!=eqW^;zRJB+2|J>qG^tH`b| z>cVUfYKS+HZmOh^ZC{u@fcBO^9_408HaQ*pM0S`k8&mF z704T4?F*YJ-avK$w>*^jqR(H+nM9k3rWb7{S;#XkuzZr`zUJ}vTR!n6OMT1p?Ya92 zigGE@bU(S&-ut{telh0nu>KRunXx8Be>;85bK2!=y#JWt_QSo|^#=LA?t>5HL8Ng_ zXOBIys;gh*cR**N=8xz*%?rr^xhHSK-u!CRhw-Lv6IaS9z>7&wTUKI02auv~wnh%n7m2_`NFT9DyQ*t8FiP9BG=2cq1;Gsk>rolc3-$1;;_UGU? zzJ+uIJae)CmSpXCFIl^6&qR+nzEHeGqWK`d0>b6HyeDya)W!yUL^viV+U<$<(q5*R z1TJHXG?>0w#PYa&VG*WBu>%-y7w4dCBcunH{<(_%kuc|o4TWTE)MMeB=qz$PqQ&&X^V2V~Z_00rZ>hCh zl@*GA7Ed7CpDI7AGmf@9D9`N->(9F1iWs{&f5BBh!BtG$vCi97v2Vh>Ii`(!L!{>) zx|pXEJ*;^qKZcUwe(Mt$C!9I*SE%{sbhGh6cwdQO6tSzq&FI`K;a)Hwge?=@O?exh zSN#`ieu^%qd=2SDpNr=deXjFWbUM#2q$dso*Afl`dq;_m$L|=^;wv^!tMi_F8PW+a zA^KkDx#)bY3;83Ie2jKZXot>y;Q_QB#0SXFpxZ;4z8?AHUohHw1ezH0x+>q2KSAwv zQGRuk>t`u(j*Iv+$r2-<2EOi5Ut=FbnTz>C)N|_}GM)5FtfwL$NhB8$y-fLt z&*S5eJ2=h-JNCl@XIZ5;b<}ziq#pFB~SJ^ka{x8TuqD`2vnxZ{P zOQJoZ9izW%^wsxS*;AMIUd*wl{TusYF$D1YBYyUrd_JBBeyt|Wk4(Rpyy(lG2K8vq zavRA|PcDDL92TZQx_8%IbL&dA2VwY=+G#KxpS^RbNk(>FB9(8V^zht z+Tz_6%SraW(*Hd7-8SCppW6X9M31qbn2++YLi!88rPI{;B70$d7o95_AL&7=F@w0L zVeEzb5gjJGW8rV4-%!jS@zRP3CwfeJ4CzuG_a5~U(T@4n?6+hk5#J&Gfydn8cXCWH zyu{J4h4g-bk68`H)40<1!HFO-Z!n2sR63hPaJHqq7mZqVCM29CW^<5<$u z;Jd}W677#`0Qv>VRK(j$b|N3Fer9n`f6&2b1NN(PUK-kRe719(?cKI>ceeY1*<}Cj zy<1y*_HN&`|HNGzlO5^4eff(!pT2+Rj>D$Sbkv@V+x_maGn=L3L9d%mx@j|;jR*Zs zbGT6`@TC2_C#Rph`;5K2(w*6^{U>ERP{Y<%D6;ldUSsWRYd|`fj?zJ=H|zIWqfR>N zb|z_iGM!|DVKW;xryDGO_l`66Z{NM^f%{JKyCb*nO81_9e71k@_Q~PfP8>fBP1$~C zW_`Znw)=0p`?jM(f47~S?cB2?-Jfl{e>ThZX1gX?p;=3dW&5o9(^HJ$X-A`iz5BNB zKl_M%`?jC9D~!R`)^z*6{b{+>g{iH_<6&z$>NTg$Zhw@Gr`^e*KN^j?<4KnGhO^<= zs^s9FxGOt++wmtJbK=SC^+%bk>BUdSH^=VXz4N}i_Z+cndc@wz>Hg(v-V{ct=B@Rj zHEFkd*Xm4L!+x5j{br{-9gLa>QsZy0 zS7WC?$oivUYnY9*W-lF~-c~ciQtnTB-Pv@!q>rnH(z?{_jXGI-I%}si+!)%9QRwDQLi-~_0wJtyHBe-8{2X`;iTh^xc9xc zw#Iw2Y?>EnkF6Zcr(Sp1#Rk^PdV|q)&>hb@gKRn&kDC3?tTeY&+%%h|XYAO2T(;|| z-MjX0-*rZq-}S|}$CF+<9Z!3`w9}s9t4>?krzg$HIGuFHonCPuLh-h`!(F*NYiyQI zvaH`~_lNz~aMEf|yWMGf)*MV`gLE*$LI}IA6*Jque^<6|U%uznmDirMIgmtTUQS(&n%;nT%W5#S44U>ejUegKXIDjr#rRpqUM3`0{D5J;ssH8fC*yvsBvd zy*tw#+aHxpbu`o;58;j}px|9B3+8kqB z$gskOJy183?gU#5NS{%=*rt1(jpOZ1kS05`B9#L|j^|>25atyv$YNc?W zn&HeIVegm>vPn7w+0pE0<+{gvw@>eLQkal|x+_*;Z>-E#vyc2(-Z*QTgK65F%%+oc zGU{{(ok0)tys+MnJ9_s{P-~!(D&IBli7n1G66Wn$Be6AgHtA-qS*zV_jr-W+r|o8c z+#aUm(J;eEl(!}jNW1nQc{VR6EhOWtwd*n@$O|ccUnqwSE8OVk1 zv@^tB(`k?Kg>e3t4!w0t&S}0Yv0dZ@c}N^{#$?C#X_oHNNtAz#xmWBoXWlWp&fJcb z5*VO#$Ng>dG;U}Tsq{iY3sT!4X5jfSj@Xs@pi|Q^*oP*_u3@v^o{pPoxA<`v*BkcU zMQ_(_$uuxAvmTh3ZV${b$il4C>h$}wL31>kbZo0XX4n3`yZ1QbxwUmB_Q+GPyPa}o zx}#W6A(3~p+wNdWbi1v72C}dP{&w7)P1{&5?N%G-NMXY~X27 zsAMkHDXmjlNMaREMzeNnmNlod)}TF|^qZ{|3_-uwX-#^w*>q$da;^+8v__NWoAa_N z)j803S(=Tet#PwE?6rG11!m){JIFfScB^M4*o2#_ab@wPp-K0h9Zqb1Z{8QO^S8CA z-veoc{Q}hbXfT?j-42KX@LpMG+{;GY(s_G~m+6G=G38HLC^V4EvkA!Lalbvwz$Z-7 z7CtFNB@kWoy2dG}v`HO7Z!fKhy;%>WQ40EfHX5bkQh>W@pp}F_gBu{qAViY>&ED>%55NKm;H)?PcX&ww;Z0#J2W6YiFkm#%h*A zM$l^y2Q5&q%^nE(-l)}0Tm94oQb%X|>jhyoFA4)RpUdjR8b#R?te#naI0W~e4L}%X zJ$#PY0CXeUzsC8zwY7cMEU#~k99}=p@ism};8kb%-vMceZE!lq=K;4_+MNQYx_A4S z@;H;fEu&25Q(KMW?x5Rlk0wKGM&lWT2ACJvaY0q56xHI9zfa$LfJa%V_|ZuIqibe1OM9}cQHG& z*>DKfc$l@oo&@5nv|$AK9+pz9F7&PZEbn0Xxz*L`g5`$DVTj|S-Rt)Pxz%os$HS~S z9A{anm!7|}EmZnjXuz_BbFEsI*qS;W;ef_L+HdwIlW8j(Vp5I4WOXNyV+5AFaI$(+ zx3+BKoU6@B9D>Q4VX#Ly#QNi`-G>AUf|BVB6fYzs#>5}7%q&o6HRnel*Us2qkcc0#B)L^Sm^9lEmNheo88JMqUT-w(clzW0c$jv_n1%e( zONu#={d{F}HiB?G?0Pt~w@)jR<$>vrGrVshnYDk~#E#yXwTGa?Ag-IW`rS#d6+|i6 zcP6=1wp1|qm3Xw+hsq0VVS@n=G)}=%4p8i%(+%`v8=C}V%`NOU#U`SpN-L}7^&w!$ za87oEKpIo7J?%ByICwgcvQGw0qcUvIvZ1V$cSkA={A1gX*!DYan^Lm8?e0P7kxs!v z?&Jrv@=h6^ey4rV?@Tfqs~w;Wnr$Xn#trW~eMOSGa@#%2RHI-(+frzILgS#VSeUG) z)aJ0y(CdwFFdYfI1Ha1Vy~DW&lMll<-pQm>2s3HxZt<8z>1%}AXQzF zUE56{$qXgm=cKwcK95Y0cUrdVNJ{8K`tYbGN2_mN+hlw!xh5r_LoOc_O;9|R*xY6B zYAS@ji8&5fUISH=NYj14N(pss>DfeDUmOu9S7k-4TS84E0+kd#&?1JNjBbfUT9&%5 z0;oeQOMwsH+Va!x0lV-)=ik?r14fbM%rUK7Th1*O)FSmMYl?-k(Ta7(b1J5XtS5`% zo0_bxk!^5dBn#zKQu9sR`15AYOV>k%H3=)_aaU-Y5Tu65u}z}pg|%az@u@4`*ZVxr zfNz)Xot|<63!8skSJu$>j!3;*1LIGY6o1tf(6NtHrjD(Y@-r4yepFkY(~U-%huH|} z+4fzwvORlUzJZPT5*pGPu$XGBE42*{t4NnPy#ezkeq!z0(nGT_R?u?oV@};KPiI3?;8>Q?T^Ph9!lv>1<)G@bp zDQ%FUQR{c0#vDR9HETEVVMpUW1pKo>7b;HQg3DMDTZZLlc{|I`t&;8}g;;k6rVv_# zDa1`sPq(1+o`9=`wz(t|SOF!epG7M&Su3sp{0W53+jnk%R7r0V&uCjm279m?TiwAh z%{t9yA6lAzYm`EQFoXKI)gMp6KiWZDn}0ELTbrEKaWPk3S4rQ)^AA;<(%RkYx1jv* zHM<$Kb2x7U=tG~-%%HH|0;Pgg9(6X<8cqt_ADE8rzwDi*k%IK zaM&EpOtzZiEtc=kbF$-gGulYCX1#veob0fWHA9t zDpwM#W+h4_jNI|*uG7=~I6#y)@@Z=zC+9M=;^G0k66A5^z)V8VR#&|`Q9hGalx8D7 z1a_)7h43Db$o>c@lisvHY0jFH2|o7F@l?j6x_%9_73}4S1%;k5qydzREn?bjrIYp~ z2!SA8f=(H*MacMCn6llHV%Z91w|`aaNq*=rz>(yGu^@qc{m_Veoh<;#&fPoq6*Cs$ zBfwuk@YcyDqvmux1HJ*r{jlH1rU5y6Yg9rDtpW6?-=NmWXdkaT9%6qU;k+57V;l!S zSU_$(>$FF}FabDOoYqAqei>~R#$vs+`53L2-r78aEU*i)FYv1vKhVQNfTf|2>`Z&m zc1%kkr((HlsD!q*eq%rpj#3r$A?f@9AVdIrolS?mLBE?~r=Mn>0F?w{u$KWl*c+E1 zPU{LTmNsKel!p$lq|Y=1?H>@`HGE z&!x5Q2XsekJPaSA1InX68$nfpjO+wEyuBE1)jgo5zK@Zb4@S(Mu9U5P9S!@j5p zqbU}>UAGA%(10nloHHn;uvh^>8w0-70l)=Hf>F0b#a?O166g3o?Z@37ptYUS&LL!O6NP<{a?(gqxEIvxObKZIrsOC5TkUOGzwgPlSz?ZVGm;a|R%3gv+sXhHfgf>a)u zC{XNB%e2!r_BRMUz|)q#gBM%N1W0NaXpEKc6ZZ0m10f0>Gh1xVB1p)RU1U)f`(FLt z3KU6B%+$y<^Y2yja&AtGFrK5k^}?F85-?H_=hO&DZKtVuQE2SE_|&Rii5n?Yz1GQp zCBaAXk1{X3&AU1OZtjyn3E}V$8@Bv+u^6SXK>~;d0MaH9Coq)&p9^F-G`+yNbO0;W za*U$j8hg3;&dM9WNUIGL9b^)-Zhtx)Po|w_nhs&204&SEY$u93{wfrrg0Ekg)T)D> z2kapFQ`nb)uV@0p2jLaq2?2cD?s#=&@pC;rTux(!1C!VW?hEF2y%rSu06k15KmrYb z-2?b(n36Q{j1@6UrB`(_zcn&iGXQ%U44NPZCjEdoB1{jsOJF#_Di3?jVl#l4c*GfL zk+<+_tSEpsn!_RXUPx?HSYBZ#hB?v<*J%o@TifQzwy?VekVZaja>zzu(JYa=Un$59 zHfsrZBB<@>%otaqBo6BU{4|-gF~YzJI$$99x zfmpY++6LJ?Si~$loFg#s{B(=b)fL?pQl!AXZf%{u`z%blv+up@gzb~lvlC5CQ{qqS z%Iez&P|K+bfsx}Rtf_NcV@<)Z4za|}dS$>OLY)q6C{Cv%v)S&wZuuTzCrnsV5;)O9 zNrl^*v`sfAjVEB<^coRSn0hrS>&opq5`UiOn42^;OiNvf4qgL!5B~}K0qHxrx(n}f zB-^qim6AC+kuuMz_R!P#xRQtGK-aKAWome?YvtFqjR2DKaN<}%SR!Xk*1-jS{mv= zgdMd76v|&>J?e5XNfC0Yda**mh}vud8?{*rmIi67Hyve@UcUo76}Sz7VhAcIu8GBk z98mWbw%__#_`r4aVQCUap;lc=>)A>SNTI$mEot;m`B^@q<>yw{|9_w$=_3yW3Ifq) z3m!VA!wKLNuqYm3A~oUcA=tC@+Ece1+7?zvq!@~Tl6+KaU(d~pN~$WQ{hPpntR5hn z5-{j%cfcRQmo*l+`U0)!24Nf2t`HlX-02VrgoKLUXKlr%!2q5_W- z_mc43N?Qr=DC`|MsN#PY=fNSHW3uK1&3SWmSoi?;hGW1IffHz^!)bc}h0<^c^)<1O zEod0>`83C!^4 z`_lu65krZu-)zBtse}nxfYPu*TktX;tOW_I88B!9Osv&P2QV=24B@D)4gY0Xx0!Yz ztL>F6MgNzuAhR85!KcL9C=h6=VS?I)#s8=W*JhAH!)UY%CGw;VoXVu+%Bsl4FQ&I@ z_^`NrtyhALdB5H14xvYe(-}aCW18`vqtcra)9^A!Z*HHN6AN>F`vSE^; zhAHg$@uf^?-uWuz!{^qOg5ub{E4S(@^mk3Tg|!SQk}3RDw1!Z>X4q(fLY)C|j>8JZ z%dJ6qZme1I(%G?Q8P>YtDtt*{0EYZZyrM2p=7(7RqG>arb`Da>`!dtS+V@I*$ z3%ronrnsn{bz8C$=waP0NwLnP?~wG7D}9H|db2br0AW|!h9V=lEQB8__?Q`vTSH(y zt&v>+B_UX`@r9Z>c4QUnL}5WpH;1#C6NB0K!}Ucog+{eM17c#(?hFBH!QMIR4h9{x zxD0QZE5k>A?s=ivbMLI)D+9CvEf`>y;EA9k3&tfKfV4vI#sJuLCK%-6TyjZYBzG74 z3|WcY;KV3M4hy~KQ|mG8P2ge?KHs3y3?5_p8IJuy3(g|OXd+0boZu@uAQK`ZRI&(H zQBQa*N^Q*<0KnFQN)=~5fbJM897$t15QKHX5NcPGht|j&muxmQsjV(h7-`y{^n1O@ zxH$o86uvZr%T%-g{>D10Yc1a%<0gD20PP8HlJIQ-9DW}@VkXT_t2YB$eP9+^HB!w5 zV>B-!wI;(d9%d{lJmJ87A-s!@vw&&^v7W(1zcV&@^%}>s8_dRYbB!$4065BOwE$lQ zmjEBWqXFEU0{H;Xk$|3of+$gG^QepZ-p;49y1FBn4?uz6>kWnjc-tEd;Z`jL&au~m zcbqcal*2W)w$f?Ak!JqF3dLszYJUo1XBzMh6A+uTaoAE|^o0|*#41E-Z!QFmBNpFT zu`8h)g+;y)mVtfi3Px}gYAws1>%T-fjrD9LkYm1%iXh`RiszVb&94jV2wR*F%z?-; zJPQZ0u!%0gedHVTl0;Tsv6o8#6IT|fgF~{k-pUjxbZtpCn{X{iol^*%fh-yH;1s0^ zY;PaJ#c>zJ0PG{nmZG&#kMU&Efnpj?$2%>^gJ38zm;%KbRmfanfPr?#SvsDkI4;_=!3bnNoMr~UJ5$I7E&aAodnGFgt6Js2 z;x~0_92n?^?-!vMt|5!RD|wi>EbXp&RLMkrm{(Mfu_$dop*{7<>dJLJVr7cWOMzKx z89rf&>I#MBTuu5pK(kpu7QLOgE9jccb=5dl#Dttir`kPhx7)gWt_cna=0+|&tjW`A zT?xnx5QL$pa{|8lr!}o=`m9(XVe?73B2}e)Ho^pGmB|s`RC1W!*7_u&l2@&tl^iUo zDAQOhrSXE+OI%ycn#_8E_yxHWffy5qMf^Gl4EejLdh_(Y%`x(I-6*k+IE`7>_S`&> zLt08yDTO#4r=jaO%c%Br9f1`%$KutM3fJ{vJ_~^F%*<+c8Spb$%9s~YcwAE<{J}Fp zJZw%rJ=^6XuKe5i=q^uGDcy>lXB^Bsi8J1znKfKUr6{h7f#C_30Vi1HvIKSIy3d+O zKUe%k#piW-Aq5USD3hrm_~H4Y=0#lz-BJmXlod1ANAPYYdbR7*dF{eV}kKoN#n#v=z{5I?Lq##O3fA!5P8zV!)p3^ z@+C4=wXf$W-o-m^^f4=?R^F(^nT+aOiGaxEAd8DyyE;y|I?%$LqOLBHwRq5k%`U<< zq_7C?f-8ob&EUBY(gwgdS}ohy%7j~qbcmx~PGg0`&n`lk^!ihHF#y7O3>Um`1vy3x zpAj6@I^ga8>8^txu)VIef(-xzlCAz}<7ks#m`g5tEz4pxQj*}bPMRV|j(gPUon=mxM_0sjftJTv%9 zY{ADy2!qi~i@}F1Ti)A3F-4JXczng-7s7Y45_MN@fX|-UFoo!`3-99aP0@#k;Z_O* zoIwwu6U1Y&Gcbn$T&ai!ILn3?%g&?^;|O>ShZS`feo^3gzYifCc;V7mU5UVjFkW+P zOM!B(9(Z$UZD?U@o%ULYxdP9yZ~{K+!sT^8g#|K{cB4^Qez<~rxstFBp`$Bnt~07y zk;#`Y5CQac)PX1aHbg7kAuxjN!4O^+CJ0Hxlg)Ur)8sQTuGs?UpaUCiNML)@!2~Y) zVb408!sRg(p}~}@RkDt?(rR0L#ex{>s#uCyn7|2Ar#V6Z6zEDiaAurgT0^^!;6&)u z%y9i;B%Mx;gQ4d>uO{#x(?rB2So^gQ+6iGP5Zou5!mSH@OF1Naflg(EC&O*OGk zj4LHZ$^Nr)C}#1attoNv&jtk-JXvSKuRSJe4{^j0fiT0)FdE|XnF4KH=>urfUB3Z5 zMc5tZq!#sb@mwSf(f|=IQ^Z1=n2z_+rO&hG8dk(7hA^3*dUYxR~oCPm?HaD}1v#!IRas64StL z%w_heGWUFSh0{R`!Ql`+u{DC>HN5&jZ3_?u=x_LT2OzD~IR^^V9f3vX4l@K~90Dl< zwZ#|;(;@7|K?6)->fHfqU{Dr{EwxvQ=U}n;A&xtsHxajW0_Jv>!EFYjE%e54a00*Z zlc>1iQ2qMYhP;>qIYJ8!E)L-$U_--0MMa3*LY}N9wN<$i4N#Ae*3HHm@uhWOB{rf^+Zw0+{~APs4vCM-m-j+=L?AQ~O(Wn|;O-9=Jb{@W zw6ZC%4RByvoSWd~qj!tCLCxRWSoT9)SA?p8e+w|cfPe>w2QY65!T1nX(8Lc>R9g_? z##J3(T7d`-1#h~;5&U4nYX+hkz)b)`48vAx|@eJh^wrN0ug&NxCcg*F7WPOlH2(trfCUxj*-{C4-Najx!CToy zh~qXajQUeVf5n7{kP}lL-gY74K>Rct^(CN!;B;;$wCx2dcbO*&s}%^YcJR2;1y~R6 zRcFD;7D8M0+n7G!?n-tf%Su}!Us#sS8nGG(VIkQ~3E)PSzak!@qDQbV9SZiQK#J1? zLLbptnuF#54C)ZfKE?;(S>Ves?lmQSL}f--%M1>&mLegnuoa~sH1KSa;&Z`_0dPvh z?18b*3}~(?Ja;3W4ChC!Ucm^f+Ei}L4S-N#)9hQ<8=kXRc~1Lm9d`}WiL!rQz)XH)fGA?tFD1q1h>dF zRn=6|^r0|eY>D&=1=!=7e2_e|2A9^>M$c9Ob=f<%`{puLX`muuDLn&AnUizYlqu`~ zIYH$7rV`4WOIBB;M^RcK>ElSONVBYT8Xbi;1<9QihMT$^J%gx76vnjrQJ3DsL==hg2)fm z0x{M|QdhR`?=`H-q5-Q(T37JE&?Cz*7jr|mEOA{O?z+Fo5^xyu2bElW>l9(6rvt$r zzD4dt3n1Wj{_GJ3?YueS}Ny4v-l-ysj+2* zT4Zf%b6S6=5Jw_}z$6$tL3Y)dAQ0$m+=sRWVJ=%!hr=#(OR=@JD>wr>Y5SuJu^ASh zI!-V{89f>dr(Jk$57DO)r~!^&;aeNB@g8C|TW^=tSsC-3^;%Ukq7b)X$IzbzgVPSo zB;c}eI)iWb@vJ=qqgQ0t>cAzUQ}U6m@#kipT!}y_NLs?9V>w-%)Kql z|01j;AFtw57HO}Tqn;qn^VYw&QVM;me5)$~SF*UWd73;9XQf#O1TV=)wNgsH%NB;I zjCjeDtQsj>*_9d=mTME@%D|6=*cszC0%nB&-6pU$Eg){%S!Xg!VIx)w>MhRV*MpIS z`Kprg`@HM+&U(Byx+Tcr_UuR}g?%cNW2GSMXA^8q3*nHUUG8EhggpfIqbAg?u(v3Q z)2m`t~CRNF>1HqTDerMqNbz)BpoN6m~5YGlNI2T{5V*EAIVEz zkbo7D>RH2Y#+*!OEn;$wf~^&W@hOT2)=~*Xbh0b`yXXge8M` zzn20=0o4oqaA&1u=4?b!#b<5-YjG|0NRlfjmdVa|d>6KvbtNA*5Qv$bPJ^ZiozGgG z@o)+h6hy-?G0s{5bQUM{x+P=dDT-tAFSVvP$6Iy)?m6Z}HT8SnTr#Wa{~c7xfk8UX z+zt>`2m)UUWNgI4BGFU6Su9FnW3sX(Vb89hN?`qz?cbe~pvAfh2oWFj_5l9r5e2;m z<`+(e0Oo5>`Wej2aRh>3Do(sgJ$1^gQWC4-*9DlchjU`LLZ{~5dA$b`ePpf-|9o@L zSJ%4|bHWZ$R#%XW7tF2}2ZwYKVC$4tAvt?n`b-igg7U$pS??=1?gj-Y$6+h6CwbGM zQ`}uekr#`afF1zm2C!Brq7d$@4ec|6j{+`+jct(nK~EOcWtDX;;%T`EC$bDlxG0ZJ z4PcyL$N|@QV>od@s7|=-2hbA15&AfFpy0M@=l$(1t#LlNRR+gP-Da~5It3mv;D~S5 zZ}(9PLTI%EmY{UTiQJx}$o0af_OR21Zx}f57^I^b8nCGFmeR=?p=xx`0^$ za1N_@@TD`vpy(pBT&s^zA;q~rj}!q6AcVJmP`+^I(^x$Le?0|12>3`7K1^DOL_7i; zkWR)>(!w`}bvF)RT)b<9bj&wnR#j|qM2TDx5Rw8}w-6x$Paan!lB7^&S+bBwXRB$?+~kjDR9G)Ay^h10cHI@_Cy3TZw-QL4k!{P<1w570XVX?<6E z0%KQi&qggAEi?EEfyBN8BQ^Lz1B<3_YptlP!D?au4**geyQZERf+fE2NqZbu*14i=R^+k zFqAM3mA2HCROy02gxur~($o-+rC!1m$~U=hO%W|u%bI9*QV>ijTWzMQsh>!xcz$nf zjd!21Yr2m;nHPQ57232y=j4`ilV&bOO=;M^S@jB$;QR>@y1gP(ZFNT9n!u1{K;~yH zz)f8aw`r5a%y=XHVov?2%k6IDiUOj=8oc^mu9vs2as*ZgU0h#gQZ@@Zki0e3w;WglBxwuWX6Ug$uVe|$XbtQ` z*5XyH%r%fK)*<85mXUB);1XJ~riB4ZX2j1_jQ&CwBR$}%2xze*DyzU*^mJV?3l&&7 zaasV39G1dD0r2-h9~Ou()@lugtsX2f!687(+W15xQkpoD>DUPkd$z z&eB?4FpdZM0D%SIUN=jpaE1((DSR7{KM|mN0`WZSfCN&bP2YYjX%sG8qGh0#^tr{Q9IY z`)>h3hPgHw!U(dsO&OD5wb*@Lxc#;=M=;H3joW=hA4kO943V6gaFT)=z~#asDo4Br zo@5_aR((NzctC+igEWQ48CxqF2YVRcAZB5S4O%6Q^SX^&iE1hAO`*(R58M*Il9i&n za!+l*;4%hsBv>>L5jA9jodeEN+L%ZaL<~keBU_9)le7xX0_?!qg=!-7WO+Vo3Jm(- z_@*(tcNYH4M0r^C9#5`yRz^sp_41CUaW6lk=2GF$hOh}Y|NYe zW(o_4%%7U=9aOg7PK^uYYsR8X0;m>5*-9affufRw>O;jnxhWfa={aK zS^jB7)k_*`ie8Cj;TVBMj*^2lB>%DH#obHXvh82`m9G;$v0;ORaRlsc3ShvX3%^Wb zfL%rtXw!NFSiQQWYXRn@ewr>wY}LVsJHoQS|2(Wk5!pTM28U;GF4Y~6(1Lc+|I-?9 zle|-FBxVDO16Abv*U%RQ$@0Gan2XsX^Lh`k3>$>WU^eKDU{Dt#!4F_X*B#87aQ_Ax z8(#P)X0_qcy_?2O>-djv8R z_Uv#k1usZLm(wgL;y2WU0!dQBdVpKGLSZLiwpS|Ho9*0vW_I-Mo!fUo|4|5VP)cV* ziB+0{9R{!rUdiBb4TLY$`|wZHYPMT51Qsv$V@|r|V>$P{@FC~kS-tClKjt$3>J<)K zV{F)26OIY`|6h0K+T*!$ocDZ`4fag}C;;!5g6X zBA-3K?rO4|WHrgzomt5-aOBxPyQ{Bkc2zy~6uB_Q95TV0)Fs_Grv-du(q-BC3ogV5 znFRw9+nfe1u}k6Vj$eQN`OjPKKrz(0X{QgQp@VX7oa!2vR*kL!+5?g}(rh)`q%}_D zcj8FG-ub`x1C#FMWYQqJNy~(dIce3P<0FwqTVx#VVB9y|iy=r(F(77k)=z;)D!SIM zP$$8jRD_&1yx64nZN35cBsW}F5M#jmWi+3f1SROr4GfD#2cN};{Y$Zk>V9*jpiJ5& z1|^uZTQ`KiJQU?0{pO58QQ$ABdf0?AD1XeIgZL$YDJ^PnjnkjNKmR@RU*AydLV<24 zF+A)7xQTgN)_?lS>rb)(Eubx!Co+gnSYZeXiwqnSmvAU{(Gw+%D{3C*{`qnIZ!f@` zkV6N}2=Y;0Q%-6KM%prmwFK6Qwk4R%+DM!sc@t^5Ug)&b|FyRwYOe}#O|}frAQ}g*j*VGOc2e%?@!Q~`EuveYMLdQ|++k3r{8ippeR8D(0)wU$7t8}#usBLIk?K)CCO@7SFG zXAT7UT%VPANw2Q4Bq7Pkt3XOZaEf%*14(j_MRNh&FA1$PNVM@In1o)iagJTnCM(QG zydmF=C$U{{de6QKBn>0g8GM+1IY4AQ8M;BNPZ+evvcw)}cZTY3*yy`vf2yT4|Bg$p zaAwYzW}^|SJE^wx)|?(X3%5^pb*(4MQT?A`MQj^q1vI%XG=Fyp>?z+%=uhv-KSj$kE-JO5^y;Z0`@2i^I$wN+{A6AX3bZ5g3!4 zH`y$DthCyITo)r)lMf$W1~^H#yeAvL$#DWi!EJu}PhUQLeHtdY5r92F`I9+x`lua~ z{X6(s8BFTFLor3sy}Gf-JBhZf#don(eGraGt>^_V#EQEpvlAPlCr~Q-hsSCB``^op z>jB#WTFA>?dckc0&loQqDqE8lm`Ir7mD=)viKqK6=urSUQseBWY zkQM)JJCLssa?7br1REd~K79Dq^QWH;F^VnCt@ zuHNTl4b?}!DfO`oqN@$xF07svM8V`DFCa+CpoPKonvgV6)WfrnP51HhPhHSd^o}U) z;Ya~p00BXlWA7!)^k5J&a7X80>Wfk)?W{es-{a5kcZA$3Ca4AqP59<99A-Fs2;VOH zv;v#}AzWZx5hx1Z$)C~Z2`V%1+Z$k1f)=+|6spcNf_BJJtVe9QWC>BA*(CG5i%hw*0km3WhT?E=L5x{m90NRA09>X!2g z#$sLswSGkLxD`dO3bY*x--lf(x1!sbjt)|W_ZEm3c*${9VnZ9J1dfEVB)Zomj>jKB z%nAgQ!6Ge+({}-1%n~eu{NH}$@=OMN$uhGDSOWxrz2L3>Z9si&YK?IRlVw_{xFL;*xGzLZmX7O)F7k=KOE79b8u=!GwCZju2~ z31Wx2Xao~)fFmSeE7z(PGAU1D+yB{EdQs z9&Z$uKF$LaIvmkS3Nsbx8?@3MP7ts@6Ws0Y3VP2-@e=F%J&Ce5ey^OvRs87B%N?ZN z3+I=4>h% z^zL6jfaMZT5^ldAiDNNm^b#Kyu%ASBycqiwG|PL~9q=JlE%!!}dgOSvIC{y=n6L#q z{7jqmb0)#>MZJW5KaeJF@H0&dfd@v2swsfEl47k+XQIMKlS!&b)y{e0!M3y=m)Gre zKrh;B9y4u9yO#-kOvhgf=R%fPL$Wes$RH}e>-q@>OPC6aA_wZzZalloE%<;CUmi&R z`=r4q35DlFod3B-#8k z#-M-NtKeVU733H1c1rTC3nHMHs9@W_rTOQlhyLp`5tQN{`?l+71cDPD11lm1bJr8} z)V~ct2kSGLxf=Q%6L?pkMBzejdUE~{$wEd;Ru+!Tt=Pxz>Ce*l4P1mX?Ug|@!J+NU z=Db>65WzqEvFo0?mk9hgW@Jco3ryNsS@xvyDLVj8 zISH*vlj|=Ry7ysK#?;61CWPZXbv(Q_QpS$|w8g6u!L*&oajz9r;_$3=WJ4tak=r6+ zG-U>Ii?eAa^ZVW*qB50Sw74VKK%oH%(Jpep4!?xvylJ`#25H zwy&m!R^EX=?jm7C)@q|Xhs`MML7Znr$Y(P6Q!VQNDUajB&^>>8(wP-DDubDv3;Ukd zlFQg}ANrCef*@KDE?5hur=RV3mY=kCDjEGfGmR+4_sZIq?-kYhRmiT1y|stmcQS12 z26XjbzdjD`#a#ZW7X7xM7qhrA8^Nv_0W`@PMd2xd5@bam^j}3N@dYwkr%O8Bl~?`o z%glQbJXC5EsT>q=Ru3yF_*to!W==neL?qbSG5t-EM}WRmagdbFKTgWuQaP-!8zpz` zNVOG;0^i^$o_fxFhhEv$2vKWM07_t93{Xzd;#w090pqTNyOVo!8+LpDM#)_}cJS)O z@Nm4TrFP=N?SFcZ7MwcdeFzD9s8yI&v@5N`#8m0zWw@Z}LE{ zn51NF30xwTcY_1bDBndlKsh?0wpC=^)C7Jfo+Y@vs~0huZ1s`9JgbkL266>!2|EzI zy76AUGP>nvv*w8XAs`pqkix1W45os60g4gKxl-6oIWEBQuR#%B?%s4C@7BeD!z=*V*SkM&V{mtbU=GRz76R6&{pPe5rpNr)Cl8TRAw z)LQfcv)$!y-#7WU$RrUEoC=0MWsBM~Ri#1q8U-k16OcI=42pUg&G`*}N#^+q)>}CXjeNEJam=6^{@; zZ1f}HNieSubJ;eI7Ux2ehnN_uQ8>`b^Vh#eS`dJr5_4!cnf9Z1{A zi0tedwKNzY|2obgKYl-a#4M%gz`L_gY5jc$tbtdc8_6z_ld~tOz&r3^NC-F^Aaf4} z5W$FesgVMQVMcHv`pX+BEYp7pA_-2L8>kQ2q&EusG2bXGUA@GT`1kOh1;F>=UU^vt zvpJk0AVQI%FT;5q8Di4ZB&)!HYDl<==gp=Tm}5HP*PS47b5@h@0hC1gc2ndTLCX6q zJ}i2nid4GKIfAlxY?avQWb`(Dae8^#l@--o-X6}Mxq(hr%nTnscX!51xc{Emp( zV^*m)3Mfud6RU4#obaLRhV+GviIw?z8Du4Zgv1&PibxBWS#sbAe}maNz^zcJYwRP&WH56s zK=(QpAvNh462uSrtdz{BzwaE;9veA3M9E<_R& zcgoZi7-(&dk81Ndqb5TyduuvyrMu%U$(#bdD;FhZKY83Vka0H6IMdb!anD~ zN;#{hr0J*0g+dY`#=Ess4L0^~qk?>Wd_FXGR>zHY>PwT;yiH5EBW+SvXhIE^G{+EB zZ5Y1X2%Pa+dUa@0#CBJxjpHP~idee<8ppYlu00BdpgooWVS_N~?PuU{yj_O8u&#?V zfqob!9~gZ$yW+%b@A`34BIwRZDe2W+&J#N=C(>TGS0-cqIm{$vVp+p)zY%R>fg+1b z(S_G~pb36MG61Dy1%d&ogsz5ksNI}T=>WGIz?Ws+1S;apaIyqm$Ti-?c4GZt?(2g? z%`njA79x}9Ia(GBFcaRuykaw*hU7Zl)!-v#7E^UsXf7c~6%ls;=zh9*d94xWsEa^Q ztXVelOq1q(q!$PiEA^txiS*scC3HHc;Xivc zs1>PlzSxO%8DK7~hRT)K4C|tn)&mk&x&blLAGpwMaz$BOM-T|XJv{E@LpxD z_0pM*4lWHd7H5_6DupJ&p)MAyhnY2b=YAE z-SvF;N!jQLR`!i@S}O~CjCM!<@Zn#khd=)G?A~r^Mk}ZZF2sL+hK9LuKQ&wYOoZ05 zNegLjZVsjFFL35(r3Q&FYz+-6W4|dr#iQxZf|z+CO$q1e&;Dv3LS|r?Bm>Mm5rz*p zJbHXaO69JA@^`|o+so`MqKxLX9UfZv(9h~Fsvti;RM=IpkL zmyt~pe}222_XBxDF(Ja#Xb7QMh%{yP+6i<3WYDDX3$$0UM4HtlglFY*>Clc}7x5A_ zxrMgKu(!YYp>BVdRV#+BE3jS!VVhfs$XkJD;w`=vhQ_>SyW@XpD*DK86}6_D-I2`1HExflu5&_0 z$dFz@nukK&kjs1!-qdkkH3DJLehRCNQRqF6C`3&2Pu1ejmE$o5t{?Kt6Y; z;3efLI_Z}e0njzN>zRP5O zf=sjZ%&v2$P|>4hSBLx0nK?%jn%jyyW>saC`{5a!^Lzt{l&XqWxsg$yIY(+Vco+> zZrJVr>Tp1WR={fxmZ%*%7+VMe`$4wrrM%$eRReZi zBbsj_Xi|IZI`CJC1G+@qn2mYn9ns(Cvl=oTCZ8tcZ!I~wNSu}BVDX0zkQ{jvOXAVc zkX8SR3iUyA8i2jkLz!Ze!1{pIu593x$>2C772@($6_Lw5=^GF~VV4MzUYu6;t6_x8 z(4e<8!V zzL2zQTzq!|x7?X<#5-Vnr#{gnIsC$|`~fN>qBnpUAHQpsVJARqip!=cDfVRZNqc^r zzI^eww&1B!JQcSl7%4?4x8nT7FV$CB(>^KHjrj+3V}? zi5!PP>f!le67l!ys*OvR4~oj+#g#tp_pBz;p%3ocKt%N2IJ0d&BU?9Sv2bd01Tb`3 zRU23(3$+V3a$d7SO9876H~v-Y2_E{*hL{5{jYl%-Udf z4s#nVsY!Py;w|05tip|gc1$kY3{z_u?pm>w*!zXO#ov(+#Bv{lLtxmV!K?U&1AhM zswmLBRK(C`AFmb~wWwUcFTq7&i{F0V^<9a|kp8?V%TrXAd_GR@-?#g7iBd8vtlhkY zkjJaLS{WJg)R2LmD1`zfS%!s-oL+>T!uAQLNndmuGuaktq_6h2jI>dbX=Wm$GeM9Q zVUT?{;U&w6N`m?a+p3(dzni*`vRUQxuzRO|@y@(z?!F=aSWl5#h8Hj2cFMkpI^2kX z_5ah)onA;r2FNNY>WS!dV)clxFL6M3SqIcFDTy3DQ8(Bm-M_ws$p_3Gd4}_`8JdFV zwY&wemeeg~>Ionl{%*Ug-kBY-n>qmq1q0fGqvWwnO7Om^LS$>JkM78SPjK@&%1G({ zhYw*$#rp2-Iw9);&;hHx2?2(rtn8sUzyv%)EHh!81Oy?gzKnk-f{*y;?#a+$9?s)i zJ8TuV{vrF>%k?{N(dIOTY#pK$l9AO!qUFN~1hXWAd6M^_%Hiej(zFM-u+7N52se`{ zfBVG=WnRLPg6&}HeJ46;>CPIK3yp}eJ3l;rHIu&Wql_9>t{zgU6e=#0@DO5|CT~f- z)DHw#SGd~!roRhN3Yxj8hRUjibFo%jZnUomKQgl<%52<$CeIK3x=>fo+&dRlWi>7{ zH<`X)NIHN8FUm{HB)aUn3Y0VGoT8Xhj#nUm4K6vXhoFa z#C%mwp+o+KTWk}d#nIxbMt1iAmB7)9VWptF*kkbw2=4?bEu$5z`Q@ zR+5U3RR>o`E}8If-x$$elh{Yb7FgrBb}pa!a2|sa())}wNo>a<$BmWZ|0IDRffxNm zVv}wpE33@fAx_ZQz>Hsmm5P7rj{u!;%_73}!}KUhMsSHS@@M{nq1oVeg6XkV#|W^; z&TweXynx_9AIRN3=e-BwPudAyx|WE9mIM&w|I0TSVwQe=c@=C=*i--aewZ?OKugku zd`Cd`p(MivPV7GpQXJxaIgzPCYP~aJbYPAbt3S8Rgs;G=_Iel4+09NVE?GvMY&PzewikYJizE1EP;PEFZ^ybDTM$D9WGUd&UGE0M6Vq5n9#6JD~^>@nlHQxFjLC zBGwf0<(X)%@Z4C1n)Pu1@N=>edx^oZA~dtTzR^@?fQ%rUVWx(s6`Wp4v+y0K6^RD3 z63$r68XI2bGh2S7;S*PZw0{k65hfcu;uC3a-TuZYv7YJQh_bOx3;PoPWB0S8Yc~zZ zl-Q40LXh%Yj98aiqAf@PHI(oWLPl$n354W6-cRz)C>z@y)4puSpeN7==QY>sX&A71 z)}^6`9-;QhW^{j2P?}W{Bb$Sv$Uk<@8e1%GkC(4n{P{)oU1Qea={!}M*iTMhnde${2Pj%>N6t@WYAin~wGyXA-LeMR zf!!#%YsXeo;4FtEp{B2gayw!6y>T>4w@m?7@VB8^!uK?$Ys)DYduoRtd#H`hp^rBD zxDyhn$Xd-E8_sBgJAOBfU)`G;MW~QzRT^+Q zVQXQLayQT2_hr|{9@TM8n5nf`2z2&WAOHBt4ch#*-wLjLwDg8W9--c_E^^bko!}dJWY}T_t3dvz}3Hvbb$RgGM?K>F?OR+o6 zaD>ex%=9Cv1tx4!@aP+A>JFE>J+w^);0!SiniK~O0W*09bM)AbIB0Nrw2+FB!Mg#Y zu^0!IzPu*bBiIdh6}Cm=^^?0ebuL&>W%@yMVWk7f)wMl=Z4e44U0)GZ+H^^lLj~t| zj_=W89}gB`ZFG4iJHyu&wa(X&e;@YGg~H}9v~N$)a+Nw*wBdE$FM2N1{kkxZJ|TxV zKJZn_s0%354x440~;#mlaqfE<8Dzneg=S zuesY;SVflE`Q|T8+9k@vRE_{NbPHpouyh{Iw>nSSuI#(YIClF9llfGU=WxIQ17Vaj zC#Vg%AuVdS@BQ+Nhy?3M?z{mSsf9x4dB_=*xTNd_;# z0+^)8H;A*F40DIh-q7h@a>)w&dPB7Bba;Z_HD3JnfI@EAlf~=9{J%S!g&S z&aolpO}pQr-HqZ~dj+ndBXMDay3j!Gm!LVo0021_&L@*=HC*bL@yFs5zJW;Q8cq@{ zRlMzn9>rA=#a{9f!y zIEdX{S=y1w$WhJP1dx6Kxh&4KWGo4_s7Ve*XWMLzFb~D~zk{uACqZOhB2J6|Yr{O4 zse@x$R2AQXUcrrmY_zZlCKV}A)3KS&tr*)2RDviC5USX(*y@usTxYIjuQk2oqjfIH zb}2l#mMgWuQRJJx{Vf=!v(rjh8Qph7RP1~oscM2&j}N73kVC+l#)N!8b5?V+foU~O zV9`LWBJta1d))YZ>o3raiqaeMToYSRU<^n|kkrg0ZdTGa7hr4Qd@xMf-W7fZSc!Dw z)8n6}r)MaX|7q`g{37jNLR`#5YuJ{ddm8`nw|>5lWu$?^Tz$#MRB;JIlOs)AS3xM4 zLZ_8Mk}RG=_G~YaowAkuzrzNWG9tJfd6~1M$0$k4E?7kKJR2bvZ8@LFfxY?8Mor{z zfrK$L7H#k)?_^Ynoq%v>+%o6eTvk60Ml%SddJIJa!SPsvE`U`xhvSRApTTz0X8n|s zvbYlim>btCV{-n=Ff<3p#;U)cc{k)G=&+O!i$*{nbTOo5%m+>lk}_c{A$$2O>h_r! zZ@oCukDb-K*}UAAjPFEVWb@Z%_llFn7W+0>jCImDZ_eVYvEtUI-h&9uA@hT#zfb2H zws|fDKwB#A0!0UB(()!rU(EmRI{SXOkBPD0W%1A8t2jo*G=#qF9g&dAh}2zVprfcK4ZWCVhQ&InRdeIGur_}9@V~mxpXJ_qQB-Lp%>-p6 z=05XnSt1xs-^{OCCEjiGIBKsud%BZni{3Dp-7U8hZ@ts*aB#<1gumEr=<`B5>9$kf zZV54Sc(?YhWjii+WW;O-ha)dmP?PQ8CL2tQA}}xoXj1Shm_cg#b>zWLij;CFnU9}7 zeKv`;f**Iq?fc(29E$%rcwzE~gmg*bbORIK6Qz0N=IbCj)-Zf%3 zKp_Wc z{(rb4%4h2yYiC^K<_2lrTPZ3R9QoVpjq-1~uU;Z(0&QDG$Na^BG|QU7!?&sj@tdKH z_C@%W6K0h+Y1=HDb{8dgb@%*W7}iYYr(m$k^;Cvg8(k-DQdk)ZtYujG&>xc-S5H#_ zsz^k}JKLZRp$S^i3&@5u5cANjV7vg`D4&uPX3k8U%!1jUvzGx=k^oBuVnmTB- z7yZM?k6~%z&wRUjUFidAbyg5Vn=}cLp2odeHEEL>3u)0##g3#y-kIfY{`~3V1amjX z&bsw>*J&v!Ee+%bMk1Jpb{ZOd_V_@_|B_B^*EeIj2`<@*SpY6d1ddu#8pL+i)m71% z%-$J*2%N*MMoSExV&$_0n0<1o|G~+tuj92pocXf?*T+~ zkSG)tiI)1TPUmizhf@5RYwy=TWDWf{c5^8@wivDF_7AbPZQbWh0(nuI)HtMAH=a>8CRd{qnb8kWl6& z$Yv+=d$2Z3U(Bb#YayGV%0MTgtbpuHIjm_vc1M+p+K^yK5f_ z+`(7h=DQ*ds$l(md!aISBp-!6z9{*h%4BLIb=Ht2#e}bsQ^PSQ-)#x2#-0!Vn!;5 z-O-e$Sd|bK^1dg-5Wuyu9Jv~CAOl+?_fSdd$)W-|EC$q=Bs^sb+xU7piB*$f6Y){z z{n+x!?ur%-iu+kQw*yp_Fi36*zjpSvfepc@?4KVWJ_Vctn?llt!7UHK@-i|ACLIV* zk^wiQ(j-SBN>L`>i%q@tJNa6|6|9Xy-g79mStN4&F*OF&1-xq<(C)ev=t~KiSvm7* zwl|!kHPN`6_e}DBaSlz&l)+Wda)GMJH;P7UGP?k7OmLz13AhDp#=(ib;BDR<<73|d zXYRD%9^uLMg9*ShQ&u&3GU4YD%LMcX$smdoYF)iHqdY^f{Z&Y{FL1J$XOprv)kWA%B7H2}`*iK2) zlG|KdPk#&Z|MbME`0MV=G#;${FM)$xh?4aU&VnN%hokhhP&=D;7GRFt1i2jaj;4J* z4*YL2cbDKDvyh<`d1v}RU|FJNr9Bw!@&OAJxQM>&${JHqQzS5;4Q)e`(@M6Wy+KAL z`E434B5Pp!e#2ux5US%+y;(tq!np*p(Eu9fobPlEL#v4dCGRY$b+GM)r>X13vfcd% z+yjwVjVR~C*pR@!H!+`i)nJb?j9N{ZFlnkp#YVRkdc~4s2dzVKgs|SdEJ3HW(lP|% zVrMXO*d2j`L2*?kHrfIWgoQa(RDJU;){UHg3PF7Ki-&9`%xqrNyZrfdz+r~y1+hL&TRwK6K_Ey5Gna`%W1q*BF;$ALne}6J%9SyWY)8v zSdpiB;hZo0Or1Ue!py4@ub{Q!yyCip#fnqhDYoZY6|Dsatq5U2a{PzCSc%~enxtF^ zBX-liI3EHtx#_oBN|Ra%Olem>P+S#h{;4L>Wei$u(lMk@1SBMGQd2o#^frAkKPkEl;ibdNf)$QC&P3(2}% z7&$+D06y{6WlXv#tMrr*YTFI5RW3x*X0~HUA%|g#7zeGe$TOw+#OblO?0BYEHwxM= z+$g7YCzsi9AJho0$To0ZM3e1c8g~sW&RBTURwRA8Sy=0x!{){89-2OG)+1J4X(CN! za(6b1KTX5)A2_@Iu)=`C#Mg=(K9zQ~N25XHXHABqE?cYs;l`KWluBHLZ40`xdh$q- zMV@Avr8R)0A<{%I(qK`y!f z!630!4deI8GYuqOOM1Y#nvrPNEa^yF+Y`-^r6if8UxoE${>Z5g4wqYpZ#3!`WAwLFaY90hpC~iAd4GRPGwWT4LyuFxvIYAPpS28 z5wjIy`?HutmLlH|F}B|J9P3wQCvNVZ;!aSBI+5$U;6ePxy0F2WkK}pNVb3)cq)j15{Mr$=MDZ9 z%w%$(7d?88`z}oZd8G{QDpujFArn&AB#|2=(QB+J?o+qG=InB2TE17-ujRe+%ib9{6`+kOl6eNeYmCLoU_9$3%#)*h zJ41mt^u81K>VGgj zkJ)?P9Lp12SmJ$nOGwYz=wGsFW4*U)5$@fcoy>g*Ujf?_PUQhf;}&w8pX*TSWe}f> z22Z}0M;o7P*-NC4T`h~OS=Z*n2Z!}RL3;c$b4fbMYh|mNQSR#;m+7^zJ-*Al_S4fJ zCr3NJzSSWbCoMZtPw~x4>OLzBK(WMxl5_yjK*E(OwUBSXe{@2bmk1vtKsSEsA9%g2 ztRQY@FpO0}g5Z2;2(vL1fK}5%Ne6lJ67ab|^i(`gq|wtl(m2Q}c&kC7z*C%H^WpZE zv~UOI%}7?4elvSpd{3;+FV80ICnWCqZVb?(PKSYP3RuWZCl{8I3s{5S)*x))QtYrN zwaG;6RNil5iEiBm@a``o4-oe^s!D${7%ZzM8M!)vK?0IQEDOOL9)dr&=+VO zzgI5`+J^0=;%JR_c%J_e2vbbiTpr$6Smnla8lc@t`iZ}~ti?Ro4O|9$bXM2E0^EVQ zdJM2B=Mk%l?2^wX_*|-~sXl!8OTvEKJ;d+D zGmMUGi+V^hlew5zYGeX2?sLtAp|n&E57|eYTTj z3of?YKTeOowruOBC-UR2xN$JT((kK^zem*wNq z(&_VJT@>B*&JNolvc&55#qKiOE%Sp`-a(b3b~rOP>|cl7d!vrl zA_-nh|D9DP0-iZEc3xa-Czr6;yGD)|8d2;JZrW$G-nry@F*RS0J2H*NYAB7QsrbZq zCW1d%C{6dTFM!g>S$0&jWzvqn+Z8_ktn?8!11aqEV|hDP-8*=uR8AYItZR_R3#yqv zy{saf%ZP1#(QlUM4lCqa@Hp;OyP+H@ZhO<}jhfmx97E4h-Lb z*i5vXCVOG^xlV`WR27KENj1&g*N@LAwOGfy=TCtGs@9O( z@@rvh_%Q$e;pc~s9f3g)VUFSW6;L`b;9sb^A?VjS=BdG4gHj|Mr6XZ_>j{)2KrooUiR3o!ZnmIBSk!mi5Qi5+@@LKJ}$VJ>=fd2hGoJ>w0lM3%@GxZRfcd#~t zjhm{{vR=>QCMY!0q7s6nmXsl0!ez{=?dr29d_LV(Ki?G+@qm1?ocKhNHsiUhdcsWz z2p*FXgKRoX8=KfFVEto{ck$C1+DX^q>mU1it}j_ZC?&!ESOoh<{1)8Gyui!sWXcO_By8nL5A(S+1nLl?aAHh7 z__C6e8xwX(A~FeEwXcb(42OYZXWWd`&0I+$Hgf!NrZ&XFflM0`9KI8ow@QKsOKI62 zK9P=WX5s)@Ind4caE#^NCLI~a4*v%ZdyzQXq(f@xUr0_jo`VOkat+uO2W%G z6N_f81tYAh=fz$EY|MKn{agO>?~506nW!rmZA3qR6M)U8*(FJqHqkG{*#vTL7y{l5 zZWDAPgrA(<+srE7E9=+!UU_-(X7E|3sGCTiZ>V=C$5GhB8X1Bxpoh zgITnT7?ZTBek)PNb?Y+PdWI+u;Ht@Dn3a$RaQOin*y9I;a}BBozwcs=-)zbaAfT(} zl>PKC|Ij`D`8SXM_%Qr5{WgFBZY*W4t9)aOm%29Srzx9Kn0scDk?{>8kk_QQ1s=xk;SdOOhFyW2iO~XkZH572zG29@M&%jo zR?Tdfc*A#D@F~2h-wlWfyXgPk4^if>gw-$4$j8}Wo+(Kxo0%kaWT^yh39x>X)LS<@ z>S~EzR@%G-!~`eY`da>IT#T8x<@&vtO;`8ax+S+I+;+_B23}hT!^l?331PCbXGKO3 z*2sBOiJxw%=rCI^;I~|A+Q#hBpg?6-DAAl!_WUI7m(^(%NCGsZ(Qf*jyK)qE7B)(K^yR z!F{ibgE6ym!!GXU=SE@a>e$XT!3PD9q=6{NsUaa}PkaM$2_)ep9zNI$PAEXi|NXW5 z7{j*!k^x%>nz$?=RP0Mw!!TCO{Qt3o1bH*}tHePd12LJGm>D}k8tcshmRXO?V2-r% zZdOp}GgubkaG9Y+X$Vi^3qZWm00tx*9pGmiu}uGI`n%6x9zMcb_3+p|{aGB+2abt% ze{=BNMk z<tNo@06nFKs*K%=zKz%QLwN?OI36X|f$p(2YB|hxVHtaifCToNSl% zF1`E0+5WqST6Om=Ifuf0`7HBrR!R|`rd;>8cRlk@rDSGemel)Lq(b8E6mnUutbo`B_6O4^~yIxON-;Zu1 z8POs!_-w1fssxwCG!|J?Lz6~YG<<*+OK&_i{I`Ky7@2ZcGk^Iv!u(6Rme%z|;`Fv+ z50MgJt}yMCux`OM)AmccUWq(!;J7u`o-H@L z6N{;DWhpG{@~WU3r>{DXw%-O9TC4N~0xGO~RoaayZqpWyYD4pl5en#CLI#V_`gS4E zeoX(8@Sc}^b}q&u%WgKbXz-&+!n;~iHPnEI&dlKa2ujWda%}-l1QE`d0va>NF}9pk4@UTCD0v_tyGhB!ZR_puR*mW0|k&2#=y<2Hq+ z$A04%Pz|@k>B(6zrG0_oh$wu!9k9I>rT|aXA2usclyMm(Fu4m?r z>e89ACYv25%wobvKc^#iQWANv$FXducmeFVLW9HEZSg?8z4qsx1nE+hk!YzU(^5s6 zO`@cUkS>WG9&@@=$aw3k9sf_$ z)0c# z?zMqC;oKe|Id6#HxoCHFmuVl(qcPDfUte+&dhm}kZrd>-U$BtjlDSg^@}4i61*jDeV=VzIfe z1T*@(4brv`323UkATpxM6S7cG4S@m%k%3-AdO6}g$X9E6{p*M4Z**YaGBK>;{X9j@ z>2f!SKK8R1En*vae+d9G<90^zfBrmT-+g+C&a|!R$K`(C8C5opg>Pu)Ox&UEH@O zJ7Q6)x#JK`)vl&}=fr?d)kMrX)28`R#H3v5XFg#gRQDwS?Pi_`yvhMelNk^WujSYm zG2f1mv96T$#vv0I^x_hrGyU98Pw(7d{yGpcBnbI>l{Ctcvz%$Jj|Ln5`-lG{qT(eL zClv%x_Q2Hr3K$IKfr;NW`%f#TNp)Cr4~DU|{XexjE`P}GXxLcsO&8SXn!Hxr>AUia z{ag_xk8DrXN?Ie%)wq^l|B%lQAFt06XztJt>+|)GeZgHTwmZgr`H$@atB>azJ%YSTVaYGveC(Jy!ASEYh^Cj)DMe22Xb8o2P~ zk=%C2E7VOO^6kMlW_A}J=Rco-^?&j1p667NWruASJASd`^Zr)w9tF1|8&$iCdTmO3 zDhqgtcL^8p$G7ga#sECy#})kO7e-Jr(HrFfVR6gGaUs;VzH4{6u=o7#`>hs|1u=oO z?N~tmQkQiK(Gi>}WJ?<06^8j|8=ANivs~sE;KkoW80tV@h01 zRzVli;HH|l>6$MZd@b~iU-eys(E-W)e``H+ZirG5WTdsi{1cfhXv6^(CY8yhO*|`f z+-2QB6jaS~4SZ$e0$C(3%MqIB<(bHQT^tM%OnuRln3`O36Kn>+8vw8+U0dW$LU6D> zyG-*&3HeB1jGt5Ut8@uhXj{%EPc)`V9F^XoX( z-ITO&V#|&B?|<)Xf-i`7{rlhh4qxbo=5qD(=daJx8^L1y>RfchPuE338CvjVxzJ(P z#eMW82CEH{>kAHf2`t)ePHdJTiV>2l&pd@VI65&{ExQud7+3drZq?7F! zt0IkG;!Dh#zOgM4ss45N_%J?nkIS3r_u;0bv|#7~y2|7QZU785DHH;vxdU9#Vz`77 zM5gs%ebQk3idGVllrSq*h7Bp?{jp+y-L z$s|eVRdx87`YwUNuHfZ1xg~)k8mvzEjxA=fJr#`C^uuealzv?#iCsi%gbPL%KsAV> zVXw6<`p1|T32Am_m~=?P02OBk09_l+_u)x=kIrU6=9(aJ-0Xzlv~y327idC@j+mf~ zfFNA^U@U|0t!^AtEQ#yOsn?K}FYzR17*@c#bvzE~B~Iy>4BL&(_%>YHa*1AELos3c z72f_XBf>pOq9)YN0^TB0uz;BbC1X+vk=TeFGxlv93bGxN)D?SM*^}5iP2hZLhpH?q z@e$s-NkrA$8?~h`psq=&S(B<09rsQv160~4bw*moaNUkJ-B$#$1pD7(RrL4D zKbJ9FVp;sHWQCmgWm`^%Qq7EyP|`2RlNaMs zWR5%#MGi#&Z#!cDPpxY%S<7y2H)e11&a2Ngd04oW@{4IZ`Y2vWYow6*TsyV?v4@{* z#YT&1Z8!jrSbAk*uf{?zJiGA)_$TC?i%hgPE!-@mt=E?1-V)^}9Nth|F!QVo=M?(HOQDNOzZ0xb%RHn4^E+1x`;+d&YJj)e$$XB+wS@$2)$r^f&`5;SpqXd76r zyH>zSg3Et9a1eM+xz|IC+2ei~CS!Bzi>j;P3xzRsln`S58fqs&L5Kv?s63U0y4CFO zK7IW-JwH#<{Cc;!!MnMwDNE;->kDXy@Bc-?!%%yqAiI z&n_I@NeydKjSdBwd~R}fv}xWnI0b~keAnaUYQCsRZ=dx@PU2lR{4(tx$XpKa$_zc6 zP+aJ`CV@|BE=<6GLL_&ux)0=uboLTuVm8hq%Eb`F+G4((5078BiQG1Fd-C{@WT8Z9&*lzxR_Oc5 z$Aa5n$oqT)05tWy*5aqY{4TvLXRIG-S%8QEYXUP?O1_2!*b<&9%%Yp)U8H^acEHIp z;`1(DlE7Fo%VlpoM~t|pZk7&a=w=O>#i?vS^0QrF?{D$DHNdS`BT3tQ z-n=ibfLt;2647(dP#%#gvKZuKnczq3Fd~ldXXB;mh?<)QkWOujH^fea2d?bj_vMKQ z!x>6NT%^g^B*5ts6SLY4ZC=zlXoy@koxPpi(5L+ty;0b9AUu~tZ8>h5vpy)DL+_pd z8Tcg{C3v|)xi_3aKNgf?w%7q-viJ~!;Fk4eI24u%A;%@2z_tWOH;x0zWK5>B+GJU9gc$s1*nHAfB;}5gk_MQ@}B*W^ja4BYcs5K)3JiKmtA<>d^EkIf4MN3P6`inI7|{O?vrMqH z>_ZuQnpHr?vl(px4GV2y=u((Mu!@u^si`*l!UEUP4hDH9GG7ChqP1}bNV!aCWRHFO z{fau(!vt+?NG##rDS5>W(-j#r2lcRRg+`~l8WvYC;j zWirWQ$+ZeNFeM8!(`IL9YYUgrY=84Z+Wsz$@Y)5A!EDmN=&-vlt7HR%E6rUO;^APy^LAlB~P!CUFg%Rz+Nm~ z#d}j$f0~TmV^;9nxvh$VYyMCmQcr6H zySQn@SU%k!yHfU7vDi6Hh<*!;x~XWM>}r?=gRRt7j2PUuDaDPPNI^w(0$Y`-K_3iD z6>iN(|o9E7-cq?@CLnlp_d5UVcUO67k0hns}E;=%|Zu#p#~LKl~3X?D$xd zpF literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/search.php b/trunk/paradiseo-moeo/doc/html/search.php new file mode 100644 index 000000000..bcfd8c505 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/search.php @@ -0,0 +1,381 @@ + + +Search + + + + +\n"; +} + +function readInt($file) +{ + $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file)); + $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file)); + return ($b1<<24)|($b2<<16)|($b3<<8)|$b4; +} + +function readString($file) +{ + $result=""; + while (ord($c=fgetc($file))) $result.=$c; + return $result; +} + +function readHeader($file) +{ + $header =fgetc($file); $header.=fgetc($file); + $header.=fgetc($file); $header.=fgetc($file); + return $header; +} + +function computeIndex($word) +{ + // Fast string hashing + //$lword = strtolower($word); + //$l = strlen($lword); + //for ($i=0;$i<$l;$i++) + //{ + // $c = ord($lword{$i}); + // $v = (($v & 0xfc00) ^ ($v << 6) ^ $c) & 0xffff; + //} + //return $v; + + // Simple hashing that allows for substring search + if (strlen($word)<2) return -1; + // high char of the index + $hi = ord($word{0}); + if ($hi==0) return -1; + // low char of the index + $lo = ord($word{1}); + if ($lo==0) return -1; + // return index + return $hi*256+$lo; +} + +function search($file,$word,&$statsList) +{ + $index = computeIndex($word); + if ($index!=-1) // found a valid index + { + fseek($file,$index*4+4); // 4 bytes per entry, skip header + $index = readInt($file); + if ($index) // found words matching the hash key + { + $start=sizeof($statsList); + $count=$start; + fseek($file,$index); + $w = readString($file); + while ($w) + { + $statIdx = readInt($file); + if ($word==substr($w,0,strlen($word))) + { // found word that matches (as substring) + $statsList[$count++]=array( + "word"=>$word, + "match"=>$w, + "index"=>$statIdx, + "full"=>strlen($w)==strlen($word), + "docs"=>array() + ); + } + $w = readString($file); + } + $totalHi=0; + $totalFreqHi=0; + $totalFreqLo=0; + for ($count=$start;$count $idx, + "freq" => $freq>>1, + "rank" => 0.0, + "hi" => $freq&1 + ); + if ($freq&1) // word occurs in high priority doc + { + $totalHi++; + $totalFreqHi+=$freq*$multiplier; + } + else // word occurs in low priority doc + { + $totalFreqLo+=$freq*$multiplier; + } + } + // read name and url info for the doc + for ($i=0;$i<$numDocs;$i++) + { + fseek($file,$docInfo[$i]["idx"]); + $docInfo[$i]["name"]=readString($file); + $docInfo[$i]["url"]=readString($file); + } + $statInfo["docs"]=$docInfo; + } + $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi; + for ($count=$start;$count$key, + "name"=>$di["name"], + "rank"=>$rank + ); + } + $docs[$key]["words"][] = array( + "word"=>$wordInfo["word"], + "match"=>$wordInfo["match"], + "freq"=>$di["freq"] + ); + } + } + return $docs; +} + +function filter_results($docs,&$requiredWords,&$forbiddenWords) +{ + $filteredDocs=array(); + while (list ($key, $val) = each ($docs)) + { + $words = &$docs[$key]["words"]; + $copy=1; // copy entry by default + if (sizeof($requiredWords)>0) + { + foreach ($requiredWords as $reqWord) + { + $found=0; + foreach ($words as $wordInfo) + { + $found = $wordInfo["word"]==$reqWord; + if ($found) break; + } + if (!$found) + { + $copy=0; // document contains none of the required words + break; + } + } + } + if (sizeof($forbiddenWords)>0) + { + foreach ($words as $wordInfo) + { + if (in_array($wordInfo["word"],$forbiddenWords)) + { + $copy=0; // document contains a forbidden word + break; + } + } + } + if ($copy) $filteredDocs[$key]=$docs[$key]; + } + return $filteredDocs; +} + +function compare_rank($a,$b) +{ + if ($a["rank"] == $b["rank"]) + { + return 0; + } + return ($a["rank"]>$b["rank"]) ? -1 : 1; +} + +function sort_results($docs,&$sorted) +{ + $sorted = $docs; + usort($sorted,"compare_rank"); + return $sorted; +} + +function report_results(&$docs) +{ + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $numDocs = sizeof($docs); + if ($numDocs==0) + { + echo " \n"; + echo " \n"; + echo " \n"; + } + else + { + echo " \n"; + echo " \n"; + echo " \n"; + $num=1; + foreach ($docs as $doc) + { + echo " \n"; + echo " "; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + $num++; + } + } + echo "

".search_results()."

".matches_text(0)."
".matches_text($numDocs); + echo "\n"; + echo "
$num.".$doc["name"]."
".report_matches()." "; + foreach ($doc["words"] as $wordInfo) + { + $word = $wordInfo["word"]; + $matchRight = substr($wordInfo["match"],strlen($word)); + echo "$word$matchRight(".$wordInfo["freq"].") "; + } + echo "
\n"; +} + +function main() +{ + if(strcmp('4.1.0', phpversion()) > 0) + { + die("Error: PHP version 4.1.0 or above required!"); + } + if (!($file=fopen("search.idx","rb"))) + { + die("Error: Search index file could NOT be opened!"); + } + if (readHeader($file)!="DOXS") + { + die("Error: Header of index file is invalid!"); + } + $query=""; + if (array_key_exists("query", $_GET)) + { + $query=$_GET["query"]; + } + end_form($query); + echo " \n
\n"; + $results = array(); + $requiredWords = array(); + $forbiddenWords = array(); + $foundWords = array(); + $word=strtok($query," "); + while ($word) // for each word in the search query + { + if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; } + if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; } + if (!in_array($word,$foundWords)) + { + $foundWords[]=$word; + search($file,strtolower($word),$results); + } + $word=strtok(" "); + } + $docs = array(); + combine_results($results,$docs); + // filter out documents with forbidden word or that do not contain + // required words + $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords); + // sort the results based on rank + $sorted = array(); + sort_results($filteredDocs,$sorted); + // report results to the user + report_results($sorted); + echo "
\n"; + fclose($file); +} + +main(); + + +?> +
Generated on Tue Jun 26 15:13:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/html/tab_b.gif b/trunk/paradiseo-moeo/doc/html/tab_b.gif new file mode 100644 index 0000000000000000000000000000000000000000..0d623483ffdf5f9f96900108042a7ab0643fe2a3 GIT binary patch literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/tab_l.gif b/trunk/paradiseo-moeo/doc/html/tab_l.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b1e6337c9299a700401a2a78a2c6ffced475216 GIT binary patch literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/tab_r.gif b/trunk/paradiseo-moeo/doc/html/tab_r.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce9dd9f533cb5486d6941844f442b59d4a9e9175 GIT binary patch literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/html/tabs.css b/trunk/paradiseo-moeo/doc/html/tabs.css new file mode 100644 index 000000000..a61552a67 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/tabs.css @@ -0,0 +1,102 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs INPUT +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI#current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI#current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.nav +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; +} diff --git a/trunk/paradiseo-moeo/doc/html/tree.html b/trunk/paradiseo-moeo/doc/html/tree.html new file mode 100644 index 000000000..833b90e7a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/tree.html @@ -0,0 +1,482 @@ + + + + + + + TreeView + + + + +
+

ParadisEO-MOEO

+
+

o*Welcome to ParadisEO-MOEO

+

o+Class List

+
+

|o*MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >

+

|o*moeoAchievementFitnessAssignment< MOEOT >

+

|o*moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >

+

|o*moeoAggregativeComparator< MOEOT >

+

|o*moeoAlgo

+

|o*moeoArchive< MOEOT >

+

|o*moeoArchiveObjectiveVectorSavingUpdater< MOEOT >

+

|o*moeoArchiveUpdater< MOEOT >

+

|o*moeoBinaryMetric< A1, A2, R >

+

|o*moeoBinaryMetricSavingUpdater< MOEOT >

+

|o*moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >

+

|o*moeoCombinedLS< MOEOT, Type >

+

|o*moeoComparator< MOEOT >

+

|o*moeoContributionMetric< ObjectiveVector >

+

|o*moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >

+

|o*moeoCriterionBasedFitnessAssignment< MOEOT >

+

|o*moeoCrowdingDistanceDiversityAssignment< MOEOT >

+

|o*moeoDetTournamentSelect< MOEOT >

+

|o*moeoDistance< MOEOT, Type >

+

|o*moeoDistanceMatrix< MOEOT, Type >

+

|o*moeoDiversityAssignment< MOEOT >

+

|o*moeoDiversityThenFitnessComparator< MOEOT >

+

|o*moeoDummyDiversityAssignment< MOEOT >

+

|o*moeoDummyFitnessAssignment< MOEOT >

+

|o*moeoEA< MOEOT >

+

|o*moeoEasyEA< MOEOT >

+

|o*moeoEasyEA< MOEOT >::eoDummyEval

+

|o*moeoEasyEA< MOEOT >::eoDummySelect

+

|o*moeoEasyEA< MOEOT >::eoDummyTransform

+

|o*moeoElitistReplacement< MOEOT >

+

|o*moeoElitistReplacement< MOEOT >::Cmp

+

|o*moeoEntropyMetric< ObjectiveVector >

+

|o*moeoEnvironmentalReplacement< MOEOT >

+

|o*moeoEnvironmentalReplacement< MOEOT >::Cmp

+

|o*moeoEuclideanDistance< MOEOT >

+

|o*moeoEvalFunc< MOEOT >

+

|o*moeoFastNonDominatedSortingFitnessAssignment< MOEOT >

+

|o*moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator

+

|o*moeoFitnessAssignment< MOEOT >

+

|o*moeoFitnessThenDiversityComparator< MOEOT >

+

|o*moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >

+

|o*moeoFrontByFrontSharingDiversityAssignment< MOEOT >

+

|o*moeoGDominanceObjectiveVectorComparator< ObjectiveVector >

+

|o*moeoGenerationalReplacement< MOEOT >

+

|o*moeoHybridLS< MOEOT >

+

|o*moeoHypervolumeBinaryMetric< ObjectiveVector >

+

|o*moeoIBEA< MOEOT >

+

|o*moeoIndicatorBasedFitnessAssignment< MOEOT >

+

|o*moeoLS< MOEOT, Type >

+

|o*moeoManhattanDistance< MOEOT >

+

|o*moeoMetric

+

|o*moeoNormalizedDistance< MOEOT, Type >

+

|o*moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >

+

|o*moeoNSGA< MOEOT >

+

|o*moeoNSGAII< MOEOT >

+

|o*moeoObjectiveObjectiveVectorComparator< ObjectiveVector >

+

|o*moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >

+

|o*moeoObjectiveVectorComparator< ObjectiveVector >

+

|o*moeoObjectiveVectorDouble< ObjectiveVectorTraits >

+

|o*moeoObjectiveVectorTraits

+

|o*moeoOneObjectiveComparator< MOEOT >

+

|o*moeoParetoBasedFitnessAssignment< MOEOT >

+

|o*moeoParetoObjectiveVectorComparator< ObjectiveVector >

+

|o*moeoRandomSelect< MOEOT >

+

|o*moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >

+

|o*moeoReplacement< MOEOT >

+

|o*moeoRouletteSelect< MOEOT >

+

|o*moeoScalarFitnessAssignment< MOEOT >

+

|o*moeoSelectFromPopAndArch< MOEOT >

+

|o*moeoSelectOne< MOEOT >

+

|o*moeoSharingDiversityAssignment< MOEOT >

+

|o*moeoSolutionUnaryMetric< ObjectiveVector, R >

+

|o*moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >

+

|o*moeoStochTournamentSelect< MOEOT >

+

|o*moeoUnaryMetric< A, R >

+

|o*moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >

+

|o*moeoVectorUnaryMetric< ObjectiveVector, R >

+

|\*moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >

+
+

o+Class Hierarchy

+
+

|o+eoFunctorBase [external]

+
+

||o+eoBF< A1, A2, R > [external]

+
+

|||o+eoReplacement< EOT > [external]

+ +

|||o+eoReplacement< MOEOT > [external]

+ +

|||o+eoSelect< MOEOT > [external]

+ +

|||o+moeoBinaryMetric< A1, A2, R >

+ +

|||o+moeoComparator< MOEOT >

+ +

|||o+moeoDistance< MOEOT, Type >

+ +

|||o+moeoDistance< MOEOT, double >

+ +

|||\+moeoObjectiveVectorComparator< ObjectiveVector >

+ +
+

||o+eoBF< const const ObjectiveVector &, ObjectiveVector &, double > [external]

+ +

||o+eoBF< const const ObjectiveVector &, ObjectiveVector &, R > [external]

+ +

||o+eoBF< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, double > [external]

+ +

||o+eoBF< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, R > [external]

+ +

||o+eoBF< Type, moeoArchive< MOEOT > &, void > [external]

+ +

||o+eoF< void > [external]

+ +

||o+eoUF< A1, R > [external]

+ +

||o+eoUF< A, R > [external]

+ +

||o+eoUF< const eoPop< MOEOT > &, void > [external]

+ +

||o+eoUF< const ObjectiveVector &, R > [external]

+ +

||o+eoUF< const std::vector< ObjectiveVector > &, R > [external]

+ +

||o+eoUF< eoPop< MOEOT > &, void > [external]

+ +

||\+moeoMetric

+ +
+

|o+eoObject [external]

+ +

|o+eoPrintable [external]

+
+

||\+eoPersistent [external]

+
+

|| o*EO< MOEOObjectiveVector > [external]

+

|| \*eoPop< MOEOT > [external]

+
+
+

|o+moeoAlgo

+ +

|o*moeoElitistReplacement< MOEOT >::Cmp

+

|o*moeoEnvironmentalReplacement< MOEOT >::Cmp

+

|o*moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >

+

|o+moeoObjectiveVector< ObjectiveVectorTraits, double >

+ +

|\*moeoObjectiveVectorTraits

+
+

o*Class Members

+

\+File List

+
+

 o*index.h

+

 o*make_checkpoint_moeo.h

+

 o*make_continue_moeo.h

+

 o*make_ea_moeo.h

+

 o*MOEO.h

+

 o*moeoAchievementFitnessAssignment.h

+

 o*moeoAdditiveEpsilonBinaryMetric.h

+

 o*moeoAggregativeComparator.h

+

 o*moeoAlgo.h

+

 o*moeoArchive.h

+

 o*moeoArchiveObjectiveVectorSavingUpdater.h

+

 o*moeoArchiveUpdater.h

+

 o*moeoBinaryMetricSavingUpdater.h

+

 o*moeoBitVector.h

+

 o*moeoCombinedLS.h

+

 o*moeoComparator.h

+

 o*moeoContributionMetric.h

+

 o*moeoConvertPopToObjectiveVectors.h

+

 o*moeoCriterionBasedFitnessAssignment.h

+

 o*moeoCrowdingDistanceDiversityAssignment.h

+

 o*moeoDetTournamentSelect.h

+

 o*moeoDistance.h

+

 o*moeoDistanceMatrix.h

+

 o*moeoDiversityAssignment.h

+

 o*moeoDiversityThenFitnessComparator.h

+

 o*moeoDummyDiversityAssignment.h

+

 o*moeoDummyFitnessAssignment.h

+

 o*moeoEA.h

+

 o*moeoEasyEA.h

+

 o*moeoElitistReplacement.h

+

 o*moeoEntropyMetric.h

+

 o*moeoEnvironmentalReplacement.h

+

 o*moeoEuclideanDistance.h

+

 o*moeoEvalFunc.h

+

 o*moeoFastNonDominatedSortingFitnessAssignment.h

+

 o*moeoFitnessAssignment.h

+

 o*moeoFitnessThenDiversityComparator.h

+

 o*moeoFrontByFrontCrowdingDistanceDiversityAssignment.h

+

 o*moeoFrontByFrontSharingDiversityAssignment.h

+

 o*moeoGDominanceObjectiveVectorComparator.h

+

 o*moeoGenerationalReplacement.h

+

 o*moeoHybridLS.h

+

 o*moeoHypervolumeBinaryMetric.h

+

 o*moeoIBEA.h

+

 o*moeoIndicatorBasedFitnessAssignment.h

+

 o*moeoLS.h

+

 o*moeoManhattanDistance.h

+

 o*moeoMetric.h

+

 o*moeoNormalizedDistance.h

+

 o*moeoNormalizedSolutionVsSolutionBinaryMetric.h

+

 o*moeoNSGA.h

+

 o*moeoNSGAII.h

+

 o*moeoObjectiveObjectiveVectorComparator.h

+

 o*moeoObjectiveVector.h

+

 o*moeoObjectiveVectorComparator.h

+

 o*moeoObjectiveVectorDouble.h

+

 o*moeoObjectiveVectorTraits.cpp

+

 o*moeoObjectiveVectorTraits.h

+

 o*moeoOneObjectiveComparator.h

+

 o*moeoParetoBasedFitnessAssignment.h

+

 o*moeoParetoObjectiveVectorComparator.h

+

 o*moeoRandomSelect.h

+

 o*moeoRealVector.h

+

 o*moeoReplacement.h

+

 o*moeoRouletteSelect.h

+

 o*moeoScalarFitnessAssignment.h

+

 o*moeoSelectFromPopAndArch.h

+

 o*moeoSelectOne.h

+

 o*moeoSelectors.h

+

 o*moeoSharingDiversityAssignment.h

+

 o*moeoStochTournamentSelect.h

+

 \*moeoVector.h

+
+
+
+ + diff --git a/trunk/paradiseo-moeo/doc/html/webpages.html b/trunk/paradiseo-moeo/doc/html/webpages.html new file mode 100644 index 000000000..224e6b552 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/html/webpages.html @@ -0,0 +1,31 @@ + + +ParadisEO-MOEO: Related webpages + + + + +
+
+

Related webpages

+
Generated on Tue Jun 26 15:11:05 2007 for ParadisEO-MOEO by  + +doxygen 1.4.7
+ + diff --git a/trunk/paradiseo-moeo/doc/index.h b/trunk/paradiseo-moeo/doc/index.h new file mode 100644 index 000000000..72ba706bb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/index.h @@ -0,0 +1,44 @@ +/** @mainpage Welcome to ParadisEO-MOEO + +@section intro Introduction + +ParadisEO-MOEO is a white-box object-oriented generic framework dedicated to the flexible design of evolutionary multi-objective algorithms. +This paradigm-free software embeds some features and techniques for Pareto-based resolution and +aims to provide a set of classes allowing to ease and speed up the development of computationally efficient programs. +It is based on a clear conceptual distinction between the solution methods and the multi-objective problems they are intended to solve. +This separation confers a maximum design and code reuse. +ParadisEO-MOEO provides a broad range of archive-related features (such as elitism or performance metrics) +and the most common Pareto-based fitness assignment strategies (MOGA, NSGA, SPEA, IBEA and more). +Furthermore, parallel and distributed models as well as hybridization mechanisms can be applied to an algorithm designed within ParadisEO-MOEO +using the whole version of ParadisEO. + + + +@section tutorials Tutorials + +Tutorials for ParadisEO-MOEO are available here. + + + +@section install Installation + +The installation procedure of the package is detailed in the README file in the top-directory of the source-tree. + + + +@section design Overall Design + +For an introduction to the design of ParadisEO-MOEO, +you can look at the ParadisEO website. +*/ + + + +/** @page webpages Related webpages + +- ParadisEO homepage +- INRIA GForge project page +- README +- NEWS +*/ diff --git a/trunk/paradiseo-moeo/doc/latex/FreeSans.ttf b/trunk/paradiseo-moeo/doc/latex/FreeSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b550b90ba5480f9a3db170a19a1f86daecb0dc92 GIT binary patch literal 22932 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 RlllN>Fk>(~eFPlj{{dxA`xyWL literal 0 HcmV?d00001 diff --git a/trunk/paradiseo-moeo/doc/latex/Makefile b/trunk/paradiseo-moeo/doc/latex/Makefile new file mode 100644 index 000000000..776fcf968 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/Makefile @@ -0,0 +1,39 @@ +all: clean refman.dvi + +ps: refman.ps + +pdf: refman.pdf + +ps_2on1: refman_2on1.ps + +pdf_2on1: refman_2on1.pdf + +refman.ps: refman.dvi + dvips -o refman.ps refman.dvi + +refman.pdf: refman.ps + ps2pdf refman.ps refman.pdf + +refman.dvi: refman.tex doxygen.sty + echo "Running latex..." + latex refman.tex + echo "Running makeindex..." + makeindex refman.idx + echo "Rerunning latex...." + latex refman.tex + latex_count=5 ; \ + while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + latex refman.tex ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + +refman_2on1.ps: refman.ps + psnup -2 refman.ps >refman_2on1.ps + +refman_2on1.pdf: refman_2on1.ps + ps2pdf refman_2on1.ps refman_2on1.pdf + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf diff --git a/trunk/paradiseo-moeo/doc/latex/annotated.tex b/trunk/paradiseo-moeo/doc/latex/annotated.tex new file mode 100644 index 000000000..2d6226215 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/annotated.tex @@ -0,0 +1,81 @@ +\section{Paradis\-EO-MOEO Class List} +Here are the classes, structs, unions and interfaces with brief descriptions:\begin{CompactList} +\item\contentsline{section}{\bf{MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} (Base class allowing to represent a solution (an individual) for multi-objective optimization )}{\pageref{classMOEO}}{} +\item\contentsline{section}{\bf{moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$} (Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980) )}{\pageref{classmoeoAchievementFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$} (Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C )}{\pageref{classmoeoAdditiveEpsilonBinaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-Aggregative\-Comparator$<$ MOEOT $>$} (Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value )}{\pageref{classmoeoAggregativeComparator}}{} +\item\contentsline{section}{\bf{moeo\-Algo} (Abstract class for multi-objective algorithms )}{\pageref{classmoeoAlgo}}{} +\item\contentsline{section}{\bf{moeo\-Archive$<$ MOEOT $>$} (An archive is a secondary population that stores non-dominated solutions )}{\pageref{classmoeoArchive}}{} +\item\contentsline{section}{\bf{moeo\-Archive\-Objective\-Vector\-Saving\-Updater$<$ MOEOT $>$} (This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation )}{\pageref{classmoeoArchiveObjectiveVectorSavingUpdater}}{} +\item\contentsline{section}{\bf{moeo\-Archive\-Updater$<$ MOEOT $>$} (This class allows to update the archive at each generation with newly found non-dominated solutions )}{\pageref{classmoeoArchiveUpdater}}{} +\item\contentsline{section}{\bf{moeo\-Binary\-Metric$<$ A1, A2, R $>$} (Base class for binary metrics )}{\pageref{classmoeoBinaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-Binary\-Metric\-Saving\-Updater$<$ MOEOT $>$} (This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file )}{\pageref{classmoeoBinaryMetricSavingUpdater}}{} +\item\contentsline{section}{\bf{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} (This class is an implementationeo of a simple bit-valued \doxyref{moeo\-Vector}{p.}{classmoeoVector} )}{\pageref{classmoeoBitVector}}{} +\item\contentsline{section}{\bf{moeo\-Combined\-LS$<$ MOEOT, Type $>$} (This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions )}{\pageref{classmoeoCombinedLS}}{} +\item\contentsline{section}{\bf{moeo\-Comparator$<$ MOEOT $>$} (Functor allowing to compare two solutions )}{\pageref{classmoeoComparator}}{} +\item\contentsline{section}{\bf{moeo\-Contribution\-Metric$<$ Objective\-Vector $>$} (The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc )}{\pageref{classmoeoContributionMetric}}{} +\item\contentsline{section}{\bf{moeo\-Convert\-Pop\-To\-Objective\-Vectors$<$ MOEOT, Objective\-Vector $>$} (Functor allowing to get a vector of objective vectors from a population )}{\pageref{classmoeoConvertPopToObjectiveVectors}}{} +\item\contentsline{section}{\bf{moeo\-Criterion\-Based\-Fitness\-Assignment$<$ MOEOT $>$} (Moeo\-Criterion\-Based\-Fitness\-Assignment is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for criterion-based strategies )}{\pageref{classmoeoCriterionBasedFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} (Diversity assignment sheme based on crowding distance proposed in: K )}{\pageref{classmoeoCrowdingDistanceDiversityAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Det\-Tournament\-Select$<$ MOEOT $>$} (Selection strategy that selects ONE individual by deterministic tournament )}{\pageref{classmoeoDetTournamentSelect}}{} +\item\contentsline{section}{\bf{moeo\-Distance$<$ MOEOT, Type $>$} (The base class for distance computation )}{\pageref{classmoeoDistance}}{} +\item\contentsline{section}{\bf{moeo\-Distance\-Matrix$<$ MOEOT, Type $>$} (A matrix to compute distances between every pair of individuals contained in a population )}{\pageref{classmoeoDistanceMatrix}}{} +\item\contentsline{section}{\bf{moeo\-Diversity\-Assignment$<$ MOEOT $>$} (Functor that sets the diversity values of a whole population )}{\pageref{classmoeoDiversityAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Diversity\-Then\-Fitness\-Comparator$<$ MOEOT $>$} (Functor allowing to compare two solutions according to their diversity values, then according to their fitness values )}{\pageref{classmoeoDiversityThenFitnessComparator}}{} +\item\contentsline{section}{\bf{moeo\-Dummy\-Diversity\-Assignment$<$ MOEOT $>$} (Moeo\-Dummy\-Diversity\-Assignment is a \doxyref{moeo\-Diversity\-Assignment}{p.}{classmoeoDiversityAssignment} that gives the value '0' as the individual's diversity for a whole population if it is invalid )}{\pageref{classmoeoDummyDiversityAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Dummy\-Fitness\-Assignment$<$ MOEOT $>$} (Moeo\-Dummy\-Fitness\-Assignment is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} that gives the value '0' as the individual's fitness for a whole population if it is invalid )}{\pageref{classmoeoDummyFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-EA$<$ MOEOT $>$} (Abstract class for multi-objective evolutionary algorithms )}{\pageref{classmoeoEA}}{} +\item\contentsline{section}{\bf{moeo\-Easy\-EA$<$ MOEOT $>$} (An easy class to design multi-objective evolutionary algorithms )}{\pageref{classmoeoEasyEA}}{} +\item\contentsline{section}{\bf{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Eval} (\doxyref{Dummy} eval )}{\pageref{classmoeoEasyEA_1_1eoDummyEval}}{} +\item\contentsline{section}{\bf{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Select} (\doxyref{Dummy} select )}{\pageref{classmoeoEasyEA_1_1eoDummySelect}}{} +\item\contentsline{section}{\bf{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Transform} (\doxyref{Dummy} transform )}{\pageref{classmoeoEasyEA_1_1eoDummyTransform}}{} +\item\contentsline{section}{\bf{moeo\-Elitist\-Replacement$<$ MOEOT $>$} (Elitist replacement strategy that consists in keeping the N best individuals )}{\pageref{classmoeoElitistReplacement}}{} +\item\contentsline{section}{\bf{moeo\-Elitist\-Replacement$<$ MOEOT $>$::Cmp} (This object is used to compare solutions in order to sort the population )}{\pageref{classmoeoElitistReplacement_1_1Cmp}}{} +\item\contentsline{section}{\bf{moeo\-Entropy\-Metric$<$ Objective\-Vector $>$} (The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc )}{\pageref{classmoeoEntropyMetric}}{} +\item\contentsline{section}{\bf{moeo\-Environmental\-Replacement$<$ MOEOT $>$} (Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion )}{\pageref{classmoeoEnvironmentalReplacement}}{} +\item\contentsline{section}{\bf{moeo\-Environmental\-Replacement$<$ MOEOT $>$::Cmp} (This object is used to compare solutions in order to sort the population )}{\pageref{classmoeoEnvironmentalReplacement_1_1Cmp}}{} +\item\contentsline{section}{\bf{moeo\-Euclidean\-Distance$<$ MOEOT $>$} (A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e )}{\pageref{classmoeoEuclideanDistance}}{} +\item\contentsline{section}{\bf{moeo\-Eval\-Func$<$ MOEOT $>$} }{\pageref{classmoeoEvalFunc}}{} +\item\contentsline{section}{\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$} (Fitness assignment sheme based on Pareto-dominance count proposed in: N )}{\pageref{classmoeoFastNonDominatedSortingFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::Objective\-Comparator} (Functor allowing to compare two solutions according to their first objective value, then their second, and so on )}{\pageref{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator}}{} +\item\contentsline{section}{\bf{moeo\-Fitness\-Assignment$<$ MOEOT $>$} (Functor that sets the fitness values of a whole population )}{\pageref{classmoeoFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Fitness\-Then\-Diversity\-Comparator$<$ MOEOT $>$} (Functor allowing to compare two solutions according to their fitness values, then according to their diversity values )}{\pageref{classmoeoFitnessThenDiversityComparator}}{} +\item\contentsline{section}{\bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} (Diversity assignment sheme based on crowding distance proposed in: K )}{\pageref{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} (Sharing assignment scheme on the way it is used in NSGA )}{\pageref{classmoeoFrontByFrontSharingDiversityAssignment}}{} +\item\contentsline{section}{\bf{moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} (This functor class allows to compare 2 objective vectors according to g-dominance )}{\pageref{classmoeoGDominanceObjectiveVectorComparator}}{} +\item\contentsline{section}{\bf{moeo\-Generational\-Replacement$<$ MOEOT $>$} (Generational replacement: only the new individuals are preserved )}{\pageref{classmoeoGenerationalReplacement}}{} +\item\contentsline{section}{\bf{moeo\-Hybrid\-LS$<$ MOEOT $>$} (This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified )}{\pageref{classmoeoHybridLS}}{} +\item\contentsline{section}{\bf{moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$} (Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., K\~{A}¼nzli S )}{\pageref{classmoeoHypervolumeBinaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-IBEA$<$ MOEOT $>$} (IBEA (Indicator-Based Evolutionary Algorithm) as described in: E )}{\pageref{classmoeoIBEA}}{} +\item\contentsline{section}{\bf{moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$} (Fitness assignment sheme based an Indicator proposed in: E )}{\pageref{classmoeoIndicatorBasedFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-LS$<$ MOEOT, Type $>$} (Abstract class for local searches applied to multi-objective optimization )}{\pageref{classmoeoLS}}{} +\item\contentsline{section}{\bf{moeo\-Manhattan\-Distance$<$ MOEOT $>$} (A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e )}{\pageref{classmoeoManhattanDistance}}{} +\item\contentsline{section}{\bf{moeo\-Metric} (Base class for performance metrics (also known as quality indicators) )}{\pageref{classmoeoMetric}}{} +\item\contentsline{section}{\bf{moeo\-Normalized\-Distance$<$ MOEOT, Type $>$} (The base class for double distance computation with normalized objective values (i.e )}{\pageref{classmoeoNormalizedDistance}}{} +\item\contentsline{section}{\bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$} (Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values )}{\pageref{classmoeoNormalizedSolutionVsSolutionBinaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-NSGA$<$ MOEOT $>$} (NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N )}{\pageref{classmoeoNSGA}}{} +\item\contentsline{section}{\bf{moeo\-NSGAII$<$ MOEOT $>$} (NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S )}{\pageref{classmoeoNSGAII}}{} +\item\contentsline{section}{\bf{moeo\-Objective\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} (Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on )}{\pageref{classmoeoObjectiveObjectiveVectorComparator}}{} +\item\contentsline{section}{\bf{moeo\-Objective\-Vector$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$} (Abstract class allowing to represent a solution in the objective space (phenotypic representation) )}{\pageref{classmoeoObjectiveVector}}{} +\item\contentsline{section}{\bf{moeo\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} (Abstract class allowing to compare 2 objective vectors )}{\pageref{classmoeoObjectiveVectorComparator}}{} +\item\contentsline{section}{\bf{moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$} (This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e )}{\pageref{classmoeoObjectiveVectorDouble}}{} +\item\contentsline{section}{\bf{moeo\-Objective\-Vector\-Traits} (A traits class for \doxyref{moeo\-Objective\-Vector}{p.}{classmoeoObjectiveVector} to specify the number of objectives and which ones have to be minimized or maximized )}{\pageref{classmoeoObjectiveVectorTraits}}{} +\item\contentsline{section}{\bf{moeo\-One\-Objective\-Comparator$<$ MOEOT $>$} (Functor allowing to compare two solutions according to one objective )}{\pageref{classmoeoOneObjectiveComparator}}{} +\item\contentsline{section}{\bf{moeo\-Pareto\-Based\-Fitness\-Assignment$<$ MOEOT $>$} (Moeo\-Pareto\-Based\-Fitness\-Assignment is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for Pareto-based strategies )}{\pageref{classmoeoParetoBasedFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Pareto\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} (This functor class allows to compare 2 objective vectors according to Pareto dominance )}{\pageref{classmoeoParetoObjectiveVectorComparator}}{} +\item\contentsline{section}{\bf{moeo\-Random\-Select$<$ MOEOT $>$} (Selection strategy that selects only one element randomly from a whole population )}{\pageref{classmoeoRandomSelect}}{} +\item\contentsline{section}{\bf{moeo\-Real\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} (This class is an implementation of a simple double-valued \doxyref{moeo\-Vector}{p.}{classmoeoVector} )}{\pageref{classmoeoRealVector}}{} +\item\contentsline{section}{\bf{moeo\-Replacement$<$ MOEOT $>$} (Replacement strategy for multi-objective optimization )}{\pageref{classmoeoReplacement}}{} +\item\contentsline{section}{\bf{moeo\-Roulette\-Select$<$ MOEOT $>$} (Selection strategy that selects ONE individual by using roulette wheel process )}{\pageref{classmoeoRouletteSelect}}{} +\item\contentsline{section}{\bf{moeo\-Scalar\-Fitness\-Assignment$<$ MOEOT $>$} (Moeo\-Scalar\-Fitness\-Assignment is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for scalar strategies )}{\pageref{classmoeoScalarFitnessAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Select\-From\-Pop\-And\-Arch$<$ MOEOT $>$} (Elitist selection process that consists in choosing individuals in the archive as well as in the current population )}{\pageref{classmoeoSelectFromPopAndArch}}{} +\item\contentsline{section}{\bf{moeo\-Select\-One$<$ MOEOT $>$} (Selection strategy for multi-objective optimization that selects only one element from a whole population )}{\pageref{classmoeoSelectOne}}{} +\item\contentsline{section}{\bf{moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} (Sharing assignment scheme originally porposed by: D )}{\pageref{classmoeoSharingDiversityAssignment}}{} +\item\contentsline{section}{\bf{moeo\-Solution\-Unary\-Metric$<$ Objective\-Vector, R $>$} (Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector )}{\pageref{classmoeoSolutionUnaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$} (Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors )}{\pageref{classmoeoSolutionVsSolutionBinaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$} (Selection strategy that selects ONE individual by stochastic tournament )}{\pageref{classmoeoStochTournamentSelect}}{} +\item\contentsline{section}{\bf{moeo\-Unary\-Metric$<$ A, R $>$} (Base class for unary metrics )}{\pageref{classmoeoUnaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$} (Base class for fixed length chromosomes, just derives from \doxyref{MOEO}{p.}{classMOEO} and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison) )}{\pageref{classmoeoVector}}{} +\item\contentsline{section}{\bf{moeo\-Vector\-Unary\-Metric$<$ Objective\-Vector, R $>$} (Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors) )}{\pageref{classmoeoVectorUnaryMetric}}{} +\item\contentsline{section}{\bf{moeo\-Vector\-Vs\-Vector\-Binary\-Metric$<$ Objective\-Vector, R $>$} (Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors) )}{\pageref{classmoeoVectorVsVectorBinaryMetric}}{} +\end{CompactList} diff --git a/trunk/paradiseo-moeo/doc/latex/classMOEO.eps b/trunk/paradiseo-moeo/doc/latex/classMOEO.eps new file mode 100644 index 000000000..a23d66bea --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classMOEO.eps @@ -0,0 +1,243 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 80.6452 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 6.2 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 6 def +/cols 3 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(EO< MOEOObjectiveVector >) cw +(eoObject) cw +(eoPersistent) cw +(eoPrintable) cw +(moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >) cw +(moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >) cw +(moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >) cw +(moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 1 2 box + (EO< MOEOObjectiveVector >) 1 3 box + (eoObject) 0.5 4 box + (eoPersistent) 1.5 4 box + (eoPrintable) 1.5 5 box + (moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >) 0 1 box + (moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >) 1 1 box + (moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >) 2 1 box + (moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 1 0 box + (moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 2 0 box + +% ----- relations ----- + +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +0.5 1.5 4 conn +solid +1 0.5 4 in +solid +1 1.5 4 in +solid +0 1.5 4 out +solid +1 1.5 5 in +solid +1 1 1.25 out +solid +0 2 2 conn +solid +0 0 1.75 in +solid +0 1 1.75 in +solid +1 1 0.25 out +solid +0 2 1.75 in +solid +1 2 0.25 out +solid +0 1 0.75 in +solid +0 2 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classMOEO.tex b/trunk/paradiseo-moeo/doc/latex/classMOEO.tex new file mode 100644 index 000000000..06e3ed232 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classMOEO.tex @@ -0,0 +1,226 @@ +\section{MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$ Class Template Reference} +\label{classMOEO}\index{MOEO@{MOEO}} +Base class allowing to represent a solution (an individual) for multi-objective optimization. + + +{\tt \#include $<$MOEO.h$>$} + +Inheritance diagram for MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.25806cm]{classMOEO} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOObjective\-Vector \bf{Objective\-Vector}\label{classMOEO_9fafca99234ef3cd9fdbaf05bde5a275} + +\begin{CompactList}\small\item\em the objective vector type of a solution \item\end{CompactList}\item +typedef MOEOFitness \bf{Fitness}\label{classMOEO_03184b6c0b5c905e0ff5a790a3d55803} + +\begin{CompactList}\small\item\em the fitness type of a solution \item\end{CompactList}\item +typedef MOEODiversity \bf{Diversity}\label{classMOEO_9682a883fedc6333e95906e02236d492} + +\begin{CompactList}\small\item\em the diversity type of a solution \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{MOEO} ()\label{classMOEO_cff537a68ecc80c753318d3e12f842f5} + +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +virtual \bf{$\sim$MOEO} ()\label{classMOEO_0215e9acab4ab57088175f9856e6c48c} + +\begin{CompactList}\small\item\em Virtual dtor. \item\end{CompactList}\item +\bf{Objective\-Vector} \bf{objective\-Vector} () const \label{classMOEO_7509143b0f18644e7d3183a039cece7b} + +\begin{CompactList}\small\item\em Returns the objective vector of the current solution. \item\end{CompactList}\item +void \bf{objective\-Vector} (const \bf{Objective\-Vector} \&\_\-objective\-Vector\-Value) +\begin{CompactList}\small\item\em Sets the objective vector of the current solution. \item\end{CompactList}\item +void \bf{invalidate\-Objective\-Vector} ()\label{classMOEO_6b75e7e84726cf4e2d50216a35cec70b} + +\begin{CompactList}\small\item\em Sets the objective vector as invalid. \item\end{CompactList}\item +bool \bf{invalid\-Objective\-Vector} () const \label{classMOEO_c8e93beabdab8c2f79f17c7e39efdd05} + +\begin{CompactList}\small\item\em Returns true if the objective vector is invalid, false otherwise. \item\end{CompactList}\item +\bf{Fitness} \bf{fitness} () const \label{classMOEO_c02c16902f914a6fde83a33d2c8b1534} + +\begin{CompactList}\small\item\em Returns the fitness value of the current solution. \item\end{CompactList}\item +void \bf{fitness} (const \bf{Fitness} \&\_\-fitness\-Value) +\begin{CompactList}\small\item\em Sets the fitness value of the current solution. \item\end{CompactList}\item +void \bf{invalidate\-Fitness} ()\label{classMOEO_55876e2e7cd537052fec1c7f46f37ffe} + +\begin{CompactList}\small\item\em Sets the fitness value as invalid. \item\end{CompactList}\item +bool \bf{invalid\-Fitness} () const \label{classMOEO_9423f9daebb1f7be6d52c80692e4af48} + +\begin{CompactList}\small\item\em Returns true if the fitness value is invalid, false otherwise. \item\end{CompactList}\item +\bf{Diversity} \bf{diversity} () const \label{classMOEO_c610f4636e8c26a351fcfbc25028aa01} + +\begin{CompactList}\small\item\em Returns the diversity value of the current solution. \item\end{CompactList}\item +void \bf{diversity} (const \bf{Diversity} \&\_\-diversity\-Value) +\begin{CompactList}\small\item\em Sets the diversity value of the current solution. \item\end{CompactList}\item +void \bf{invalidate\-Diversity} ()\label{classMOEO_1283a27baab9728673445832e6d4301a} + +\begin{CompactList}\small\item\em Sets the diversity value as invalid. \item\end{CompactList}\item +bool \bf{invalid\-Diversity} () const \label{classMOEO_c4941e8e600fd360fdf1b061ee938e34} + +\begin{CompactList}\small\item\em Returns true if the diversity value is invalid, false otherwise. \item\end{CompactList}\item +void \bf{invalidate} ()\label{classMOEO_1069501a40e07071d78c067c46b696ee} + +\begin{CompactList}\small\item\em Sets the objective vector, the fitness value and the diversity value as invalid. \item\end{CompactList}\item +bool \bf{invalid} () const \label{classMOEO_314df446d1a9211121cedb2629da8906} + +\begin{CompactList}\small\item\em Returns true if the fitness value is invalid, false otherwise. \item\end{CompactList}\item +bool \bf{operator$<$} (const \bf{MOEO} \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the objective vector of the current solution is smaller than the objective vector of \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \item\end{CompactList}\item +virtual std::string \bf{class\-Name} () const \label{classMOEO_ca43305b2f4d1b1933f7e1c579404379} + +\begin{CompactList}\small\item\em Return the class id (the class name as a std::string). \item\end{CompactList}\item +virtual void \bf{print\-On} (std::ostream \&\_\-os) const +\begin{CompactList}\small\item\em Writing object. \item\end{CompactList}\item +virtual void \bf{read\-From} (std::istream \&\_\-is) +\begin{CompactList}\small\item\em Reading object. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{Objective\-Vector} \bf{objective\-Vector\-Value}\label{classMOEO_26b6fd1187b825b655d5a34b1d0693c9} + +\begin{CompactList}\small\item\em the objective vector of this solution \item\end{CompactList}\item +bool \bf{invalid\-Objective\-Vector\-Value}\label{classMOEO_d07613f286ef484f164c51c9c1b2dc91} + +\begin{CompactList}\small\item\em true if the objective vector is invalid \item\end{CompactList}\item +\bf{Fitness} \bf{fitness\-Value}\label{classMOEO_bcc3104ab7311fa5987de80811393c7c} + +\begin{CompactList}\small\item\em the fitness value of this solution \item\end{CompactList}\item +bool \bf{invalid\-Fitness\-Value}\label{classMOEO_17f57546c6de38604d6749cc6ef9d254} + +\begin{CompactList}\small\item\em true if the fitness value is invalid \item\end{CompactList}\item +\bf{Diversity} \bf{diversity\-Value}\label{classMOEO_83cc0d3a4020cbd7e1ff895dfedc61eb} + +\begin{CompactList}\small\item\em the diversity value of this solution \item\end{CompactList}\item +bool \bf{invalid\-Diversity\-Value}\label{classMOEO_c53c08b7c51d4cc06efe58c6127f9b7d} + +\begin{CompactList}\small\item\em true if the diversity value is invalid \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ class MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} + +Base class allowing to represent a solution (an individual) for multi-objective optimization. + +The template argument MOEOObjective\-Vector allows to represent the solution in the objective space (it can be a \doxyref{moeo\-Objective\-Vector}{p.}{classmoeoObjectiveVector} object). The template argument MOEOFitness is an object reflecting the quality of the solution in term of convergence (the fitness of a solution is always to be maximized). The template argument MOEODiversity is an object reflecting the quality of the solution in term of diversity (the diversity of a solution is always to be maximized). All template arguments must have a void and a copy constructor. Using some specific representations, you will have to define a copy constructor if the default one is not what you want. In the same cases, you will also have to define the affectation operator (operator=). Then, you will explicitly have to call the parent copy constructor and the parent affectation operator at the beginning of the corresponding implementation. Besides, note that, contrary to the mono-objective case (and to \doxyref{EO}) where the fitness value of a solution is confused with its objective value, the fitness value differs of the objectives values in the multi-objective case. + + + +Definition at line 34 of file MOEO.h. + +\subsection{Member Function Documentation} +\index{MOEO@{MOEO}!objectiveVector@{objectiveVector}} +\index{objectiveVector@{objectiveVector}!MOEO@{MOEO}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ void \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::objective\-Vector (const \bf{Objective\-Vector} \& {\em \_\-objective\-Vector\-Value})\hspace{0.3cm}{\tt [inline]}}\label{classMOEO_d4a765a76f9acc1bca36297ab55d7282} + + +Sets the objective vector of the current solution. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector\-Value}]the new objective vector \end{description} +\end{Desc} + + +Definition at line 85 of file MOEO.h. + +References MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::invalid\-Objective\-Vector\-Value, and MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::objective\-Vector\-Value.\index{MOEO@{MOEO}!fitness@{fitness}} +\index{fitness@{fitness}!MOEO@{MOEO}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ void \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::fitness (const \bf{Fitness} \& {\em \_\-fitness\-Value})\hspace{0.3cm}{\tt [inline]}}\label{classMOEO_4dc05ded73bb60d1a51e282006c8942d} + + +Sets the fitness value of the current solution. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Value}]the new fitness value \end{description} +\end{Desc} + + +Definition at line 127 of file MOEO.h. + +References MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::fitness\-Value, and MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::invalid\-Fitness\-Value.\index{MOEO@{MOEO}!diversity@{diversity}} +\index{diversity@{diversity}!MOEO@{MOEO}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ void \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::diversity (const \bf{Diversity} \& {\em \_\-diversity\-Value})\hspace{0.3cm}{\tt [inline]}}\label{classMOEO_1f0a391984cd14bcf930d1d81dd4848e} + + +Sets the diversity value of the current solution. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-diversity\-Value}]the new diversity value \end{description} +\end{Desc} + + +Definition at line 169 of file MOEO.h. + +References MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::diversity\-Value, and MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::invalid\-Diversity\-Value.\index{MOEO@{MOEO}!operator<@{operator$<$}} +\index{operator<@{operator$<$}!MOEO@{MOEO}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ bool \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::operator$<$ (const \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classMOEO_119ef916de4955298febaf3e1c8ad705} + + +Returns true if the objective vector of the current solution is smaller than the objective vector of \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). + +You should implement another function in the sub-class of \doxyref{MOEO}{p.}{classMOEO} to have another sorting mecanism. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{MOEO}{p.}{classMOEO} object to compare with \end{description} +\end{Desc} + + +Definition at line 220 of file MOEO.h. + +References MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::objective\-Vector().\index{MOEO@{MOEO}!printOn@{printOn}} +\index{printOn@{printOn}!MOEO@{MOEO}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ virtual void \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::print\-On (std::ostream \& {\em \_\-os}) const\hspace{0.3cm}{\tt [inline, virtual]}}\label{classMOEO_a3b6074b3289585bf4dc6998e8397e24} + + +Writing object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-os}]output stream \end{description} +\end{Desc} + + +Reimplemented from \bf{EO$<$ MOEOObjective\-Vector $>$}. + +Reimplemented in \bf{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} \doxyref{p.}{classmoeoBitVector_78f821c548cf46d8bcd30aa8a52ffb7c}, \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$} \doxyref{p.}{classmoeoVector_d0a92cb26483ffab754ac4a0efb76308}, \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, bool $>$} \doxyref{p.}{classmoeoVector_d0a92cb26483ffab754ac4a0efb76308}, and \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, double $>$} \doxyref{p.}{classmoeoVector_d0a92cb26483ffab754ac4a0efb76308}. + +Definition at line 239 of file MOEO.h. + +References MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::invalid\-Objective\-Vector(), and MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::objective\-Vector\-Value.\index{MOEO@{MOEO}!readFrom@{readFrom}} +\index{readFrom@{readFrom}!MOEO@{MOEO}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ virtual void \bf{MOEO}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::read\-From (std::istream \& {\em \_\-is})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classMOEO_1bbd9cb1a7709592bf4bc29dff8c5273} + + +Reading object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-is}]input stream \end{description} +\end{Desc} + + +Reimplemented from \bf{EO$<$ MOEOObjective\-Vector $>$}. + +Reimplemented in \bf{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} \doxyref{p.}{classmoeoBitVector_31cd3f894615d0a27dd116a5c8082521}, \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$} \doxyref{p.}{classmoeoVector_cd8ee0fe79bb9515b29e2a4d3fee5ab9}, \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, bool $>$} \doxyref{p.}{classmoeoVector_cd8ee0fe79bb9515b29e2a4d3fee5ab9}, and \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, double $>$} \doxyref{p.}{classmoeoVector_cd8ee0fe79bb9515b29e2a4d3fee5ab9}. + +Definition at line 256 of file MOEO.h. + +References MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::invalidate\-Objective\-Vector(), MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::invalid\-Objective\-Vector\-Value, and MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::objective\-Vector\-Value. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +MOEO.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.eps new file mode 100644 index 000000000..d447c1718 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 336.7 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.485 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoAchievementFitnessAssignment< MOEOT >) cw +(moeoScalarFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoAchievementFitnessAssignment< MOEOT >) 0 0 box + (moeoScalarFitnessAssignment< MOEOT >) 0 1 box + (moeoFitnessAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.tex new file mode 100644 index 000000000..71218a65c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAchievementFitnessAssignment.tex @@ -0,0 +1,172 @@ +\section{moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoAchievementFitnessAssignment}\index{moeoAchievementFitnessAssignment@{moeoAchievementFitnessAssignment}} +Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). + + +{\tt \#include $<$moeo\-Achievement\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoAchievementFitnessAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoAchievementFitnessAssignment_1a58a88ff0175cf303eb63d8b4f52a26} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Achievement\-Fitness\-Assignment} (\bf{Objective\-Vector} \&\_\-reference, std::vector$<$ double $>$ \&\_\-lambdas, double \_\-spn=0.0001) +\begin{CompactList}\small\item\em Default ctor. \item\end{CompactList}\item +\bf{moeo\-Achievement\-Fitness\-Assignment} (\bf{Objective\-Vector} \&\_\-reference, double \_\-spn=0.0001) +\begin{CompactList}\small\item\em Ctor with default values for lambdas (1/n\-Objectives). \item\end{CompactList}\item +virtual void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness values for every solution contained in the population \_\-pop. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account (nothing to do). \item\end{CompactList}\item +void \bf{set\-Reference} (const \bf{Objective\-Vector} \&\_\-reference) +\begin{CompactList}\small\item\em Sets the reference point. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +double \bf{inf} () const \label{classmoeoAchievementFitnessAssignment_cdc77cfe1180bc792b9de82755828896} + +\begin{CompactList}\small\item\em Returns a big value (regarded as infinite). \item\end{CompactList}\item +void \bf{compute} (MOEOT \&\_\-moeo) +\begin{CompactList}\small\item\em Computes the fitness value for a solution. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{Objective\-Vector} \bf{reference}\label{classmoeoAchievementFitnessAssignment_3f01cc20823b53f440dd1ab5a82c3564} + +\begin{CompactList}\small\item\em the reference point \item\end{CompactList}\item +std::vector$<$ double $>$ \bf{lambdas}\label{classmoeoAchievementFitnessAssignment_2992fb7c43286bef9cd6dc7628fa083a} + +\begin{CompactList}\small\item\em the weighted coefficients vector \item\end{CompactList}\item +double \bf{spn}\label{classmoeoAchievementFitnessAssignment_bf99cd0c85e298bdd1281ef2fb06e7b0} + +\begin{CompactList}\small\item\em an arbitrary small positive number (0 $<$ \_\-spn $<$$<$ 1) \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$} + +Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). + + + +Definition at line 24 of file moeo\-Achievement\-Fitness\-Assignment.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}!moeoAchievementFitnessAssignment@{moeoAchievementFitnessAssignment}} +\index{moeoAchievementFitnessAssignment@{moeoAchievementFitnessAssignment}!moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Achievement\-Fitness\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Achievement\-Fitness\-Assignment} (\bf{Objective\-Vector} \& {\em \_\-reference}, std::vector$<$ double $>$ \& {\em \_\-lambdas}, double {\em \_\-spn} = {\tt 0.0001})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoAchievementFitnessAssignment_52ae7d8112e66813232172a26d03cbb8} + + +Default ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-reference}]reference point vector \item[{\em \_\-lambdas}]weighted coefficients vector \item[{\em \_\-spn}]arbitrary small positive number (0 $<$ \_\-spn $<$$<$ 1) \end{description} +\end{Desc} + + +Definition at line 38 of file moeo\-Achievement\-Fitness\-Assignment.h. + +References moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::spn.\index{moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}!moeoAchievementFitnessAssignment@{moeoAchievementFitnessAssignment}} +\index{moeoAchievementFitnessAssignment@{moeoAchievementFitnessAssignment}!moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Achievement\-Fitness\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Achievement\-Fitness\-Assignment} (\bf{Objective\-Vector} \& {\em \_\-reference}, double {\em \_\-spn} = {\tt 0.0001})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoAchievementFitnessAssignment_75d9668a256381ef764352d705dcf47a} + + +Ctor with default values for lambdas (1/n\-Objectives). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-reference}]reference point vector \item[{\em \_\-spn}]arbitrary small positive number (0 $<$ \_\-spn $<$$<$ 1) \end{description} +\end{Desc} + + +Definition at line 54 of file moeo\-Achievement\-Fitness\-Assignment.h. + +References moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::lambdas, and moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::spn. + +\subsection{Member Function Documentation} +\index{moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-Achievement\-Fitness\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoAchievementFitnessAssignment_d5863db9571d7f23a16ca184adf562a3} + + +Sets the fitness values for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 75 of file moeo\-Achievement\-Fitness\-Assignment.h. + +References moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::compute().\index{moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Achievement\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoAchievementFitnessAssignment_a6a2ae6c263dbcea3c16cde4c8a1e5fc} + + +Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account (nothing to do). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implements \bf{moeo\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFitnessAssignment_4922629569eddc9be049b3ead1ab0269}. + +Definition at line 89 of file moeo\-Achievement\-Fitness\-Assignment.h.\index{moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}!setReference@{setReference}} +\index{setReference@{setReference}!moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Achievement\-Fitness\-Assignment}$<$ MOEOT $>$::set\-Reference (const \bf{Objective\-Vector} \& {\em \_\-reference})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoAchievementFitnessAssignment_d200530e3fbdf847dca970ac2265d83d} + + +Sets the reference point. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-reference}]the new reference point \end{description} +\end{Desc} + + +Definition at line 99 of file moeo\-Achievement\-Fitness\-Assignment.h. + +References moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::reference.\index{moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}!compute@{compute}} +\index{compute@{compute}!moeoAchievementFitnessAssignment@{moeo\-Achievement\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Achievement\-Fitness\-Assignment}$<$ MOEOT $>$::compute (MOEOT \& {\em \_\-moeo})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoAchievementFitnessAssignment_7c027540ed0d7f61559f636b6b8a4b29} + + +Computes the fitness value for a solution. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo}]the solution \end{description} +\end{Desc} + + +Definition at line 128 of file moeo\-Achievement\-Fitness\-Assignment.h. + +References moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::inf(), moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::lambdas, moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::reference, and moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::spn. + +Referenced by moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Achievement\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.eps new file mode 100644 index 000000000..cc5b0870f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.eps @@ -0,0 +1,233 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.159 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.78333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 6 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >) cw +(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) cw +(moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >) 0.5 0 box + (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) 0.5 1 box + (moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) 0.5 2 box + (moeoBinaryMetric< A1, A2, R >) 0.5 3 box + (eoBF< A1, A2, R >) 0 4 box + (moeoMetric) 1 4 box + (eoFunctorBase) 0 5 box + (eoFunctorBase) 1 5 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +1 0.5 3 in +solid +0 0.5 3 out +solid +0 1 4 conn +solid +1 0 4 in +solid +0 0 4 out +solid +1 1 4 in +solid +0 1 4 out +solid +1 0 5 in +solid +1 1 5 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.tex new file mode 100644 index 000000000..7f652f420 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAdditiveEpsilonBinaryMetric.tex @@ -0,0 +1,78 @@ +\section{moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoAdditiveEpsilonBinaryMetric}\index{moeoAdditiveEpsilonBinaryMetric@{moeoAdditiveEpsilonBinaryMetric}} +Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C. + + +{\tt \#include $<$moeo\-Additive\-Epsilon\-Binary\-Metric.h$>$} + +Inheritance diagram for moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.70044cm]{classmoeoAdditiveEpsilonBinaryMetric} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +double \bf{operator()} (const Objective\-Vector \&\_\-o1, const Objective\-Vector \&\_\-o2) +\begin{CompactList}\small\item\em Returns the minimal distance by which the objective vector \_\-o1 must be translated in all objectives so that it weakly dominates the objective vector \_\-o2. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +double \bf{epsilon} (const Objective\-Vector \&\_\-o1, const Objective\-Vector \&\_\-o2, const unsigned int \_\-obj) +\begin{CompactList}\small\item\em Returns the epsilon value by which the objective vector \_\-o1 must be translated in the objective \_\-obj so that it dominates the objective vector \_\-o2. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$} + +Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C. + +M., Grunert da Fonseca V.: Performance Assessment of Multiobjective Optimizers: An Analysis and Review. IEEE Transactions on Evolutionary Computation 7(2), pp.117\^{a}€“132 (2003). + + + +Definition at line 24 of file moeo\-Additive\-Epsilon\-Binary\-Metric.h. + +\subsection{Member Function Documentation} +\index{moeoAdditiveEpsilonBinaryMetric@{moeo\-Additive\-Epsilon\-Binary\-Metric}!operator()@{operator()}} +\index{operator()@{operator()}!moeoAdditiveEpsilonBinaryMetric@{moeo\-Additive\-Epsilon\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ double \bf{moeo\-Additive\-Epsilon\-Binary\-Metric}$<$ Objective\-Vector $>$::operator() (const Objective\-Vector \& {\em \_\-o1}, const Objective\-Vector \& {\em \_\-o2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoAdditiveEpsilonBinaryMetric_545aa2c8e6dd93084276763c9d8a3709} + + +Returns the minimal distance by which the objective vector \_\-o1 must be translated in all objectives so that it weakly dominates the objective vector \_\-o2. + +\begin{Desc} +\item[Warning:]don't forget to set the bounds for every objective before the call of this function \end{Desc} +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-o1}]the first objective vector \item[{\em \_\-o2}]the second objective vector \end{description} +\end{Desc} + + +Definition at line 35 of file moeo\-Additive\-Epsilon\-Binary\-Metric.h. + +References moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$::epsilon().\index{moeoAdditiveEpsilonBinaryMetric@{moeo\-Additive\-Epsilon\-Binary\-Metric}!epsilon@{epsilon}} +\index{epsilon@{epsilon}!moeoAdditiveEpsilonBinaryMetric@{moeo\-Additive\-Epsilon\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ double \bf{moeo\-Additive\-Epsilon\-Binary\-Metric}$<$ Objective\-Vector $>$::epsilon (const Objective\-Vector \& {\em \_\-o1}, const Objective\-Vector \& {\em \_\-o2}, const unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoAdditiveEpsilonBinaryMetric_04253f76c832d24a3fd6bc574be54c46} + + +Returns the epsilon value by which the objective vector \_\-o1 must be translated in the objective \_\-obj so that it dominates the objective vector \_\-o2. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-o1}]the first objective vector \item[{\em \_\-o2}]the second objective vector \item[{\em \_\-obj}]the index of the objective \end{description} +\end{Desc} + + +Definition at line 64 of file moeo\-Additive\-Epsilon\-Binary\-Metric.h. + +References moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, double $>$::bounds. + +Referenced by moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Additive\-Epsilon\-Binary\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.eps new file mode 100644 index 000000000..9789f7000 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 313.725 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.59375 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoAggregativeComparator< MOEOT >) cw +(moeoComparator< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoAggregativeComparator< MOEOT >) 0 0 box + (moeoComparator< MOEOT >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.tex new file mode 100644 index 000000000..1455c58cf --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAggregativeComparator.tex @@ -0,0 +1,79 @@ +\section{moeo\-Aggregative\-Comparator$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoAggregativeComparator}\index{moeoAggregativeComparator@{moeoAggregativeComparator}} +Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. + + +{\tt \#include $<$moeo\-Aggregative\-Comparator.h$>$} + +Inheritance diagram for moeo\-Aggregative\-Comparator$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoAggregativeComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Aggregative\-Comparator} (double \_\-weight\-Fitness=1.0, double \_\-weight\-Diversity=1.0) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +const bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 $<$ \_\-moeo2 according to the aggregation of their fitness and diversity values. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +double \bf{weight\-Fitness}\label{classmoeoAggregativeComparator_9ddf44b9e447bee8503c5b9cad9a7df0} + +\begin{CompactList}\small\item\em the weight for fitness \item\end{CompactList}\item +double \bf{weight\-Diversity}\label{classmoeoAggregativeComparator_d4ce25f797af0218c6c8cfca7c73b2d3} + +\begin{CompactList}\small\item\em the weight for diversity \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Aggregative\-Comparator$<$ MOEOT $>$} + +Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. + + + +Definition at line 22 of file moeo\-Aggregative\-Comparator.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoAggregativeComparator@{moeo\-Aggregative\-Comparator}!moeoAggregativeComparator@{moeoAggregativeComparator}} +\index{moeoAggregativeComparator@{moeoAggregativeComparator}!moeoAggregativeComparator@{moeo\-Aggregative\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Aggregative\-Comparator}$<$ MOEOT $>$::\bf{moeo\-Aggregative\-Comparator} (double {\em \_\-weight\-Fitness} = {\tt 1.0}, double {\em \_\-weight\-Diversity} = {\tt 1.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoAggregativeComparator_76cc4d0f5f9bd4984c77410ad8142914} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-weight\-Fitness}]the weight for fitness \item[{\em \_\-weight\-Diversity}]the weight for diversity \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Aggregative\-Comparator.h. + +\subsection{Member Function Documentation} +\index{moeoAggregativeComparator@{moeo\-Aggregative\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoAggregativeComparator@{moeo\-Aggregative\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const bool \bf{moeo\-Aggregative\-Comparator}$<$ MOEOT $>$::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoAggregativeComparator_2f6745ebc2d575e64b162fc250f04b0f} + + +Returns true if \_\-moeo1 $<$ \_\-moeo2 according to the aggregation of their fitness and diversity values. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 40 of file moeo\-Aggregative\-Comparator.h. + +References moeo\-Aggregative\-Comparator$<$ MOEOT $>$::weight\-Diversity, and moeo\-Aggregative\-Comparator$<$ MOEOT $>$::weight\-Fitness. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Aggregative\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.eps new file mode 100644 index 000000000..a43467b12 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.eps @@ -0,0 +1,229 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 52.6316 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 9.5 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 5 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoAlgo) cw +(moeoEA< MOEOT >) cw +(moeoLS< MOEOT, Type >) cw +(moeoEasyEA< MOEOT >) cw +(moeoIBEA< MOEOT >) cw +(moeoNSGA< MOEOT >) cw +(moeoNSGAII< MOEOT >) cw +(moeoCombinedLS< MOEOT, Type >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoAlgo) 2.75 2 box + (moeoEA< MOEOT >) 1.5 1 box + (moeoLS< MOEOT, Type >) 4 1 box + (moeoEasyEA< MOEOT >) 0 0 box + (moeoIBEA< MOEOT >) 1 0 box + (moeoNSGA< MOEOT >) 2 0 box + (moeoNSGAII< MOEOT >) 3 0 box + (moeoCombinedLS< MOEOT, Type >) 4 0 box + +% ----- relations ----- + +solid +1 2.75 1.25 out +solid +1.5 4 2 conn +solid +0 1.5 1.75 in +solid +1 1.5 0.25 out +solid +0 3 1 conn +solid +0 4 1.75 in +solid +1 4 0.25 out +solid +0 0 0.75 in +solid +0 1 0.75 in +solid +0 2 0.75 in +solid +0 3 0.75 in +solid +0 4 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.tex new file mode 100644 index 000000000..528bd7d40 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoAlgo.tex @@ -0,0 +1,25 @@ +\section{moeo\-Algo Class Reference} +\label{classmoeoAlgo}\index{moeoAlgo@{moeoAlgo}} +Abstract class for multi-objective algorithms. + + +{\tt \#include $<$moeo\-Algo.h$>$} + +Inheritance diagram for moeo\-Algo::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=1.47368cm]{classmoeoAlgo} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Abstract class for multi-objective algorithms. + + + +Definition at line 19 of file moeo\-Algo.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Algo.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoArchive.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoArchive.eps new file mode 100644 index 000000000..b035ce904 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoArchive.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 242.424 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.0625 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoArchive< MOEOT >) cw +(eoPop< MOEOT >) cw +(eoObject) cw +(eoPersistent) cw +(eoPrintable) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoArchive< MOEOT >) 0.5 0 box + (eoPop< MOEOT >) 0.5 1 box + (eoObject) 0 2 box + (eoPersistent) 1 2 box + (eoPrintable) 1 3 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoArchive.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoArchive.tex new file mode 100644 index 000000000..56265b135 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoArchive.tex @@ -0,0 +1,170 @@ +\section{moeo\-Archive$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoArchive}\index{moeoArchive@{moeoArchive}} +An archive is a secondary population that stores non-dominated solutions. + + +{\tt \#include $<$moeo\-Archive.h$>$} + +Inheritance diagram for moeo\-Archive$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoArchive} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoArchive_655f6879b14d7b4e65ea03724e5ee601} + +\begin{CompactList}\small\item\em The type of an objective vector for a solution. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Archive} () +\begin{CompactList}\small\item\em Default ctor. \item\end{CompactList}\item +\bf{moeo\-Archive} (\bf{moeo\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \&\_\-comparator) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +bool \bf{dominates} (const \bf{Objective\-Vector} \&\_\-objective\-Vector) const +\begin{CompactList}\small\item\em Returns true if the current archive dominates \_\-objective\-Vector according to the \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} given in the constructor. \item\end{CompactList}\item +bool \bf{contains} (const \bf{Objective\-Vector} \&\_\-objective\-Vector) const +\begin{CompactList}\small\item\em Returns true if the current archive already contains a solution with the same objective values than \_\-objective\-Vector. \item\end{CompactList}\item +void \bf{update} (const MOEOT \&\_\-moeo) +\begin{CompactList}\small\item\em Updates the archive with a given individual \_\-moeo. \item\end{CompactList}\item +void \bf{update} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Updates the archive with a given population \_\-pop. \item\end{CompactList}\item +bool \bf{equals} (const \bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch) +\begin{CompactList}\small\item\em Returns true if the current archive contains the same objective vectors than the given archive \_\-arch. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \& \bf{comparator}\label{classmoeoArchive_59d96d161a53b3ee50df8ca5ad0d0642} + +\begin{CompactList}\small\item\em The \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} used to compare solutions. \item\end{CompactList}\item +\bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \bf{pareto\-Comparator}\label{classmoeoArchive_eefd5b82b1d7f7d60c72683da9cd8682} + +\begin{CompactList}\small\item\em A \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} based on Pareto dominance (used as default). \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Archive$<$ MOEOT $>$} + +An archive is a secondary population that stores non-dominated solutions. + + + +Definition at line 24 of file moeo\-Archive.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoArchive@{moeo\-Archive}!moeoArchive@{moeoArchive}} +\index{moeoArchive@{moeoArchive}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Archive}$<$ MOEOT $>$::\bf{moeo\-Archive} ()\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_a593ca2122484d255b5aa5a0463bd913} + + +Default ctor. + +The \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} used to compare solutions is based on Pareto dominance + +Definition at line 44 of file moeo\-Archive.h.\index{moeoArchive@{moeo\-Archive}!moeoArchive@{moeoArchive}} +\index{moeoArchive@{moeoArchive}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Archive}$<$ MOEOT $>$::\bf{moeo\-Archive} (\bf{moeo\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \& {\em \_\-comparator})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_75e5fee339ca463405434f6f48497de0} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-comparator}]the \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} used to compare solutions \end{description} +\end{Desc} + + +Definition at line 52 of file moeo\-Archive.h. + +\subsection{Member Function Documentation} +\index{moeoArchive@{moeo\-Archive}!dominates@{dominates}} +\index{dominates@{dominates}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ bool \bf{moeo\-Archive}$<$ MOEOT $>$::dominates (const \bf{Objective\-Vector} \& {\em \_\-objective\-Vector}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_67f667e822e0485c6976c6ee0d18f70a} + + +Returns true if the current archive dominates \_\-objective\-Vector according to the \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} given in the constructor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector}]the objective vector to compare with the current archive \end{description} +\end{Desc} + + +Definition at line 60 of file moeo\-Archive.h. + +References moeo\-Archive$<$ MOEOT $>$::comparator.\index{moeoArchive@{moeo\-Archive}!contains@{contains}} +\index{contains@{contains}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ bool \bf{moeo\-Archive}$<$ MOEOT $>$::contains (const \bf{Objective\-Vector} \& {\em \_\-objective\-Vector}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_748d5c75d713075288257192be1986a9} + + +Returns true if the current archive already contains a solution with the same objective values than \_\-objective\-Vector. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector}]the objective vector to compare with the current archive \end{description} +\end{Desc} + + +Definition at line 78 of file moeo\-Archive.h. + +Referenced by moeo\-Archive$<$ MOEOT $>$::equals().\index{moeoArchive@{moeo\-Archive}!update@{update}} +\index{update@{update}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Archive}$<$ MOEOT $>$::update (const MOEOT \& {\em \_\-moeo})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_6df0acd84cab4cb53682f2e6ca850e9a} + + +Updates the archive with a given individual \_\-moeo. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo}]the given individual \end{description} +\end{Desc} + + +Definition at line 95 of file moeo\-Archive.h. + +References moeo\-Archive$<$ MOEOT $>$::comparator. + +Referenced by moeo\-Archive$<$ MOEOT $>$::update().\index{moeoArchive@{moeo\-Archive}!update@{update}} +\index{update@{update}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Archive}$<$ MOEOT $>$::update (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_877bf4f0937f6be263e2686df4e77cf3} + + +Updates the archive with a given population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the given population \end{description} +\end{Desc} + + +Definition at line 138 of file moeo\-Archive.h. + +References moeo\-Archive$<$ MOEOT $>$::update().\index{moeoArchive@{moeo\-Archive}!equals@{equals}} +\index{equals@{equals}!moeoArchive@{moeo\-Archive}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ bool \bf{moeo\-Archive}$<$ MOEOT $>$::equals (const \bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchive_937088a6054ba1b50db651f50dda3a72} + + +Returns true if the current archive contains the same objective vectors than the given archive \_\-arch. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-arch}]the given archive \end{description} +\end{Desc} + + +Definition at line 151 of file moeo\-Archive.h. + +References moeo\-Archive$<$ MOEOT $>$::contains(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Archive.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.eps new file mode 100644 index 000000000..c41be59f8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 235.294 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.125 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoArchiveObjectiveVectorSavingUpdater< MOEOT >) cw +(eoUpdater) cw +(eoF< void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoArchiveObjectiveVectorSavingUpdater< MOEOT >) 0 0 box + (eoUpdater) 0 1 box + (eoF< void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.tex new file mode 100644 index 000000000..8faaea295 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveObjectiveVectorSavingUpdater.tex @@ -0,0 +1,70 @@ +\section{moeo\-Archive\-Objective\-Vector\-Saving\-Updater$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoArchiveObjectiveVectorSavingUpdater}\index{moeoArchiveObjectiveVectorSavingUpdater@{moeoArchiveObjectiveVectorSavingUpdater}} +This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. + + +{\tt \#include $<$moeo\-Archive\-Objective\-Vector\-Saving\-Updater.h$>$} + +Inheritance diagram for moeo\-Archive\-Objective\-Vector\-Saving\-Updater$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoArchiveObjectiveVectorSavingUpdater} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Archive\-Objective\-Vector\-Saving\-Updater} (\bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch, const std::string \&\_\-filename, bool \_\-count=false, int \_\-id=-1) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{operator()} ()\label{classmoeoArchiveObjectiveVectorSavingUpdater_0f6770822c62463ee3b56f7a4c59a850} + +\begin{CompactList}\small\item\em Saves the fitness of the archive's members into the file. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Archive}$<$ MOEOT $>$ \& \bf{arch}\label{classmoeoArchiveObjectiveVectorSavingUpdater_b252eed0ea4f837efefdcdd81d5c42a6} + +\begin{CompactList}\small\item\em local archive \item\end{CompactList}\item +std::string \bf{filename}\label{classmoeoArchiveObjectiveVectorSavingUpdater_7571569a5fb6df07f5d4e72310ec4d4d} + +\begin{CompactList}\small\item\em target filename \item\end{CompactList}\item +bool \bf{count}\label{classmoeoArchiveObjectiveVectorSavingUpdater_6eb54eb29152e2d357b1b975ce33c062} + +\begin{CompactList}\small\item\em this variable is set to true if a new file have to be created each time () is called and to false if the file only HAVE to be updated \item\end{CompactList}\item +unsigned int \bf{counter}\label{classmoeoArchiveObjectiveVectorSavingUpdater_5ea4722f75597976cf6a21a7fba3ddbc} + +\begin{CompactList}\small\item\em counter \item\end{CompactList}\item +int \bf{id}\label{classmoeoArchiveObjectiveVectorSavingUpdater_cd6940347cf39a47085c4d0a7c558355} + +\begin{CompactList}\small\item\em own ID \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Archive\-Objective\-Vector\-Saving\-Updater$<$ MOEOT $>$} + +This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. + + + +Definition at line 28 of file moeo\-Archive\-Objective\-Vector\-Saving\-Updater.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoArchiveObjectiveVectorSavingUpdater@{moeo\-Archive\-Objective\-Vector\-Saving\-Updater}!moeoArchiveObjectiveVectorSavingUpdater@{moeoArchiveObjectiveVectorSavingUpdater}} +\index{moeoArchiveObjectiveVectorSavingUpdater@{moeoArchiveObjectiveVectorSavingUpdater}!moeoArchiveObjectiveVectorSavingUpdater@{moeo\-Archive\-Objective\-Vector\-Saving\-Updater}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Archive\-Objective\-Vector\-Saving\-Updater}$<$ MOEOT $>$::\bf{moeo\-Archive\-Objective\-Vector\-Saving\-Updater} (\bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch}, const std::string \& {\em \_\-filename}, bool {\em \_\-count} = {\tt false}, int {\em \_\-id} = {\tt -1})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchiveObjectiveVectorSavingUpdater_d9f70d24605ccd1e89c8b4ea4c96c333} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-arch}]local archive \item[{\em \_\-filename}]target filename \item[{\em \_\-count}]put this variable to true if you want a new file to be created each time () is called and to false if you only want the file to be updated \item[{\em \_\-id}]own ID \end{description} +\end{Desc} + + +Definition at line 39 of file moeo\-Archive\-Objective\-Vector\-Saving\-Updater.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Archive\-Objective\-Vector\-Saving\-Updater.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.eps new file mode 100644 index 000000000..3617df02d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 382.775 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.30625 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoArchiveUpdater< MOEOT >) cw +(eoUpdater) cw +(eoF< void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoArchiveUpdater< MOEOT >) 0 0 box + (eoUpdater) 0 1 box + (eoF< void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.tex new file mode 100644 index 000000000..8336f6069 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoArchiveUpdater.tex @@ -0,0 +1,61 @@ +\section{moeo\-Archive\-Updater$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoArchiveUpdater}\index{moeoArchiveUpdater@{moeoArchiveUpdater}} +This class allows to update the archive at each generation with newly found non-dominated solutions. + + +{\tt \#include $<$moeo\-Archive\-Updater.h$>$} + +Inheritance diagram for moeo\-Archive\-Updater$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoArchiveUpdater} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Archive\-Updater} (\bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch, const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{operator()} ()\label{classmoeoArchiveUpdater_3d72137dce51d0d4f0cc7207be42878a} + +\begin{CompactList}\small\item\em Updates the archive with newly found non-dominated solutions contained in the main population. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Archive}$<$ MOEOT $>$ \& \bf{arch}\label{classmoeoArchiveUpdater_64531e46898b0e2a4ec48ba28dbfd59d} + +\begin{CompactList}\small\item\em the archive of non-dominated solutions \item\end{CompactList}\item +const \bf{eo\-Pop}$<$ MOEOT $>$ \& \bf{pop}\label{classmoeoArchiveUpdater_a7ba8cde3727d1f24835083e85dfd70d} + +\begin{CompactList}\small\item\em the main population \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Archive\-Updater$<$ MOEOT $>$} + +This class allows to update the archive at each generation with newly found non-dominated solutions. + + + +Definition at line 24 of file moeo\-Archive\-Updater.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoArchiveUpdater@{moeo\-Archive\-Updater}!moeoArchiveUpdater@{moeoArchiveUpdater}} +\index{moeoArchiveUpdater@{moeoArchiveUpdater}!moeoArchiveUpdater@{moeo\-Archive\-Updater}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Archive\-Updater}$<$ MOEOT $>$::\bf{moeo\-Archive\-Updater} (\bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch}, const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoArchiveUpdater_1497a2bc8df12565b3ea21bb8e08bee1} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-arch}]an archive of non-dominated solutions \item[{\em \_\-pop}]the main population \end{description} +\end{Desc} + + +Definition at line 33 of file moeo\-Archive\-Updater.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Archive\-Updater.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.eps new file mode 100644 index 000000000..afd2c025d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.eps @@ -0,0 +1,271 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 52.8634 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 9.45833 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 6 def +/cols 5 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +(moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) cw +(moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) cw +(moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >) cw +(moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >) cw +(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) cw +(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) cw +(moeoContributionMetric< ObjectiveVector >) cw +(moeoEntropyMetric< ObjectiveVector >) cw +(moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >) cw +(moeoHypervolumeBinaryMetric< ObjectiveVector >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoBinaryMetric< A1, A2, R >) 1.5 3 box + (eoBF< A1, A2, R >) 1 4 box + (moeoMetric) 2 4 box + (eoFunctorBase) 1 5 box + (eoFunctorBase) 2 5 box + (moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) 0 2 box + (moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) 1 2 box + (moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >) 2 2 box + (moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >) 3 2 box + (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) 0 1 box + (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) 1 1 box + (moeoContributionMetric< ObjectiveVector >) 2.5 1 box + (moeoEntropyMetric< ObjectiveVector >) 3.5 1 box + (moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >) 0.5 0 box + (moeoHypervolumeBinaryMetric< ObjectiveVector >) 1.5 0 box + +% ----- relations ----- + +solid +0 1.5 3 out +solid +1 2 4 conn +solid +1 1 4 in +solid +0 1 4 out +solid +1 2 4 in +solid +0 2 4 out +solid +1 1 5 in +solid +1 2 5 in +solid +1 1.5 2.25 out +solid +0 3 3 conn +solid +0 0 2.75 in +solid +1 0 1.25 out +solid +0 1 2.75 in +solid +1 1 1.25 out +solid +0 2 2.75 in +solid +0 3 2.75 in +solid +1 3 1.25 out +solid +2.5 3.5 2 conn +solid +0 0 1.75 in +solid +0 1 1.75 in +solid +1 1 0.25 out +solid +0.5 1.5 1 conn +solid +0 2.5 1.75 in +solid +0 3.5 1.75 in +solid +0 0.5 0.75 in +solid +0 1.5 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.tex new file mode 100644 index 000000000..b803fc3ef --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetric.tex @@ -0,0 +1,27 @@ +\section{moeo\-Binary\-Metric$<$ A1, A2, R $>$ Class Template Reference} +\label{classmoeoBinaryMetric}\index{moeoBinaryMetric@{moeoBinaryMetric}} +Base class for binary metrics. + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Binary\-Metric$<$ A1, A2, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=1.48018cm]{classmoeoBinaryMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class A1, class A2, class R$>$ class moeo\-Binary\-Metric$<$ A1, A2, R $>$} + +Base class for binary metrics. + + + +Definition at line 36 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.eps new file mode 100644 index 000000000..b9c5cec08 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 289.855 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.725 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoBinaryMetricSavingUpdater< MOEOT >) cw +(eoUpdater) cw +(eoF< void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoBinaryMetricSavingUpdater< MOEOT >) 0 0 box + (eoUpdater) 0 1 box + (eoF< void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.tex new file mode 100644 index 000000000..73030a896 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoBinaryMetricSavingUpdater.tex @@ -0,0 +1,79 @@ +\section{moeo\-Binary\-Metric\-Saving\-Updater$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoBinaryMetricSavingUpdater}\index{moeoBinaryMetricSavingUpdater@{moeoBinaryMetricSavingUpdater}} +This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file. + + +{\tt \#include $<$moeo\-Binary\-Metric\-Saving\-Updater.h$>$} + +Inheritance diagram for moeo\-Binary\-Metric\-Saving\-Updater$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoBinaryMetricSavingUpdater} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoBinaryMetricSavingUpdater_21c2b12ee8600d8550eff42bcba87fd2} + +\begin{CompactList}\small\item\em The objective vector type of a solution. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Binary\-Metric\-Saving\-Updater} (\bf{moeo\-Vector\-Vs\-Vector\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, std::string \_\-filename) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{operator()} ()\label{classmoeoBinaryMetricSavingUpdater_a4f0a9e86b4a39ef88e7f8e1c1d6d229} + +\begin{CompactList}\small\item\em Saves the metric's value for the current generation. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Vector\-Vs\-Vector\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& \bf{metric}\label{classmoeoBinaryMetricSavingUpdater_d1c66d6d179aff03d6949f4f76d3237c} + +\begin{CompactList}\small\item\em binary metric comparing two Pareto sets \item\end{CompactList}\item +const \bf{eo\-Pop}$<$ MOEOT $>$ \& \bf{pop}\label{classmoeoBinaryMetricSavingUpdater_79eea0916733568929ea9c0758ffe8fa} + +\begin{CompactList}\small\item\em main population \item\end{CompactList}\item +\bf{eo\-Pop}$<$ MOEOT $>$ \bf{old\-Pop}\label{classmoeoBinaryMetricSavingUpdater_0461af7e569921fec49538ff8fa998d4} + +\begin{CompactList}\small\item\em (n-1) population \item\end{CompactList}\item +std::string \bf{filename}\label{classmoeoBinaryMetricSavingUpdater_6d280c180de7bab1e18ab2bb39a0e184} + +\begin{CompactList}\small\item\em target filename \item\end{CompactList}\item +bool \bf{first\-Gen}\label{classmoeoBinaryMetricSavingUpdater_9bfa927499265f53f2b25afd2cd3c94f} + +\begin{CompactList}\small\item\em is it the first generation ? \item\end{CompactList}\item +unsigned int \bf{counter}\label{classmoeoBinaryMetricSavingUpdater_d8d3ce9ac8ab5a57ee1840bc1c98d776} + +\begin{CompactList}\small\item\em counter \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Binary\-Metric\-Saving\-Updater$<$ MOEOT $>$} + +This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file. + + + +Definition at line 28 of file moeo\-Binary\-Metric\-Saving\-Updater.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoBinaryMetricSavingUpdater@{moeo\-Binary\-Metric\-Saving\-Updater}!moeoBinaryMetricSavingUpdater@{moeoBinaryMetricSavingUpdater}} +\index{moeoBinaryMetricSavingUpdater@{moeoBinaryMetricSavingUpdater}!moeoBinaryMetricSavingUpdater@{moeo\-Binary\-Metric\-Saving\-Updater}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Binary\-Metric\-Saving\-Updater}$<$ MOEOT $>$::\bf{moeo\-Binary\-Metric\-Saving\-Updater} (\bf{moeo\-Vector\-Vs\-Vector\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, std::string {\em \_\-filename})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoBinaryMetricSavingUpdater_b7c3fb73caf759450367c76d4716bb62} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-metric}]the binary metric comparing two Pareto sets \item[{\em \_\-pop}]the main population \item[{\em \_\-filename}]the target filename \end{description} +\end{Desc} + + +Definition at line 42 of file moeo\-Binary\-Metric\-Saving\-Updater.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Binary\-Metric\-Saving\-Updater.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.eps new file mode 100644 index 000000000..586e3e79b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 129.87 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.85 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 6 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >) cw +(MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(EO< MOEOObjectiveVector >) cw +(eoObject) cw +(eoPersistent) cw +(eoPrintable) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 0.5 0 box + (moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >) 0.5 1 box + (MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 0.5 2 box + (EO< MOEOObjectiveVector >) 0.5 3 box + (eoObject) 0 4 box + (eoPersistent) 1 4 box + (eoPrintable) 1 5 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +1 0.5 3 in +solid +0 0.5 3 out +solid +0 1 4 conn +solid +1 0 4 in +solid +1 1 4 in +solid +0 1 4 out +solid +1 1 5 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.tex new file mode 100644 index 000000000..093083348 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoBitVector.tex @@ -0,0 +1,88 @@ +\section{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$ Class Template Reference} +\label{classmoeoBitVector}\index{moeoBitVector@{moeoBitVector}} +This class is an implementationeo of a simple bit-valued \doxyref{moeo\-Vector}{p.}{classmoeoVector}. + + +{\tt \#include $<$moeo\-Bit\-Vector.h$>$} + +Inheritance diagram for moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.63636cm]{classmoeoBitVector} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Bit\-Vector} (unsigned int \_\-size=0, bool \_\-value=false) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +virtual void \bf{print\-On} (std::ostream \&\_\-os) const +\begin{CompactList}\small\item\em Writing object. \item\end{CompactList}\item +virtual void \bf{read\-From} (std::istream \&\_\-is) +\begin{CompactList}\small\item\em Reading object. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ class moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} + +This class is an implementationeo of a simple bit-valued \doxyref{moeo\-Vector}{p.}{classmoeoVector}. + + + +Definition at line 22 of file moeo\-Bit\-Vector.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoBitVector@{moeo\-Bit\-Vector}!moeoBitVector@{moeoBitVector}} +\index{moeoBitVector@{moeoBitVector}!moeoBitVector@{moeo\-Bit\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ \bf{moeo\-Bit\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::\bf{moeo\-Bit\-Vector} (unsigned int {\em \_\-size} = {\tt 0}, bool {\em \_\-value} = {\tt false})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoBitVector_959ae6d2acf91467142366049a0b6121} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-size}]Length of vector (default is 0) \item[{\em \_\-value}]Initial value of all elements (default is default value of type Gene\-Type) \end{description} +\end{Desc} + + +Definition at line 37 of file moeo\-Bit\-Vector.h. + +\subsection{Member Function Documentation} +\index{moeoBitVector@{moeo\-Bit\-Vector}!printOn@{printOn}} +\index{printOn@{printOn}!moeoBitVector@{moeo\-Bit\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ virtual void \bf{moeo\-Bit\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::print\-On (std::ostream \& {\em \_\-os}) const\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoBitVector_78f821c548cf46d8bcd30aa8a52ffb7c} + + +Writing object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-os}]output stream \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, bool $>$} \doxyref{p.}{classmoeoVector_d0a92cb26483ffab754ac4a0efb76308}. + +Definition at line 45 of file moeo\-Bit\-Vector.h.\index{moeoBitVector@{moeo\-Bit\-Vector}!readFrom@{readFrom}} +\index{readFrom@{readFrom}!moeoBitVector@{moeo\-Bit\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ virtual void \bf{moeo\-Bit\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::read\-From (std::istream \& {\em \_\-is})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoBitVector_31cd3f894615d0a27dd116a5c8082521} + + +Reading object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-is}]input stream \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, bool $>$} \doxyref{p.}{classmoeoVector_cd8ee0fe79bb9515b29e2a4d3fee5ab9}. + +Definition at line 58 of file moeo\-Bit\-Vector.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Bit\-Vector.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.eps new file mode 100644 index 000000000..31da390c9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.013 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.7875 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoCombinedLS< MOEOT, Type >) cw +(moeoLS< MOEOT, Type >) cw +(moeoAlgo) cw +(eoBF< Type, moeoArchive< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoCombinedLS< MOEOT, Type >) 0.5 0 box + (moeoLS< MOEOT, Type >) 0.5 1 box + (moeoAlgo) 0 2 box + (eoBF< Type, moeoArchive< MOEOT > &, void >) 1 2 box + (eoFunctorBase) 1 3 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.tex new file mode 100644 index 000000000..462b057d7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoCombinedLS.tex @@ -0,0 +1,98 @@ +\section{moeo\-Combined\-LS$<$ MOEOT, Type $>$ Class Template Reference} +\label{classmoeoCombinedLS}\index{moeoCombinedLS@{moeoCombinedLS}} +This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions. + + +{\tt \#include $<$moeo\-Combined\-LS.h$>$} + +Inheritance diagram for moeo\-Combined\-LS$<$ MOEOT, Type $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.69637cm]{classmoeoCombinedLS} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Combined\-LS} (\bf{moeo\-LS}$<$ MOEOT, Type $>$ \&\_\-first\_\-mols) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{add} (\bf{moeo\-LS}$<$ MOEOT, Type $>$ \&\_\-mols) +\begin{CompactList}\small\item\em Adds a new local search to combine. \item\end{CompactList}\item +void \bf{operator()} (Type \_\-type, \bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch) +\begin{CompactList}\small\item\em Gives a new solution in order to explore the neigborhood. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +std::vector$<$ \bf{moeo\-LS}$<$ MOEOT, Type $>$ $\ast$ $>$ \bf{combined\-LS}\label{classmoeoCombinedLS_3cf36ae7ada10d2837b60df01210d92a} + +\begin{CompactList}\small\item\em the vector that contains the combined LS \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT, class Type$>$ class moeo\-Combined\-LS$<$ MOEOT, Type $>$} + +This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions. + + + +Definition at line 25 of file moeo\-Combined\-LS.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoCombinedLS@{moeo\-Combined\-LS}!moeoCombinedLS@{moeoCombinedLS}} +\index{moeoCombinedLS@{moeoCombinedLS}!moeoCombinedLS@{moeo\-Combined\-LS}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ \bf{moeo\-Combined\-LS}$<$ MOEOT, Type $>$::\bf{moeo\-Combined\-LS} (\bf{moeo\-LS}$<$ MOEOT, Type $>$ \& {\em \_\-first\_\-mols})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoCombinedLS_5d09220b47bac67bd332dc0f93226ae1} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-first\_\-mols}]the first multi-objective local search to add \end{description} +\end{Desc} + + +Definition at line 33 of file moeo\-Combined\-LS.h. + +References moeo\-Combined\-LS$<$ MOEOT, Type $>$::combined\-LS. + +\subsection{Member Function Documentation} +\index{moeoCombinedLS@{moeo\-Combined\-LS}!add@{add}} +\index{add@{add}!moeoCombinedLS@{moeo\-Combined\-LS}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ void \bf{moeo\-Combined\-LS}$<$ MOEOT, Type $>$::add (\bf{moeo\-LS}$<$ MOEOT, Type $>$ \& {\em \_\-mols})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoCombinedLS_1637b4dcf2dd694cc9ffbad605b2bf13} + + +Adds a new local search to combine. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-mols}]the multi-objective local search to add \end{description} +\end{Desc} + + +Definition at line 42 of file moeo\-Combined\-LS.h. + +References moeo\-Combined\-LS$<$ MOEOT, Type $>$::combined\-LS.\index{moeoCombinedLS@{moeo\-Combined\-LS}!operator()@{operator()}} +\index{operator()@{operator()}!moeoCombinedLS@{moeo\-Combined\-LS}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ void \bf{moeo\-Combined\-LS}$<$ MOEOT, Type $>$::operator() (Type {\em \_\-type}, \bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoCombinedLS_634d7fa3092fe8f88a1b54cacfdc35fd} + + +Gives a new solution in order to explore the neigborhood. + +The new non-dominated solutions are added to the archive \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-type}]the object to apply the local search to \item[{\em \_\-arch}]the archive of non-dominated solutions \end{description} +\end{Desc} + + +Implements \bf{eo\-BF$<$ Type, moeo\-Archive$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 53 of file moeo\-Combined\-LS.h. + +References moeo\-Combined\-LS$<$ MOEOT, Type $>$::combined\-LS. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Combined\-LS.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoComparator.eps new file mode 100644 index 000000000..c87d0fa42 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoComparator.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 32.2581 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 15.5 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 5 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoComparator< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +(moeoAggregativeComparator< MOEOT >) cw +(moeoDiversityThenFitnessComparator< MOEOT >) cw +(moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator) cw +(moeoFitnessThenDiversityComparator< MOEOT >) cw +(moeoOneObjectiveComparator< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoComparator< MOEOT >) 2 1 box + (eoBF< A1, A2, R >) 2 2 box + (eoFunctorBase) 2 3 box + (moeoAggregativeComparator< MOEOT >) 0 0 box + (moeoDiversityThenFitnessComparator< MOEOT >) 1 0 box + (moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator) 2 0 box + (moeoFitnessThenDiversityComparator< MOEOT >) 3 0 box + (moeoOneObjectiveComparator< MOEOT >) 4 0 box + +% ----- relations ----- + +solid +0 2 1 out +solid +1 2 2 in +solid +0 2 2 out +solid +1 2 3 in +solid +1 2 0.25 out +solid +0 4 1 conn +solid +0 0 0.75 in +solid +0 1 0.75 in +solid +0 2 0.75 in +solid +0 3 0.75 in +solid +0 4 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoComparator.tex new file mode 100644 index 000000000..22da026e1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoComparator.tex @@ -0,0 +1,27 @@ +\section{moeo\-Comparator$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoComparator}\index{moeoComparator@{moeoComparator}} +Functor allowing to compare two solutions. + + +{\tt \#include $<$moeo\-Comparator.h$>$} + +Inheritance diagram for moeo\-Comparator$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=0.903226cm]{classmoeoComparator} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Comparator$<$ MOEOT $>$} + +Functor allowing to compare two solutions. + + + +Definition at line 22 of file moeo\-Comparator.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.eps new file mode 100644 index 000000000..b5ce434de --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.626 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.77 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoContributionMetric< ObjectiveVector >) cw +(moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoContributionMetric< ObjectiveVector >) 0.5 0 box + (moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >) 0.5 1 box + (moeoBinaryMetric< A1, A2, R >) 0.5 2 box + (eoBF< A1, A2, R >) 0 3 box + (moeoMetric) 1 3 box + (eoFunctorBase) 0 4 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +0 1 3 conn +solid +1 0 3 in +solid +0 0 3 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 0 4 in +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.tex new file mode 100644 index 000000000..9ecca0f4b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoContributionMetric.tex @@ -0,0 +1,120 @@ +\section{moeo\-Contribution\-Metric$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoContributionMetric}\index{moeoContributionMetric@{moeoContributionMetric}} +The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. + + +{\tt \#include $<$moeo\-Contribution\-Metric.h$>$} + +Inheritance diagram for moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.71353cm]{classmoeoContributionMetric} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +double \bf{operator()} (const std::vector$<$ Objective\-Vector $>$ \&\_\-set1, const std::vector$<$ Objective\-Vector $>$ \&\_\-set2) +\begin{CompactList}\small\item\em Returns the contribution of the Pareto set '\_\-set1' relatively to the Pareto set '\_\-set2'. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +unsigned int \bf{card\_\-C} (const std::vector$<$ Objective\-Vector $>$ \&\_\-set1, const std::vector$<$ Objective\-Vector $>$ \&\_\-set2) +\begin{CompactList}\small\item\em Returns the number of solutions both in '\_\-set1' and '\_\-set2'. \item\end{CompactList}\item +unsigned int \bf{card\_\-W} (const std::vector$<$ Objective\-Vector $>$ \&\_\-set1, const std::vector$<$ Objective\-Vector $>$ \&\_\-set2) +\begin{CompactList}\small\item\em Returns the number of solutions in '\_\-set1' dominating at least one solution of '\_\-set2'. \item\end{CompactList}\item +unsigned int \bf{card\_\-N} (const std::vector$<$ Objective\-Vector $>$ \&\_\-set1, const std::vector$<$ Objective\-Vector $>$ \&\_\-set2) +\begin{CompactList}\small\item\em Returns the number of solutions in '\_\-set1' having no relation of dominance with those from '\_\-set2'. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$ \bf{pareto\-Comparator}\label{classmoeoContributionMetric_b474229c85ffbf5108f51eef01ab2d64} + +\begin{CompactList}\small\item\em Functor to compare two objective vectors according to Pareto dominance relation. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Contribution\-Metric$<$ Objective\-Vector $>$} + +The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. + +of the 2000 Congress on Evolutionary Computation, IEEE Press, pp. 317-324) + + + +Definition at line 24 of file moeo\-Contribution\-Metric.h. + +\subsection{Member Function Documentation} +\index{moeoContributionMetric@{moeo\-Contribution\-Metric}!operator()@{operator()}} +\index{operator()@{operator()}!moeoContributionMetric@{moeo\-Contribution\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ double \bf{moeo\-Contribution\-Metric}$<$ Objective\-Vector $>$::operator() (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set1}, const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoContributionMetric_491610f6557874c2989eaa7a75117dcb} + + +Returns the contribution of the Pareto set '\_\-set1' relatively to the Pareto set '\_\-set2'. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-set1}]the first Pareto set \item[{\em \_\-set2}]the second Pareto set \end{description} +\end{Desc} + + +Definition at line 33 of file moeo\-Contribution\-Metric.h. + +References moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::card\_\-C(), moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::card\_\-N(), and moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::card\_\-W().\index{moeoContributionMetric@{moeo\-Contribution\-Metric}!card_C@{card\_\-C}} +\index{card_C@{card\_\-C}!moeoContributionMetric@{moeo\-Contribution\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ unsigned int \bf{moeo\-Contribution\-Metric}$<$ Objective\-Vector $>$::card\_\-C (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set1}, const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set2})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoContributionMetric_4e60849763aaad0cdea66e71edf2d29e} + + +Returns the number of solutions both in '\_\-set1' and '\_\-set2'. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-set1}]the first Pareto set \item[{\em \_\-set2}]the second Pareto set \end{description} +\end{Desc} + + +Definition at line 54 of file moeo\-Contribution\-Metric.h. + +Referenced by moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::operator()().\index{moeoContributionMetric@{moeo\-Contribution\-Metric}!card_W@{card\_\-W}} +\index{card_W@{card\_\-W}!moeoContributionMetric@{moeo\-Contribution\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ unsigned int \bf{moeo\-Contribution\-Metric}$<$ Objective\-Vector $>$::card\_\-W (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set1}, const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set2})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoContributionMetric_68d6d1ec1ed0bed1ea290cdacb93b5b2} + + +Returns the number of solutions in '\_\-set1' dominating at least one solution of '\_\-set2'. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-set1}]the first Pareto set \item[{\em \_\-set2}]the second Pareto set \end{description} +\end{Desc} + + +Definition at line 71 of file moeo\-Contribution\-Metric.h. + +References moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::pareto\-Comparator. + +Referenced by moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::operator()().\index{moeoContributionMetric@{moeo\-Contribution\-Metric}!card_N@{card\_\-N}} +\index{card_N@{card\_\-N}!moeoContributionMetric@{moeo\-Contribution\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ unsigned int \bf{moeo\-Contribution\-Metric}$<$ Objective\-Vector $>$::card\_\-N (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set1}, const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set2})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoContributionMetric_df26b17120ed2271a6d1ec9c8c77b451} + + +Returns the number of solutions in '\_\-set1' having no relation of dominance with those from '\_\-set2'. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-set1}]the first Pareto set \item[{\em \_\-set2}]the second Pareto set \end{description} +\end{Desc} + + +Definition at line 89 of file moeo\-Contribution\-Metric.h. + +References moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::pareto\-Comparator. + +Referenced by moeo\-Contribution\-Metric$<$ Objective\-Vector $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Contribution\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.eps new file mode 100644 index 000000000..70c54441c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 150 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.33333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >) 0 0 box + (eoUF< A1, R >) 0 1 box + (eoFunctorBase) 0 2 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.tex new file mode 100644 index 000000000..92b954b37 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoConvertPopToObjectiveVectors.tex @@ -0,0 +1,49 @@ +\section{moeo\-Convert\-Pop\-To\-Objective\-Vectors$<$ MOEOT, Objective\-Vector $>$ Class Template Reference} +\label{classmoeoConvertPopToObjectiveVectors}\index{moeoConvertPopToObjectiveVectors@{moeoConvertPopToObjectiveVectors}} +Functor allowing to get a vector of objective vectors from a population. + + +{\tt \#include $<$moeo\-Convert\-Pop\-To\-Objective\-Vectors.h$>$} + +Inheritance diagram for moeo\-Convert\-Pop\-To\-Objective\-Vectors$<$ MOEOT, Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3cm]{classmoeoConvertPopToObjectiveVectors} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const std::vector$<$ Objective\-Vector $>$ \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \_\-pop) +\begin{CompactList}\small\item\em Returns a vector of the objective vectors from the population \_\-pop. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT, class Objective\-Vector = typename MOEOT::Objective\-Vector$>$ class moeo\-Convert\-Pop\-To\-Objective\-Vectors$<$ MOEOT, Objective\-Vector $>$} + +Functor allowing to get a vector of objective vectors from a population. + + + +Definition at line 23 of file moeo\-Convert\-Pop\-To\-Objective\-Vectors.h. + +\subsection{Member Function Documentation} +\index{moeoConvertPopToObjectiveVectors@{moeo\-Convert\-Pop\-To\-Objective\-Vectors}!operator()@{operator()}} +\index{operator()@{operator()}!moeoConvertPopToObjectiveVectors@{moeo\-Convert\-Pop\-To\-Objective\-Vectors}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Objective\-Vector = typename MOEOT::Objective\-Vector$>$ const std::vector$<$ Objective\-Vector $>$ \bf{moeo\-Convert\-Pop\-To\-Objective\-Vectors}$<$ MOEOT, Objective\-Vector $>$::operator() (const \bf{eo\-Pop}$<$ MOEOT $>$ {\em \_\-pop})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoConvertPopToObjectiveVectors_8fada75aa151a6eaa310c5064f783c86} + + +Returns a vector of the objective vectors from the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Convert\-Pop\-To\-Objective\-Vectors.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Convert\-Pop\-To\-Objective\-Vectors.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.eps new file mode 100644 index 000000000..08faf7012 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 259.74 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.925 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoCriterionBasedFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoCriterionBasedFitnessAssignment< MOEOT >) 0 0 box + (moeoFitnessAssignment< MOEOT >) 0 1 box + (eoUF< eoPop< MOEOT > &, void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.tex new file mode 100644 index 000000000..ed43820ca --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoCriterionBasedFitnessAssignment.tex @@ -0,0 +1,27 @@ +\section{moeo\-Criterion\-Based\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoCriterionBasedFitnessAssignment}\index{moeoCriterionBasedFitnessAssignment@{moeoCriterionBasedFitnessAssignment}} +\doxyref{moeo\-Criterion\-Based\-Fitness\-Assignment}{p.}{classmoeoCriterionBasedFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for criterion-based strategies. + + +{\tt \#include $<$moeo\-Criterion\-Based\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Criterion\-Based\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoCriterionBasedFitnessAssignment} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Criterion\-Based\-Fitness\-Assignment$<$ MOEOT $>$} + +\doxyref{moeo\-Criterion\-Based\-Fitness\-Assignment}{p.}{classmoeoCriterionBasedFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for criterion-based strategies. + + + +Definition at line 22 of file moeo\-Criterion\-Based\-Fitness\-Assignment.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Criterion\-Based\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.eps new file mode 100644 index 000000000..8a52f92e8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 242.718 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.06 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoCrowdingDistanceDiversityAssignment< MOEOT >) cw +(moeoDiversityAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoCrowdingDistanceDiversityAssignment< MOEOT >) 0 1 box + (moeoDiversityAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + (moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >) 0 0 box + +% ----- relations ----- + +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in +solid +1 0 0.25 out +solid +0 0 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.tex new file mode 100644 index 000000000..c4d5951a4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoCrowdingDistanceDiversityAssignment.tex @@ -0,0 +1,114 @@ +\section{moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoCrowdingDistanceDiversityAssignment}\index{moeoCrowdingDistanceDiversityAssignment@{moeoCrowdingDistanceDiversityAssignment}} +Diversity assignment sheme based on crowding distance proposed in: K. + + +{\tt \#include $<$moeo\-Crowding\-Distance\-Diversity\-Assignment.h$>$} + +Inheritance diagram for moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoCrowdingDistanceDiversityAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoCrowdingDistanceDiversityAssignment_7c5b1b763bf82e2d557586533b072a64} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +double \bf{inf} () const \label{classmoeoCrowdingDistanceDiversityAssignment_fd3720297b90f97b38996a4db24632f8} + +\begin{CompactList}\small\item\em Returns a big value (regarded as infinite). \item\end{CompactList}\item +double \bf{tiny} () const \label{classmoeoCrowdingDistanceDiversityAssignment_9ed112968bb30897e14c675a33046cf8} + +\begin{CompactList}\small\item\em Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound). \item\end{CompactList}\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Computes diversity values for every solution contained in the population \_\-pop. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\end{CompactItemize} +\subsection*{Protected Member Functions} +\begin{CompactItemize} +\item +virtual void \bf{set\-Distances} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the distance values. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} + +Diversity assignment sheme based on crowding distance proposed in: K. + +Deb, A. Pratap, S. Agarwal, T. Meyarivan, \char`\"{}A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II\char`\"{}, IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). + + + +Definition at line 25 of file moeo\-Crowding\-Distance\-Diversity\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoCrowdingDistanceDiversityAssignment@{moeo\-Crowding\-Distance\-Diversity\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoCrowdingDistanceDiversityAssignment@{moeo\-Crowding\-Distance\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoCrowdingDistanceDiversityAssignment_7af5b14f4a0d288fd12fa6044b816c54} + + +Computes diversity values for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 55 of file moeo\-Crowding\-Distance\-Diversity\-Assignment.h. + +References moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::inf(), and moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::set\-Distances().\index{moeoCrowdingDistanceDiversityAssignment@{moeo\-Crowding\-Distance\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoCrowdingDistanceDiversityAssignment@{moeo\-Crowding\-Distance\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoCrowdingDistanceDiversityAssignment_ac21453d018c0e5dc872ccf0d0893f18} + + +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \end{Desc} +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! \end{Desc} + + +Implements \bf{moeo\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoDiversityAssignment_57f400263b36664df6269f1b522cfdcb}. + +Reimplemented in \bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_91aec07ffdc20c9654575106399ca62d}. + +Definition at line 78 of file moeo\-Crowding\-Distance\-Diversity\-Assignment.h.\index{moeoCrowdingDistanceDiversityAssignment@{moeo\-Crowding\-Distance\-Diversity\-Assignment}!setDistances@{setDistances}} +\index{setDistances@{setDistances}!moeoCrowdingDistanceDiversityAssignment@{moeo\-Crowding\-Distance\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$::set\-Distances (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, protected, virtual]}}\label{classmoeoCrowdingDistanceDiversityAssignment_2dac680d7ca8327a15bc30f5ce7bbd4f} + + +Sets the distance values. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Reimplemented in \bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_b275343fd08575612525a5654d749feb}. + +Definition at line 90 of file moeo\-Crowding\-Distance\-Diversity\-Assignment.h. + +References moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::inf(). + +Referenced by moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Crowding\-Distance\-Diversity\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.eps new file mode 100644 index 000000000..28f1b4487 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 416.667 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.2 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDetTournamentSelect< MOEOT >) cw +(moeoSelectOne< MOEOT >) cw +(eoSelectOne< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDetTournamentSelect< MOEOT >) 0 0 box + (moeoSelectOne< MOEOT >) 0 1 box + (eoSelectOne< MOEOT >) 0 2 box + (eoUF< A1, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.tex new file mode 100644 index 000000000..113c14ff7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDetTournamentSelect.tex @@ -0,0 +1,102 @@ +\section{moeo\-Det\-Tournament\-Select$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoDetTournamentSelect}\index{moeoDetTournamentSelect@{moeoDetTournamentSelect}} +Selection strategy that selects ONE individual by deterministic tournament. + + +{\tt \#include $<$moeo\-Det\-Tournament\-Select.h$>$} + +Inheritance diagram for moeo\-Det\-Tournament\-Select$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoDetTournamentSelect} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Det\-Tournament\-Select} (\bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comparator, unsigned int \_\-t\-Size=2) +\begin{CompactList}\small\item\em Full Ctor. \item\end{CompactList}\item +\bf{moeo\-Det\-Tournament\-Select} (unsigned int \_\-t\-Size=2) +\begin{CompactList}\small\item\em Ctor without comparator. \item\end{CompactList}\item +const MOEOT \& \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Apply the tournament to the given population. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Comparator}$<$ MOEOT $>$ \& \bf{comparator}\label{classmoeoDetTournamentSelect_f31a46190da0fe561d748133456907c9} + +\begin{CompactList}\small\item\em the comparator (used to compare 2 individuals) \item\end{CompactList}\item +\bf{moeo\-Fitness\-Then\-Diversity\-Comparator}$<$ MOEOT $>$ \bf{default\-Comparator}\label{classmoeoDetTournamentSelect_dde5fc82ffff52056aab75632f779825} + +\begin{CompactList}\small\item\em a fitness then diversity comparator can be used as default \item\end{CompactList}\item +unsigned int \bf{t\-Size}\label{classmoeoDetTournamentSelect_061c191c2df365cf4325e0093aae2ae6} + +\begin{CompactList}\small\item\em the number of individuals in the tournament \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Det\-Tournament\-Select$<$ MOEOT $>$} + +Selection strategy that selects ONE individual by deterministic tournament. + + + +Definition at line 24 of file moeo\-Det\-Tournament\-Select.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoDetTournamentSelect@{moeo\-Det\-Tournament\-Select}!moeoDetTournamentSelect@{moeoDetTournamentSelect}} +\index{moeoDetTournamentSelect@{moeoDetTournamentSelect}!moeoDetTournamentSelect@{moeo\-Det\-Tournament\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Det\-Tournament\-Select}$<$ MOEOT $>$::\bf{moeo\-Det\-Tournament\-Select} (\bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comparator}, unsigned int {\em \_\-t\-Size} = {\tt 2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoDetTournamentSelect_106e44d01bbf2775b483104639c6556e} + + +Full Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-comparator}]the comparator (used to compare 2 individuals) \item[{\em \_\-t\-Size}]the number of individuals in the tournament (default: 2) \end{description} +\end{Desc} + + +Definition at line 33 of file moeo\-Det\-Tournament\-Select.h. + +References moeo\-Det\-Tournament\-Select$<$ MOEOT $>$::t\-Size.\index{moeoDetTournamentSelect@{moeo\-Det\-Tournament\-Select}!moeoDetTournamentSelect@{moeoDetTournamentSelect}} +\index{moeoDetTournamentSelect@{moeoDetTournamentSelect}!moeoDetTournamentSelect@{moeo\-Det\-Tournament\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Det\-Tournament\-Select}$<$ MOEOT $>$::\bf{moeo\-Det\-Tournament\-Select} (unsigned int {\em \_\-t\-Size} = {\tt 2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoDetTournamentSelect_f17a16c1b0f688832e7143e55d0f767d} + + +Ctor without comparator. + +A \doxyref{moeo\-Fitness\-Then\-Diversity\-Comparator}{p.}{classmoeoFitnessThenDiversityComparator} is used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-t\-Size}]the number of individuals in the tournament (default: 2) \end{description} +\end{Desc} + + +Definition at line 49 of file moeo\-Det\-Tournament\-Select.h. + +References moeo\-Det\-Tournament\-Select$<$ MOEOT $>$::t\-Size. + +\subsection{Member Function Documentation} +\index{moeoDetTournamentSelect@{moeo\-Det\-Tournament\-Select}!operator()@{operator()}} +\index{operator()@{operator()}!moeoDetTournamentSelect@{moeo\-Det\-Tournament\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const MOEOT\& \bf{moeo\-Det\-Tournament\-Select}$<$ MOEOT $>$::operator() (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoDetTournamentSelect_0d7051a48570e5dcbe9a19b90e4be3bf} + + +Apply the tournament to the given population. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 65 of file moeo\-Det\-Tournament\-Select.h. + +References moeo\-Det\-Tournament\-Select$<$ MOEOT $>$::comparator, and moeo\-Det\-Tournament\-Select$<$ MOEOT $>$::t\-Size. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Det\-Tournament\-Select.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDistance.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDistance.eps new file mode 100644 index 000000000..74950e0b3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDistance.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 297.398 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.68125 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDistance< MOEOT, Type >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +(moeoNormalizedDistance< MOEOT, Type >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDistance< MOEOT, Type >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + (moeoNormalizedDistance< MOEOT, Type >) 0 0 box + +% ----- relations ----- + +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +1 0 0.25 out +solid +0 0 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDistance.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDistance.tex new file mode 100644 index 000000000..b01cae414 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDistance.tex @@ -0,0 +1,87 @@ +\section{moeo\-Distance$<$ MOEOT, Type $>$ Class Template Reference} +\label{classmoeoDistance}\index{moeoDistance@{moeoDistance}} +The base class for distance computation. + + +{\tt \#include $<$moeo\-Distance.h$>$} + +Inheritance diagram for moeo\-Distance$<$ MOEOT, Type $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoDistance} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +virtual void \bf{setup} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Nothing to do. \item\end{CompactList}\item +virtual void \bf{setup} (double \_\-min, double \_\-max, unsigned int \_\-obj) +\begin{CompactList}\small\item\em Nothing to do. \item\end{CompactList}\item +virtual void \bf{setup} (\bf{eo\-Real\-Interval} \_\-real\-Interval, unsigned int \_\-obj) +\begin{CompactList}\small\item\em Nothing to do. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT, class Type$>$ class moeo\-Distance$<$ MOEOT, Type $>$} + +The base class for distance computation. + + + +Definition at line 22 of file moeo\-Distance.h. + +\subsection{Member Function Documentation} +\index{moeoDistance@{moeo\-Distance}!setup@{setup}} +\index{setup@{setup}!moeoDistance@{moeo\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ virtual void \bf{moeo\-Distance}$<$ MOEOT, Type $>$::setup (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDistance_1834a67c2a7a96f0c9a3c408108a8f8c} + + +Nothing to do. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Reimplemented in \bf{moeo\-Normalized\-Distance$<$ MOEOT, Type $>$} \doxyref{p.}{classmoeoNormalizedDistance_b99ffed3c0ce6c9c10aef0a76d983bb1}, and \bf{moeo\-Normalized\-Distance$<$ MOEOT $>$} \doxyref{p.}{classmoeoNormalizedDistance_b99ffed3c0ce6c9c10aef0a76d983bb1}. + +Definition at line 30 of file moeo\-Distance.h.\index{moeoDistance@{moeo\-Distance}!setup@{setup}} +\index{setup@{setup}!moeoDistance@{moeo\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ virtual void \bf{moeo\-Distance}$<$ MOEOT, Type $>$::setup (double {\em \_\-min}, double {\em \_\-max}, unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDistance_341c4fa39652871761053e85914a16ad} + + +Nothing to do. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-min}]lower bound \item[{\em \_\-max}]upper bound \item[{\em \_\-obj}]the objective index \end{description} +\end{Desc} + + +Reimplemented in \bf{moeo\-Normalized\-Distance$<$ MOEOT, Type $>$} \doxyref{p.}{classmoeoNormalizedDistance_e58bbf9eb90a8d2704f88d774d3fe1e1}, and \bf{moeo\-Normalized\-Distance$<$ MOEOT $>$} \doxyref{p.}{classmoeoNormalizedDistance_e58bbf9eb90a8d2704f88d774d3fe1e1}. + +Definition at line 40 of file moeo\-Distance.h.\index{moeoDistance@{moeo\-Distance}!setup@{setup}} +\index{setup@{setup}!moeoDistance@{moeo\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ virtual void \bf{moeo\-Distance}$<$ MOEOT, Type $>$::setup (\bf{eo\-Real\-Interval} {\em \_\-real\-Interval}, unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDistance_b08e7b8c1bedb2993669ec0315fb2b73} + + +Nothing to do. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-real\-Interval}]the \doxyref{eo\-Real\-Interval} object \item[{\em \_\-obj}]the objective index \end{description} +\end{Desc} + + +Reimplemented in \bf{moeo\-Normalized\-Distance$<$ MOEOT, Type $>$} \doxyref{p.}{classmoeoNormalizedDistance_dda4f95d7f6cae9dd1f4bf6cd8fb7c1c}, and \bf{moeo\-Normalized\-Distance$<$ MOEOT $>$} \doxyref{p.}{classmoeoNormalizedDistance_dda4f95d7f6cae9dd1f4bf6cd8fb7c1c}. + +Definition at line 49 of file moeo\-Distance.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Distance.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.eps new file mode 100644 index 000000000..595189b41 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 229.008 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.18333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDistanceMatrix< MOEOT, Type >) cw +(eoUF< const eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDistanceMatrix< MOEOT, Type >) 0 0 box + (eoUF< const eoPop< MOEOT > &, void >) 0 1 box + (eoFunctorBase) 0 2 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.tex new file mode 100644 index 000000000..670658e13 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDistanceMatrix.tex @@ -0,0 +1,78 @@ +\section{moeo\-Distance\-Matrix$<$ MOEOT, Type $>$ Class Template Reference} +\label{classmoeoDistanceMatrix}\index{moeoDistanceMatrix@{moeoDistanceMatrix}} +A matrix to compute distances between every pair of individuals contained in a population. + + +{\tt \#include $<$moeo\-Distance\-Matrix.h$>$} + +Inheritance diagram for moeo\-Distance\-Matrix$<$ MOEOT, Type $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3cm]{classmoeoDistanceMatrix} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Distance\-Matrix} (unsigned int \_\-size, \bf{moeo\-Distance}$<$ MOEOT, Type $>$ \&\_\-distance) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the distance between every pair of individuals contained in the population \_\-pop. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Distance}$<$ MOEOT, Type $>$ \& \bf{distance}\label{classmoeoDistanceMatrix_72789ab7bcb89670cdc4242173dc2c69} + +\begin{CompactList}\small\item\em the distance to use \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT, class Type$>$ class moeo\-Distance\-Matrix$<$ MOEOT, Type $>$} + +A matrix to compute distances between every pair of individuals contained in a population. + + + +Definition at line 24 of file moeo\-Distance\-Matrix.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoDistanceMatrix@{moeo\-Distance\-Matrix}!moeoDistanceMatrix@{moeoDistanceMatrix}} +\index{moeoDistanceMatrix@{moeoDistanceMatrix}!moeoDistanceMatrix@{moeo\-Distance\-Matrix}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ \bf{moeo\-Distance\-Matrix}$<$ MOEOT, Type $>$::\bf{moeo\-Distance\-Matrix} (unsigned int {\em \_\-size}, \bf{moeo\-Distance}$<$ MOEOT, Type $>$ \& {\em \_\-distance})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoDistanceMatrix_5526260bd46b6877abd700a15b9b9ee8} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-size}]size for every dimension of the matrix \item[{\em \_\-distance}]the distance to use \end{description} +\end{Desc} + + +Definition at line 37 of file moeo\-Distance\-Matrix.h. + +\subsection{Member Function Documentation} +\index{moeoDistanceMatrix@{moeo\-Distance\-Matrix}!operator()@{operator()}} +\index{operator()@{operator()}!moeoDistanceMatrix@{moeo\-Distance\-Matrix}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type$>$ void \bf{moeo\-Distance\-Matrix}$<$ MOEOT, Type $>$::operator() (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDistanceMatrix_ae3d433983a0a3d369cc17971498ad48} + + +Sets the distance between every pair of individuals contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ const eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 51 of file moeo\-Distance\-Matrix.h. + +References moeo\-Distance\-Matrix$<$ MOEOT, Type $>$::distance. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Distance\-Matrix.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.eps new file mode 100644 index 000000000..4dc745415 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.eps @@ -0,0 +1,231 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 80.9061 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 6.18 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 3 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDiversityAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoCrowdingDistanceDiversityAssignment< MOEOT >) cw +(moeoDummyDiversityAssignment< MOEOT >) cw +(moeoSharingDiversityAssignment< MOEOT >) cw +(moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >) cw +(moeoFrontByFrontSharingDiversityAssignment< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDiversityAssignment< MOEOT >) 1 2 box + (eoUF< eoPop< MOEOT > &, void >) 1 3 box + (eoFunctorBase) 1 4 box + (moeoCrowdingDistanceDiversityAssignment< MOEOT >) 0 1 box + (moeoDummyDiversityAssignment< MOEOT >) 1 1 box + (moeoSharingDiversityAssignment< MOEOT >) 2 1 box + (moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >) 0 0 box + (moeoFrontByFrontSharingDiversityAssignment< MOEOT >) 2 0 box + +% ----- relations ----- + +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in +solid +1 1 1.25 out +solid +0 2 2 conn +solid +0 0 1.75 in +solid +1 0 0.25 out +solid +0 1 1.75 in +solid +0 2 1.75 in +solid +1 2 0.25 out +solid +0 0 0.75 in +solid +0 2 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.tex new file mode 100644 index 000000000..80686a625 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityAssignment.tex @@ -0,0 +1,75 @@ +\section{moeo\-Diversity\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoDiversityAssignment}\index{moeoDiversityAssignment@{moeoDiversityAssignment}} +Functor that sets the diversity values of a whole population. + + +{\tt \#include $<$moeo\-Diversity\-Assignment.h$>$} + +Inheritance diagram for moeo\-Diversity\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.26537cm]{classmoeoDiversityAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoDiversityAssignment_dc2aa6c655cb0c163aa3c769c91c9339} + +\begin{CompactList}\small\item\em The type for objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +virtual void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec)=0 +\begin{CompactList}\small\item\em Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, MOEOT \&\_\-moeo) +\begin{CompactList}\small\item\em Updates the diversity values of the whole population \_\-pop by taking the deletion of the individual \_\-moeo into account. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Diversity\-Assignment$<$ MOEOT $>$} + +Functor that sets the diversity values of a whole population. + + + +Definition at line 23 of file moeo\-Diversity\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoDiversityAssignment@{moeo\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoDiversityAssignment@{moeo\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [pure virtual]}}\label{classmoeoDiversityAssignment_57f400263b36664df6269f1b522cfdcb} + + +Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implemented in \bf{moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoCrowdingDistanceDiversityAssignment_ac21453d018c0e5dc872ccf0d0893f18}, \bf{moeo\-Dummy\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoDummyDiversityAssignment_3382b59e2b8bbdc840dc25463649f1e4}, \bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_91aec07ffdc20c9654575106399ca62d}, \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFrontByFrontSharingDiversityAssignment_623489a246f86cf24cc5860d32caa743}, and \bf{moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoSharingDiversityAssignment_21c8d6e020af23b2be219b7e02248300}. + +Referenced by moeo\-Diversity\-Assignment$<$ MOEOT $>$::update\-By\-Deleting().\index{moeoDiversityAssignment@{moeo\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoDiversityAssignment@{moeo\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, MOEOT \& {\em \_\-moeo})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoDiversityAssignment_d104002fdd5d81aabe25f95d443ed390} + + +Updates the diversity values of the whole population \_\-pop by taking the deletion of the individual \_\-moeo into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-moeo}]the individual \end{description} +\end{Desc} + + +Definition at line 44 of file moeo\-Diversity\-Assignment.h. + +References moeo\-Diversity\-Assignment$<$ MOEOT $>$::update\-By\-Deleting(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Diversity\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.eps new file mode 100644 index 000000000..2e4daddc8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 263.158 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.9 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDiversityThenFitnessComparator< MOEOT >) cw +(moeoComparator< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDiversityThenFitnessComparator< MOEOT >) 0 0 box + (moeoComparator< MOEOT >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.tex new file mode 100644 index 000000000..e094536aa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDiversityThenFitnessComparator.tex @@ -0,0 +1,49 @@ +\section{moeo\-Diversity\-Then\-Fitness\-Comparator$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoDiversityThenFitnessComparator}\index{moeoDiversityThenFitnessComparator@{moeoDiversityThenFitnessComparator}} +Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. + + +{\tt \#include $<$moeo\-Diversity\-Then\-Fitness\-Comparator.h$>$} + +Inheritance diagram for moeo\-Diversity\-Then\-Fitness\-Comparator$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoDiversityThenFitnessComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 $<$ \_\-moeo2 according to their diversity values, then according to their fitness values. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Diversity\-Then\-Fitness\-Comparator$<$ MOEOT $>$} + +Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. + + + +Definition at line 22 of file moeo\-Diversity\-Then\-Fitness\-Comparator.h. + +\subsection{Member Function Documentation} +\index{moeoDiversityThenFitnessComparator@{moeo\-Diversity\-Then\-Fitness\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoDiversityThenFitnessComparator@{moeo\-Diversity\-Then\-Fitness\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const bool \bf{moeo\-Diversity\-Then\-Fitness\-Comparator}$<$ MOEOT $>$::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoDiversityThenFitnessComparator_62620887203d033af92091d838d4b0b6} + + +Returns true if \_\-moeo1 $<$ \_\-moeo2 according to their diversity values, then according to their fitness values. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Diversity\-Then\-Fitness\-Comparator.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Diversity\-Then\-Fitness\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.eps new file mode 100644 index 000000000..f96a71e7a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 290.909 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.71875 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDummyDiversityAssignment< MOEOT >) cw +(moeoDiversityAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDummyDiversityAssignment< MOEOT >) 0 0 box + (moeoDiversityAssignment< MOEOT >) 0 1 box + (eoUF< eoPop< MOEOT > &, void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.tex new file mode 100644 index 000000000..d96ccf59c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyDiversityAssignment.tex @@ -0,0 +1,75 @@ +\section{moeo\-Dummy\-Diversity\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoDummyDiversityAssignment}\index{moeoDummyDiversityAssignment@{moeoDummyDiversityAssignment}} +\doxyref{moeo\-Dummy\-Diversity\-Assignment}{p.}{classmoeoDummyDiversityAssignment} is a \doxyref{moeo\-Diversity\-Assignment}{p.}{classmoeoDiversityAssignment} that gives the value '0' as the individual's diversity for a whole population if it is invalid. + + +{\tt \#include $<$moeo\-Dummy\-Diversity\-Assignment.h$>$} + +Inheritance diagram for moeo\-Dummy\-Diversity\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoDummyDiversityAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoDummyDiversityAssignment_657d87e8f537200392bd7a24649f0294} + +\begin{CompactList}\small\item\em The type for objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the diversity to '0' for every individuals of the population \_\-pop if it is invalid. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\begin{CompactList}\small\item\em Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Dummy\-Diversity\-Assignment$<$ MOEOT $>$} + +\doxyref{moeo\-Dummy\-Diversity\-Assignment}{p.}{classmoeoDummyDiversityAssignment} is a \doxyref{moeo\-Diversity\-Assignment}{p.}{classmoeoDiversityAssignment} that gives the value '0' as the individual's diversity for a whole population if it is invalid. + + + +Definition at line 22 of file moeo\-Dummy\-Diversity\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoDummyDiversityAssignment@{moeo\-Dummy\-Diversity\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoDummyDiversityAssignment@{moeo\-Dummy\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Dummy\-Diversity\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDummyDiversityAssignment_78c9150d3c586f5324ccbd2faa984ba9} + + +Sets the diversity to '0' for every individuals of the population \_\-pop if it is invalid. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 34 of file moeo\-Dummy\-Diversity\-Assignment.h.\index{moeoDummyDiversityAssignment@{moeo\-Dummy\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoDummyDiversityAssignment@{moeo\-Dummy\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Dummy\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDummyDiversityAssignment_3382b59e2b8bbdc840dc25463649f1e4} + + +Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implements \bf{moeo\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoDiversityAssignment_57f400263b36664df6269f1b522cfdcb}. + +Definition at line 52 of file moeo\-Dummy\-Diversity\-Assignment.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Dummy\-Diversity\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.eps new file mode 100644 index 000000000..5a126222e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 301.887 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.65625 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoDummyFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoDummyFitnessAssignment< MOEOT >) 0 0 box + (moeoFitnessAssignment< MOEOT >) 0 1 box + (eoUF< eoPop< MOEOT > &, void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.tex new file mode 100644 index 000000000..3f8969533 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoDummyFitnessAssignment.tex @@ -0,0 +1,75 @@ +\section{moeo\-Dummy\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoDummyFitnessAssignment}\index{moeoDummyFitnessAssignment@{moeoDummyFitnessAssignment}} +\doxyref{moeo\-Dummy\-Fitness\-Assignment}{p.}{classmoeoDummyFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} that gives the value '0' as the individual's fitness for a whole population if it is invalid. + + +{\tt \#include $<$moeo\-Dummy\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Dummy\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoDummyFitnessAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoDummyFitnessAssignment_33cc1cd06c4c1d8f1f56602594e0593a} + +\begin{CompactList}\small\item\em The type for objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness to '0' for every individuals of the population \_\-pop if it is invalid. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Dummy\-Fitness\-Assignment$<$ MOEOT $>$} + +\doxyref{moeo\-Dummy\-Fitness\-Assignment}{p.}{classmoeoDummyFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} that gives the value '0' as the individual's fitness for a whole population if it is invalid. + + + +Definition at line 22 of file moeo\-Dummy\-Fitness\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoDummyFitnessAssignment@{moeo\-Dummy\-Fitness\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoDummyFitnessAssignment@{moeo\-Dummy\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Dummy\-Fitness\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDummyFitnessAssignment_03c7c1649ae3c83ef6b3668977c10982} + + +Sets the fitness to '0' for every individuals of the population \_\-pop if it is invalid. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 34 of file moeo\-Dummy\-Fitness\-Assignment.h.\index{moeoDummyFitnessAssignment@{moeo\-Dummy\-Fitness\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoDummyFitnessAssignment@{moeo\-Dummy\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Dummy\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoDummyFitnessAssignment_6e87d4a8ff8f43a7001a21a13795d00e} + + +Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implements \bf{moeo\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFitnessAssignment_4922629569eddc9be049b3ead1ab0269}. + +Definition at line 52 of file moeo\-Dummy\-Fitness\-Assignment.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Dummy\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEA.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEA.eps new file mode 100644 index 000000000..91075a456 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEA.eps @@ -0,0 +1,235 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 151.515 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.3 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 4 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEA< MOEOT >) cw +(moeoAlgo) cw +(eoAlgo< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +(moeoEasyEA< MOEOT >) cw +(moeoIBEA< MOEOT >) cw +(moeoNSGA< MOEOT >) cw +(moeoNSGAII< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEA< MOEOT >) 1.5 1 box + (moeoAlgo) 1 2 box + (eoAlgo< MOEOT >) 2 2 box + (eoUF< A1, R >) 2 3 box + (eoFunctorBase) 2 4 box + (moeoEasyEA< MOEOT >) 0 0 box + (moeoIBEA< MOEOT >) 1 0 box + (moeoNSGA< MOEOT >) 2 0 box + (moeoNSGAII< MOEOT >) 3 0 box + +% ----- relations ----- + +solid +0 1.5 1 out +solid +1 2 2 conn +solid +1 1 2 in +solid +1 2 2 in +solid +0 2 2 out +solid +1 2 3 in +solid +0 2 3 out +solid +1 2 4 in +solid +1 1.5 0.25 out +solid +0 3 1 conn +solid +0 0 0.75 in +solid +0 1 0.75 in +solid +0 2 0.75 in +solid +0 3 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEA.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEA.tex new file mode 100644 index 000000000..c6de2bc08 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEA.tex @@ -0,0 +1,27 @@ +\section{moeo\-EA$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoEA}\index{moeoEA@{moeoEA}} +Abstract class for multi-objective evolutionary algorithms. + + +{\tt \#include $<$moeo\-EA.h$>$} + +Inheritance diagram for moeo\-EA$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4.24242cm]{classmoeoEA} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-EA$<$ MOEOT $>$} + +Abstract class for multi-objective evolutionary algorithms. + + + +Definition at line 23 of file moeo\-EA.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-EA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.eps new file mode 100644 index 000000000..528189a2d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 303.03 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.65 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEasyEA< MOEOT >) cw +(moeoEA< MOEOT >) cw +(moeoAlgo) cw +(eoAlgo< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEasyEA< MOEOT >) 0.5 0 box + (moeoEA< MOEOT >) 0.5 1 box + (moeoAlgo) 0 2 box + (eoAlgo< MOEOT >) 1 2 box + (eoUF< A1, R >) 1 3 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.tex new file mode 100644 index 000000000..4ea751dcc --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA.tex @@ -0,0 +1,194 @@ +\section{moeo\-Easy\-EA$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoEasyEA}\index{moeoEasyEA@{moeoEasyEA}} +An easy class to design multi-objective evolutionary algorithms. + + +{\tt \#include $<$moeo\-Easy\-EA.h$>$} + +Inheritance diagram for moeo\-Easy\-EA$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoEasyEA} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Breed}$<$ MOEOT $>$ \&\_\-breed, \bf{moeo\-Replacement}$<$ MOEOT $>$ \&\_\-replace, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Eval, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Eval, bool \_\-eval\-Fit\-And\-Div\-Before\-Selection=false) +\begin{CompactList}\small\item\em Ctor taking a breed and merge. \item\end{CompactList}\item +\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Pop\-Eval\-Func}$<$ MOEOT $>$ \&\_\-pop\-Eval, \bf{eo\-Breed}$<$ MOEOT $>$ \&\_\-breed, \bf{moeo\-Replacement}$<$ MOEOT $>$ \&\_\-replace, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Eval, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Eval, bool \_\-eval\-Fit\-And\-Div\-Before\-Selection=false) +\begin{CompactList}\small\item\em Ctor taking a breed, a merge and a eo\-Pop\-Eval. \item\end{CompactList}\item +\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Breed}$<$ MOEOT $>$ \&\_\-breed, \bf{eo\-Merge}$<$ MOEOT $>$ \&\_\-merge, \bf{eo\-Reduce}$<$ MOEOT $>$ \&\_\-reduce, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Eval, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Eval, bool \_\-eval\-Fit\-And\-Div\-Before\-Selection=false) +\begin{CompactList}\small\item\em Ctor taking a breed, a merge and a reduce. \item\end{CompactList}\item +\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Select}$<$ MOEOT $>$ \&\_\-select, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-transform, \bf{moeo\-Replacement}$<$ MOEOT $>$ \&\_\-replace, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Eval, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Eval, bool \_\-eval\-Fit\-And\-Div\-Before\-Selection=false) +\begin{CompactList}\small\item\em Ctor taking a select, a transform and a replacement. \item\end{CompactList}\item +\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Select}$<$ MOEOT $>$ \&\_\-select, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-transform, \bf{eo\-Merge}$<$ MOEOT $>$ \&\_\-merge, \bf{eo\-Reduce}$<$ MOEOT $>$ \&\_\-reduce, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Eval, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Eval, bool \_\-eval\-Fit\-And\-Div\-Before\-Selection=false) +\begin{CompactList}\small\item\em Ctor taking a select, a transform, a merge and a reduce. \item\end{CompactList}\item +virtual void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Applies a few generation of evolution to the population \_\-pop. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{eo\-Continue}$<$ MOEOT $>$ \& \bf{continuator}\label{classmoeoEasyEA_5f5b76acbaf99a6a3ee2710da07dde29} + +\begin{CompactList}\small\item\em the stopping criteria \item\end{CompactList}\item +\bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& \bf{eval}\label{classmoeoEasyEA_26e8ebce6a1bc3216e20171688ba6b83} + +\begin{CompactList}\small\item\em the evaluation functions \item\end{CompactList}\item +\bf{eo\-Pop\-Loop\-Eval}$<$ MOEOT $>$ \bf{loop\-Eval}\label{classmoeoEasyEA_c1d492090805bf322c07159a9238a7ae} + +\begin{CompactList}\small\item\em to evaluate the whole population \item\end{CompactList}\item +\bf{eo\-Pop\-Eval\-Func}$<$ MOEOT $>$ \& \bf{pop\-Eval}\label{classmoeoEasyEA_189a8f5196844907ff71f386d95bf415} + +\begin{CompactList}\small\item\em to evaluate the whole population \item\end{CompactList}\item +\bf{eo\-Select\-Transform}$<$ MOEOT $>$ \bf{select\-Transform}\label{classmoeoEasyEA_bd69a176f3cacc2694342075a9022f74} + +\begin{CompactList}\small\item\em breed: a select followed by a transform \item\end{CompactList}\item +\bf{eo\-Breed}$<$ MOEOT $>$ \& \bf{breed}\label{classmoeoEasyEA_35d5909694019d1b0d52347c72a9092e} + +\begin{CompactList}\small\item\em the breeder \item\end{CompactList}\item +\bf{eo\-Merge\-Reduce}$<$ MOEOT $>$ \bf{merge\-Reduce}\label{classmoeoEasyEA_15a69654c07b24f9795add0a22f1f856} + +\begin{CompactList}\small\item\em replacement: a merge followed by a reduce \item\end{CompactList}\item +\bf{moeo\-Replacement}$<$ MOEOT $>$ \& \bf{replace}\label{classmoeoEasyEA_91611cf2862c2db953554e367a576244} + +\begin{CompactList}\small\item\em the replacment strategy \item\end{CompactList}\item +\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& \bf{fitness\-Eval}\label{classmoeoEasyEA_1268fc2f0b62fe51bca17d4efb51954b} + +\begin{CompactList}\small\item\em the fitness assignment strategy \item\end{CompactList}\item +\bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& \bf{diversity\-Eval}\label{classmoeoEasyEA_b9d1b3790072dbbbe0012a252bab95f4} + +\begin{CompactList}\small\item\em the diversity assignment strategy \item\end{CompactList}\item +bool \bf{eval\-Fit\-And\-Div\-Before\-Selection}\label{classmoeoEasyEA_856a19d9a7c180fe33ce7a5bb010edcc} + +\begin{CompactList}\small\item\em if this parameter is set to 'true', the fitness and the diversity of the whole population will be re-evaluated before the selection process \item\end{CompactList}\item +\bf{moeo\-Easy\-EA::eo\-Dummy\-Eval} \bf{dummy\-Eval}\label{classmoeoEasyEA_16cbb12cb7de77c6d7d3f7aee9434880} + +\begin{CompactList}\small\item\em a dummy eval \item\end{CompactList}\item +\bf{moeo\-Easy\-EA::eo\-Dummy\-Select} \bf{dummy\-Select}\label{classmoeoEasyEA_fed6522fe0fcea204850dbb89cc7116e} + +\begin{CompactList}\small\item\em a dummy select \item\end{CompactList}\item +\bf{moeo\-Easy\-EA::eo\-Dummy\-Transform} \bf{dummy\-Transform}\label{classmoeoEasyEA_56991f36963ed61e44e91759c891f13c} + +\begin{CompactList}\small\item\em a dummy transform \item\end{CompactList}\item +\bf{eo\-No\-Elitism}$<$ MOEOT $>$ \bf{dummy\-Merge}\label{classmoeoEasyEA_e26830e1301cfd626eed55b0fbf8dbcb} + +\begin{CompactList}\small\item\em a dummy merge \item\end{CompactList}\item +\bf{eo\-Truncate}$<$ MOEOT $>$ \bf{dummy\-Reduce}\label{classmoeoEasyEA_65963f9308ccc0acc3dfc32a128f6228} + +\begin{CompactList}\small\item\em a dummy reduce \item\end{CompactList}\end{CompactItemize} +\subsection*{Classes} +\begin{CompactItemize} +\item +class \bf{eo\-Dummy\-Eval} +\begin{CompactList}\small\item\em a dummy eval \item\end{CompactList}\item +class \bf{eo\-Dummy\-Select} +\begin{CompactList}\small\item\em a dummy select \item\end{CompactList}\item +class \bf{eo\-Dummy\-Transform} +\begin{CompactList}\small\item\em a dummy transform \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Easy\-EA$<$ MOEOT $>$} + +An easy class to design multi-objective evolutionary algorithms. + + + +Definition at line 33 of file moeo\-Easy\-EA.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoEasyEA@{moeo\-Easy\-EA}!moeoEasyEA@{moeoEasyEA}} +\index{moeoEasyEA@{moeoEasyEA}!moeoEasyEA@{moeo\-Easy\-EA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Easy\-EA}$<$ MOEOT $>$::\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Breed}$<$ MOEOT $>$ \& {\em \_\-breed}, \bf{moeo\-Replacement}$<$ MOEOT $>$ \& {\em \_\-replace}, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Eval}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Eval}, bool {\em \_\-eval\-Fit\-And\-Div\-Before\-Selection} = {\tt false})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEasyEA_3f657699b8ed340ae3f51194206daa20} + + +Ctor taking a breed and merge. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]the stopping criteria \item[{\em \_\-eval}]the evaluation functions \item[{\em \_\-breed}]the breeder \item[{\em \_\-replace}]the replacement strategy \item[{\em \_\-fitness\-Eval}]the fitness evaluation scheme \item[{\em \_\-diversity\-Eval}]the diversity evaluation scheme \item[{\em \_\-eval\-Fit\-And\-Div\-Before\-Selection}]put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process \end{description} +\end{Desc} + + +Definition at line 47 of file moeo\-Easy\-EA.h.\index{moeoEasyEA@{moeo\-Easy\-EA}!moeoEasyEA@{moeoEasyEA}} +\index{moeoEasyEA@{moeoEasyEA}!moeoEasyEA@{moeo\-Easy\-EA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Easy\-EA}$<$ MOEOT $>$::\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Pop\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-pop\-Eval}, \bf{eo\-Breed}$<$ MOEOT $>$ \& {\em \_\-breed}, \bf{moeo\-Replacement}$<$ MOEOT $>$ \& {\em \_\-replace}, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Eval}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Eval}, bool {\em \_\-eval\-Fit\-And\-Div\-Before\-Selection} = {\tt false})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEasyEA_6cdebc72ce0134ce1680dafdf94740a1} + + +Ctor taking a breed, a merge and a eo\-Pop\-Eval. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]the stopping criteria \item[{\em \_\-pop\-Eval}]the evaluation functions for the whole population \item[{\em \_\-breed}]the breeder \item[{\em \_\-replace}]the replacement strategy \item[{\em \_\-fitness\-Eval}]the fitness evaluation scheme \item[{\em \_\-diversity\-Eval}]the diversity evaluation scheme \item[{\em \_\-eval\-Fit\-And\-Div\-Before\-Selection}]put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process \end{description} +\end{Desc} + + +Definition at line 65 of file moeo\-Easy\-EA.h.\index{moeoEasyEA@{moeo\-Easy\-EA}!moeoEasyEA@{moeoEasyEA}} +\index{moeoEasyEA@{moeoEasyEA}!moeoEasyEA@{moeo\-Easy\-EA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Easy\-EA}$<$ MOEOT $>$::\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Breed}$<$ MOEOT $>$ \& {\em \_\-breed}, \bf{eo\-Merge}$<$ MOEOT $>$ \& {\em \_\-merge}, \bf{eo\-Reduce}$<$ MOEOT $>$ \& {\em \_\-reduce}, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Eval}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Eval}, bool {\em \_\-eval\-Fit\-And\-Div\-Before\-Selection} = {\tt false})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEasyEA_65c1069eeed979ca433e6caee3b5e942} + + +Ctor taking a breed, a merge and a reduce. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]the stopping criteria \item[{\em \_\-eval}]the evaluation functions \item[{\em \_\-breed}]the breeder \item[{\em \_\-merge}]the merge scheme \item[{\em \_\-reduce}]the reduce scheme \item[{\em \_\-fitness\-Eval}]the fitness evaluation scheme \item[{\em \_\-diversity\-Eval}]the diversity evaluation scheme \item[{\em \_\-eval\-Fit\-And\-Div\-Before\-Selection}]put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process \end{description} +\end{Desc} + + +Definition at line 84 of file moeo\-Easy\-EA.h.\index{moeoEasyEA@{moeo\-Easy\-EA}!moeoEasyEA@{moeoEasyEA}} +\index{moeoEasyEA@{moeoEasyEA}!moeoEasyEA@{moeo\-Easy\-EA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Easy\-EA}$<$ MOEOT $>$::\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Select}$<$ MOEOT $>$ \& {\em \_\-select}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-transform}, \bf{moeo\-Replacement}$<$ MOEOT $>$ \& {\em \_\-replace}, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Eval}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Eval}, bool {\em \_\-eval\-Fit\-And\-Div\-Before\-Selection} = {\tt false})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEasyEA_27f0db7a608636c904305afa11cd6ae1} + + +Ctor taking a select, a transform and a replacement. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]the stopping criteria \item[{\em \_\-eval}]the evaluation functions \item[{\em \_\-select}]the selection scheme \item[{\em \_\-transform}]the tranformation scheme \item[{\em \_\-replace}]the replacement strategy \item[{\em \_\-fitness\-Eval}]the fitness evaluation scheme \item[{\em \_\-diversity\-Eval}]the diversity evaluation scheme \item[{\em \_\-eval\-Fit\-And\-Div\-Before\-Selection}]put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process \end{description} +\end{Desc} + + +Definition at line 103 of file moeo\-Easy\-EA.h.\index{moeoEasyEA@{moeo\-Easy\-EA}!moeoEasyEA@{moeoEasyEA}} +\index{moeoEasyEA@{moeoEasyEA}!moeoEasyEA@{moeo\-Easy\-EA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Easy\-EA}$<$ MOEOT $>$::\bf{moeo\-Easy\-EA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Select}$<$ MOEOT $>$ \& {\em \_\-select}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-transform}, \bf{eo\-Merge}$<$ MOEOT $>$ \& {\em \_\-merge}, \bf{eo\-Reduce}$<$ MOEOT $>$ \& {\em \_\-reduce}, \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Eval}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Eval}, bool {\em \_\-eval\-Fit\-And\-Div\-Before\-Selection} = {\tt false})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEasyEA_564a3291a8239515328cf0a6b40f3c99} + + +Ctor taking a select, a transform, a merge and a reduce. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]the stopping criteria \item[{\em \_\-eval}]the evaluation functions \item[{\em \_\-select}]the selection scheme \item[{\em \_\-transform}]the tranformation scheme \item[{\em \_\-merge}]the merge scheme \item[{\em \_\-reduce}]the reduce scheme \item[{\em \_\-fitness\-Eval}]the fitness evaluation scheme \item[{\em \_\-diversity\-Eval}]the diversity evaluation scheme \item[{\em \_\-eval\-Fit\-And\-Div\-Before\-Selection}]put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process \end{description} +\end{Desc} + + +Definition at line 123 of file moeo\-Easy\-EA.h. + +\subsection{Member Function Documentation} +\index{moeoEasyEA@{moeo\-Easy\-EA}!operator()@{operator()}} +\index{operator()@{operator()}!moeoEasyEA@{moeo\-Easy\-EA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-Easy\-EA}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoEasyEA_f18e8fd179fbb2b89f4a59d213317170} + + +Applies a few generation of evolution to the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 135 of file moeo\-Easy\-EA.h. + +References moeo\-Easy\-EA$<$ MOEOT $>$::breed, moeo\-Easy\-EA$<$ MOEOT $>$::continuator, moeo\-Easy\-EA$<$ MOEOT $>$::diversity\-Eval, moeo\-Easy\-EA$<$ MOEOT $>$::eval\-Fit\-And\-Div\-Before\-Selection, moeo\-Easy\-EA$<$ MOEOT $>$::fitness\-Eval, moeo\-Easy\-EA$<$ MOEOT $>$::pop\-Eval, and moeo\-Easy\-EA$<$ MOEOT $>$::replace. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Easy\-EA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.eps new file mode 100644 index 000000000..6887abc95 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 318.725 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.56875 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEasyEA< MOEOT >::eoDummyEval) cw +(eoEvalFunc< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEasyEA< MOEOT >::eoDummyEval) 0 0 box + (eoEvalFunc< MOEOT >) 0 1 box + (eoUF< A1, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.tex new file mode 100644 index 000000000..a29cf04b9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyEval.tex @@ -0,0 +1,33 @@ +\section{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Eval Class Reference} +\label{classmoeoEasyEA_1_1eoDummyEval}\index{moeoEasyEA::eoDummyEval@{moeoEasyEA::eoDummyEval}} +a dummy eval + + +{\tt \#include $<$moeo\-Easy\-EA.h$>$} + +Inheritance diagram for moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Eval::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoEasyEA_1_1eoDummyEval} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{operator()} (MOEOT \&)\label{classmoeoEasyEA_1_1eoDummyEval_1ed55869451f883db2fc43c60f7caff5} + +\begin{CompactList}\small\item\em the dummy functor \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Eval} + +a dummy eval + + + +Definition at line 200 of file moeo\-Easy\-EA.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Easy\-EA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.eps new file mode 100644 index 000000000..d9db8ba09 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 306.513 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.63125 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEasyEA< MOEOT >::eoDummySelect) cw +(eoSelect< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEasyEA< MOEOT >::eoDummySelect) 0 0 box + (eoSelect< MOEOT >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.tex new file mode 100644 index 000000000..50599fe9b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummySelect.tex @@ -0,0 +1,33 @@ +\section{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Select Class Reference} +\label{classmoeoEasyEA_1_1eoDummySelect}\index{moeoEasyEA::eoDummySelect@{moeoEasyEA::eoDummySelect}} +a dummy select + + +{\tt \#include $<$moeo\-Easy\-EA.h$>$} + +Inheritance diagram for moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Select::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoEasyEA_1_1eoDummySelect} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&, \bf{eo\-Pop}$<$ MOEOT $>$ \&)\label{classmoeoEasyEA_1_1eoDummySelect_32207d2ed997aa90ba9f32f5625b63d6} + +\begin{CompactList}\small\item\em the dummy functor \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Select} + +a dummy select + + + +Definition at line 204 of file moeo\-Easy\-EA.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Easy\-EA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.eps new file mode 100644 index 000000000..35dbc762b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 282.686 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.76875 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEasyEA< MOEOT >::eoDummyTransform) cw +(eoTransform< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEasyEA< MOEOT >::eoDummyTransform) 0 0 box + (eoTransform< MOEOT >) 0 1 box + (eoUF< A1, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.tex new file mode 100644 index 000000000..495ae6b6c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEasyEA_1_1eoDummyTransform.tex @@ -0,0 +1,33 @@ +\section{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Transform Class Reference} +\label{classmoeoEasyEA_1_1eoDummyTransform}\index{moeoEasyEA::eoDummyTransform@{moeoEasyEA::eoDummyTransform}} +a dummy transform + + +{\tt \#include $<$moeo\-Easy\-EA.h$>$} + +Inheritance diagram for moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Transform::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoEasyEA_1_1eoDummyTransform} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&)\label{classmoeoEasyEA_1_1eoDummyTransform_0e153e482291a7f19f7f7a02505fb432} + +\begin{CompactList}\small\item\em the dummy functor \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Transform} + +a dummy transform + + + +Definition at line 208 of file moeo\-Easy\-EA.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Easy\-EA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.eps new file mode 100644 index 000000000..afafe9024 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 452.489 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.105 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoElitistReplacement< MOEOT >) cw +(moeoReplacement< MOEOT >) cw +(eoReplacement< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoElitistReplacement< MOEOT >) 0 0 box + (moeoReplacement< MOEOT >) 0 1 box + (eoReplacement< MOEOT >) 0 2 box + (eoBF< A1, A2, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.tex new file mode 100644 index 000000000..7b71765f9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement.tex @@ -0,0 +1,141 @@ +\section{moeo\-Elitist\-Replacement$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoElitistReplacement}\index{moeoElitistReplacement@{moeoElitistReplacement}} +Elitist replacement strategy that consists in keeping the N best individuals. + + +{\tt \#include $<$moeo\-Elitist\-Replacement.h$>$} + +Inheritance diagram for moeo\-Elitist\-Replacement$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoElitistReplacement} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Assignment, \bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comparator) +\begin{CompactList}\small\item\em Full constructor. \item\end{CompactList}\item +\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Assignment) +\begin{CompactList}\small\item\em Constructor without comparator. \item\end{CompactList}\item +\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment, \bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comparator) +\begin{CompactList}\small\item\em Constructor without moeo\-Diversity\-Assignement. \item\end{CompactList}\item +\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment) +\begin{CompactList}\small\item\em Constructor without moeo\-Diversity\-Assignement nor \doxyref{moeo\-Comparator}{p.}{classmoeoComparator}. \item\end{CompactList}\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-parents, \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-offspring) +\begin{CompactList}\small\item\em Replaces the first population by adding the individuals of the second one, sorting with a \doxyref{moeo\-Comparator}{p.}{classmoeoComparator} and resizing the whole population obtained. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& \bf{fitness\-Assignment}\label{classmoeoElitistReplacement_ba390ae799848417dc41d0e71b010425} + +\begin{CompactList}\small\item\em the fitness assignment strategy \item\end{CompactList}\item +\bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& \bf{diversity\-Assignment}\label{classmoeoElitistReplacement_7dff2c8d871e87a2ba326b69fd0c48d9} + +\begin{CompactList}\small\item\em the diversity assignment strategy \item\end{CompactList}\item +\bf{moeo\-Dummy\-Diversity\-Assignment}$<$ MOEOT $>$ \bf{default\-Diversity}\label{classmoeoElitistReplacement_0a88fa6ae1cba0eb041b804f86e31ab2} + +\begin{CompactList}\small\item\em a dummy diversity assignment can be used as default \item\end{CompactList}\item +\bf{moeo\-Fitness\-Then\-Diversity\-Comparator}$<$ MOEOT $>$ \bf{default\-Comparator}\label{classmoeoElitistReplacement_e4b10eae9d1b048525737fbe47e34215} + +\begin{CompactList}\small\item\em a fitness then diversity comparator can be used as default \item\end{CompactList}\item +\bf{moeo\-Elitist\-Replacement::Cmp} \bf{comparator}\label{classmoeoElitistReplacement_4ef0a67b6f52c7238449522f4773ad60} + +\begin{CompactList}\small\item\em this object is used to compare solutions in order to sort the population \item\end{CompactList}\end{CompactItemize} +\subsection*{Classes} +\begin{CompactItemize} +\item +class \bf{Cmp} +\begin{CompactList}\small\item\em this object is used to compare solutions in order to sort the population \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Elitist\-Replacement$<$ MOEOT $>$} + +Elitist replacement strategy that consists in keeping the N best individuals. + + + +Definition at line 26 of file moeo\-Elitist\-Replacement.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoElitistReplacement@{moeo\-Elitist\-Replacement}!moeoElitistReplacement@{moeoElitistReplacement}} +\index{moeoElitistReplacement@{moeoElitistReplacement}!moeoElitistReplacement@{moeo\-Elitist\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Assignment}, \bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comparator})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoElitistReplacement_1d91980f3f800833c8e9452cb450ae3e} + + +Full constructor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \item[{\em \_\-diversity\-Assignment}]the diversity assignment strategy \item[{\em \_\-comparator}]the comparator (used to compare 2 individuals) \end{description} +\end{Desc} + + +Definition at line 36 of file moeo\-Elitist\-Replacement.h.\index{moeoElitistReplacement@{moeo\-Elitist\-Replacement}!moeoElitistReplacement@{moeoElitistReplacement}} +\index{moeoElitistReplacement@{moeoElitistReplacement}!moeoElitistReplacement@{moeo\-Elitist\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Assignment})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoElitistReplacement_d7122be0519207c7496852284ed24514} + + +Constructor without comparator. + +A moeo\-Fit\-Then\-Div\-Comparator is used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \item[{\em \_\-diversity\-Assignment}]the diversity assignment strategy \end{description} +\end{Desc} + + +Definition at line 46 of file moeo\-Elitist\-Replacement.h.\index{moeoElitistReplacement@{moeo\-Elitist\-Replacement}!moeoElitistReplacement@{moeoElitistReplacement}} +\index{moeoElitistReplacement@{moeoElitistReplacement}!moeoElitistReplacement@{moeo\-Elitist\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment}, \bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comparator})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoElitistReplacement_81b7b8e0cac6cbed36e47688adf1466c} + + +Constructor without moeo\-Diversity\-Assignement. + +A dummy diversity is used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \item[{\em \_\-comparator}]the comparator (used to compare 2 individuals) \end{description} +\end{Desc} + + +Definition at line 56 of file moeo\-Elitist\-Replacement.h.\index{moeoElitistReplacement@{moeo\-Elitist\-Replacement}!moeoElitistReplacement@{moeoElitistReplacement}} +\index{moeoElitistReplacement@{moeoElitistReplacement}!moeoElitistReplacement@{moeo\-Elitist\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Elitist\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoElitistReplacement_2ef7c199d779d473a9d35cee21556794} + + +Constructor without moeo\-Diversity\-Assignement nor \doxyref{moeo\-Comparator}{p.}{classmoeoComparator}. + +A moeo\-Fit\-Then\-Div\-Comparator and a dummy diversity are used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \end{description} +\end{Desc} + + +Definition at line 66 of file moeo\-Elitist\-Replacement.h. + +\subsection{Member Function Documentation} +\index{moeoElitistReplacement@{moeo\-Elitist\-Replacement}!operator()@{operator()}} +\index{operator()@{operator()}!moeoElitistReplacement@{moeo\-Elitist\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-parents}, \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-offspring})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoElitistReplacement_0364c6ef9d16f7eb65caa9edfce69006} + + +Replaces the first population by adding the individuals of the second one, sorting with a \doxyref{moeo\-Comparator}{p.}{classmoeoComparator} and resizing the whole population obtained. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-parents}]the population composed of the parents (the population you want to replace) \item[{\em \_\-offspring}]the offspring population \end{description} +\end{Desc} + + +Definition at line 76 of file moeo\-Elitist\-Replacement.h. + +References moeo\-Elitist\-Replacement$<$ MOEOT $>$::comparator, moeo\-Elitist\-Replacement$<$ MOEOT $>$::diversity\-Assignment, and moeo\-Elitist\-Replacement$<$ MOEOT $>$::fitness\-Assignment. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Elitist\-Replacement.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement_1_1Cmp.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement_1_1Cmp.tex new file mode 100644 index 000000000..e3d9c7dec --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoElitistReplacement_1_1Cmp.tex @@ -0,0 +1,52 @@ +\section{moeo\-Elitist\-Replacement$<$ MOEOT $>$::Cmp Class Reference} +\label{classmoeoElitistReplacement_1_1Cmp}\index{moeoElitistReplacement::Cmp@{moeoElitistReplacement::Cmp}} +this object is used to compare solutions in order to sort the population + + +{\tt \#include $<$moeo\-Elitist\-Replacement.h$>$} + +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{Cmp} (\bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comp) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2)\label{classmoeoElitistReplacement_1_1Cmp_2411b927dde02225114635e776ce863f} + +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 is greater than \_\-moeo2 according to the comparator \_\-moeo1 the first individual \_\-moeo2 the first individual. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Comparator}$<$ MOEOT $>$ \& \bf{comp}\label{classmoeoElitistReplacement_1_1Cmp_c7c0d0839bcbe86455d9f1064884219a} + +\begin{CompactList}\small\item\em the comparator \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Elitist\-Replacement$<$ MOEOT $>$::Cmp} + +this object is used to compare solutions in order to sort the population + + + +Definition at line 105 of file moeo\-Elitist\-Replacement.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoElitistReplacement::Cmp@{moeo\-Elitist\-Replacement::Cmp}!Cmp@{Cmp}} +\index{Cmp@{Cmp}!moeoElitistReplacement::Cmp@{moeo\-Elitist\-Replacement::Cmp}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$::Cmp::Cmp (\bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comp})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoElitistReplacement_1_1Cmp_c9f21fe0df172dc601a13d6531c5ffd9} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-comp}]the comparator \end{description} +\end{Desc} + + +Definition at line 112 of file moeo\-Elitist\-Replacement.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Elitist\-Replacement.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.eps new file mode 100644 index 000000000..07195f6e5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.626 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.77 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEntropyMetric< ObjectiveVector >) cw +(moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEntropyMetric< ObjectiveVector >) 0.5 0 box + (moeoVectorVsVectorBinaryMetric< ObjectiveVector, double >) 0.5 1 box + (moeoBinaryMetric< A1, A2, R >) 0.5 2 box + (eoBF< A1, A2, R >) 0 3 box + (moeoMetric) 1 3 box + (eoFunctorBase) 0 4 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +0 1 3 conn +solid +1 0 3 in +solid +0 0 3 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 0 4 in +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.tex new file mode 100644 index 000000000..eaf9016ca --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEntropyMetric.tex @@ -0,0 +1,152 @@ +\section{moeo\-Entropy\-Metric$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoEntropyMetric}\index{moeoEntropyMetric@{moeoEntropyMetric}} +The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. + + +{\tt \#include $<$moeo\-Entropy\-Metric.h$>$} + +Inheritance diagram for moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.71353cm]{classmoeoEntropyMetric} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +double \bf{operator()} (const std::vector$<$ Objective\-Vector $>$ \&\_\-set1, const std::vector$<$ Objective\-Vector $>$ \&\_\-set2) +\begin{CompactList}\small\item\em Returns the entropy of the Pareto set '\_\-set1' relatively to the Pareto set '\_\-set2'. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +void \bf{remove\-Dominated} (std::vector$<$ Objective\-Vector $>$ \&\_\-f) +\begin{CompactList}\small\item\em Removes the dominated individuals contained in \_\-f. \item\end{CompactList}\item +void \bf{prenormalize} (const std::vector$<$ Objective\-Vector $>$ \&\_\-f) +\begin{CompactList}\small\item\em Prenormalization. \item\end{CompactList}\item +void \bf{normalize} (std::vector$<$ Objective\-Vector $>$ \&\_\-f) +\begin{CompactList}\small\item\em Normalization. \item\end{CompactList}\item +void \bf{compute\-Union} (const std::vector$<$ Objective\-Vector $>$ \&\_\-f1, const std::vector$<$ Objective\-Vector $>$ \&\_\-f2, std::vector$<$ Objective\-Vector $>$ \&\_\-f) +\begin{CompactList}\small\item\em Computation of the union of \_\-f1 and \_\-f2 in \_\-f. \item\end{CompactList}\item +unsigned int \bf{how\-Many\-In\-Niche\-Of} (const std::vector$<$ Objective\-Vector $>$ \&\_\-f, const Objective\-Vector \&\_\-s, unsigned int \_\-size)\label{classmoeoEntropyMetric_7977dac672bd6e2e1dfff8cf7954c180} + +\begin{CompactList}\small\item\em How many in niche. \item\end{CompactList}\item +double \bf{euclidian\-Distance} (const Objective\-Vector \&\_\-set1, const Objective\-Vector \&\_\-to, unsigned int \_\-deg=2)\label{classmoeoEntropyMetric_4716a673498a0681fb78414e390824a3} + +\begin{CompactList}\small\item\em Euclidian distance. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +std::vector$<$ double $>$ \bf{vect\_\-min\_\-val}\label{classmoeoEntropyMetric_e423d7d4416ef371ce7b0fd24c3212f8} + +\begin{CompactList}\small\item\em vector of min values \item\end{CompactList}\item +std::vector$<$ double $>$ \bf{vect\_\-max\_\-val}\label{classmoeoEntropyMetric_f5fad6d144520fd1403f774f98b18b99} + +\begin{CompactList}\small\item\em vector of max values \item\end{CompactList}\item +\bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$ \bf{pareto\-Comparator}\label{classmoeoEntropyMetric_227ce550253c35957300c6e11730c847} + +\begin{CompactList}\small\item\em Functor to compare two objective vectors according to Pareto dominance relation. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Entropy\-Metric$<$ Objective\-Vector $>$} + +The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. + +of the 2002 Congress on Evolutionary Computation, IEEE Press, pp. 1155-1156) + + + +Definition at line 25 of file moeo\-Entropy\-Metric.h. + +\subsection{Member Function Documentation} +\index{moeoEntropyMetric@{moeo\-Entropy\-Metric}!operator()@{operator()}} +\index{operator()@{operator()}!moeoEntropyMetric@{moeo\-Entropy\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ double \bf{moeo\-Entropy\-Metric}$<$ Objective\-Vector $>$::operator() (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set1}, const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-set2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEntropyMetric_191a8cdda7873e20338e678c5a7b927b} + + +Returns the entropy of the Pareto set '\_\-set1' relatively to the Pareto set '\_\-set2'. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-set1}]the first Pareto set \item[{\em \_\-set2}]the second Pareto set \end{description} +\end{Desc} + + +Definition at line 34 of file moeo\-Entropy\-Metric.h. + +References moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::compute\-Union(), moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::how\-Many\-In\-Niche\-Of(), moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::normalize(), moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::prenormalize(), and moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::remove\-Dominated().\index{moeoEntropyMetric@{moeo\-Entropy\-Metric}!removeDominated@{removeDominated}} +\index{removeDominated@{removeDominated}!moeoEntropyMetric@{moeo\-Entropy\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ void \bf{moeo\-Entropy\-Metric}$<$ Objective\-Vector $>$::remove\-Dominated (std::vector$<$ Objective\-Vector $>$ \& {\em \_\-f})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoEntropyMetric_198a717fd0bab0bb91346399c1021f82} + + +Removes the dominated individuals contained in \_\-f. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-f}]a Pareto set \end{description} +\end{Desc} + + +Definition at line 85 of file moeo\-Entropy\-Metric.h. + +References moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::pareto\-Comparator. + +Referenced by moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::operator()().\index{moeoEntropyMetric@{moeo\-Entropy\-Metric}!prenormalize@{prenormalize}} +\index{prenormalize@{prenormalize}!moeoEntropyMetric@{moeo\-Entropy\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ void \bf{moeo\-Entropy\-Metric}$<$ Objective\-Vector $>$::prenormalize (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-f})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoEntropyMetric_51dd04bdd0ac6315f4f5956fb726cec1} + + +Prenormalization. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-f}]a Pareto set \end{description} +\end{Desc} + + +Definition at line 107 of file moeo\-Entropy\-Metric.h. + +References moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::vect\_\-max\_\-val, and moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::vect\_\-min\_\-val. + +Referenced by moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::operator()().\index{moeoEntropyMetric@{moeo\-Entropy\-Metric}!normalize@{normalize}} +\index{normalize@{normalize}!moeoEntropyMetric@{moeo\-Entropy\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ void \bf{moeo\-Entropy\-Metric}$<$ Objective\-Vector $>$::normalize (std::vector$<$ Objective\-Vector $>$ \& {\em \_\-f})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoEntropyMetric_2ed5771c3c611634b415f4be48cad172} + + +Normalization. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-f}]a Pareto set \end{description} +\end{Desc} + + +Definition at line 129 of file moeo\-Entropy\-Metric.h. + +References moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::vect\_\-max\_\-val, and moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::vect\_\-min\_\-val. + +Referenced by moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::operator()().\index{moeoEntropyMetric@{moeo\-Entropy\-Metric}!computeUnion@{computeUnion}} +\index{computeUnion@{computeUnion}!moeoEntropyMetric@{moeo\-Entropy\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ void \bf{moeo\-Entropy\-Metric}$<$ Objective\-Vector $>$::compute\-Union (const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-f1}, const std::vector$<$ Objective\-Vector $>$ \& {\em \_\-f2}, std::vector$<$ Objective\-Vector $>$ \& {\em \_\-f})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoEntropyMetric_4b99c1842d780a89bda08e99a59e3e29} + + +Computation of the union of \_\-f1 and \_\-f2 in \_\-f. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-f1}]the first Pareto set \item[{\em \_\-f2}]the second Pareto set \item[{\em \_\-f}]the final Pareto set \end{description} +\end{Desc} + + +Definition at line 142 of file moeo\-Entropy\-Metric.h. + +Referenced by moeo\-Entropy\-Metric$<$ Objective\-Vector $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Entropy\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.eps new file mode 100644 index 000000000..06f562ea4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 367.647 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.36 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEnvironmentalReplacement< MOEOT >) cw +(moeoReplacement< MOEOT >) cw +(eoReplacement< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEnvironmentalReplacement< MOEOT >) 0 0 box + (moeoReplacement< MOEOT >) 0 1 box + (eoReplacement< MOEOT >) 0 2 box + (eoBF< A1, A2, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.tex new file mode 100644 index 000000000..4b64e667d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement.tex @@ -0,0 +1,147 @@ +\section{moeo\-Environmental\-Replacement$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoEnvironmentalReplacement}\index{moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}} +Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion. + + +{\tt \#include $<$moeo\-Environmental\-Replacement.h$>$} + +Inheritance diagram for moeo\-Environmental\-Replacement$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoEnvironmentalReplacement} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoEnvironmentalReplacement_ef38fb9b1ab23ddd2c558639e19f4821} + +\begin{CompactList}\small\item\em The type for objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Assignment, \bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comparator) +\begin{CompactList}\small\item\em Full constructor. \item\end{CompactList}\item +\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \&\_\-diversity\-Assignment) +\begin{CompactList}\small\item\em Constructor without comparator. \item\end{CompactList}\item +\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment, \bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comparator) +\begin{CompactList}\small\item\em Constructor without moeo\-Diversity\-Assignement. \item\end{CompactList}\item +\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \&\_\-fitness\-Assignment) +\begin{CompactList}\small\item\em Constructor without moeo\-Diversity\-Assignement nor \doxyref{moeo\-Comparator}{p.}{classmoeoComparator}. \item\end{CompactList}\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-parents, \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-offspring) +\begin{CompactList}\small\item\em Replaces the first population by adding the individuals of the second one, sorting with a \doxyref{moeo\-Comparator}{p.}{classmoeoComparator} and resizing the whole population obtained. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& \bf{fitness\-Assignment}\label{classmoeoEnvironmentalReplacement_4b7bc138b17ad5381355c0481bc9c669} + +\begin{CompactList}\small\item\em the fitness assignment strategy \item\end{CompactList}\item +\bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& \bf{diversity\-Assignment}\label{classmoeoEnvironmentalReplacement_e2453bd96c9a490f7de21f9ce22fdff9} + +\begin{CompactList}\small\item\em the diversity assignment strategy \item\end{CompactList}\item +\bf{moeo\-Dummy\-Diversity\-Assignment}$<$ MOEOT $>$ \bf{default\-Diversity}\label{classmoeoEnvironmentalReplacement_7f546704db3225ee1c40439beff5f618} + +\begin{CompactList}\small\item\em a dummy diversity assignment can be used as default \item\end{CompactList}\item +\bf{moeo\-Fitness\-Then\-Diversity\-Comparator}$<$ MOEOT $>$ \bf{default\-Comparator}\label{classmoeoEnvironmentalReplacement_b7f4ce8d3ecf2d18e8c48982875760bb} + +\begin{CompactList}\small\item\em a fitness then diversity comparator can be used as default \item\end{CompactList}\item +\bf{moeo\-Environmental\-Replacement::Cmp} \bf{comparator}\label{classmoeoEnvironmentalReplacement_e3a9d75b9e6603aba4a04fb8062db0a4} + +\begin{CompactList}\small\item\em this object is used to compare solutions in order to sort the population \item\end{CompactList}\end{CompactItemize} +\subsection*{Classes} +\begin{CompactItemize} +\item +class \bf{Cmp} +\begin{CompactList}\small\item\em this object is used to compare solutions in order to sort the population \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Environmental\-Replacement$<$ MOEOT $>$} + +Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion. + + + +Definition at line 26 of file moeo\-Environmental\-Replacement.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}!moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}} +\index{moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}!moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Assignment}, \bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comparator})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEnvironmentalReplacement_de6e8f546a4583f1eee31366f7099c38} + + +Full constructor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \item[{\em \_\-diversity\-Assignment}]the diversity assignment strategy \item[{\em \_\-comparator}]the comparator (used to compare 2 individuals) \end{description} +\end{Desc} + + +Definition at line 40 of file moeo\-Environmental\-Replacement.h.\index{moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}!moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}} +\index{moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}!moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment}, \bf{moeo\-Diversity\-Assignment}$<$ MOEOT $>$ \& {\em \_\-diversity\-Assignment})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEnvironmentalReplacement_9199a29cf89cd6b01bb9be304f344940} + + +Constructor without comparator. + +A moeo\-Fit\-Then\-Div\-Comparator is used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \item[{\em \_\-diversity\-Assignment}]the diversity assignment strategy \end{description} +\end{Desc} + + +Definition at line 50 of file moeo\-Environmental\-Replacement.h.\index{moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}!moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}} +\index{moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}!moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment}, \bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comparator})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEnvironmentalReplacement_7512641b5d58c96a148a75fd4dc95bf7} + + +Constructor without moeo\-Diversity\-Assignement. + +A dummy diversity is used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \item[{\em \_\-comparator}]the comparator (used to compare 2 individuals) \end{description} +\end{Desc} + + +Definition at line 60 of file moeo\-Environmental\-Replacement.h.\index{moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}!moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}} +\index{moeoEnvironmentalReplacement@{moeoEnvironmentalReplacement}!moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$::\bf{moeo\-Environmental\-Replacement} (\bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$ \& {\em \_\-fitness\-Assignment})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEnvironmentalReplacement_2dfa5d51660039b4f90196e7885ed586} + + +Constructor without moeo\-Diversity\-Assignement nor \doxyref{moeo\-Comparator}{p.}{classmoeoComparator}. + +A moeo\-Fit\-Then\-Div\-Comparator and a dummy diversity are used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-fitness\-Assignment}]the fitness assignment strategy \end{description} +\end{Desc} + + +Definition at line 70 of file moeo\-Environmental\-Replacement.h. + +\subsection{Member Function Documentation} +\index{moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}!operator()@{operator()}} +\index{operator()@{operator()}!moeoEnvironmentalReplacement@{moeo\-Environmental\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-parents}, \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-offspring})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEnvironmentalReplacement_55acfca7f9dd9e3d75cef7c9015dc037} + + +Replaces the first population by adding the individuals of the second one, sorting with a \doxyref{moeo\-Comparator}{p.}{classmoeoComparator} and resizing the whole population obtained. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-parents}]the population composed of the parents (the population you want to replace) \item[{\em \_\-offspring}]the offspring population \end{description} +\end{Desc} + + +Definition at line 80 of file moeo\-Environmental\-Replacement.h. + +References moeo\-Environmental\-Replacement$<$ MOEOT $>$::comparator, moeo\-Environmental\-Replacement$<$ MOEOT $>$::diversity\-Assignment, and moeo\-Environmental\-Replacement$<$ MOEOT $>$::fitness\-Assignment. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Environmental\-Replacement.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement_1_1Cmp.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement_1_1Cmp.tex new file mode 100644 index 000000000..9d597aa51 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEnvironmentalReplacement_1_1Cmp.tex @@ -0,0 +1,52 @@ +\section{moeo\-Environmental\-Replacement$<$ MOEOT $>$::Cmp Class Reference} +\label{classmoeoEnvironmentalReplacement_1_1Cmp}\index{moeoEnvironmentalReplacement::Cmp@{moeoEnvironmentalReplacement::Cmp}} +this object is used to compare solutions in order to sort the population + + +{\tt \#include $<$moeo\-Environmental\-Replacement.h$>$} + +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{Cmp} (\bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comp) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2)\label{classmoeoEnvironmentalReplacement_1_1Cmp_b006918d5d6fc1f87fb9ed585946595a} + +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 is greater than \_\-moeo2 according to the comparator \_\-moeo1 the first individual \_\-moeo2 the first individual. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Comparator}$<$ MOEOT $>$ \& \bf{comp}\label{classmoeoEnvironmentalReplacement_1_1Cmp_5c345292ee3ec6b8f7b79dafe3ac2c81} + +\begin{CompactList}\small\item\em the comparator \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Environmental\-Replacement$<$ MOEOT $>$::Cmp} + +this object is used to compare solutions in order to sort the population + + + +Definition at line 121 of file moeo\-Environmental\-Replacement.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoEnvironmentalReplacement::Cmp@{moeo\-Environmental\-Replacement::Cmp}!Cmp@{Cmp}} +\index{Cmp@{Cmp}!moeoEnvironmentalReplacement::Cmp@{moeo\-Environmental\-Replacement::Cmp}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$::Cmp::Cmp (\bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comp})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEnvironmentalReplacement_1_1Cmp_efd55b365f306715f1a871b50d479f38} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-comp}]the comparator \end{description} +\end{Desc} + + +Definition at line 128 of file moeo\-Environmental\-Replacement.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Environmental\-Replacement.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.eps new file mode 100644 index 000000000..298825456 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 431.034 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.16 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEuclideanDistance< MOEOT >) cw +(moeoNormalizedDistance< MOEOT >) cw +(moeoDistance< MOEOT, double >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEuclideanDistance< MOEOT >) 0 0 box + (moeoNormalizedDistance< MOEOT >) 0 1 box + (moeoDistance< MOEOT, double >) 0 2 box + (eoBF< A1, A2, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.tex new file mode 100644 index 000000000..19ed853ed --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEuclideanDistance.tex @@ -0,0 +1,59 @@ +\section{moeo\-Euclidean\-Distance$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoEuclideanDistance}\index{moeoEuclideanDistance@{moeoEuclideanDistance}} +A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. + + +{\tt \#include $<$moeo\-Euclidean\-Distance.h$>$} + +Inheritance diagram for moeo\-Euclidean\-Distance$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoEuclideanDistance} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoEuclideanDistance_d75b1b8695b3eb16f9574496b5822daa} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const double \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns the euclidian distance between \_\-moeo1 and \_\-moeo2 in the objective space. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Euclidean\-Distance$<$ MOEOT $>$} + +A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. + +between 0 and 1). A distance value then lies between 0 and sqrt(n\-Objectives). + + + +Definition at line 24 of file moeo\-Euclidean\-Distance.h. + +\subsection{Member Function Documentation} +\index{moeoEuclideanDistance@{moeo\-Euclidean\-Distance}!operator()@{operator()}} +\index{operator()@{operator()}!moeoEuclideanDistance@{moeo\-Euclidean\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const double \bf{moeo\-Euclidean\-Distance}$<$ MOEOT $>$::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoEuclideanDistance_20ff559e95da92a46990eb0658f018f1} + + +Returns the euclidian distance between \_\-moeo1 and \_\-moeo2 in the objective space. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 37 of file moeo\-Euclidean\-Distance.h. + +References moeo\-Normalized\-Distance$<$ MOEOT $>$::bounds. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Euclidean\-Distance.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.eps new file mode 100644 index 000000000..0a42e820d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 459.77 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.0875 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoEvalFunc< MOEOT >) cw +(eoEvalFunc< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoEvalFunc< MOEOT >) 0 0 box + (eoEvalFunc< MOEOT >) 0 1 box + (eoUF< A1, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.tex new file mode 100644 index 000000000..a935b8a71 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoEvalFunc.tex @@ -0,0 +1,22 @@ +\section{moeo\-Eval\-Func$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoEvalFunc}\index{moeoEvalFunc@{moeoEvalFunc}} +Inheritance diagram for moeo\-Eval\-Func$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoEvalFunc} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Eval\-Func$<$ MOEOT $>$} + + + + + +Definition at line 22 of file moeo\-Eval\-Func.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Eval\-Func.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.eps new file mode 100644 index 000000000..2e7225c9b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 270.27 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.85 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoFastNonDominatedSortingFitnessAssignment< MOEOT >) cw +(moeoParetoBasedFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoFastNonDominatedSortingFitnessAssignment< MOEOT >) 0 0 box + (moeoParetoBasedFitnessAssignment< MOEOT >) 0 1 box + (moeoFitnessAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.tex new file mode 100644 index 000000000..04c3317a1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment.tex @@ -0,0 +1,179 @@ +\section{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoFastNonDominatedSortingFitnessAssignment}\index{moeoFastNonDominatedSortingFitnessAssignment@{moeoFastNonDominatedSortingFitnessAssignment}} +Fitness assignment sheme based on Pareto-dominance count proposed in: N. + + +{\tt \#include $<$moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoFastNonDominatedSortingFitnessAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoFastNonDominatedSortingFitnessAssignment_7bca09c8cf084700172a6e0dfcf6c381} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment} ()\label{classmoeoFastNonDominatedSortingFitnessAssignment_d02bd6ca60399f6171c08fa42f131644} + +\begin{CompactList}\small\item\em Default ctor. \item\end{CompactList}\item +\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment} (\bf{moeo\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \&\_\-comparator) +\begin{CompactList}\small\item\em Ctor where you can choose your own way to compare objective vectors. \item\end{CompactList}\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness values for every solution contained in the population \_\-pop. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +void \bf{one\-Objective} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness values for mono-objective problems. \item\end{CompactList}\item +void \bf{two\-Objectives} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size. \item\end{CompactList}\item +void \bf{m\-Objectives} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness values for problems with more than two objectives with a complexity of O(n\^{A}² log n), where n stands for the population size. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \& \bf{comparator}\label{classmoeoFastNonDominatedSortingFitnessAssignment_cc2269f00944e308e53004cc3a68855b} + +\begin{CompactList}\small\item\em Functor to compare two objective vectors. \item\end{CompactList}\item +\bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \bf{pareto\-Comparator}\label{classmoeoFastNonDominatedSortingFitnessAssignment_c91bade0a1aa1200d0245f7c13fb74fc} + +\begin{CompactList}\small\item\em Functor to compare two objective vectors according to Pareto dominance relation. \item\end{CompactList}\item +\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment::Objective\-Comparator} \bf{obj\-Comparator}\label{classmoeoFastNonDominatedSortingFitnessAssignment_1ff82dbdcd601806382bb1af98c30572} + +\begin{CompactList}\small\item\em Functor allowing to compare two solutions according to their first objective value, then their second, and so on. \item\end{CompactList}\end{CompactItemize} +\subsection*{Classes} +\begin{CompactItemize} +\item +class \bf{Objective\-Comparator} +\begin{CompactList}\small\item\em Functor allowing to compare two solutions according to their first objective value, then their second, and so on. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$} + +Fitness assignment sheme based on Pareto-dominance count proposed in: N. + +Srinivas, K. Deb, \char`\"{}Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms\char`\"{}, Evolutionary Computation vol. 2, no. 3, pp. 221-248 (1994) and in: K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, \char`\"{}A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II\char`\"{}, IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). This strategy is, for instance, used in NSGA and NSGA-II. + + + +Definition at line 32 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}!moeoFastNonDominatedSortingFitnessAssignment@{moeoFastNonDominatedSortingFitnessAssignment}} +\index{moeoFastNonDominatedSortingFitnessAssignment@{moeoFastNonDominatedSortingFitnessAssignment}!moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment} (\bf{moeo\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \& {\em \_\-comparator})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_6843abccb77386a06016063f42c63f75} + + +Ctor where you can choose your own way to compare objective vectors. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-comparator}]the functor used to compare objective vectors \end{description} +\end{Desc} + + +Definition at line 51 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_4d75a10be83e50e4d3827c32b74f9d7d} + + +Sets the fitness values for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 59 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +References moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::m\-Objectives(), and moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::one\-Objective().\index{moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_8d16de444f6c7a73c28c9087b652656e} + + +Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implements \bf{moeo\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFitnessAssignment_4922629569eddc9be049b3ead1ab0269}. + +Definition at line 101 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +References moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::comparator.\index{moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}!oneObjective@{oneObjective}} +\index{oneObjective@{oneObjective}!moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::one\-Objective (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_f69d3a918dbbe8d7e9ef5abc50fbf17b} + + +Sets the fitness values for mono-objective problems. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 143 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +References moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::obj\-Comparator. + +Referenced by moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::operator()().\index{moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}!twoObjectives@{twoObjectives}} +\index{twoObjectives@{twoObjectives}!moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::two\-Objectives (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_ac0337fe41c4d565c5a81de38398a9e9} + + +Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 165 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h.\index{moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}!mObjectives@{mObjectives}} +\index{mObjectives@{mObjectives}!moeoFastNonDominatedSortingFitnessAssignment@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::m\-Objectives (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_f28ad92fe565e13b8d38a3beb30e1e29} + + +Sets the fitness values for problems with more than two objectives with a complexity of O(n\^{A}² log n), where n stands for the population size. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 175 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +References moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::comparator. + +Referenced by moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.eps new file mode 100644 index 000000000..40263889c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 161.29 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.1 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator) cw +(moeoComparator< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator) 0 0 box + (moeoComparator< MOEOT >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.tex new file mode 100644 index 000000000..1d9464262 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator.tex @@ -0,0 +1,55 @@ +\section{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::Objective\-Comparator Class Reference} +\label{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator}\index{moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator@{moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator}} +Functor allowing to compare two solutions according to their first objective value, then their second, and so on. + + +Inheritance diagram for moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::Objective\-Comparator::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 $<$ \_\-moeo2 on the first objective, then on the second, and so on. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Objective\-Objective\-Vector\-Comparator}$<$ \bf{Objective\-Vector} $>$ \bf{cmp}\label{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator_2280f5d8df81b5c69676fa4fade67719} + +\begin{CompactList}\small\item\em the corresponding comparator for objective vectors \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::Objective\-Comparator} + +Functor allowing to compare two solutions according to their first objective value, then their second, and so on. + + + +Definition at line 121 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment::Objective\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator@{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment::Objective\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const bool \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$::Objective\-Comparator::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator_21ba1645a166a348a24c204e88f97987} + + +Returns true if \_\-moeo1 $<$ \_\-moeo2 on the first objective, then on the second, and so on. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 129 of file moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h. + +References moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::Objective\-Comparator::cmp. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.eps new file mode 100644 index 000000000..baf36fe70 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.eps @@ -0,0 +1,239 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 54.0541 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 9.25 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 5 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoCriterionBasedFitnessAssignment< MOEOT >) cw +(moeoDummyFitnessAssignment< MOEOT >) cw +(moeoIndicatorBasedFitnessAssignment< MOEOT >) cw +(moeoParetoBasedFitnessAssignment< MOEOT >) cw +(moeoScalarFitnessAssignment< MOEOT >) cw +(moeoFastNonDominatedSortingFitnessAssignment< MOEOT >) cw +(moeoAchievementFitnessAssignment< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoFitnessAssignment< MOEOT >) 2 2 box + (eoUF< eoPop< MOEOT > &, void >) 2 3 box + (eoFunctorBase) 2 4 box + (moeoCriterionBasedFitnessAssignment< MOEOT >) 0 1 box + (moeoDummyFitnessAssignment< MOEOT >) 1 1 box + (moeoIndicatorBasedFitnessAssignment< MOEOT >) 2 1 box + (moeoParetoBasedFitnessAssignment< MOEOT >) 3 1 box + (moeoScalarFitnessAssignment< MOEOT >) 4 1 box + (moeoFastNonDominatedSortingFitnessAssignment< MOEOT >) 3 0 box + (moeoAchievementFitnessAssignment< MOEOT >) 4 0 box + +% ----- relations ----- + +solid +0 2 2 out +solid +1 2 3 in +solid +0 2 3 out +solid +1 2 4 in +solid +1 2 1.25 out +solid +0 4 2 conn +solid +0 0 1.75 in +solid +0 1 1.75 in +solid +0 2 1.75 in +solid +0 3 1.75 in +solid +1 3 0.25 out +solid +0 4 1.75 in +solid +1 4 0.25 out +solid +0 3 0.75 in +solid +0 4 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.tex new file mode 100644 index 000000000..135b11107 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessAssignment.tex @@ -0,0 +1,75 @@ +\section{moeo\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoFitnessAssignment}\index{moeoFitnessAssignment@{moeoFitnessAssignment}} +Functor that sets the fitness values of a whole population. + + +{\tt \#include $<$moeo\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=1.51351cm]{classmoeoFitnessAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoFitnessAssignment_6271b8215ea5df4fc1f19e513cd1d533} + +\begin{CompactList}\small\item\em The type for objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +virtual void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec)=0 +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, MOEOT \&\_\-moeo) +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the deletion of the individual \_\-moeo into account. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Fitness\-Assignment$<$ MOEOT $>$} + +Functor that sets the fitness values of a whole population. + + + +Definition at line 23 of file moeo\-Fitness\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoFitnessAssignment@{moeo\-Fitness\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoFitnessAssignment@{moeo\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [pure virtual]}}\label{classmoeoFitnessAssignment_4922629569eddc9be049b3ead1ab0269} + + +Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implemented in \bf{moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoAchievementFitnessAssignment_a6a2ae6c263dbcea3c16cde4c8a1e5fc}, \bf{moeo\-Dummy\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoDummyFitnessAssignment_6e87d4a8ff8f43a7001a21a13795d00e}, \bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFastNonDominatedSortingFitnessAssignment_8d16de444f6c7a73c28c9087b652656e}, and \bf{moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoIndicatorBasedFitnessAssignment_04d6a7e20060af2da765e76600c72e2c}. + +Referenced by moeo\-Fitness\-Assignment$<$ MOEOT $>$::update\-By\-Deleting().\index{moeoFitnessAssignment@{moeo\-Fitness\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoFitnessAssignment@{moeo\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, MOEOT \& {\em \_\-moeo})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoFitnessAssignment_057fd85764abb5de35adb52b5ef695be} + + +Updates the fitness values of the whole population \_\-pop by taking the deletion of the individual \_\-moeo into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-moeo}]the individual \end{description} +\end{Desc} + + +Definition at line 44 of file moeo\-Fitness\-Assignment.h. + +References moeo\-Fitness\-Assignment$<$ MOEOT $>$::update\-By\-Deleting(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.eps new file mode 100644 index 000000000..c32881430 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 263.158 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.9 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoFitnessThenDiversityComparator< MOEOT >) cw +(moeoComparator< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoFitnessThenDiversityComparator< MOEOT >) 0 0 box + (moeoComparator< MOEOT >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.tex new file mode 100644 index 000000000..467c9ba75 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFitnessThenDiversityComparator.tex @@ -0,0 +1,49 @@ +\section{moeo\-Fitness\-Then\-Diversity\-Comparator$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoFitnessThenDiversityComparator}\index{moeoFitnessThenDiversityComparator@{moeoFitnessThenDiversityComparator}} +Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. + + +{\tt \#include $<$moeo\-Fitness\-Then\-Diversity\-Comparator.h$>$} + +Inheritance diagram for moeo\-Fitness\-Then\-Diversity\-Comparator$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoFitnessThenDiversityComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 $<$ \_\-moeo2 according to their fitness values, then according to their diversity values. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Fitness\-Then\-Diversity\-Comparator$<$ MOEOT $>$} + +Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. + + + +Definition at line 22 of file moeo\-Fitness\-Then\-Diversity\-Comparator.h. + +\subsection{Member Function Documentation} +\index{moeoFitnessThenDiversityComparator@{moeo\-Fitness\-Then\-Diversity\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoFitnessThenDiversityComparator@{moeo\-Fitness\-Then\-Diversity\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const bool \bf{moeo\-Fitness\-Then\-Diversity\-Comparator}$<$ MOEOT $>$::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoFitnessThenDiversityComparator_087856d1a7d81f242e95591d694e3ef6} + + +Returns true if \_\-moeo1 $<$ \_\-moeo2 according to their fitness values, then according to their diversity values. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Fitness\-Then\-Diversity\-Comparator.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Fitness\-Then\-Diversity\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.eps new file mode 100644 index 000000000..9c4172e44 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 242.718 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.06 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >) cw +(moeoCrowdingDistanceDiversityAssignment< MOEOT >) cw +(moeoDiversityAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >) 0 0 box + (moeoCrowdingDistanceDiversityAssignment< MOEOT >) 0 1 box + (moeoDiversityAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.tex new file mode 100644 index 000000000..a1e5af84a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontCrowdingDistanceDiversityAssignment.tex @@ -0,0 +1,102 @@ +\section{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment}\index{moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeoFrontByFrontCrowdingDistanceDiversityAssignment}} +Diversity assignment sheme based on crowding distance proposed in: K. + + +{\tt \#include $<$moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment.h$>$} + +Inheritance diagram for moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_4da1cf7b19fd72eb9b6a64d89d01f5a3} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +void \bf{set\-Distances} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the distance values. \item\end{CompactList}\item +unsigned int \bf{last\-Index} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, unsigned int \_\-start) +\begin{CompactList}\small\item\em Returns the index of the last individual having the same fitness value than \_\-pop[\_\-start]. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} + +Diversity assignment sheme based on crowding distance proposed in: K. + +Deb, A. Pratap, S. Agarwal, T. Meyarivan, \char`\"{}A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II\char`\"{}, IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). Tis strategy assigns diversity values FRONT BY FRONT. It is, for instance, used in NSGA-II. + + + +Definition at line 25 of file moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_91aec07ffdc20c9654575106399ca62d} + + +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \end{Desc} +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! \end{Desc} + + +Reimplemented from \bf{moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoCrowdingDistanceDiversityAssignment_ac21453d018c0e5dc872ccf0d0893f18}. + +Definition at line 40 of file moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment.h.\index{moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}!setDistances@{setDistances}} +\index{setDistances@{setDistances}!moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$::set\-Distances (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, private, virtual]}}\label{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_b275343fd08575612525a5654d749feb} + + +Sets the distance values. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoCrowdingDistanceDiversityAssignment_2dac680d7ca8327a15bc30f5ce7bbd4f}. + +Definition at line 55 of file moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment.h. + +References moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::inf(), moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::last\-Index(), and moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::tiny().\index{moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}!lastIndex@{lastIndex}} +\index{lastIndex@{lastIndex}!moeoFrontByFrontCrowdingDistanceDiversityAssignment@{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ unsigned int \bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$::last\-Index (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, unsigned int {\em \_\-start})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment_c7f75934e76d37a2747f06d2271984c3} + + +Returns the index of the last individual having the same fitness value than \_\-pop[\_\-start]. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-start}]the index to start from \end{description} +\end{Desc} + + +Definition at line 121 of file moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment.h. + +Referenced by moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$::set\-Distances(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.eps new file mode 100644 index 000000000..951532f00 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 283.286 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.765 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoFrontByFrontSharingDiversityAssignment< MOEOT >) cw +(moeoSharingDiversityAssignment< MOEOT >) cw +(moeoDiversityAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoFrontByFrontSharingDiversityAssignment< MOEOT >) 0 0 box + (moeoSharingDiversityAssignment< MOEOT >) 0 1 box + (moeoDiversityAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.tex new file mode 100644 index 000000000..cb17edb2b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoFrontByFrontSharingDiversityAssignment.tex @@ -0,0 +1,117 @@ +\section{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoFrontByFrontSharingDiversityAssignment}\index{moeoFrontByFrontSharingDiversityAssignment@{moeoFrontByFrontSharingDiversityAssignment}} +Sharing assignment scheme on the way it is used in NSGA. + + +{\tt \#include $<$moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h$>$} + +Inheritance diagram for moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoFrontByFrontSharingDiversityAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoFrontByFrontSharingDiversityAssignment_c5350ba4340adea240c9cb362c1eb96d} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment} (\bf{moeo\-Distance}$<$ MOEOT, double $>$ \&\_\-distance, double \_\-niche\-Size=0.5, double \_\-alpha=2.0) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +\bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment} (double \_\-niche\-Size=0.5, double \_\-alpha=2.0) +\begin{CompactList}\small\item\em Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +void \bf{set\-Similarities} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets similarities FRONT BY FRONT for every solution contained in the population \_\-pop. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} + +Sharing assignment scheme on the way it is used in NSGA. + + + +Definition at line 22 of file moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}!moeoFrontByFrontSharingDiversityAssignment@{moeoFrontByFrontSharingDiversityAssignment}} +\index{moeoFrontByFrontSharingDiversityAssignment@{moeoFrontByFrontSharingDiversityAssignment}!moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment} (\bf{moeo\-Distance}$<$ MOEOT, double $>$ \& {\em \_\-distance}, double {\em \_\-niche\-Size} = {\tt 0.5}, double {\em \_\-alpha} = {\tt 2.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoFrontByFrontSharingDiversityAssignment_a77c641d3d9184f60c3aace07fb1774f} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-distance}]the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) \item[{\em \_\-niche\-Size}]neighborhood size in terms of radius distance (closely related to the way the distances are computed) \item[{\em \_\-alpha}]parameter used to regulate the shape of the sharing function \end{description} +\end{Desc} + + +Definition at line 36 of file moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h.\index{moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}!moeoFrontByFrontSharingDiversityAssignment@{moeoFrontByFrontSharingDiversityAssignment}} +\index{moeoFrontByFrontSharingDiversityAssignment@{moeoFrontByFrontSharingDiversityAssignment}!moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment} (double {\em \_\-niche\-Size} = {\tt 0.5}, double {\em \_\-alpha} = {\tt 2.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoFrontByFrontSharingDiversityAssignment_fec74d6b140ff6bb98e80ca13d57b6d7} + + +Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-niche\-Size}]neighborhood size in terms of radius distance (closely related to the way the distances are computed) \item[{\em \_\-alpha}]parameter used to regulate the shape of the sharing function \end{description} +\end{Desc} + + +Definition at line 45 of file moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoFrontByFrontSharingDiversityAssignment_623489a246f86cf24cc5860d32caa743} + + +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \end{Desc} +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! \end{Desc} + + +Reimplemented from \bf{moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoSharingDiversityAssignment_21c8d6e020af23b2be219b7e02248300}. + +Definition at line 56 of file moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h.\index{moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}!setSimilarities@{setSimilarities}} +\index{setSimilarities@{setSimilarities}!moeoFrontByFrontSharingDiversityAssignment@{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::set\-Similarities (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, private, virtual]}}\label{classmoeoFrontByFrontSharingDiversityAssignment_a0f6c045237aba2857c4a9ec25679e69} + + +Sets similarities FRONT BY FRONT for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoSharingDiversityAssignment_c01f6ac1abba3799f5c4b6c0608dac55}. + +Definition at line 74 of file moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h. + +References moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::distance, moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::niche\-Size, and moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::sh(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.eps new file mode 100644 index 000000000..c47fc760a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 202.02 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.475 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoGDominanceObjectiveVectorComparator< ObjectiveVector >) cw +(moeoObjectiveVectorComparator< ObjectiveVector >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoGDominanceObjectiveVectorComparator< ObjectiveVector >) 0 0 box + (moeoObjectiveVectorComparator< ObjectiveVector >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.tex new file mode 100644 index 000000000..0d7c46fe4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoGDominanceObjectiveVectorComparator.tex @@ -0,0 +1,104 @@ +\section{moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoGDominanceObjectiveVectorComparator}\index{moeoGDominanceObjectiveVectorComparator@{moeoGDominanceObjectiveVectorComparator}} +This functor class allows to compare 2 objective vectors according to g-dominance. + + +{\tt \#include $<$moeo\-GDominance\-Objective\-Vector\-Comparator.h$>$} + +Inheritance diagram for moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoGDominanceObjectiveVectorComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-GDominance\-Objective\-Vector\-Comparator} (Objective\-Vector \&\_\-ref) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +const bool \bf{operator()} (const Objective\-Vector \&\_\-objective\-Vector1, const Objective\-Vector \&\_\-objective\-Vector2) +\begin{CompactList}\small\item\em Returns true if \_\-objective\-Vector1 is g-dominated by \_\-objective\-Vector2. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +unsigned int \bf{flag} (const Objective\-Vector \&\_\-objective\-Vector) +\begin{CompactList}\small\item\em Returns the flag of \_\-objective\-Vector according to the reference point. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +Objective\-Vector \& \bf{ref}\label{classmoeoGDominanceObjectiveVectorComparator_54cf089933c4d5d70ceb931c2b97ca68} + +\begin{CompactList}\small\item\em the reference point \item\end{CompactList}\item +\bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$ \bf{pareto\-Comparator}\label{classmoeoGDominanceObjectiveVectorComparator_5768e6444e546f1da2f36ccabcfc1f70} + +\begin{CompactList}\small\item\em Pareto comparator. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} + +This functor class allows to compare 2 objective vectors according to g-dominance. + +The concept of g-dominance as been introduced in: J. Molina, L. V. Santana, A. G. Hernandez-Diaz, C. A. Coello Coello, R. Caballero, \char`\"{}g-dominance: Reference point based dominance\char`\"{} (2007) + + + +Definition at line 25 of file moeo\-GDominance\-Objective\-Vector\-Comparator.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoGDominanceObjectiveVectorComparator@{moeo\-GDominance\-Objective\-Vector\-Comparator}!moeoGDominanceObjectiveVectorComparator@{moeoGDominanceObjectiveVectorComparator}} +\index{moeoGDominanceObjectiveVectorComparator@{moeoGDominanceObjectiveVectorComparator}!moeoGDominanceObjectiveVectorComparator@{moeo\-GDominance\-Objective\-Vector\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ \bf{moeo\-GDominance\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$::\bf{moeo\-GDominance\-Objective\-Vector\-Comparator} (Objective\-Vector \& {\em \_\-ref})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoGDominanceObjectiveVectorComparator_fc4e1f1201b6420d206b28ab98e9ea0d} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-ref}]the reference point \end{description} +\end{Desc} + + +Definition at line 33 of file moeo\-GDominance\-Objective\-Vector\-Comparator.h. + +\subsection{Member Function Documentation} +\index{moeoGDominanceObjectiveVectorComparator@{moeo\-GDominance\-Objective\-Vector\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoGDominanceObjectiveVectorComparator@{moeo\-GDominance\-Objective\-Vector\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ const bool \bf{moeo\-GDominance\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$::operator() (const Objective\-Vector \& {\em \_\-objective\-Vector1}, const Objective\-Vector \& {\em \_\-objective\-Vector2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoGDominanceObjectiveVectorComparator_4b8c3496d77abf6e774333f3296e6d79} + + +Returns true if \_\-objective\-Vector1 is g-dominated by \_\-objective\-Vector2. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector1}]the first objective vector \item[{\em \_\-objective\-Vector2}]the second objective vector \end{description} +\end{Desc} + + +Definition at line 42 of file moeo\-GDominance\-Objective\-Vector\-Comparator.h. + +References moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::flag(), and moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::pareto\-Comparator.\index{moeoGDominanceObjectiveVectorComparator@{moeo\-GDominance\-Objective\-Vector\-Comparator}!flag@{flag}} +\index{flag@{flag}!moeoGDominanceObjectiveVectorComparator@{moeo\-GDominance\-Objective\-Vector\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ unsigned int \bf{moeo\-GDominance\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$::flag (const Objective\-Vector \& {\em \_\-objective\-Vector})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoGDominanceObjectiveVectorComparator_75bf5141369522563e60d4e3ac2ec9cb} + + +Returns the flag of \_\-objective\-Vector according to the reference point. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector}]the first objective vector \end{description} +\end{Desc} + + +Definition at line 76 of file moeo\-GDominance\-Objective\-Vector\-Comparator.h. + +References moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::ref. + +Referenced by moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-GDominance\-Objective\-Vector\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.eps new file mode 100644 index 000000000..63a2ad358 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.eps @@ -0,0 +1,239 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 189.394 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.64 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoGenerationalReplacement< MOEOT >) cw +(moeoReplacement< MOEOT >) cw +(eoGenerationalReplacement< MOEOT >) cw +(eoReplacement< MOEOT >) cw +(eoReplacement< EOT >) cw +(eoBF< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoGenerationalReplacement< MOEOT >) 0.5 0 box + (moeoReplacement< MOEOT >) 0 1 box + (eoGenerationalReplacement< MOEOT >) 1 1 box + (eoReplacement< MOEOT >) 0 2 box + (eoReplacement< EOT >) 1 2 box + (eoBF< A1, A2, R >) 0 3 box + (eoBF< A1, A2, R >) 1 3 box + (eoFunctorBase) 0 4 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +0 1 1 conn +solid +1 0 1 in +solid +0 0 1 out +solid +1 1 1 in +solid +0 1 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 0 4 in +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.tex new file mode 100644 index 000000000..9ebd8d44b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoGenerationalReplacement.tex @@ -0,0 +1,51 @@ +\section{moeo\-Generational\-Replacement$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoGenerationalReplacement}\index{moeoGenerationalReplacement@{moeoGenerationalReplacement}} +Generational replacement: only the new individuals are preserved. + + +{\tt \#include $<$moeo\-Generational\-Replacement.h$>$} + +Inheritance diagram for moeo\-Generational\-Replacement$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoGenerationalReplacement} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-parents, \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-offspring) +\begin{CompactList}\small\item\em Swaps \_\-parents and \_\-offspring. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Generational\-Replacement$<$ MOEOT $>$} + +Generational replacement: only the new individuals are preserved. + + + +Definition at line 23 of file moeo\-Generational\-Replacement.h. + +\subsection{Member Function Documentation} +\index{moeoGenerationalReplacement@{moeo\-Generational\-Replacement}!operator()@{operator()}} +\index{operator()@{operator()}!moeoGenerationalReplacement@{moeo\-Generational\-Replacement}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Generational\-Replacement}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-parents}, \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-offspring})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoGenerationalReplacement_7b8ac20d375820ba44a9f3dd4b95e120} + + +Swaps \_\-parents and \_\-offspring. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-parents}]the parents population \item[{\em \_\-offspring}]the offspring population \end{description} +\end{Desc} + + +Reimplemented from \bf{eo\-Generational\-Replacement$<$ MOEOT $>$}. + +Definition at line 32 of file moeo\-Generational\-Replacement.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Generational\-Replacement.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.eps new file mode 100644 index 000000000..5ca50d410 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 462.428 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.08125 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoHybridLS< MOEOT >) cw +(eoUpdater) cw +(eoF< void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoHybridLS< MOEOT >) 0 0 box + (eoUpdater) 0 1 box + (eoF< void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.tex new file mode 100644 index 000000000..3834f08e0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoHybridLS.tex @@ -0,0 +1,67 @@ +\section{moeo\-Hybrid\-LS$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoHybridLS}\index{moeoHybridLS@{moeoHybridLS}} +This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified. + + +{\tt \#include $<$moeo\-Hybrid\-LS.h$>$} + +Inheritance diagram for moeo\-Hybrid\-LS$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoHybridLS} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Hybrid\-LS} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-term, \bf{eo\-Select}$<$ MOEOT $>$ \&\_\-select, \bf{moeo\-LS}$<$ MOEOT, MOEOT $>$ \&\_\-mols, \bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{operator()} ()\label{classmoeoHybridLS_bd35c0f0e03914b1b669cb064310d3eb} + +\begin{CompactList}\small\item\em Applies the multi-objective local search to selected individuals contained in the archive if the stopping criteria is not verified. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{eo\-Continue}$<$ MOEOT $>$ \& \bf{term}\label{classmoeoHybridLS_776a00e2e8970ad6e3940c61eabd52ba} + +\begin{CompactList}\small\item\em stopping criteria \item\end{CompactList}\item +\bf{eo\-Select}$<$ MOEOT $>$ \& \bf{select}\label{classmoeoHybridLS_106ca80830d807da0cfdcac934737533} + +\begin{CompactList}\small\item\em selector \item\end{CompactList}\item +\bf{moeo\-LS}$<$ MOEOT, MOEOT $>$ \& \bf{mols}\label{classmoeoHybridLS_28af163ec90dbff609b38666b249a19c} + +\begin{CompactList}\small\item\em multi-objective local search \item\end{CompactList}\item +\bf{moeo\-Archive}$<$ MOEOT $>$ \& \bf{arch}\label{classmoeoHybridLS_4cda70ac38a51d7b629a1fed56af4c33} + +\begin{CompactList}\small\item\em archive \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Hybrid\-LS$<$ MOEOT $>$} + +This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified. + + + +Definition at line 28 of file moeo\-Hybrid\-LS.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoHybridLS@{moeo\-Hybrid\-LS}!moeoHybridLS@{moeoHybridLS}} +\index{moeoHybridLS@{moeoHybridLS}!moeoHybridLS@{moeo\-Hybrid\-LS}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Hybrid\-LS}$<$ MOEOT $>$::\bf{moeo\-Hybrid\-LS} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-term}, \bf{eo\-Select}$<$ MOEOT $>$ \& {\em \_\-select}, \bf{moeo\-LS}$<$ MOEOT, MOEOT $>$ \& {\em \_\-mols}, \bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoHybridLS_e669b2ca5e17467eb9819c71557aad53} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-term}]stopping criteria \item[{\em \_\-select}]selector \item[{\em \_\-mols}]a multi-objective local search \item[{\em \_\-arch}]the archive \end{description} +\end{Desc} + + +Definition at line 39 of file moeo\-Hybrid\-LS.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Hybrid\-LS.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.eps new file mode 100644 index 000000000..42dbae300 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.eps @@ -0,0 +1,233 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.159 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.78333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 6 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoHypervolumeBinaryMetric< ObjectiveVector >) cw +(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) cw +(moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoHypervolumeBinaryMetric< ObjectiveVector >) 0.5 0 box + (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) 0.5 1 box + (moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >) 0.5 2 box + (moeoBinaryMetric< A1, A2, R >) 0.5 3 box + (eoBF< A1, A2, R >) 0 4 box + (moeoMetric) 1 4 box + (eoFunctorBase) 0 5 box + (eoFunctorBase) 1 5 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +1 0.5 3 in +solid +0 0.5 3 out +solid +0 1 4 conn +solid +1 0 4 in +solid +0 0 4 out +solid +1 1 4 in +solid +0 1 4 out +solid +1 0 5 in +solid +1 1 5 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.tex new file mode 100644 index 000000000..ecc5cb8a0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoHypervolumeBinaryMetric.tex @@ -0,0 +1,108 @@ +\section{moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoHypervolumeBinaryMetric}\index{moeoHypervolumeBinaryMetric@{moeoHypervolumeBinaryMetric}} +Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., K\~{A}¼nzli S. + + +{\tt \#include $<$moeo\-Hypervolume\-Binary\-Metric.h$>$} + +Inheritance diagram for moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.70044cm]{classmoeoHypervolumeBinaryMetric} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Hypervolume\-Binary\-Metric} (double \_\-rho=1.1) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +double \bf{operator()} (const Objective\-Vector \&\_\-o1, const Objective\-Vector \&\_\-o2) +\begin{CompactList}\small\item\em Returns the volume of the space that is dominated by \_\-o2 but not by \_\-o1 with respect to a reference point computed using rho. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Member Functions} +\begin{CompactItemize} +\item +double \bf{hypervolume} (const Objective\-Vector \&\_\-o1, const Objective\-Vector \&\_\-o2, const unsigned int \_\-obj, const bool \_\-flag=false) +\begin{CompactList}\small\item\em Returns the volume of the space that is dominated by \_\-o2 but not by \_\-o1 with respect to a reference point computed using rho for the objective \_\-obj. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +double \bf{rho}\label{classmoeoHypervolumeBinaryMetric_2498b6010719249121e3a371978d927b} + +\begin{CompactList}\small\item\em value used to compute the reference point from the worst values for each objective \item\end{CompactList}\item +\bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$ \bf{pareto\-Comparator}\label{classmoeoHypervolumeBinaryMetric_2bbeb34a5bfde25b9eadc7eca899906e} + +\begin{CompactList}\small\item\em Functor to compare two objective vectors according to Pareto dominance relation. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$} + +Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., K\~{A}¼nzli S. + +: Indicator-Based Selection in Multiobjective Search. In Parallel Problem Solving from Nature (PPSN VIII). Lecture Notes in Computer Science 3242, Springer, Birmingham, UK pp.832\^{a}€“842 (2004). This indicator is based on the hypervolume concept introduced in Zitzler, E., Thiele, L.: Multiobjective Optimization Using Evolutionary Algorithms - A Comparative Case Study. Parallel Problem Solving from Nature (PPSN-V), pp.292-301 (1998). + + + +Definition at line 29 of file moeo\-Hypervolume\-Binary\-Metric.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoHypervolumeBinaryMetric@{moeo\-Hypervolume\-Binary\-Metric}!moeoHypervolumeBinaryMetric@{moeoHypervolumeBinaryMetric}} +\index{moeoHypervolumeBinaryMetric@{moeoHypervolumeBinaryMetric}!moeoHypervolumeBinaryMetric@{moeo\-Hypervolume\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ \bf{moeo\-Hypervolume\-Binary\-Metric}$<$ Objective\-Vector $>$::\bf{moeo\-Hypervolume\-Binary\-Metric} (double {\em \_\-rho} = {\tt 1.1})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoHypervolumeBinaryMetric_01a07711a7c9f38cdc2c76e40a3c5958} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-rho}]value used to compute the reference point from the worst values for each objective (default : 1.1) \end{description} +\end{Desc} + + +Definition at line 37 of file moeo\-Hypervolume\-Binary\-Metric.h. + +References moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$::rho. + +\subsection{Member Function Documentation} +\index{moeoHypervolumeBinaryMetric@{moeo\-Hypervolume\-Binary\-Metric}!operator()@{operator()}} +\index{operator()@{operator()}!moeoHypervolumeBinaryMetric@{moeo\-Hypervolume\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ double \bf{moeo\-Hypervolume\-Binary\-Metric}$<$ Objective\-Vector $>$::operator() (const Objective\-Vector \& {\em \_\-o1}, const Objective\-Vector \& {\em \_\-o2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoHypervolumeBinaryMetric_c147309a5ba6b365be926e6083c5b9f2} + + +Returns the volume of the space that is dominated by \_\-o2 but not by \_\-o1 with respect to a reference point computed using rho. + +\begin{Desc} +\item[Warning:]don't forget to set the bounds for every objective before the call of this function \end{Desc} +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-o1}]the first objective vector \item[{\em \_\-o2}]the second objective vector \end{description} +\end{Desc} + + +Definition at line 63 of file moeo\-Hypervolume\-Binary\-Metric.h. + +References moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$::hypervolume(), and moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$::pareto\-Comparator.\index{moeoHypervolumeBinaryMetric@{moeo\-Hypervolume\-Binary\-Metric}!hypervolume@{hypervolume}} +\index{hypervolume@{hypervolume}!moeoHypervolumeBinaryMetric@{moeo\-Hypervolume\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ double \bf{moeo\-Hypervolume\-Binary\-Metric}$<$ Objective\-Vector $>$::hypervolume (const Objective\-Vector \& {\em \_\-o1}, const Objective\-Vector \& {\em \_\-o2}, const unsigned int {\em \_\-obj}, const bool {\em \_\-flag} = {\tt false})\hspace{0.3cm}{\tt [inline, private]}}\label{classmoeoHypervolumeBinaryMetric_e841d13001c63b043981a41fcb49218a} + + +Returns the volume of the space that is dominated by \_\-o2 but not by \_\-o1 with respect to a reference point computed using rho for the objective \_\-obj. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-o1}]the first objective vector \item[{\em \_\-o2}]the second objective vector \item[{\em \_\-obj}]the objective index \item[{\em \_\-flag}]used for iteration, if \_\-flag=true \_\-o2 is not talen into account (default : false) \end{description} +\end{Desc} + + +Definition at line 96 of file moeo\-Hypervolume\-Binary\-Metric.h. + +References moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, double $>$::bounds, and moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$::rho. + +Referenced by moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$::operator()(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Hypervolume\-Binary\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.eps new file mode 100644 index 000000000..8402bc3c9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 337.838 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.48 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoIBEA< MOEOT >) cw +(moeoEA< MOEOT >) cw +(moeoAlgo) cw +(eoAlgo< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoIBEA< MOEOT >) 0.5 0 box + (moeoEA< MOEOT >) 0.5 1 box + (moeoAlgo) 0 2 box + (eoAlgo< MOEOT >) 1 2 box + (eoUF< A1, R >) 1 3 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.tex new file mode 100644 index 000000000..9289ceb87 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoIBEA.tex @@ -0,0 +1,175 @@ +\section{moeo\-IBEA$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoIBEA}\index{moeoIBEA@{moeoIBEA}} +IBEA (Indicator-Based Evolutionary Algorithm) as described in: E. + + +{\tt \#include $<$moeo\-IBEA.h$>$} + +Inheritance diagram for moeo\-IBEA$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoIBEA} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoIBEA_220d16bade11304306f124f6014dc4b8} + +\begin{CompactList}\small\item\em The type of objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-IBEA} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \&\_\-op, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const double \_\-kappa=0.05) +\begin{CompactList}\small\item\em Simple ctor with a \doxyref{eo\-Gen\-Op}. \item\end{CompactList}\item +\bf{moeo\-IBEA} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-op, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const double \_\-kappa=0.05) +\begin{CompactList}\small\item\em Simple ctor with a \doxyref{eo\-Transform}. \item\end{CompactList}\item +\bf{moeo\-IBEA} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Quad\-Op}$<$ MOEOT $>$ \&\_\-crossover, double \_\-p\-Cross, \bf{eo\-Mon\-Op}$<$ MOEOT $>$ \&\_\-mutation, double \_\-p\-Mut, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const double \_\-kappa=0.05) +\begin{CompactList}\small\item\em Ctor with a crossover, a mutation and their corresponding rates. \item\end{CompactList}\item +\bf{moeo\-IBEA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \&\_\-op, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const double \_\-kappa=0.05) +\begin{CompactList}\small\item\em Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Gen\-Op}. \item\end{CompactList}\item +\bf{moeo\-IBEA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-op, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const double \_\-kappa=0.05) +\begin{CompactList}\small\item\em Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Transform}. \item\end{CompactList}\item +virtual void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Apply a few generation of evolution to the population \_\-pop until the stopping criteria is verified. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{eo\-Gen\-Continue}$<$ MOEOT $>$ \bf{default\-Gen\-Continuator}\label{classmoeoIBEA_70ecf0f84e1d4ba33b20fdfb2a3b3d02} + +\begin{CompactList}\small\item\em a continuator based on the number of generations (used as default) \item\end{CompactList}\item +\bf{eo\-Continue}$<$ MOEOT $>$ \& \bf{continuator}\label{classmoeoIBEA_d3772c044b41ea51f7aef80c0e12a75b} + +\begin{CompactList}\small\item\em stopping criteria \item\end{CompactList}\item +\bf{eo\-Pop\-Loop\-Eval}$<$ MOEOT $>$ \bf{pop\-Eval}\label{classmoeoIBEA_a3fa636bc571c43a43eadddf5817da73} + +\begin{CompactList}\small\item\em evaluation function used to evaluate the whole population \item\end{CompactList}\item +\bf{moeo\-Det\-Tournament\-Select}$<$ MOEOT $>$ \bf{select}\label{classmoeoIBEA_0b3ef8b89b356b575ae3bad1636b5faa} + +\begin{CompactList}\small\item\em binary tournament selection \item\end{CompactList}\item +\bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$ \bf{fitness\-Assignment}\label{classmoeoIBEA_fed3304c930a10d27b0ec7e0c7974e40} + +\begin{CompactList}\small\item\em fitness assignment used in IBEA \item\end{CompactList}\item +\bf{moeo\-Dummy\-Diversity\-Assignment}$<$ MOEOT $>$ \bf{dummy\-Diversity\-Assignment}\label{classmoeoIBEA_f31b1a42c2c3db0201ac7c5ed2c016f0} + +\begin{CompactList}\small\item\em dummy diversity assignment \item\end{CompactList}\item +\bf{moeo\-Environmental\-Replacement}$<$ MOEOT $>$ \bf{replace}\label{classmoeoIBEA_074ac1d52fa02e8f77b75ad46f0193f8} + +\begin{CompactList}\small\item\em elitist replacement \item\end{CompactList}\item +\bf{eo\-SGAGen\-Op}$<$ MOEOT $>$ \bf{default\-SGAGen\-Op}\label{classmoeoIBEA_eb9d41ac2c472683a32b302bc518094d} + +\begin{CompactList}\small\item\em an object for genetic operators (used as default) \item\end{CompactList}\item +\bf{eo\-General\-Breeder}$<$ MOEOT $>$ \bf{gen\-Breed}\label{classmoeoIBEA_33582dd65d7c5b90868d6719183a721e} + +\begin{CompactList}\small\item\em general breeder \item\end{CompactList}\item +\bf{eo\-Breed}$<$ MOEOT $>$ \& \bf{breed}\label{classmoeoIBEA_670490da376ec266458d509354a7e101} + +\begin{CompactList}\small\item\em breeder \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-IBEA$<$ MOEOT $>$} + +IBEA (Indicator-Based Evolutionary Algorithm) as described in: E. + +Zitzler, S. K\~{A}¼nzli, \char`\"{}Indicator-Based Selection in Multiobjective Search\char`\"{}, Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). This class builds the IBEA algorithm only by using the fine-grained components of the Paradis\-EO-MOEO framework. + + + +Definition at line 38 of file moeo\-IBEA.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoIBEA@{moeo\-IBEA}!moeoIBEA@{moeoIBEA}} +\index{moeoIBEA@{moeoIBEA}!moeoIBEA@{moeo\-IBEA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-IBEA}$<$ MOEOT $>$::\bf{moeo\-IBEA} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \& {\em \_\-op}, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const double {\em \_\-kappa} = {\tt 0.05})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIBEA_ff425ab40d782131dc2fea3485bf20df} + + +Simple ctor with a \doxyref{eo\-Gen\-Op}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-metric}]metric \item[{\em \_\-kappa}]scaling factor kappa \end{description} +\end{Desc} + + +Definition at line 54 of file moeo\-IBEA.h.\index{moeoIBEA@{moeo\-IBEA}!moeoIBEA@{moeoIBEA}} +\index{moeoIBEA@{moeoIBEA}!moeoIBEA@{moeo\-IBEA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-IBEA}$<$ MOEOT $>$::\bf{moeo\-IBEA} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-op}, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const double {\em \_\-kappa} = {\tt 0.05})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIBEA_cbc97868f6eb817d95127c43231c7540} + + +Simple ctor with a \doxyref{eo\-Transform}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-metric}]metric \item[{\em \_\-kappa}]scaling factor kappa \end{description} +\end{Desc} + + +Definition at line 68 of file moeo\-IBEA.h.\index{moeoIBEA@{moeo\-IBEA}!moeoIBEA@{moeoIBEA}} +\index{moeoIBEA@{moeoIBEA}!moeoIBEA@{moeo\-IBEA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-IBEA}$<$ MOEOT $>$::\bf{moeo\-IBEA} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Quad\-Op}$<$ MOEOT $>$ \& {\em \_\-crossover}, double {\em \_\-p\-Cross}, \bf{eo\-Mon\-Op}$<$ MOEOT $>$ \& {\em \_\-mutation}, double {\em \_\-p\-Mut}, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const double {\em \_\-kappa} = {\tt 0.05})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIBEA_b0c051de75326b11a391aaacdb324dac} + + +Ctor with a crossover, a mutation and their corresponding rates. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-crossover}]crossover \item[{\em \_\-p\-Cross}]crossover probability \item[{\em \_\-mutation}]mutation \item[{\em \_\-p\-Mut}]mutation probability \item[{\em \_\-metric}]metric \item[{\em \_\-kappa}]scaling factor kappa \end{description} +\end{Desc} + + +Definition at line 85 of file moeo\-IBEA.h.\index{moeoIBEA@{moeo\-IBEA}!moeoIBEA@{moeoIBEA}} +\index{moeoIBEA@{moeoIBEA}!moeoIBEA@{moeo\-IBEA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-IBEA}$<$ MOEOT $>$::\bf{moeo\-IBEA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \& {\em \_\-op}, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const double {\em \_\-kappa} = {\tt 0.05})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIBEA_9b59ebf11f896198264ab5594dbaaefd} + + +Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Gen\-Op}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]stopping criteria \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-metric}]metric \item[{\em \_\-kappa}]scaling factor kappa \end{description} +\end{Desc} + + +Definition at line 100 of file moeo\-IBEA.h.\index{moeoIBEA@{moeo\-IBEA}!moeoIBEA@{moeoIBEA}} +\index{moeoIBEA@{moeoIBEA}!moeoIBEA@{moeo\-IBEA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-IBEA}$<$ MOEOT $>$::\bf{moeo\-IBEA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-op}, \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const double {\em \_\-kappa} = {\tt 0.05})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIBEA_654c67d0bd74ea798580ec4c81435f92} + + +Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Transform}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]stopping criteria \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-metric}]metric \item[{\em \_\-kappa}]scaling factor kappa \end{description} +\end{Desc} + + +Definition at line 114 of file moeo\-IBEA.h. + +\subsection{Member Function Documentation} +\index{moeoIBEA@{moeo\-IBEA}!operator()@{operator()}} +\index{operator()@{operator()}!moeoIBEA@{moeo\-IBEA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-IBEA}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoIBEA_34e98caf16795ac05d2977f8d20151cd} + + +Apply a few generation of evolution to the population \_\-pop until the stopping criteria is verified. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 124 of file moeo\-IBEA.h. + +References moeo\-IBEA$<$ MOEOT $>$::breed, moeo\-IBEA$<$ MOEOT $>$::continuator, moeo\-IBEA$<$ MOEOT $>$::dummy\-Diversity\-Assignment, moeo\-IBEA$<$ MOEOT $>$::fitness\-Assignment, moeo\-IBEA$<$ MOEOT $>$::pop\-Eval, and moeo\-IBEA$<$ MOEOT $>$::replace. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-IBEA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.eps new file mode 100644 index 000000000..366388c2e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 259.74 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.925 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoIndicatorBasedFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoIndicatorBasedFitnessAssignment< MOEOT >) 0 0 box + (moeoFitnessAssignment< MOEOT >) 0 1 box + (eoUF< eoPop< MOEOT > &, void >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.tex new file mode 100644 index 000000000..4b4acae71 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoIndicatorBasedFitnessAssignment.tex @@ -0,0 +1,213 @@ +\section{moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoIndicatorBasedFitnessAssignment}\index{moeoIndicatorBasedFitnessAssignment@{moeoIndicatorBasedFitnessAssignment}} +Fitness assignment sheme based an Indicator proposed in: E. + + +{\tt \#include $<$moeo\-Indicator\-Based\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoIndicatorBasedFitnessAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoIndicatorBasedFitnessAssignment_d3e6ebd336966e4c27c49b1f3a5caff7} + +\begin{CompactList}\small\item\em The type of objective vector. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Indicator\-Based\-Fitness\-Assignment} (\bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \&\_\-metric, const double \_\-kappa=0.05) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness values for every solution contained in the population \_\-pop. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \item\end{CompactList}\item +double \bf{update\-By\-Adding} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\begin{CompactList}\small\item\em Updates the fitness values of the whole population \_\-pop by taking the adding of the objective vector \_\-obj\-Vec into account and returns the fitness value of \_\-obj\-Vec. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Member Functions} +\begin{CompactItemize} +\item +void \bf{setup} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the bounds for every objective using the min and the max value for every objective vector of \_\-pop. \item\end{CompactList}\item +void \bf{compute\-Values} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Compute every indicator value in values (values[i] = I(\_\-v[i], \_\-o)). \item\end{CompactList}\item +void \bf{set\-Fitnesses} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the fitness value of the whple population. \item\end{CompactList}\item +double \bf{compute\-Fitness} (const unsigned int \_\-idx) +\begin{CompactList}\small\item\em Returns the fitness value of the \_\-idx th individual of the population. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& \bf{metric}\label{classmoeoIndicatorBasedFitnessAssignment_e282cea650fce9b3776e691d2bb7611c} + +\begin{CompactList}\small\item\em the quality indicator \item\end{CompactList}\item +double \bf{kappa}\label{classmoeoIndicatorBasedFitnessAssignment_d03b1277faa2c3719d2dc24a0de36183} + +\begin{CompactList}\small\item\em the scaling factor \item\end{CompactList}\item +std::vector$<$ std::vector$<$ double $>$ $>$ \bf{values}\label{classmoeoIndicatorBasedFitnessAssignment_30cd71c3fcc46432eee7b462d41d357b} + +\begin{CompactList}\small\item\em the computed indicator values \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$} + +Fitness assignment sheme based an Indicator proposed in: E. + +Zitzler, S. K\~{A}¼nzli, \char`\"{}Indicator-Based Selection in Multiobjective Search\char`\"{}, Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). This strategy is, for instance, used in IBEA. + + + +Definition at line 29 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!moeoIndicatorBasedFitnessAssignment@{moeoIndicatorBasedFitnessAssignment}} +\index{moeoIndicatorBasedFitnessAssignment@{moeoIndicatorBasedFitnessAssignment}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Indicator\-Based\-Fitness\-Assignment} (\bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ \bf{Objective\-Vector}, double $>$ \& {\em \_\-metric}, const double {\em \_\-kappa} = {\tt 0.05})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIndicatorBasedFitnessAssignment_8f075df685b569aff5d6c0f0ccf5986c} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-metric}]the quality indicator \item[{\em \_\-kappa}]the scaling factor \end{description} +\end{Desc} + + +Definition at line 42 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoIndicatorBasedFitnessAssignment_01cd4c9d1383f2a5948851278866c068} + + +Sets the fitness values for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 50 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::compute\-Values(), moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::set\-Fitnesses(), and moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::setup().\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoIndicatorBasedFitnessAssignment_04d6a7e20060af2da765e76600c72e2c} + + +Updates the fitness values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Implements \bf{moeo\-Fitness\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFitnessAssignment_4922629569eddc9be049b3ead1ab0269}. + +Definition at line 66 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::kappa, and moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::metric.\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!updateByAdding@{updateByAdding}} +\index{updateByAdding@{updateByAdding}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ double \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::update\-By\-Adding (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoIndicatorBasedFitnessAssignment_33707dba105ebf6a8ba75e31b2319c98} + + +Updates the fitness values of the whole population \_\-pop by taking the adding of the objective vector \_\-obj\-Vec into account and returns the fitness value of \_\-obj\-Vec. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} + + +Definition at line 87 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::kappa, and moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::metric.\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!setup@{setup}} +\index{setup@{setup}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::setup (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, protected]}}\label{classmoeoIndicatorBasedFitnessAssignment_decaa6258ead44f1e0587e84208c6bf9} + + +Sets the bounds for every objective using the min and the max value for every objective vector of \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 130 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::metric, and moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$::setup(). + +Referenced by moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::operator()().\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!computeValues@{computeValues}} +\index{computeValues@{computeValues}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::compute\-Values (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, protected]}}\label{classmoeoIndicatorBasedFitnessAssignment_2fd93c0a5fe35e979637c5f602c39341} + + +Compute every indicator value in values (values[i] = I(\_\-v[i], \_\-o)). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 152 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::metric, and moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::values. + +Referenced by moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::operator()().\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!setFitnesses@{setFitnesses}} +\index{setFitnesses@{setFitnesses}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::set\-Fitnesses (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, protected]}}\label{classmoeoIndicatorBasedFitnessAssignment_8d23624ddefd5eb2cf88eb28049b588c} + + +Sets the fitness value of the whple population. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 174 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::compute\-Fitness(). + +Referenced by moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::operator()().\index{moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}!computeFitness@{computeFitness}} +\index{computeFitness@{computeFitness}!moeoIndicatorBasedFitnessAssignment@{moeo\-Indicator\-Based\-Fitness\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ double \bf{moeo\-Indicator\-Based\-Fitness\-Assignment}$<$ MOEOT $>$::compute\-Fitness (const unsigned int {\em \_\-idx})\hspace{0.3cm}{\tt [inline, protected]}}\label{classmoeoIndicatorBasedFitnessAssignment_ee4c7361ad192e90534cab1a78180fe0} + + +Returns the fitness value of the \_\-idx th individual of the population. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-idx}]the index \end{description} +\end{Desc} + + +Definition at line 187 of file moeo\-Indicator\-Based\-Fitness\-Assignment.h. + +References moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::kappa, and moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::values. + +Referenced by moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::set\-Fitnesses(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Indicator\-Based\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoLS.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoLS.eps new file mode 100644 index 000000000..7501ada41 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoLS.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.013 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.7875 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoLS< MOEOT, Type >) cw +(moeoAlgo) cw +(eoBF< Type, moeoArchive< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoCombinedLS< MOEOT, Type >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoLS< MOEOT, Type >) 0.5 1 box + (moeoAlgo) 0 2 box + (eoBF< Type, moeoArchive< MOEOT > &, void >) 1 2 box + (eoFunctorBase) 1 3 box + (moeoCombinedLS< MOEOT, Type >) 0.5 0 box + +% ----- relations ----- + +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +1 0.5 0.25 out +solid +0 0.5 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoLS.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoLS.tex new file mode 100644 index 000000000..a768f0a79 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoLS.tex @@ -0,0 +1,29 @@ +\section{moeo\-LS$<$ MOEOT, Type $>$ Class Template Reference} +\label{classmoeoLS}\index{moeoLS@{moeoLS}} +Abstract class for local searches applied to multi-objective optimization. + + +{\tt \#include $<$moeo\-LS.h$>$} + +Inheritance diagram for moeo\-LS$<$ MOEOT, Type $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.69637cm]{classmoeoLS} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT, class Type$>$ class moeo\-LS$<$ MOEOT, Type $>$} + +Abstract class for local searches applied to multi-objective optimization. + +Starting from a Type (i.e.: an individual, a pop, an archive...), it produces a set of new non-dominated solutions. + + + +Definition at line 25 of file moeo\-LS.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-LS.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.eps new file mode 100644 index 000000000..be2de7245 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 431.034 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.16 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoManhattanDistance< MOEOT >) cw +(moeoNormalizedDistance< MOEOT >) cw +(moeoDistance< MOEOT, double >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoManhattanDistance< MOEOT >) 0 0 box + (moeoNormalizedDistance< MOEOT >) 0 1 box + (moeoDistance< MOEOT, double >) 0 2 box + (eoBF< A1, A2, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.tex new file mode 100644 index 000000000..b53cc6973 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoManhattanDistance.tex @@ -0,0 +1,59 @@ +\section{moeo\-Manhattan\-Distance$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoManhattanDistance}\index{moeoManhattanDistance@{moeoManhattanDistance}} +A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. + + +{\tt \#include $<$moeo\-Manhattan\-Distance.h$>$} + +Inheritance diagram for moeo\-Manhattan\-Distance$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoManhattanDistance} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoManhattanDistance_44fa512b80d2eee94e876a95babc9913} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const double \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns the Manhattan distance between \_\-moeo1 and \_\-moeo2 in the objective space. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Manhattan\-Distance$<$ MOEOT $>$} + +A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. + +between 0 and 1). A distance value then lies between 0 and n\-Objectives. + + + +Definition at line 24 of file moeo\-Manhattan\-Distance.h. + +\subsection{Member Function Documentation} +\index{moeoManhattanDistance@{moeo\-Manhattan\-Distance}!operator()@{operator()}} +\index{operator()@{operator()}!moeoManhattanDistance@{moeo\-Manhattan\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const double \bf{moeo\-Manhattan\-Distance}$<$ MOEOT $>$::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoManhattanDistance_dcabb2bddb46439a47cd1af5dd124f92} + + +Returns the Manhattan distance between \_\-moeo1 and \_\-moeo2 in the objective space. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 37 of file moeo\-Manhattan\-Distance.h. + +References moeo\-Normalized\-Distance$<$ MOEOT $>$::bounds. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Manhattan\-Distance.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoMetric.eps new file mode 100644 index 000000000..8ddac6002 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoMetric.eps @@ -0,0 +1,236 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 154.083 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.245 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 10 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoMetric) cw +(eoFunctorBase) cw +(moeoBinaryMetric< A1, A2, R >) cw +(moeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, double >) cw +(moeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, R >) cw +(moeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, double >) cw +(moeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, R >) cw +(moeoUnaryMetric< A, R >) cw +(moeoUnaryMetric< const ObjectiveVector &, R >) cw +(moeoUnaryMetric< const std::vector< ObjectiveVector > &, R >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoMetric) 0 8 box + (eoFunctorBase) 0 9 box + (moeoBinaryMetric< A1, A2, R >) 1 7 box +1 7 mark + (moeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, double >) 1 6 box + (moeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, R >) 1 5 box + (moeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, double >) 1 4 box + (moeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, R >) 1 3 box + (moeoUnaryMetric< A, R >) 1 2 box + (moeoUnaryMetric< const ObjectiveVector &, R >) 1 1 box +1 1 mark + (moeoUnaryMetric< const std::vector< ObjectiveVector > &, R >) 1 0 box +1 0 mark + +% ----- relations ----- + +solid +0 0 8 out +solid +1 0 9 in +solid +1 0 7.25 out +solid +0 0 7.5 hedge +solid +0 0 6.5 hedge +solid +0 0 5.5 hedge +solid +0 0 4.5 hedge +solid +0 0 3.5 hedge +solid +0 0 2.5 hedge +solid +0 0 1.5 hedge +solid +0 0 0.5 hedge +solid +0 8 0.5 vedge diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoMetric.tex new file mode 100644 index 000000000..a181e5345 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoMetric.tex @@ -0,0 +1,25 @@ +\section{moeo\-Metric Class Reference} +\label{classmoeoMetric}\index{moeoMetric@{moeoMetric}} +Base class for performance metrics (also known as quality indicators). + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Metric::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4.31433cm]{classmoeoMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +Base class for performance metrics (also known as quality indicators). + + + +Definition at line 22 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.eps new file mode 100644 index 000000000..0996a06ad --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 322.581 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.55 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoNSGA< MOEOT >) cw +(moeoEA< MOEOT >) cw +(moeoAlgo) cw +(eoAlgo< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoNSGA< MOEOT >) 0.5 0 box + (moeoEA< MOEOT >) 0.5 1 box + (moeoAlgo) 0 2 box + (eoAlgo< MOEOT >) 1 2 box + (eoUF< A1, R >) 1 3 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.tex new file mode 100644 index 000000000..b4f2680ac --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGA.tex @@ -0,0 +1,169 @@ +\section{moeo\-NSGA$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoNSGA}\index{moeoNSGA@{moeoNSGA}} +NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N. + + +{\tt \#include $<$moeo\-NSGA.h$>$} + +Inheritance diagram for moeo\-NSGA$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoNSGA} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-NSGA} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \&\_\-op, double \_\-niche\-Size=0.5) +\begin{CompactList}\small\item\em Simple ctor with a \doxyref{eo\-Gen\-Op}. \item\end{CompactList}\item +\bf{moeo\-NSGA} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-op, double \_\-niche\-Size=0.5) +\begin{CompactList}\small\item\em Simple ctor with a \doxyref{eo\-Transform}. \item\end{CompactList}\item +\bf{moeo\-NSGA} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Quad\-Op}$<$ MOEOT $>$ \&\_\-crossover, double \_\-p\-Cross, \bf{eo\-Mon\-Op}$<$ MOEOT $>$ \&\_\-mutation, double \_\-p\-Mut, double \_\-niche\-Size=0.5) +\begin{CompactList}\small\item\em Ctor with a crossover, a mutation and their corresponding rates. \item\end{CompactList}\item +\bf{moeo\-NSGA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \&\_\-op, double \_\-niche\-Size=0.5) +\begin{CompactList}\small\item\em Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Gen\-Op}. \item\end{CompactList}\item +\bf{moeo\-NSGA} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-op, double \_\-niche\-Size=0.5) +\begin{CompactList}\small\item\em Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Transform}. \item\end{CompactList}\item +virtual void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Apply a few generation of evolution to the population \_\-pop until the stopping criteria is verified. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{eo\-Gen\-Continue}$<$ MOEOT $>$ \bf{default\-Gen\-Continuator}\label{classmoeoNSGA_6dbb57c19ff00085df8397cebcce066d} + +\begin{CompactList}\small\item\em a continuator based on the number of generations (used as default) \item\end{CompactList}\item +\bf{eo\-Continue}$<$ MOEOT $>$ \& \bf{continuator}\label{classmoeoNSGA_ef67320e3820548b333577b33430fcbe} + +\begin{CompactList}\small\item\em stopping criteria \item\end{CompactList}\item +\bf{eo\-Pop\-Loop\-Eval}$<$ MOEOT $>$ \bf{pop\-Eval}\label{classmoeoNSGA_b54adef108d8b4c5a7c0da1e2065ac85} + +\begin{CompactList}\small\item\em evaluation function used to evaluate the whole population \item\end{CompactList}\item +\bf{moeo\-Det\-Tournament\-Select}$<$ MOEOT $>$ \bf{select}\label{classmoeoNSGA_ffd95fab4aed24fc866334c28e77a666} + +\begin{CompactList}\small\item\em binary tournament selection \item\end{CompactList}\item +\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$ \bf{fitness\-Assignment}\label{classmoeoNSGA_2c13f9fa53c29d93af39cca083ccb10d} + +\begin{CompactList}\small\item\em fitness assignment used in NSGA-II \item\end{CompactList}\item +\bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$ \bf{diversity\-Assignment}\label{classmoeoNSGA_e361fa8aed173619e2aae64dba0c504a} + +\begin{CompactList}\small\item\em diversity assignment used in NSGA-II \item\end{CompactList}\item +\bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$ \bf{replace}\label{classmoeoNSGA_8470efa1ef87b6448f081ec802858a8c} + +\begin{CompactList}\small\item\em elitist replacement \item\end{CompactList}\item +\bf{eo\-SGAGen\-Op}$<$ MOEOT $>$ \bf{default\-SGAGen\-Op}\label{classmoeoNSGA_879b4451e77b627705280373ff0a26ab} + +\begin{CompactList}\small\item\em an object for genetic operators (used as default) \item\end{CompactList}\item +\bf{eo\-General\-Breeder}$<$ MOEOT $>$ \bf{gen\-Breed}\label{classmoeoNSGA_3ee7a5ea8ed71859ea544741de9989f2} + +\begin{CompactList}\small\item\em general breeder \item\end{CompactList}\item +\bf{eo\-Breed}$<$ MOEOT $>$ \& \bf{breed}\label{classmoeoNSGA_1538e7c32062d9d9c634b9948ca28000} + +\begin{CompactList}\small\item\em breeder \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-NSGA$<$ MOEOT $>$} + +NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N. + +Srinivas, K. Deb, \char`\"{}Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms\char`\"{}. Evolutionary Computation, Vol. 2(3), No 2, pp. 221-248 (1994). This class builds the NSGA algorithm only by using the fine-grained components of the Paradis\-EO-MOEO framework. + + + +Definition at line 37 of file moeo\-NSGA.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoNSGA@{moeo\-NSGA}!moeoNSGA@{moeoNSGA}} +\index{moeoNSGA@{moeoNSGA}!moeoNSGA@{moeo\-NSGA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGA}$<$ MOEOT $>$::\bf{moeo\-NSGA} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \& {\em \_\-op}, double {\em \_\-niche\-Size} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGA_3f5d288a5f3bdeb8c35dfcefbaf0dd43} + + +Simple ctor with a \doxyref{eo\-Gen\-Op}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-niche\-Size}]niche size \end{description} +\end{Desc} + + +Definition at line 48 of file moeo\-NSGA.h.\index{moeoNSGA@{moeo\-NSGA}!moeoNSGA@{moeoNSGA}} +\index{moeoNSGA@{moeoNSGA}!moeoNSGA@{moeo\-NSGA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGA}$<$ MOEOT $>$::\bf{moeo\-NSGA} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-op}, double {\em \_\-niche\-Size} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGA_177e825966d70e7f697a52be7819e830} + + +Simple ctor with a \doxyref{eo\-Transform}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-niche\-Size}]niche size \end{description} +\end{Desc} + + +Definition at line 61 of file moeo\-NSGA.h.\index{moeoNSGA@{moeo\-NSGA}!moeoNSGA@{moeoNSGA}} +\index{moeoNSGA@{moeoNSGA}!moeoNSGA@{moeo\-NSGA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGA}$<$ MOEOT $>$::\bf{moeo\-NSGA} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Quad\-Op}$<$ MOEOT $>$ \& {\em \_\-crossover}, double {\em \_\-p\-Cross}, \bf{eo\-Mon\-Op}$<$ MOEOT $>$ \& {\em \_\-mutation}, double {\em \_\-p\-Mut}, double {\em \_\-niche\-Size} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGA_7c7b4bb55b7ee74da780f20a943809fd} + + +Ctor with a crossover, a mutation and their corresponding rates. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-crossover}]crossover \item[{\em \_\-p\-Cross}]crossover probability \item[{\em \_\-mutation}]mutation \item[{\em \_\-p\-Mut}]mutation probability \item[{\em \_\-niche\-Size}]niche size \end{description} +\end{Desc} + + +Definition at line 77 of file moeo\-NSGA.h.\index{moeoNSGA@{moeo\-NSGA}!moeoNSGA@{moeoNSGA}} +\index{moeoNSGA@{moeoNSGA}!moeoNSGA@{moeo\-NSGA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGA}$<$ MOEOT $>$::\bf{moeo\-NSGA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \& {\em \_\-op}, double {\em \_\-niche\-Size} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGA_5f8a315499cb7e65911af0c7587144d8} + + +Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Gen\-Op}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]stopping criteria \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-niche\-Size}]niche size \end{description} +\end{Desc} + + +Definition at line 91 of file moeo\-NSGA.h.\index{moeoNSGA@{moeo\-NSGA}!moeoNSGA@{moeoNSGA}} +\index{moeoNSGA@{moeoNSGA}!moeoNSGA@{moeo\-NSGA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGA}$<$ MOEOT $>$::\bf{moeo\-NSGA} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-op}, double {\em \_\-niche\-Size} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGA_eacee61268618c12d44d2f07cf7a796c} + + +Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Transform}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]stopping criteria \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \item[{\em \_\-niche\-Size}]niche size \end{description} +\end{Desc} + + +Definition at line 104 of file moeo\-NSGA.h. + +\subsection{Member Function Documentation} +\index{moeoNSGA@{moeo\-NSGA}!operator()@{operator()}} +\index{operator()@{operator()}!moeoNSGA@{moeo\-NSGA}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-NSGA}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoNSGA_632676ceb299f3318c116b2b2b386b0d} + + +Apply a few generation of evolution to the population \_\-pop until the stopping criteria is verified. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 114 of file moeo\-NSGA.h. + +References moeo\-NSGA$<$ MOEOT $>$::breed, moeo\-NSGA$<$ MOEOT $>$::continuator, moeo\-NSGA$<$ MOEOT $>$::diversity\-Assignment, moeo\-NSGA$<$ MOEOT $>$::fitness\-Assignment, moeo\-NSGA$<$ MOEOT $>$::pop\-Eval, and moeo\-NSGA$<$ MOEOT $>$::replace. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-NSGA.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.eps new file mode 100644 index 000000000..5f2c5c2fb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 310.559 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.61 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoNSGAII< MOEOT >) cw +(moeoEA< MOEOT >) cw +(moeoAlgo) cw +(eoAlgo< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoNSGAII< MOEOT >) 0.5 0 box + (moeoEA< MOEOT >) 0.5 1 box + (moeoAlgo) 0 2 box + (eoAlgo< MOEOT >) 1 2 box + (eoUF< A1, R >) 1 3 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.tex new file mode 100644 index 000000000..1917a32d5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNSGAII.tex @@ -0,0 +1,169 @@ +\section{moeo\-NSGAII$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoNSGAII}\index{moeoNSGAII@{moeoNSGAII}} +NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S. + + +{\tt \#include $<$moeo\-NSGAII.h$>$} + +Inheritance diagram for moeo\-NSGAII$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoNSGAII} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-NSGAII} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \&\_\-op) +\begin{CompactList}\small\item\em Simple ctor with a \doxyref{eo\-Gen\-Op}. \item\end{CompactList}\item +\bf{moeo\-NSGAII} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-op) +\begin{CompactList}\small\item\em Simple ctor with a \doxyref{eo\-Transform}. \item\end{CompactList}\item +\bf{moeo\-NSGAII} (unsigned int \_\-max\-Gen, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Quad\-Op}$<$ MOEOT $>$ \&\_\-crossover, double \_\-p\-Cross, \bf{eo\-Mon\-Op}$<$ MOEOT $>$ \&\_\-mutation, double \_\-p\-Mut) +\begin{CompactList}\small\item\em Ctor with a crossover, a mutation and their corresponding rates. \item\end{CompactList}\item +\bf{moeo\-NSGAII} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \&\_\-op) +\begin{CompactList}\small\item\em Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Gen\-Op}. \item\end{CompactList}\item +\bf{moeo\-NSGAII} (\bf{eo\-Continue}$<$ MOEOT $>$ \&\_\-continuator, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \&\_\-eval, \bf{eo\-Transform}$<$ MOEOT $>$ \&\_\-op) +\begin{CompactList}\small\item\em Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Transform}. \item\end{CompactList}\item +virtual void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Apply a few generation of evolution to the population \_\-pop until the stopping criteria is verified. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{eo\-Gen\-Continue}$<$ MOEOT $>$ \bf{default\-Gen\-Continuator}\label{classmoeoNSGAII_2bc5adbd55a32faead1c4ac0cbac3b35} + +\begin{CompactList}\small\item\em a continuator based on the number of generations (used as default) \item\end{CompactList}\item +\bf{eo\-Continue}$<$ MOEOT $>$ \& \bf{continuator}\label{classmoeoNSGAII_7eb1e36631eebbe3216167b1077e3a53} + +\begin{CompactList}\small\item\em stopping criteria \item\end{CompactList}\item +\bf{eo\-Pop\-Loop\-Eval}$<$ MOEOT $>$ \bf{pop\-Eval}\label{classmoeoNSGAII_5b042567e51f014b3fe841346d9830a0} + +\begin{CompactList}\small\item\em evaluation function used to evaluate the whole population \item\end{CompactList}\item +\bf{moeo\-Det\-Tournament\-Select}$<$ MOEOT $>$ \bf{select}\label{classmoeoNSGAII_6134c5baa1c6921aaacd67f6f452871a} + +\begin{CompactList}\small\item\em binary tournament selection \item\end{CompactList}\item +\bf{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment}$<$ MOEOT $>$ \bf{fitness\-Assignment}\label{classmoeoNSGAII_2cf7c853cc4213664b0654b1e5a8862a} + +\begin{CompactList}\small\item\em fitness assignment used in NSGA-II \item\end{CompactList}\item +\bf{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment}$<$ MOEOT $>$ \bf{diversity\-Assignment}\label{classmoeoNSGAII_710a3cdb375b1d03b1251f8a11b1c4b0} + +\begin{CompactList}\small\item\em diversity assignment used in NSGA-II \item\end{CompactList}\item +\bf{moeo\-Elitist\-Replacement}$<$ MOEOT $>$ \bf{replace}\label{classmoeoNSGAII_75bc4b735c5de2a6fc93b2f2b63c7251} + +\begin{CompactList}\small\item\em elitist replacement \item\end{CompactList}\item +\bf{eo\-SGAGen\-Op}$<$ MOEOT $>$ \bf{default\-SGAGen\-Op}\label{classmoeoNSGAII_a2050440184979533f2c403bb044c064} + +\begin{CompactList}\small\item\em an object for genetic operators (used as default) \item\end{CompactList}\item +\bf{eo\-General\-Breeder}$<$ MOEOT $>$ \bf{gen\-Breed}\label{classmoeoNSGAII_2099c3069a7da12485578fc66ff71ff1} + +\begin{CompactList}\small\item\em general breeder \item\end{CompactList}\item +\bf{eo\-Breed}$<$ MOEOT $>$ \& \bf{breed}\label{classmoeoNSGAII_17954849435e579d74bf37ed7b9063fc} + +\begin{CompactList}\small\item\em breeder \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-NSGAII$<$ MOEOT $>$} + +NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S. + +Agrawal, A. Pratap, and T. Meyarivan : \char`\"{}A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II\char`\"{}. In IEEE Transactions on Evolutionary Computation, Vol. 6, No 2, pp 182-197 (April 2002). This class builds the NSGA-II algorithm only by using the fine-grained components of the Paradis\-EO-MOEO framework. + + + +Definition at line 37 of file moeo\-NSGAII.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoNSGAII@{moeo\-NSGAII}!moeoNSGAII@{moeoNSGAII}} +\index{moeoNSGAII@{moeoNSGAII}!moeoNSGAII@{moeo\-NSGAII}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGAII}$<$ MOEOT $>$::\bf{moeo\-NSGAII} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \& {\em \_\-op})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGAII_a13ddb75d60e2956905a9eacca2e0b2e} + + +Simple ctor with a \doxyref{eo\-Gen\-Op}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \end{description} +\end{Desc} + + +Definition at line 47 of file moeo\-NSGAII.h.\index{moeoNSGAII@{moeo\-NSGAII}!moeoNSGAII@{moeoNSGAII}} +\index{moeoNSGAII@{moeoNSGAII}!moeoNSGAII@{moeo\-NSGAII}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGAII}$<$ MOEOT $>$::\bf{moeo\-NSGAII} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-op})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGAII_56a2b2ab62b2a4025f1d122e3cfa2aa2} + + +Simple ctor with a \doxyref{eo\-Transform}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \end{description} +\end{Desc} + + +Definition at line 59 of file moeo\-NSGAII.h.\index{moeoNSGAII@{moeo\-NSGAII}!moeoNSGAII@{moeoNSGAII}} +\index{moeoNSGAII@{moeoNSGAII}!moeoNSGAII@{moeo\-NSGAII}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGAII}$<$ MOEOT $>$::\bf{moeo\-NSGAII} (unsigned int {\em \_\-max\-Gen}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Quad\-Op}$<$ MOEOT $>$ \& {\em \_\-crossover}, double {\em \_\-p\-Cross}, \bf{eo\-Mon\-Op}$<$ MOEOT $>$ \& {\em \_\-mutation}, double {\em \_\-p\-Mut})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGAII_996e1b2683378ae1880b7520814aa9c9} + + +Ctor with a crossover, a mutation and their corresponding rates. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-max\-Gen}]number of generations before stopping \item[{\em \_\-eval}]evaluation function \item[{\em \_\-crossover}]crossover \item[{\em \_\-p\-Cross}]crossover probability \item[{\em \_\-mutation}]mutation \item[{\em \_\-p\-Mut}]mutation probability \end{description} +\end{Desc} + + +Definition at line 74 of file moeo\-NSGAII.h.\index{moeoNSGAII@{moeo\-NSGAII}!moeoNSGAII@{moeoNSGAII}} +\index{moeoNSGAII@{moeoNSGAII}!moeoNSGAII@{moeo\-NSGAII}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGAII}$<$ MOEOT $>$::\bf{moeo\-NSGAII} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Gen\-Op}$<$ MOEOT $>$ \& {\em \_\-op})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGAII_1797f01afde01d155e559522df12ae05} + + +Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Gen\-Op}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]stopping criteria \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \end{description} +\end{Desc} + + +Definition at line 87 of file moeo\-NSGAII.h.\index{moeoNSGAII@{moeo\-NSGAII}!moeoNSGAII@{moeoNSGAII}} +\index{moeoNSGAII@{moeoNSGAII}!moeoNSGAII@{moeo\-NSGAII}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-NSGAII}$<$ MOEOT $>$::\bf{moeo\-NSGAII} (\bf{eo\-Continue}$<$ MOEOT $>$ \& {\em \_\-continuator}, \bf{eo\-Eval\-Func}$<$ MOEOT $>$ \& {\em \_\-eval}, \bf{eo\-Transform}$<$ MOEOT $>$ \& {\em \_\-op})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNSGAII_a2b8d5b2ca7e7fd5845c6cda896b75c6} + + +Ctor with a continuator (instead of \_\-max\-Gen) and a \doxyref{eo\-Transform}. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-continuator}]stopping criteria \item[{\em \_\-eval}]evaluation function \item[{\em \_\-op}]variation operator \end{description} +\end{Desc} + + +Definition at line 99 of file moeo\-NSGAII.h. + +\subsection{Member Function Documentation} +\index{moeoNSGAII@{moeo\-NSGAII}!operator()@{operator()}} +\index{operator()@{operator()}!moeoNSGAII@{moeo\-NSGAII}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-NSGAII}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoNSGAII_60ba3ed4287efe81e1ff66b22e1d2e14} + + +Apply a few generation of evolution to the population \_\-pop until the stopping criteria is verified. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 109 of file moeo\-NSGAII.h. + +References moeo\-NSGAII$<$ MOEOT $>$::breed, moeo\-NSGAII$<$ MOEOT $>$::continuator, moeo\-NSGAII$<$ MOEOT $>$::diversity\-Assignment, moeo\-NSGAII$<$ MOEOT $>$::fitness\-Assignment, moeo\-NSGAII$<$ MOEOT $>$::pop\-Eval, and moeo\-NSGAII$<$ MOEOT $>$::replace. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-NSGAII.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.eps new file mode 100644 index 000000000..b6b9ed08e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 297.398 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.68125 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoNormalizedDistance< MOEOT, Type >) cw +(moeoDistance< MOEOT, Type >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoNormalizedDistance< MOEOT, Type >) 0 0 box + (moeoDistance< MOEOT, Type >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.tex new file mode 100644 index 000000000..cacbcda7e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedDistance.tex @@ -0,0 +1,112 @@ +\section{moeo\-Normalized\-Distance$<$ MOEOT, Type $>$ Class Template Reference} +\label{classmoeoNormalizedDistance}\index{moeoNormalizedDistance@{moeoNormalizedDistance}} +The base class for double distance computation with normalized objective values (i.e. + + +{\tt \#include $<$moeo\-Normalized\-Distance.h$>$} + +Inheritance diagram for moeo\-Normalized\-Distance$<$ MOEOT, Type $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoNormalizedDistance} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoNormalizedDistance_4009eb0c953bdc30b98dfc219774ce84} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Normalized\-Distance} ()\label{classmoeoNormalizedDistance_d3948169e6781aaf5f1b5de7ae09ba89} + +\begin{CompactList}\small\item\em Default ctr. \item\end{CompactList}\item +virtual void \bf{setup} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets the lower and the upper bounds for every objective using extremes values for solutions contained in the population \_\-pop. \item\end{CompactList}\item +virtual void \bf{setup} (double \_\-min, double \_\-max, unsigned int \_\-obj) +\begin{CompactList}\small\item\em Sets the lower bound (\_\-min) and the upper bound (\_\-max) for the objective \_\-obj. \item\end{CompactList}\item +virtual void \bf{setup} (\bf{eo\-Real\-Interval} \_\-real\-Interval, unsigned int \_\-obj) +\begin{CompactList}\small\item\em Sets the lower bound and the upper bound for the objective \_\-obj using a \doxyref{eo\-Real\-Interval} object. \item\end{CompactList}\end{CompactItemize} +\subsection*{Static Public Member Functions} +\begin{CompactItemize} +\item +static double \bf{tiny} ()\label{classmoeoNormalizedDistance_3534fa0cebf35373baa77ce18cfe572a} + +\begin{CompactList}\small\item\em Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound). \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +std::vector$<$ \bf{eo\-Real\-Interval} $>$ \bf{bounds}\label{classmoeoNormalizedDistance_db85a478b20f9d8ec0f34f30a15e7bdd} + +\begin{CompactList}\small\item\em the bounds for every objective (bounds[i] = bounds for the objective i) \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT, class Type = double$>$ class moeo\-Normalized\-Distance$<$ MOEOT, Type $>$} + +The base class for double distance computation with normalized objective values (i.e. + +between 0 and 1). + + + +Definition at line 24 of file moeo\-Normalized\-Distance.h. + +\subsection{Member Function Documentation} +\index{moeoNormalizedDistance@{moeo\-Normalized\-Distance}!setup@{setup}} +\index{setup@{setup}!moeoNormalizedDistance@{moeo\-Normalized\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type = double$>$ virtual void \bf{moeo\-Normalized\-Distance}$<$ MOEOT, Type $>$::setup (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoNormalizedDistance_b99ffed3c0ce6c9c10aef0a76d983bb1} + + +Sets the lower and the upper bounds for every objective using extremes values for solutions contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Distance$<$ MOEOT, Type $>$} \doxyref{p.}{classmoeoDistance_1834a67c2a7a96f0c9a3c408108a8f8c}. + +Definition at line 59 of file moeo\-Normalized\-Distance.h. + +Referenced by moeo\-Normalized\-Distance$<$ MOEOT $>$::setup().\index{moeoNormalizedDistance@{moeo\-Normalized\-Distance}!setup@{setup}} +\index{setup@{setup}!moeoNormalizedDistance@{moeo\-Normalized\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type = double$>$ virtual void \bf{moeo\-Normalized\-Distance}$<$ MOEOT, Type $>$::setup (double {\em \_\-min}, double {\em \_\-max}, unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoNormalizedDistance_e58bbf9eb90a8d2704f88d774d3fe1e1} + + +Sets the lower bound (\_\-min) and the upper bound (\_\-max) for the objective \_\-obj. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-min}]lower bound \item[{\em \_\-max}]upper bound \item[{\em \_\-obj}]the objective index \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Distance$<$ MOEOT, Type $>$} \doxyref{p.}{classmoeoDistance_341c4fa39652871761053e85914a16ad}. + +Definition at line 83 of file moeo\-Normalized\-Distance.h.\index{moeoNormalizedDistance@{moeo\-Normalized\-Distance}!setup@{setup}} +\index{setup@{setup}!moeoNormalizedDistance@{moeo\-Normalized\-Distance}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT, class Type = double$>$ virtual void \bf{moeo\-Normalized\-Distance}$<$ MOEOT, Type $>$::setup (\bf{eo\-Real\-Interval} {\em \_\-real\-Interval}, unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoNormalizedDistance_dda4f95d7f6cae9dd1f4bf6cd8fb7c1c} + + +Sets the lower bound and the upper bound for the objective \_\-obj using a \doxyref{eo\-Real\-Interval} object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-real\-Interval}]the \doxyref{eo\-Real\-Interval} object \item[{\em \_\-obj}]the objective index \end{description} +\end{Desc} + + +Reimplemented from \bf{moeo\-Distance$<$ MOEOT, Type $>$} \doxyref{p.}{classmoeoDistance_b08e7b8c1bedb2993669ec0315fb2b73}. + +Definition at line 99 of file moeo\-Normalized\-Distance.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Normalized\-Distance.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.eps new file mode 100644 index 000000000..c4f1216cf --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 117.925 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.24 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) cw +(moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) 0.5 0 box + (moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) 0.5 1 box + (moeoBinaryMetric< A1, A2, R >) 0.5 2 box + (eoBF< A1, A2, R >) 0 3 box + (moeoMetric) 1 3 box + (eoFunctorBase) 0 4 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +0 1 3 conn +solid +1 0 3 in +solid +0 0 3 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 0 4 in +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.tex new file mode 100644 index 000000000..3f078db29 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoNormalizedSolutionVsSolutionBinaryMetric.tex @@ -0,0 +1,84 @@ +\section{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$ Class Template Reference} +\label{classmoeoNormalizedSolutionVsSolutionBinaryMetric}\index{moeoNormalizedSolutionVsSolutionBinaryMetric@{moeoNormalizedSolutionVsSolutionBinaryMetric}} +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. + + +{\tt \#include $<$moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric.h$>$} + +Inheritance diagram for moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.30189cm]{classmoeoNormalizedSolutionVsSolutionBinaryMetric} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric} ()\label{classmoeoNormalizedSolutionVsSolutionBinaryMetric_e58174a553269d3e8b0685a1f22b8333} + +\begin{CompactList}\small\item\em Default ctr for any \doxyref{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}{p.}{classmoeoNormalizedSolutionVsSolutionBinaryMetric} object. \item\end{CompactList}\item +void \bf{setup} (double \_\-min, double \_\-max, unsigned int \_\-obj) +\begin{CompactList}\small\item\em Sets the lower bound (\_\-min) and the upper bound (\_\-max) for the objective \_\-obj. \item\end{CompactList}\item +virtual void \bf{setup} (\bf{eo\-Real\-Interval} \_\-real\-Interval, unsigned int \_\-obj) +\begin{CompactList}\small\item\em Sets the lower bound and the upper bound for the objective \_\-obj using a \doxyref{eo\-Real\-Interval} object. \item\end{CompactList}\end{CompactItemize} +\subsection*{Static Public Member Functions} +\begin{CompactItemize} +\item +static double \bf{tiny} ()\label{classmoeoNormalizedSolutionVsSolutionBinaryMetric_d0ccbdceb71b9d2d6ae8ceec1af9dcdb} + +\begin{CompactList}\small\item\em Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound). \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +std::vector$<$ \bf{eo\-Real\-Interval} $>$ \bf{bounds}\label{classmoeoNormalizedSolutionVsSolutionBinaryMetric_81bff9a83c74f7f7f8a1db28c09c4c38} + +\begin{CompactList}\small\item\em the bounds for every objective (bounds[i] = bounds for the objective i) \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector, class R$>$ class moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$} + +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. + +Then, indicator values lie in the interval [-1,1]. Note that you have to set the bounds for every objective before using the operator(). + + + +Definition at line 26 of file moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric.h. + +\subsection{Member Function Documentation} +\index{moeoNormalizedSolutionVsSolutionBinaryMetric@{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}!setup@{setup}} +\index{setup@{setup}!moeoNormalizedSolutionVsSolutionBinaryMetric@{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector, class R$>$ void \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ Objective\-Vector, R $>$::setup (double {\em \_\-min}, double {\em \_\-max}, unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoNormalizedSolutionVsSolutionBinaryMetric_1f56a2f59a9b0548ad0ab691c8a02334} + + +Sets the lower bound (\_\-min) and the upper bound (\_\-max) for the objective \_\-obj. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-min}]lower bound \item[{\em \_\-max}]upper bound \item[{\em \_\-obj}]the objective index \end{description} +\end{Desc} + + +Definition at line 50 of file moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric.h. + +Referenced by moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$::setup().\index{moeoNormalizedSolutionVsSolutionBinaryMetric@{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}!setup@{setup}} +\index{setup@{setup}!moeoNormalizedSolutionVsSolutionBinaryMetric@{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector, class R$>$ virtual void \bf{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric}$<$ Objective\-Vector, R $>$::setup (\bf{eo\-Real\-Interval} {\em \_\-real\-Interval}, unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoNormalizedSolutionVsSolutionBinaryMetric_0693a23c68e3fe0bb546e34926dcfe93} + + +Sets the lower bound and the upper bound for the objective \_\-obj using a \doxyref{eo\-Real\-Interval} object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-real\-Interval}]the \doxyref{eo\-Real\-Interval} object \item[{\em \_\-obj}]the objective index \end{description} +\end{Desc} + + +Definition at line 66 of file moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.eps new file mode 100644 index 000000000..d06716d53 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 211.64 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.3625 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoObjectiveObjectiveVectorComparator< ObjectiveVector >) cw +(moeoObjectiveVectorComparator< ObjectiveVector >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoObjectiveObjectiveVectorComparator< ObjectiveVector >) 0 0 box + (moeoObjectiveVectorComparator< ObjectiveVector >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.tex new file mode 100644 index 000000000..6117be6be --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveObjectiveVectorComparator.tex @@ -0,0 +1,49 @@ +\section{moeo\-Objective\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoObjectiveObjectiveVectorComparator}\index{moeoObjectiveObjectiveVectorComparator@{moeoObjectiveObjectiveVectorComparator}} +Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. + + +{\tt \#include $<$moeo\-Objective\-Objective\-Vector\-Comparator.h$>$} + +Inheritance diagram for moeo\-Objective\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoObjectiveObjectiveVectorComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const bool \bf{operator()} (const Objective\-Vector \&\_\-objective\-Vector1, const Objective\-Vector \&\_\-objective\-Vector2) +\begin{CompactList}\small\item\em Returns true if \_\-objective\-Vector1 $<$ \_\-objective\-Vector2 on the first objective, then on the second, and so on. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Objective\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} + +Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. + + + +Definition at line 22 of file moeo\-Objective\-Objective\-Vector\-Comparator.h. + +\subsection{Member Function Documentation} +\index{moeoObjectiveObjectiveVectorComparator@{moeo\-Objective\-Objective\-Vector\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoObjectiveObjectiveVectorComparator@{moeo\-Objective\-Objective\-Vector\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ const bool \bf{moeo\-Objective\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$::operator() (const Objective\-Vector \& {\em \_\-objective\-Vector1}, const Objective\-Vector \& {\em \_\-objective\-Vector2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveObjectiveVectorComparator_bc3c97b380e87107e92f52843a7f9303} + + +Returns true if \_\-objective\-Vector1 $<$ \_\-objective\-Vector2 on the first objective, then on the second, and so on. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector1}]the first objective vector \item[{\em \_\-objective\-Vector2}]the second objective vector \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Objective\-Objective\-Vector\-Comparator.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Objective\-Objective\-Vector\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVector.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVector.tex new file mode 100644 index 000000000..f97618af4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVector.tex @@ -0,0 +1,114 @@ +\section{moeo\-Objective\-Vector$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$ Class Template Reference} +\label{classmoeoObjectiveVector}\index{moeoObjectiveVector@{moeoObjectiveVector}} +Abstract class allowing to represent a solution in the objective space (phenotypic representation). + + +{\tt \#include $<$moeo\-Objective\-Vector.h$>$} + +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef Objective\-Vector\-Traits \bf{Traits}\label{classmoeoObjectiveVector_21ee0475420b613951b96a550e814fbb} + +\begin{CompactList}\small\item\em The traits of objective vectors. \item\end{CompactList}\item +typedef Objective\-Vector\-Type \bf{Type}\label{classmoeoObjectiveVector_e86f199692cae43bc346be63130eb993} + +\begin{CompactList}\small\item\em The type of an objective value. \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Objective\-Vector} (\bf{Type} \_\-value=\bf{Type}())\label{classmoeoObjectiveVector_084e9d2cecbf9ea66e4b68537457109f} + +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +\bf{moeo\-Objective\-Vector} (std::vector$<$ \bf{Type} $>$ \&\_\-v) +\begin{CompactList}\small\item\em Ctor from a vector of Type. \item\end{CompactList}\end{CompactItemize} +\subsection*{Static Public Member Functions} +\begin{CompactItemize} +\item +static void \bf{setup} (unsigned int \_\-n\-Objectives, std::vector$<$ bool $>$ \&\_\-b\-Objectives) +\begin{CompactList}\small\item\em \doxyref{Parameters} setting (for the objective vector of any solution). \item\end{CompactList}\item +static unsigned int \bf{n\-Objectives} ()\label{classmoeoObjectiveVector_4c9a17116e0a95b4e3191f299e10fc9d} + +\begin{CompactList}\small\item\em Returns the number of objectives. \item\end{CompactList}\item +static bool \bf{minimizing} (unsigned int \_\-i) +\begin{CompactList}\small\item\em Returns true if the \_\-ith objective have to be minimized. \item\end{CompactList}\item +static bool \bf{maximizing} (unsigned int \_\-i) +\begin{CompactList}\small\item\em Returns true if the \_\-ith objective have to be maximized. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector\-Traits, class Objective\-Vector\-Type$>$ class moeo\-Objective\-Vector$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$} + +Abstract class allowing to represent a solution in the objective space (phenotypic representation). + +The template argument Objective\-Vector\-Traits defaults to \doxyref{moeo\-Objective\-Vector\-Traits}{p.}{classmoeoObjectiveVectorTraits}, but it can be replaced at will by any other class that implements the static functions defined therein. Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's. + + + +Definition at line 25 of file moeo\-Objective\-Vector.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoObjectiveVector@{moeo\-Objective\-Vector}!moeoObjectiveVector@{moeoObjectiveVector}} +\index{moeoObjectiveVector@{moeoObjectiveVector}!moeoObjectiveVector@{moeo\-Objective\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits, class Objective\-Vector\-Type$>$ \bf{moeo\-Objective\-Vector}$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$::\bf{moeo\-Objective\-Vector} (std::vector$<$ \bf{Type} $>$ \& {\em \_\-v})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVector_c504cb6a2086a80aaaf41978032c8ce7} + + +Ctor from a vector of Type. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-v}]the std::vector $<$ Type $>$ \end{description} +\end{Desc} + + +Definition at line 46 of file moeo\-Objective\-Vector.h. + +\subsection{Member Function Documentation} +\index{moeoObjectiveVector@{moeo\-Objective\-Vector}!setup@{setup}} +\index{setup@{setup}!moeoObjectiveVector@{moeo\-Objective\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits, class Objective\-Vector\-Type$>$ static void \bf{moeo\-Objective\-Vector}$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$::setup (unsigned int {\em \_\-n\-Objectives}, std::vector$<$ bool $>$ \& {\em \_\-b\-Objectives})\hspace{0.3cm}{\tt [inline, static]}}\label{classmoeoObjectiveVector_0593e2d91be697d9b255513236cb207f} + + +\doxyref{Parameters} setting (for the objective vector of any solution). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-n\-Objectives}]the number of objectives \item[{\em \_\-b\-Objectives}]the min/max vector (true = min / false = max) \end{description} +\end{Desc} + + +Definition at line 55 of file moeo\-Objective\-Vector.h.\index{moeoObjectiveVector@{moeo\-Objective\-Vector}!minimizing@{minimizing}} +\index{minimizing@{minimizing}!moeoObjectiveVector@{moeo\-Objective\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits, class Objective\-Vector\-Type$>$ static bool \bf{moeo\-Objective\-Vector}$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$::minimizing (unsigned int {\em \_\-i})\hspace{0.3cm}{\tt [inline, static]}}\label{classmoeoObjectiveVector_decaf6e3b9a9ac97461d2b271facfc5f} + + +Returns true if the \_\-ith objective have to be minimized. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-i}]the index \end{description} +\end{Desc} + + +Definition at line 74 of file moeo\-Objective\-Vector.h.\index{moeoObjectiveVector@{moeo\-Objective\-Vector}!maximizing@{maximizing}} +\index{maximizing@{maximizing}!moeoObjectiveVector@{moeo\-Objective\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits, class Objective\-Vector\-Type$>$ static bool \bf{moeo\-Objective\-Vector}$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$::maximizing (unsigned int {\em \_\-i})\hspace{0.3cm}{\tt [inline, static]}}\label{classmoeoObjectiveVector_b62231b0e1c6bb6bab43d6d058871ce3} + + +Returns true if the \_\-ith objective have to be maximized. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-i}]the index \end{description} +\end{Desc} + + +Definition at line 84 of file moeo\-Objective\-Vector.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Objective\-Vector.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.eps new file mode 100644 index 000000000..1451a2738 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.eps @@ -0,0 +1,219 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 67.3401 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 7.425 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 3 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoObjectiveVectorComparator< ObjectiveVector >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +(moeoGDominanceObjectiveVectorComparator< ObjectiveVector >) cw +(moeoObjectiveObjectiveVectorComparator< ObjectiveVector >) cw +(moeoParetoObjectiveVectorComparator< ObjectiveVector >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoObjectiveVectorComparator< ObjectiveVector >) 1 1 box + (eoBF< A1, A2, R >) 1 2 box + (eoFunctorBase) 1 3 box + (moeoGDominanceObjectiveVectorComparator< ObjectiveVector >) 0 0 box + (moeoObjectiveObjectiveVectorComparator< ObjectiveVector >) 1 0 box + (moeoParetoObjectiveVectorComparator< ObjectiveVector >) 2 0 box + +% ----- relations ----- + +solid +0 1 1 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +1 1 0.25 out +solid +0 2 1 conn +solid +0 0 0.75 in +solid +0 1 0.75 in +solid +0 2 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.tex new file mode 100644 index 000000000..9bfde27f5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorComparator.tex @@ -0,0 +1,29 @@ +\section{moeo\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoObjectiveVectorComparator}\index{moeoObjectiveVectorComparator@{moeoObjectiveVectorComparator}} +Abstract class allowing to compare 2 objective vectors. + + +{\tt \#include $<$moeo\-Objective\-Vector\-Comparator.h$>$} + +Inheritance diagram for moeo\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=1.88552cm]{classmoeoObjectiveVectorComparator} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} + +Abstract class allowing to compare 2 objective vectors. + +The template argument Objective\-Vector have to be a \doxyref{moeo\-Objective\-Vector}{p.}{classmoeoObjectiveVector}. + + + +Definition at line 24 of file moeo\-Objective\-Vector\-Comparator.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Objective\-Vector\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.eps new file mode 100644 index 000000000..f638da952 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 119.048 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.2 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoObjectiveVectorDouble< ObjectiveVectorTraits >) cw +(moeoObjectiveVector< ObjectiveVectorTraits, double >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoObjectiveVectorDouble< ObjectiveVectorTraits >) 0 0 box + (moeoObjectiveVector< ObjectiveVectorTraits, double >) 0 1 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.tex new file mode 100644 index 000000000..c349969cc --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorDouble.tex @@ -0,0 +1,181 @@ +\section{moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$ Class Template Reference} +\label{classmoeoObjectiveVectorDouble}\index{moeoObjectiveVectorDouble@{moeoObjectiveVectorDouble}} +This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e. + + +{\tt \#include $<$moeo\-Objective\-Vector\-Double.h$>$} + +Inheritance diagram for moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2cm]{classmoeoObjectiveVectorDouble} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Objective\-Vector\-Double} (double \_\-value=0.0)\label{classmoeoObjectiveVectorDouble_9d4c470ac87733521084175552874837} + +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +\bf{moeo\-Objective\-Vector\-Double} (std::vector$<$ double $>$ \&\_\-v) +\begin{CompactList}\small\item\em Ctor from a vector of doubles. \item\end{CompactList}\item +bool \bf{dominates} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector dominates \_\-other according to the Pareto dominance relation (but it's better to use a \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} object to compare solutions). \item\end{CompactList}\item +bool \bf{operator==} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector is equal to \_\-other (according to a tolerance value). \item\end{CompactList}\item +bool \bf{operator!=} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector is different than \_\-other (according to a tolerance value). \item\end{CompactList}\item +bool \bf{operator$<$} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector is smaller than \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \item\end{CompactList}\item +bool \bf{operator$>$} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector is greater than \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \item\end{CompactList}\item +bool \bf{operator$<$=} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector is smaller than or equal to \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \item\end{CompactList}\item +bool \bf{operator$>$=} (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \&\_\-other) const +\begin{CompactList}\small\item\em Returns true if the current objective vector is greater than or equal to \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector\-Traits$>$ class moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$} + +This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e. + +that an objective value is represented using a double, and this for any objective. + + + +Definition at line 27 of file moeo\-Objective\-Vector\-Double.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!moeoObjectiveVectorDouble@{moeoObjectiveVectorDouble}} +\index{moeoObjectiveVectorDouble@{moeoObjectiveVectorDouble}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::\bf{moeo\-Objective\-Vector\-Double} (std::vector$<$ double $>$ \& {\em \_\-v})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_99f4a743424ed8384ad97fd36e3123d9} + + +Ctor from a vector of doubles. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-v}]the std::vector $<$ double $>$ \end{description} +\end{Desc} + + +Definition at line 45 of file moeo\-Objective\-Vector\-Double.h. + +\subsection{Member Function Documentation} +\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!dominates@{dominates}} +\index{dominates@{dominates}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::dominates (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_f4aa764abee12a28ae30ae6bb23083f4} + + +Returns true if the current objective vector dominates \_\-other according to the Pareto dominance relation (but it's better to use a \doxyref{moeo\-Objective\-Vector\-Comparator}{p.}{classmoeoObjectiveVectorComparator} object to compare solutions). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 54 of file moeo\-Objective\-Vector\-Double.h.\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!operator==@{operator==}} +\index{operator==@{operator==}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::operator== (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_cf09615e1a38924ee4fb6250047f9d77} + + +Returns true if the current objective vector is equal to \_\-other (according to a tolerance value). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 65 of file moeo\-Objective\-Vector\-Double.h. + +Referenced by moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator!=(), and moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator$>$=().\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!operator"!=@{operator"!=}} +\index{operator"!=@{operator"!=}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::operator!= (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_367e69818ebe05a932510e6516c54fdb} + + +Returns true if the current objective vector is different than \_\-other (according to a tolerance value). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 82 of file moeo\-Objective\-Vector\-Double.h. + +References moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator==().\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!operator<@{operator$<$}} +\index{operator<@{operator$<$}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::operator$<$ (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_5616d7504e6b29848ca38b52e9eb44e0} + + +Returns true if the current objective vector is smaller than \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 93 of file moeo\-Objective\-Vector\-Double.h. + +Referenced by moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator$<$=().\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!operator>@{operator$>$}} +\index{operator>@{operator$>$}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::operator$>$ (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_50de392d10bd90ad125f26efb8ea5f3d} + + +Returns true if the current objective vector is greater than \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 105 of file moeo\-Objective\-Vector\-Double.h. + +Referenced by moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator$>$=().\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!operator<=@{operator$<$=}} +\index{operator<=@{operator$<$=}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::operator$<$= (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_11728f07ebd7d72fe331679913888d3f} + + +Returns true if the current objective vector is smaller than or equal to \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 116 of file moeo\-Objective\-Vector\-Double.h. + +References moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator$<$().\index{moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}!operator>=@{operator$>$=}} +\index{operator>=@{operator$>$=}!moeoObjectiveVectorDouble@{moeo\-Objective\-Vector\-Double}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector\-Traits$>$ bool \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$::operator$>$= (const \bf{moeo\-Objective\-Vector\-Double}$<$ Objective\-Vector\-Traits $>$ \& {\em \_\-other}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoObjectiveVectorDouble_74057cd0d8325513d186aea6034d7901} + + +Returns true if the current objective vector is greater than or equal to \_\-other on the first objective, then on the second, and so on (can be usefull for sorting/printing). + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-other}]the other \doxyref{moeo\-Objective\-Vector\-Double}{p.}{classmoeoObjectiveVectorDouble} object to compare with \end{description} +\end{Desc} + + +Definition at line 127 of file moeo\-Objective\-Vector\-Double.h. + +References moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator==(), and moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$::operator$>$(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Objective\-Vector\-Double.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorTraits.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorTraits.tex new file mode 100644 index 000000000..ea58ffa09 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoObjectiveVectorTraits.tex @@ -0,0 +1,97 @@ +\section{moeo\-Objective\-Vector\-Traits Class Reference} +\label{classmoeoObjectiveVectorTraits}\index{moeoObjectiveVectorTraits@{moeoObjectiveVectorTraits}} +A traits class for \doxyref{moeo\-Objective\-Vector}{p.}{classmoeoObjectiveVector} to specify the number of objectives and which ones have to be minimized or maximized. + + +{\tt \#include $<$moeo\-Objective\-Vector\-Traits.h$>$} + +\subsection*{Static Public Member Functions} +\begin{CompactItemize} +\item +static void \bf{setup} (unsigned int \_\-n\-Objectives, std::vector$<$ bool $>$ \&\_\-b\-Objectives) +\begin{CompactList}\small\item\em \doxyref{Parameters} setting. \item\end{CompactList}\item +static unsigned int \bf{n\-Objectives} ()\label{classmoeoObjectiveVectorTraits_5befa177fc91ead8234bac7ce9d1e587} + +\begin{CompactList}\small\item\em Returns the number of objectives. \item\end{CompactList}\item +static bool \bf{minimizing} (unsigned int \_\-i) +\begin{CompactList}\small\item\em Returns true if the \_\-ith objective have to be minimized. \item\end{CompactList}\item +static bool \bf{maximizing} (unsigned int \_\-i) +\begin{CompactList}\small\item\em Returns true if the \_\-ith objective have to be maximized. \item\end{CompactList}\item +static double \bf{tolerance} ()\label{classmoeoObjectiveVectorTraits_c1199e4f019ec88a0365db81e9ab8d1f} + +\begin{CompactList}\small\item\em Returns the tolerance value (to compare solutions). \item\end{CompactList}\end{CompactItemize} +\subsection*{Static Private Attributes} +\begin{CompactItemize} +\item +static unsigned int \bf{n\-Obj}\label{classmoeoObjectiveVectorTraits_77b639889ffc6d306d4dfded5a160236} + +\begin{CompactList}\small\item\em The number of objectives. \item\end{CompactList}\item +static std::vector$<$ bool $>$ \bf{b\-Obj}\label{classmoeoObjectiveVectorTraits_db329d416c75711f671c9d7cffb06299} + +\begin{CompactList}\small\item\em The min/max vector. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +A traits class for \doxyref{moeo\-Objective\-Vector}{p.}{classmoeoObjectiveVector} to specify the number of objectives and which ones have to be minimized or maximized. + + + +Definition at line 23 of file moeo\-Objective\-Vector\-Traits.h. + +\subsection{Member Function Documentation} +\index{moeoObjectiveVectorTraits@{moeo\-Objective\-Vector\-Traits}!setup@{setup}} +\index{setup@{setup}!moeoObjectiveVectorTraits@{moeo\-Objective\-Vector\-Traits}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}static void moeo\-Objective\-Vector\-Traits::setup (unsigned int {\em \_\-n\-Objectives}, std::vector$<$ bool $>$ \& {\em \_\-b\-Objectives})\hspace{0.3cm}{\tt [inline, static]}}\label{classmoeoObjectiveVectorTraits_327c1994f1b5aa3d6b5c8cae0b971191} + + +\doxyref{Parameters} setting. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-n\-Objectives}]the number of objectives \item[{\em \_\-b\-Objectives}]the min/max vector (true = min / false = max) \end{description} +\end{Desc} + + +Definition at line 32 of file moeo\-Objective\-Vector\-Traits.h. + +References b\-Obj, and n\-Obj.\index{moeoObjectiveVectorTraits@{moeo\-Objective\-Vector\-Traits}!minimizing@{minimizing}} +\index{minimizing@{minimizing}!moeoObjectiveVectorTraits@{moeo\-Objective\-Vector\-Traits}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}static bool moeo\-Objective\-Vector\-Traits::minimizing (unsigned int {\em \_\-i})\hspace{0.3cm}{\tt [inline, static]}}\label{classmoeoObjectiveVectorTraits_1478ae3006747619aa9ef3c016bdc831} + + +Returns true if the \_\-ith objective have to be minimized. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-i}]the index \end{description} +\end{Desc} + + +Definition at line 67 of file moeo\-Objective\-Vector\-Traits.h. + +References b\-Obj. + +Referenced by maximizing().\index{moeoObjectiveVectorTraits@{moeo\-Objective\-Vector\-Traits}!maximizing@{maximizing}} +\index{maximizing@{maximizing}!moeoObjectiveVectorTraits@{moeo\-Objective\-Vector\-Traits}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}static bool moeo\-Objective\-Vector\-Traits::maximizing (unsigned int {\em \_\-i})\hspace{0.3cm}{\tt [inline, static]}}\label{classmoeoObjectiveVectorTraits_c8e1a93d8c8480c391a007969ae652df} + + +Returns true if the \_\-ith objective have to be maximized. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-i}]the index \end{description} +\end{Desc} + + +Definition at line 80 of file moeo\-Objective\-Vector\-Traits.h. + +References minimizing(). + +The documentation for this class was generated from the following files:\begin{CompactItemize} +\item +moeo\-Objective\-Vector\-Traits.h\item +moeo\-Objective\-Vector\-Traits.cpp\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.eps new file mode 100644 index 000000000..deebfb25e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 303.03 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.65 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoOneObjectiveComparator< MOEOT >) cw +(moeoComparator< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoOneObjectiveComparator< MOEOT >) 0 0 box + (moeoComparator< MOEOT >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.tex new file mode 100644 index 000000000..8b59cdb14 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoOneObjectiveComparator.tex @@ -0,0 +1,78 @@ +\section{moeo\-One\-Objective\-Comparator$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoOneObjectiveComparator}\index{moeoOneObjectiveComparator@{moeoOneObjectiveComparator}} +Functor allowing to compare two solutions according to one objective. + + +{\tt \#include $<$moeo\-One\-Objective\-Comparator.h$>$} + +Inheritance diagram for moeo\-One\-Objective\-Comparator$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoOneObjectiveComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-One\-Objective\-Comparator} (unsigned int \_\-obj) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +const bool \bf{operator()} (const MOEOT \&\_\-moeo1, const MOEOT \&\_\-moeo2) +\begin{CompactList}\small\item\em Returns true if \_\-moeo1 $<$ \_\-moeo2 on the obj objective. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +unsigned int \bf{obj}\label{classmoeoOneObjectiveComparator_a45047e66adac81f5a34a2a0fe05f591} + +\begin{CompactList}\small\item\em the index of objective \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-One\-Objective\-Comparator$<$ MOEOT $>$} + +Functor allowing to compare two solutions according to one objective. + + + +Definition at line 22 of file moeo\-One\-Objective\-Comparator.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoOneObjectiveComparator@{moeo\-One\-Objective\-Comparator}!moeoOneObjectiveComparator@{moeoOneObjectiveComparator}} +\index{moeoOneObjectiveComparator@{moeoOneObjectiveComparator}!moeoOneObjectiveComparator@{moeo\-One\-Objective\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-One\-Objective\-Comparator}$<$ MOEOT $>$::\bf{moeo\-One\-Objective\-Comparator} (unsigned int {\em \_\-obj})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoOneObjectiveComparator_be1249440803553ef868182019d49e4d} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-obj}]the index of objective \end{description} +\end{Desc} + + +Definition at line 30 of file moeo\-One\-Objective\-Comparator.h. + +References moeo\-One\-Objective\-Comparator$<$ MOEOT $>$::obj. + +\subsection{Member Function Documentation} +\index{moeoOneObjectiveComparator@{moeo\-One\-Objective\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoOneObjectiveComparator@{moeo\-One\-Objective\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const bool \bf{moeo\-One\-Objective\-Comparator}$<$ MOEOT $>$::operator() (const MOEOT \& {\em \_\-moeo1}, const MOEOT \& {\em \_\-moeo2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoOneObjectiveComparator_962a4cbc308c30a83c9c485a79374f6a} + + +Returns true if \_\-moeo1 $<$ \_\-moeo2 on the obj objective. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo1}]the first solution \item[{\em \_\-moeo2}]the second solution \end{description} +\end{Desc} + + +Definition at line 44 of file moeo\-One\-Objective\-Comparator.h. + +References moeo\-One\-Objective\-Comparator$<$ MOEOT $>$::obj. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-One\-Objective\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.eps new file mode 100644 index 000000000..6905f3d2d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 270.27 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.85 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoParetoBasedFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoFastNonDominatedSortingFitnessAssignment< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoParetoBasedFitnessAssignment< MOEOT >) 0 1 box + (moeoFitnessAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + (moeoFastNonDominatedSortingFitnessAssignment< MOEOT >) 0 0 box + +% ----- relations ----- + +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in +solid +1 0 0.25 out +solid +0 0 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.tex new file mode 100644 index 000000000..742a285c3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoBasedFitnessAssignment.tex @@ -0,0 +1,27 @@ +\section{moeo\-Pareto\-Based\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoParetoBasedFitnessAssignment}\index{moeoParetoBasedFitnessAssignment@{moeoParetoBasedFitnessAssignment}} +\doxyref{moeo\-Pareto\-Based\-Fitness\-Assignment}{p.}{classmoeoParetoBasedFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for Pareto-based strategies. + + +{\tt \#include $<$moeo\-Pareto\-Based\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Pareto\-Based\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoParetoBasedFitnessAssignment} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Pareto\-Based\-Fitness\-Assignment$<$ MOEOT $>$} + +\doxyref{moeo\-Pareto\-Based\-Fitness\-Assignment}{p.}{classmoeoParetoBasedFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for Pareto-based strategies. + + + +Definition at line 22 of file moeo\-Pareto\-Based\-Fitness\-Assignment.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Pareto\-Based\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.eps new file mode 100644 index 000000000..cda7a9a73 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 221.607 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.25625 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoParetoObjectiveVectorComparator< ObjectiveVector >) cw +(moeoObjectiveVectorComparator< ObjectiveVector >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoParetoObjectiveVectorComparator< ObjectiveVector >) 0 0 box + (moeoObjectiveVectorComparator< ObjectiveVector >) 0 1 box + (eoBF< A1, A2, R >) 0 2 box + (eoFunctorBase) 0 3 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.tex new file mode 100644 index 000000000..fe17076c3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoParetoObjectiveVectorComparator.tex @@ -0,0 +1,49 @@ +\section{moeo\-Pareto\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$ Class Template Reference} +\label{classmoeoParetoObjectiveVectorComparator}\index{moeoParetoObjectiveVectorComparator@{moeoParetoObjectiveVectorComparator}} +This functor class allows to compare 2 objective vectors according to Pareto dominance. + + +{\tt \#include $<$moeo\-Pareto\-Objective\-Vector\-Comparator.h$>$} + +Inheritance diagram for moeo\-Pareto\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=4cm]{classmoeoParetoObjectiveVectorComparator} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +const bool \bf{operator()} (const Objective\-Vector \&\_\-objective\-Vector1, const Objective\-Vector \&\_\-objective\-Vector2) +\begin{CompactList}\small\item\em Returns true if \_\-objective\-Vector1 is dominated by \_\-objective\-Vector2. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector$>$ class moeo\-Pareto\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$} + +This functor class allows to compare 2 objective vectors according to Pareto dominance. + + + +Definition at line 22 of file moeo\-Pareto\-Objective\-Vector\-Comparator.h. + +\subsection{Member Function Documentation} +\index{moeoParetoObjectiveVectorComparator@{moeo\-Pareto\-Objective\-Vector\-Comparator}!operator()@{operator()}} +\index{operator()@{operator()}!moeoParetoObjectiveVectorComparator@{moeo\-Pareto\-Objective\-Vector\-Comparator}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class Objective\-Vector$>$ const bool \bf{moeo\-Pareto\-Objective\-Vector\-Comparator}$<$ Objective\-Vector $>$::operator() (const Objective\-Vector \& {\em \_\-objective\-Vector1}, const Objective\-Vector \& {\em \_\-objective\-Vector2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoParetoObjectiveVectorComparator_9bd4302396fb179efe14035dc097726c} + + +Returns true if \_\-objective\-Vector1 is dominated by \_\-objective\-Vector2. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-objective\-Vector1}]the first objective vector \item[{\em \_\-objective\-Vector2}]the second objective vector \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Pareto\-Objective\-Vector\-Comparator.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Pareto\-Objective\-Vector\-Comparator.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.eps new file mode 100644 index 000000000..6a6789ed7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.eps @@ -0,0 +1,239 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 250 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoRandomSelect< MOEOT >) cw +(moeoSelectOne< MOEOT >) cw +(eoRandomSelect< MOEOT >) cw +(eoSelectOne< MOEOT >) cw +(eoSelectOne< EOT, WorthT >) cw +(eoUF< A1, R >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoRandomSelect< MOEOT >) 0.5 0 box + (moeoSelectOne< MOEOT >) 0 1 box + (eoRandomSelect< MOEOT >) 1 1 box + (eoSelectOne< MOEOT >) 0 2 box + (eoSelectOne< EOT, WorthT >) 1 2 box + (eoUF< A1, R >) 0 3 box + (eoUF< A1, R >) 1 3 box + (eoFunctorBase) 0 4 box + (eoFunctorBase) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +0 1 1 conn +solid +1 0 1 in +solid +0 0 1 out +solid +1 1 1 in +solid +0 1 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 0 4 in +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.tex new file mode 100644 index 000000000..8209cde07 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoRandomSelect.tex @@ -0,0 +1,36 @@ +\section{moeo\-Random\-Select$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoRandomSelect}\index{moeoRandomSelect@{moeoRandomSelect}} +Selection strategy that selects only one element randomly from a whole population. + + +{\tt \#include $<$moeo\-Random\-Select.h$>$} + +Inheritance diagram for moeo\-Random\-Select$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoRandomSelect} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Random\-Select} ()\label{classmoeoRandomSelect_209022add1e1750f28497dfe637bb5dc} + +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +const MOEOT \& \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop)\label{classmoeoRandomSelect_96dbd0832ad677090ef79ff3867d7af9} + +\begin{CompactList}\small\item\em Return one individual at random by using an \doxyref{eo\-Random\-Select}. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Random\-Select$<$ MOEOT $>$} + +Selection strategy that selects only one element randomly from a whole population. + + + +Definition at line 23 of file moeo\-Random\-Select.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Random\-Select.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.eps new file mode 100644 index 000000000..68a3a30ef --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 126.05 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.96667 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 6 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >) cw +(MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(EO< MOEOObjectiveVector >) cw +(eoObject) cw +(eoPersistent) cw +(eoPrintable) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 0.5 0 box + (moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >) 0.5 1 box + (MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 0.5 2 box + (EO< MOEOObjectiveVector >) 0.5 3 box + (eoObject) 0 4 box + (eoPersistent) 1 4 box + (eoPrintable) 1 5 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +1 0.5 3 in +solid +0 0.5 3 out +solid +0 1 4 conn +solid +1 0 4 in +solid +1 1 4 in +solid +0 1 4 out +solid +1 1 5 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.tex new file mode 100644 index 000000000..6b81ca03d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoRealVector.tex @@ -0,0 +1,49 @@ +\section{moeo\-Real\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$ Class Template Reference} +\label{classmoeoRealVector}\index{moeoRealVector@{moeoRealVector}} +This class is an implementation of a simple double-valued \doxyref{moeo\-Vector}{p.}{classmoeoVector}. + + +{\tt \#include $<$moeo\-Real\-Vector.h$>$} + +Inheritance diagram for moeo\-Real\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.52941cm]{classmoeoRealVector} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Real\-Vector} (unsigned int \_\-size=0, double \_\-value=0.0) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ class moeo\-Real\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} + +This class is an implementation of a simple double-valued \doxyref{moeo\-Vector}{p.}{classmoeoVector}. + + + +Definition at line 22 of file moeo\-Real\-Vector.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoRealVector@{moeo\-Real\-Vector}!moeoRealVector@{moeoRealVector}} +\index{moeoRealVector@{moeoRealVector}!moeoRealVector@{moeo\-Real\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity$>$ \bf{moeo\-Real\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$::\bf{moeo\-Real\-Vector} (unsigned int {\em \_\-size} = {\tt 0}, double {\em \_\-value} = {\tt 0.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoRealVector_575f601664ea6d9d48e3e11c4beeafed} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-size}]Length of vector (default is 0) \item[{\em \_\-value}]Initial value of all elements (default is default value of type Gene\-Type) \end{description} +\end{Desc} + + +Definition at line 31 of file moeo\-Real\-Vector.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Real\-Vector.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.eps new file mode 100644 index 000000000..ab3b9798a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.eps @@ -0,0 +1,225 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 122.549 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.08 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 3 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoReplacement< MOEOT >) cw +(eoReplacement< MOEOT >) cw +(eoBF< A1, A2, R >) cw +(eoFunctorBase) cw +(moeoElitistReplacement< MOEOT >) cw +(moeoEnvironmentalReplacement< MOEOT >) cw +(moeoGenerationalReplacement< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoReplacement< MOEOT >) 1 1 box + (eoReplacement< MOEOT >) 1 2 box + (eoBF< A1, A2, R >) 1 3 box + (eoFunctorBase) 1 4 box + (moeoElitistReplacement< MOEOT >) 0 0 box + (moeoEnvironmentalReplacement< MOEOT >) 1 0 box + (moeoGenerationalReplacement< MOEOT >) 2 0 box + +% ----- relations ----- + +solid +0 1 1 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in +solid +1 1 0.25 out +solid +0 2 1 conn +solid +0 0 0.75 in +solid +0 1 0.75 in +solid +0 2 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.tex new file mode 100644 index 000000000..2a3aeebb4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoReplacement.tex @@ -0,0 +1,27 @@ +\section{moeo\-Replacement$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoReplacement}\index{moeoReplacement@{moeoReplacement}} +Replacement strategy for multi-objective optimization. + + +{\tt \#include $<$moeo\-Replacement.h$>$} + +Inheritance diagram for moeo\-Replacement$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.43137cm]{classmoeoReplacement} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Replacement$<$ MOEOT $>$} + +Replacement strategy for multi-objective optimization. + + + +Definition at line 22 of file moeo\-Replacement.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Replacement.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.eps new file mode 100644 index 000000000..d9a7d8227 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 500 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoRouletteSelect< MOEOT >) cw +(moeoSelectOne< MOEOT >) cw +(eoSelectOne< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoRouletteSelect< MOEOT >) 0 0 box + (moeoSelectOne< MOEOT >) 0 1 box + (eoSelectOne< MOEOT >) 0 2 box + (eoUF< A1, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.tex new file mode 100644 index 000000000..83ad8f48c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoRouletteSelect.tex @@ -0,0 +1,82 @@ +\section{moeo\-Roulette\-Select$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoRouletteSelect}\index{moeoRouletteSelect@{moeoRouletteSelect}} +Selection strategy that selects ONE individual by using roulette wheel process. + + +{\tt \#include $<$moeo\-Roulette\-Select.h$>$} + +Inheritance diagram for moeo\-Roulette\-Select$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoRouletteSelect} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Roulette\-Select} (unsigned int \_\-t\-Size=2) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +const MOEOT \& \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Apply the tournament to the given population. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +double \& \bf{t\-Size}\label{classmoeoRouletteSelect_19af84fe966381cbfbe032f69ee0b42b} + +\begin{CompactList}\small\item\em size \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Roulette\-Select$<$ MOEOT $>$} + +Selection strategy that selects ONE individual by using roulette wheel process. + +\begin{Desc} +\item[Warning:]This selection only uses fitness values (and not diversity values). \end{Desc} + + + + +Definition at line 24 of file moeo\-Roulette\-Select.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoRouletteSelect@{moeo\-Roulette\-Select}!moeoRouletteSelect@{moeoRouletteSelect}} +\index{moeoRouletteSelect@{moeoRouletteSelect}!moeoRouletteSelect@{moeo\-Roulette\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Roulette\-Select}$<$ MOEOT $>$::\bf{moeo\-Roulette\-Select} (unsigned int {\em \_\-t\-Size} = {\tt 2})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoRouletteSelect_4caa45f4c9d1ad2949cc14d2c21b77ea} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-t\-Size}]the number of individuals in the tournament (default: 2) \end{description} +\end{Desc} + + +Definition at line 32 of file moeo\-Roulette\-Select.h. + +References moeo\-Roulette\-Select$<$ MOEOT $>$::t\-Size. + +\subsection{Member Function Documentation} +\index{moeoRouletteSelect@{moeo\-Roulette\-Select}!operator()@{operator()}} +\index{operator()@{operator()}!moeoRouletteSelect@{moeo\-Roulette\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const MOEOT\& \bf{moeo\-Roulette\-Select}$<$ MOEOT $>$::operator() (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoRouletteSelect_573fe156daf6fdfbae96d2b54a9fc260} + + +Apply the tournament to the given population. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 48 of file moeo\-Roulette\-Select.h. + +References moeo\-Roulette\-Select$<$ MOEOT $>$::t\-Size. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Roulette\-Select.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.eps new file mode 100644 index 000000000..c325c6d69 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 336.7 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.485 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoScalarFitnessAssignment< MOEOT >) cw +(moeoFitnessAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoAchievementFitnessAssignment< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoScalarFitnessAssignment< MOEOT >) 0 1 box + (moeoFitnessAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + (moeoAchievementFitnessAssignment< MOEOT >) 0 0 box + +% ----- relations ----- + +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in +solid +1 0 0.25 out +solid +0 0 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.tex new file mode 100644 index 000000000..39534c2a6 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoScalarFitnessAssignment.tex @@ -0,0 +1,27 @@ +\section{moeo\-Scalar\-Fitness\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoScalarFitnessAssignment}\index{moeoScalarFitnessAssignment@{moeoScalarFitnessAssignment}} +\doxyref{moeo\-Scalar\-Fitness\-Assignment}{p.}{classmoeoScalarFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for scalar strategies. + + +{\tt \#include $<$moeo\-Scalar\-Fitness\-Assignment.h$>$} + +Inheritance diagram for moeo\-Scalar\-Fitness\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoScalarFitnessAssignment} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Scalar\-Fitness\-Assignment$<$ MOEOT $>$} + +\doxyref{moeo\-Scalar\-Fitness\-Assignment}{p.}{classmoeoScalarFitnessAssignment} is a \doxyref{moeo\-Fitness\-Assignment}{p.}{classmoeoFitnessAssignment} for scalar strategies. + + + +Definition at line 22 of file moeo\-Scalar\-Fitness\-Assignment.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Scalar\-Fitness\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.eps new file mode 100644 index 000000000..5e90b21a0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 389.105 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.285 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoSelectFromPopAndArch< MOEOT >) cw +(moeoSelectOne< MOEOT >) cw +(eoSelectOne< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoSelectFromPopAndArch< MOEOT >) 0 0 box + (moeoSelectOne< MOEOT >) 0 1 box + (eoSelectOne< MOEOT >) 0 2 box + (eoUF< A1, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.tex new file mode 100644 index 000000000..6f2be7c04 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectFromPopAndArch.tex @@ -0,0 +1,89 @@ +\section{moeo\-Select\-From\-Pop\-And\-Arch$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoSelectFromPopAndArch}\index{moeoSelectFromPopAndArch@{moeoSelectFromPopAndArch}} +Elitist selection process that consists in choosing individuals in the archive as well as in the current population. + + +{\tt \#include $<$moeo\-Select\-From\-Pop\-And\-Arch.h$>$} + +Inheritance diagram for moeo\-Select\-From\-Pop\-And\-Arch$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoSelectFromPopAndArch} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Select\-From\-Pop\-And\-Arch} (\bf{moeo\-Select\-One}$<$ MOEOT $>$ \&\_\-pop\-Select\-One, \bf{moeo\-Select\-One}$<$ MOEOT $>$ \_\-arch\-Select\-One, \bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch, double \_\-ratio\-From\-Pop=0.5) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +\bf{moeo\-Select\-From\-Pop\-And\-Arch} (\bf{moeo\-Select\-One}$<$ MOEOT $>$ \&\_\-pop\-Select\-One, \bf{moeo\-Archive}$<$ MOEOT $>$ \&\_\-arch, double \_\-ratio\-From\-Pop=0.5) +\begin{CompactList}\small\item\em Defaulr ctor - the archive's selection operator is a random selector. \item\end{CompactList}\item +virtual const MOEOT \& \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&pop)\label{classmoeoSelectFromPopAndArch_7b763aef8e25f205159b69b3f746c942} + +\begin{CompactList}\small\item\em The selection process. \item\end{CompactList}\item +virtual void \bf{setup} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop)\label{classmoeoSelectFromPopAndArch_70180aeaa5d647a720276c82b7a0b111} + +\begin{CompactList}\small\item\em Setups some population stats. \item\end{CompactList}\end{CompactItemize} +\subsection*{Private Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Select\-One}$<$ MOEOT $>$ \& \bf{pop\-Select\-One}\label{classmoeoSelectFromPopAndArch_e16fb61bf9c115b0a34528e512d30ac6} + +\begin{CompactList}\small\item\em The population's selection operator. \item\end{CompactList}\item +\bf{moeo\-Select\-One}$<$ MOEOT $>$ \& \bf{arch\-Select\-One}\label{classmoeoSelectFromPopAndArch_a34f3871b3a9f94614a15c381c2fa570} + +\begin{CompactList}\small\item\em The archive's selection operator. \item\end{CompactList}\item +\bf{moeo\-Archive}$<$ MOEOT $>$ \& \bf{arch}\label{classmoeoSelectFromPopAndArch_e87de22341f2225ea94ee2895a7eb4a6} + +\begin{CompactList}\small\item\em The archive. \item\end{CompactList}\item +double \bf{ratio\-From\-Pop}\label{classmoeoSelectFromPopAndArch_78a1e18111b46c447c86a0f77484d970} + +\begin{CompactList}\small\item\em The ratio of selected individuals from the population. \item\end{CompactList}\item +\bf{moeo\-Random\-Select}$<$ MOEOT $>$ \bf{random\-Select\-One}\label{classmoeoSelectFromPopAndArch_d6094492eed214e3bdb0330620a5890a} + +\begin{CompactList}\small\item\em A random selection operator (used as default for arch\-Select\-One). \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Select\-From\-Pop\-And\-Arch$<$ MOEOT $>$} + +Elitist selection process that consists in choosing individuals in the archive as well as in the current population. + + + +Definition at line 26 of file moeo\-Select\-From\-Pop\-And\-Arch.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoSelectFromPopAndArch@{moeo\-Select\-From\-Pop\-And\-Arch}!moeoSelectFromPopAndArch@{moeoSelectFromPopAndArch}} +\index{moeoSelectFromPopAndArch@{moeoSelectFromPopAndArch}!moeoSelectFromPopAndArch@{moeo\-Select\-From\-Pop\-And\-Arch}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Select\-From\-Pop\-And\-Arch}$<$ MOEOT $>$::\bf{moeo\-Select\-From\-Pop\-And\-Arch} (\bf{moeo\-Select\-One}$<$ MOEOT $>$ \& {\em \_\-pop\-Select\-One}, \bf{moeo\-Select\-One}$<$ MOEOT $>$ {\em \_\-arch\-Select\-One}, \bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch}, double {\em \_\-ratio\-From\-Pop} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoSelectFromPopAndArch_96b34f67d678a7df7610f28bf10c4e86} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop\-Select\-One}]the population's selection operator \item[{\em \_\-arch\-Select\-One}]the archive's selection operator \item[{\em \_\-arch}]the archive \item[{\em \_\-ratio\-From\-Pop}]the ratio of selected individuals from the population \end{description} +\end{Desc} + + +Definition at line 37 of file moeo\-Select\-From\-Pop\-And\-Arch.h.\index{moeoSelectFromPopAndArch@{moeo\-Select\-From\-Pop\-And\-Arch}!moeoSelectFromPopAndArch@{moeoSelectFromPopAndArch}} +\index{moeoSelectFromPopAndArch@{moeoSelectFromPopAndArch}!moeoSelectFromPopAndArch@{moeo\-Select\-From\-Pop\-And\-Arch}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Select\-From\-Pop\-And\-Arch}$<$ MOEOT $>$::\bf{moeo\-Select\-From\-Pop\-And\-Arch} (\bf{moeo\-Select\-One}$<$ MOEOT $>$ \& {\em \_\-pop\-Select\-One}, \bf{moeo\-Archive}$<$ MOEOT $>$ \& {\em \_\-arch}, double {\em \_\-ratio\-From\-Pop} = {\tt 0.5})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoSelectFromPopAndArch_1c225b5f7b5a5ce6e87b46a7ea4a4cd0} + + +Defaulr ctor - the archive's selection operator is a random selector. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop\-Select\-One}]the population's selection operator \item[{\em \_\-arch}]the archive \item[{\em \_\-ratio\-From\-Pop}]the ratio of selected individuals from the population \end{description} +\end{Desc} + + +Definition at line 48 of file moeo\-Select\-From\-Pop\-And\-Arch.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Select\-From\-Pop\-And\-Arch.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.eps new file mode 100644 index 000000000..3af7fa4fa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.eps @@ -0,0 +1,233 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 77.821 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 6.425 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 5 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoSelectOne< MOEOT >) cw +(eoSelectOne< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +(moeoDetTournamentSelect< MOEOT >) cw +(moeoRandomSelect< MOEOT >) cw +(moeoRouletteSelect< MOEOT >) cw +(moeoSelectFromPopAndArch< MOEOT >) cw +(moeoStochTournamentSelect< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoSelectOne< MOEOT >) 2 1 box + (eoSelectOne< MOEOT >) 2 2 box + (eoUF< A1, R >) 2 3 box + (eoFunctorBase) 2 4 box + (moeoDetTournamentSelect< MOEOT >) 0 0 box + (moeoRandomSelect< MOEOT >) 1 0 box + (moeoRouletteSelect< MOEOT >) 2 0 box + (moeoSelectFromPopAndArch< MOEOT >) 3 0 box + (moeoStochTournamentSelect< MOEOT >) 4 0 box + +% ----- relations ----- + +solid +0 2 1 out +solid +1 2 2 in +solid +0 2 2 out +solid +1 2 3 in +solid +0 2 3 out +solid +1 2 4 in +solid +1 2 0.25 out +solid +0 4 1 conn +solid +0 0 0.75 in +solid +0 1 0.75 in +solid +0 2 0.75 in +solid +0 3 0.75 in +solid +0 4 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.tex new file mode 100644 index 000000000..fc3c2f417 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSelectOne.tex @@ -0,0 +1,27 @@ +\section{moeo\-Select\-One$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoSelectOne}\index{moeoSelectOne@{moeoSelectOne}} +Selection strategy for multi-objective optimization that selects only one element from a whole population. + + +{\tt \#include $<$moeo\-Select\-One.h$>$} + +Inheritance diagram for moeo\-Select\-One$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.17899cm]{classmoeoSelectOne} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Select\-One$<$ MOEOT $>$} + +Selection strategy for multi-objective optimization that selects only one element from a whole population. + + + +Definition at line 22 of file moeo\-Select\-One.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Select\-One.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.eps new file mode 100644 index 000000000..182d449c9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 283.286 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.765 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoSharingDiversityAssignment< MOEOT >) cw +(moeoDiversityAssignment< MOEOT >) cw +(eoUF< eoPop< MOEOT > &, void >) cw +(eoFunctorBase) cw +(moeoFrontByFrontSharingDiversityAssignment< MOEOT >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoSharingDiversityAssignment< MOEOT >) 0 1 box + (moeoDiversityAssignment< MOEOT >) 0 2 box + (eoUF< eoPop< MOEOT > &, void >) 0 3 box + (eoFunctorBase) 0 4 box + (moeoFrontByFrontSharingDiversityAssignment< MOEOT >) 0 0 box + +% ----- relations ----- + +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in +solid +1 0 0.25 out +solid +0 0 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.tex new file mode 100644 index 000000000..a26431630 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSharingDiversityAssignment.tex @@ -0,0 +1,178 @@ +\section{moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoSharingDiversityAssignment}\index{moeoSharingDiversityAssignment@{moeoSharingDiversityAssignment}} +Sharing assignment scheme originally porposed by: D. + + +{\tt \#include $<$moeo\-Sharing\-Diversity\-Assignment.h$>$} + +Inheritance diagram for moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoSharingDiversityAssignment} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef MOEOT::Objective\-Vector \bf{Objective\-Vector}\label{classmoeoSharingDiversityAssignment_5e92f136f41363dcb8a6df94dbf2f3b3} + +\begin{CompactList}\small\item\em the objective vector type of the solutions \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Sharing\-Diversity\-Assignment} (\bf{moeo\-Distance}$<$ MOEOT, double $>$ \&\_\-distance, double \_\-niche\-Size=0.5, double \_\-alpha=1.0) +\begin{CompactList}\small\item\em Ctor. \item\end{CompactList}\item +\bf{moeo\-Sharing\-Diversity\-Assignment} (double \_\-niche\-Size=0.5, double \_\-alpha=1.0) +\begin{CompactList}\small\item\em Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. \item\end{CompactList}\item +void \bf{operator()} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets diversity values for every solution contained in the population \_\-pop. \item\end{CompactList}\item +void \bf{update\-By\-Deleting} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop, \bf{Objective\-Vector} \&\_\-obj\-Vec) +\end{CompactItemize} +\subsection*{Protected Member Functions} +\begin{CompactItemize} +\item +virtual void \bf{set\-Similarities} (\bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Sets similarities for every solution contained in the population \_\-pop. \item\end{CompactList}\item +double \bf{sh} (double \_\-dist) +\begin{CompactList}\small\item\em Sharing function. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Distance}$<$ MOEOT, double $>$ \& \bf{distance}\label{classmoeoSharingDiversityAssignment_b81d950d0469ebd4c769994bcea58f8b} + +\begin{CompactList}\small\item\em the distance used to compute the neighborhood of solutions \item\end{CompactList}\item +\bf{moeo\-Euclidean\-Distance}$<$ MOEOT $>$ \bf{default\-Distance}\label{classmoeoSharingDiversityAssignment_ecde6f1a0ba15d9ec563396a585188f0} + +\begin{CompactList}\small\item\em euclidean distancein the objective space (can be used as default) \item\end{CompactList}\item +double \bf{niche\-Size}\label{classmoeoSharingDiversityAssignment_175d978d4b56603a3bcb45fec8395441} + +\begin{CompactList}\small\item\em neighborhood size in terms of radius distance \item\end{CompactList}\item +double \bf{alpha}\label{classmoeoSharingDiversityAssignment_95ed49448a35d5b99cdfd496a33fd45b} + +\begin{CompactList}\small\item\em parameter used to regulate the shape of the sharing function \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} + +Sharing assignment scheme originally porposed by: D. + +E. Goldberg, \char`\"{}Genetic Algorithms in Search, Optimization and Machine Learning\char`\"{}, Addision-Wesley, MA, USA (1989). + + + +Definition at line 28 of file moeo\-Sharing\-Diversity\-Assignment.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}!moeoSharingDiversityAssignment@{moeoSharingDiversityAssignment}} +\index{moeoSharingDiversityAssignment@{moeoSharingDiversityAssignment}!moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Sharing\-Diversity\-Assignment} (\bf{moeo\-Distance}$<$ MOEOT, double $>$ \& {\em \_\-distance}, double {\em \_\-niche\-Size} = {\tt 0.5}, double {\em \_\-alpha} = {\tt 1.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoSharingDiversityAssignment_10ba0d2cdd57ce47244afdf4b1623409} + + +Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-distance}]the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) \item[{\em \_\-niche\-Size}]neighborhood size in terms of radius distance (closely related to the way the distances are computed) \item[{\em \_\-alpha}]parameter used to regulate the shape of the sharing function \end{description} +\end{Desc} + + +Definition at line 42 of file moeo\-Sharing\-Diversity\-Assignment.h.\index{moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}!moeoSharingDiversityAssignment@{moeoSharingDiversityAssignment}} +\index{moeoSharingDiversityAssignment@{moeoSharingDiversityAssignment}!moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::\bf{moeo\-Sharing\-Diversity\-Assignment} (double {\em \_\-niche\-Size} = {\tt 0.5}, double {\em \_\-alpha} = {\tt 1.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoSharingDiversityAssignment_ccc66529da0cacd3f11a019ebe646668} + + +Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-niche\-Size}]neighborhood size in terms of radius distance (closely related to the way the distances are computed) \item[{\em \_\-alpha}]parameter used to regulate the shape of the sharing function \end{description} +\end{Desc} + + +Definition at line 51 of file moeo\-Sharing\-Diversity\-Assignment.h. + +\subsection{Member Function Documentation} +\index{moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}!operator()@{operator()}} +\index{operator()@{operator()}!moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::operator() (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoSharingDiversityAssignment_6228be85e166172cf03def1a004505d5} + + +Sets diversity values for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Implements \bf{eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>$}. + +Definition at line 59 of file moeo\-Sharing\-Diversity\-Assignment.h. + +References moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::set\-Similarities().\index{moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}!updateByDeleting@{updateByDeleting}} +\index{updateByDeleting@{updateByDeleting}!moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ void \bf{moeo\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::update\-By\-Deleting (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop}, \bf{Objective\-Vector} \& {\em \_\-obj\-Vec})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoSharingDiversityAssignment_21c8d6e020af23b2be219b7e02248300} + + +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population \_\-pop by taking the deletion of the objective vector \_\-obj\-Vec into account. \end{Desc} +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \item[{\em \_\-obj\-Vec}]the objective vector \end{description} +\end{Desc} +\begin{Desc} +\item[Warning:]NOT IMPLEMENTED, DO NOTHING ! \end{Desc} + + +Implements \bf{moeo\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoDiversityAssignment_57f400263b36664df6269f1b522cfdcb}. + +Reimplemented in \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFrontByFrontSharingDiversityAssignment_623489a246f86cf24cc5860d32caa743}. + +Definition at line 80 of file moeo\-Sharing\-Diversity\-Assignment.h.\index{moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}!setSimilarities@{setSimilarities}} +\index{setSimilarities@{setSimilarities}!moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ virtual void \bf{moeo\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::set\-Similarities (\bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline, protected, virtual]}}\label{classmoeoSharingDiversityAssignment_c01f6ac1abba3799f5c4b6c0608dac55} + + +Sets similarities for every solution contained in the population \_\-pop. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Reimplemented in \bf{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$} \doxyref{p.}{classmoeoFrontByFrontSharingDiversityAssignment_a0f6c045237aba2857c4a9ec25679e69}. + +Definition at line 102 of file moeo\-Sharing\-Diversity\-Assignment.h. + +References moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::distance, and moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::sh(). + +Referenced by moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::operator()().\index{moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}!sh@{sh}} +\index{sh@{sh}!moeoSharingDiversityAssignment@{moeo\-Sharing\-Diversity\-Assignment}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ double \bf{moeo\-Sharing\-Diversity\-Assignment}$<$ MOEOT $>$::sh (double {\em \_\-dist})\hspace{0.3cm}{\tt [inline, protected]}}\label{classmoeoSharingDiversityAssignment_5b5daaa55e97c6fcd172d61c7837e26c} + + +Sharing function. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-dist}]the distance value \end{description} +\end{Desc} + + +Definition at line 125 of file moeo\-Sharing\-Diversity\-Assignment.h. + +References moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::alpha, and moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::niche\-Size. + +Referenced by moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::set\-Similarities(), and moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$::set\-Similarities(). + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Sharing\-Diversity\-Assignment.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.eps new file mode 100644 index 000000000..6b51f160e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 132.45 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.775 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoSolutionUnaryMetric< ObjectiveVector, R >) cw +(moeoUnaryMetric< const ObjectiveVector &, R >) cw +(eoUF< const ObjectiveVector &, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoSolutionUnaryMetric< ObjectiveVector, R >) 0.5 0 box + (moeoUnaryMetric< const ObjectiveVector &, R >) 0.5 1 box + (eoUF< const ObjectiveVector &, R >) 0 2 box + (moeoMetric) 1 2 box + (eoFunctorBase) 0 3 box + (eoFunctorBase) 1 3 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +0 0 2 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 0 3 in +solid +1 1 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.tex new file mode 100644 index 000000000..71e3e9d58 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionUnaryMetric.tex @@ -0,0 +1,27 @@ +\section{moeo\-Solution\-Unary\-Metric$<$ Objective\-Vector, R $>$ Class Template Reference} +\label{classmoeoSolutionUnaryMetric}\index{moeoSolutionUnaryMetric@{moeoSolutionUnaryMetric}} +Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Solution\-Unary\-Metric$<$ Objective\-Vector, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.70861cm]{classmoeoSolutionUnaryMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector, class R$>$ class moeo\-Solution\-Unary\-Metric$<$ Objective\-Vector, R $>$} + +Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. + + + +Definition at line 43 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.eps new file mode 100644 index 000000000..0ba5b7092 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.eps @@ -0,0 +1,227 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 117.925 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.24 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +(moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) 0.5 1 box + (moeoBinaryMetric< A1, A2, R >) 0.5 2 box + (eoBF< A1, A2, R >) 0 3 box + (moeoMetric) 1 3 box + (eoFunctorBase) 0 4 box + (eoFunctorBase) 1 4 box + (moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >) 0.5 0 box + +% ----- relations ----- + +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +0 1 3 conn +solid +1 0 3 in +solid +0 0 3 out +solid +1 1 3 in +solid +0 1 3 out +solid +1 0 4 in +solid +1 1 4 in +solid +1 0.5 0.25 out +solid +0 0.5 0.75 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.tex new file mode 100644 index 000000000..f98bbe8a7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoSolutionVsSolutionBinaryMetric.tex @@ -0,0 +1,27 @@ +\section{moeo\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$ Class Template Reference} +\label{classmoeoSolutionVsSolutionBinaryMetric}\index{moeoSolutionVsSolutionBinaryMetric@{moeoSolutionVsSolutionBinaryMetric}} +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.30189cm]{classmoeoSolutionVsSolutionBinaryMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector, class R$>$ class moeo\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$} + +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. + + + +Definition at line 57 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.eps new file mode 100644 index 000000000..87f5b6ec3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 395.257 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.265 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoStochTournamentSelect< MOEOT >) cw +(moeoSelectOne< MOEOT >) cw +(eoSelectOne< MOEOT >) cw +(eoUF< A1, R >) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoStochTournamentSelect< MOEOT >) 0 0 box + (moeoSelectOne< MOEOT >) 0 1 box + (eoSelectOne< MOEOT >) 0 2 box + (eoUF< A1, R >) 0 3 box + (eoFunctorBase) 0 4 box + +% ----- relations ----- + +solid +0 0 0 out +solid +1 0 1 in +solid +0 0 1 out +solid +1 0 2 in +solid +0 0 2 out +solid +1 0 3 in +solid +0 0 3 out +solid +1 0 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.tex new file mode 100644 index 000000000..0215c08f2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoStochTournamentSelect.tex @@ -0,0 +1,102 @@ +\section{moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$ Class Template Reference} +\label{classmoeoStochTournamentSelect}\index{moeoStochTournamentSelect@{moeoStochTournamentSelect}} +Selection strategy that selects ONE individual by stochastic tournament. + + +{\tt \#include $<$moeo\-Stoch\-Tournament\-Select.h$>$} + +Inheritance diagram for moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=5cm]{classmoeoStochTournamentSelect} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Stoch\-Tournament\-Select} (\bf{moeo\-Comparator}$<$ MOEOT $>$ \&\_\-comparator, double \_\-t\-Rate=1.0) +\begin{CompactList}\small\item\em Full Ctor. \item\end{CompactList}\item +\bf{moeo\-Stoch\-Tournament\-Select} (double \_\-t\-Rate=1.0) +\begin{CompactList}\small\item\em Ctor without comparator. \item\end{CompactList}\item +const MOEOT \& \bf{operator()} (const \bf{eo\-Pop}$<$ MOEOT $>$ \&\_\-pop) +\begin{CompactList}\small\item\em Apply the tournament to the given population. \item\end{CompactList}\end{CompactItemize} +\subsection*{Protected Attributes} +\begin{CompactItemize} +\item +\bf{moeo\-Comparator}$<$ MOEOT $>$ \& \bf{comparator}\label{classmoeoStochTournamentSelect_a8ae24cb50092cc77872a447b6602009} + +\begin{CompactList}\small\item\em the comparator (used to compare 2 individuals) \item\end{CompactList}\item +\bf{moeo\-Fitness\-Then\-Diversity\-Comparator}$<$ MOEOT $>$ \bf{default\-Comparator}\label{classmoeoStochTournamentSelect_ec34173496ad3dd0cd118b5233a53855} + +\begin{CompactList}\small\item\em a fitness then diversity comparator can be used as default \item\end{CompactList}\item +double \bf{t\-Rate}\label{classmoeoStochTournamentSelect_659d064e1333ee9a3e9808a15a2f53f6} + +\begin{CompactList}\small\item\em the tournament rate \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOT$>$ class moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$} + +Selection strategy that selects ONE individual by stochastic tournament. + + + +Definition at line 24 of file moeo\-Stoch\-Tournament\-Select.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoStochTournamentSelect@{moeo\-Stoch\-Tournament\-Select}!moeoStochTournamentSelect@{moeoStochTournamentSelect}} +\index{moeoStochTournamentSelect@{moeoStochTournamentSelect}!moeoStochTournamentSelect@{moeo\-Stoch\-Tournament\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Stoch\-Tournament\-Select}$<$ MOEOT $>$::\bf{moeo\-Stoch\-Tournament\-Select} (\bf{moeo\-Comparator}$<$ MOEOT $>$ \& {\em \_\-comparator}, double {\em \_\-t\-Rate} = {\tt 1.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoStochTournamentSelect_dfd4eb2c6d148fd3cab2fb670ae7f1d4} + + +Full Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-comparator}]the comparator (used to compare 2 individuals) \item[{\em \_\-t\-Rate}]the tournament rate \end{description} +\end{Desc} + + +Definition at line 33 of file moeo\-Stoch\-Tournament\-Select.h. + +References moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$::t\-Rate.\index{moeoStochTournamentSelect@{moeo\-Stoch\-Tournament\-Select}!moeoStochTournamentSelect@{moeoStochTournamentSelect}} +\index{moeoStochTournamentSelect@{moeoStochTournamentSelect}!moeoStochTournamentSelect@{moeo\-Stoch\-Tournament\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ \bf{moeo\-Stoch\-Tournament\-Select}$<$ MOEOT $>$::\bf{moeo\-Stoch\-Tournament\-Select} (double {\em \_\-t\-Rate} = {\tt 1.0})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoStochTournamentSelect_a7d9a735f65193a943ca2cdce780e80d} + + +Ctor without comparator. + +A \doxyref{moeo\-Fitness\-Then\-Diversity\-Comparator}{p.}{classmoeoFitnessThenDiversityComparator} is used as default. \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-t\-Rate}]the tournament rate \end{description} +\end{Desc} + + +Definition at line 53 of file moeo\-Stoch\-Tournament\-Select.h. + +References moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$::t\-Rate. + +\subsection{Member Function Documentation} +\index{moeoStochTournamentSelect@{moeo\-Stoch\-Tournament\-Select}!operator()@{operator()}} +\index{operator()@{operator()}!moeoStochTournamentSelect@{moeo\-Stoch\-Tournament\-Select}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOT$>$ const MOEOT\& \bf{moeo\-Stoch\-Tournament\-Select}$<$ MOEOT $>$::operator() (const \bf{eo\-Pop}$<$ MOEOT $>$ \& {\em \_\-pop})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoStochTournamentSelect_2323cbf99554b37dc3724c8ea26e52c1} + + +Apply the tournament to the given population. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-pop}]the population \end{description} +\end{Desc} + + +Definition at line 73 of file moeo\-Stoch\-Tournament\-Select.h. + +References moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$::comparator, and moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$::t\-Rate. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Stoch\-Tournament\-Select.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.eps new file mode 100644 index 000000000..aa9d7b900 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.eps @@ -0,0 +1,215 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 176.471 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.83333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoUnaryMetric< A, R >) cw +(eoUF< A, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoUnaryMetric< A, R >) 0.5 0 box + (eoUF< A, R >) 0 1 box + (moeoMetric) 1 1 box + (eoFunctorBase) 0 2 box + (eoFunctorBase) 1 2 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +0 1 1 conn +solid +1 0 1 in +solid +0 0 1 out +solid +1 1 1 in +solid +0 1 1 out +solid +1 0 2 in +solid +1 1 2 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.tex new file mode 100644 index 000000000..33a9a8088 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoUnaryMetric.tex @@ -0,0 +1,27 @@ +\section{moeo\-Unary\-Metric$<$ A, R $>$ Class Template Reference} +\label{classmoeoUnaryMetric}\index{moeoUnaryMetric@{moeoUnaryMetric}} +Base class for unary metrics. + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Unary\-Metric$<$ A, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3cm]{classmoeoUnaryMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class A, class R$>$ class moeo\-Unary\-Metric$<$ A, R $>$} + +Base class for unary metrics. + + + +Definition at line 29 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoVector.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoVector.eps new file mode 100644 index 000000000..f0dc8dc31 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoVector.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 100.806 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.96 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 5 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >) cw +(MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) cw +(EO< MOEOObjectiveVector >) cw +(eoObject) cw +(eoPersistent) cw +(eoPrintable) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >) 0.5 0 box + (MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >) 0.5 1 box + (EO< MOEOObjectiveVector >) 0.5 2 box + (eoObject) 0 3 box + (eoPersistent) 1 3 box + (eoPrintable) 1 4 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +1 0.5 2 in +solid +0 0.5 2 out +solid +0 1 3 conn +solid +1 0 3 in +solid +1 1 3 in +solid +0 1 3 out +solid +1 1 4 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoVector.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoVector.tex new file mode 100644 index 000000000..26a55b536 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoVector.tex @@ -0,0 +1,135 @@ +\section{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$ Class Template Reference} +\label{classmoeoVector}\index{moeoVector@{moeoVector}} +Base class for fixed length chromosomes, just derives from \doxyref{MOEO}{p.}{classMOEO} and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). + + +{\tt \#include $<$moeo\-Vector.h$>$} + +Inheritance diagram for moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.82258cm]{classmoeoVector} +\end{center} +\end{figure} +\subsection*{Public Types} +\begin{CompactItemize} +\item +typedef Gene\-Type \bf{Atom\-Type}\label{classmoeoVector_9d4400084dec28c37e392bb8b0a0b452} + +\begin{CompactList}\small\item\em the atomic type \item\end{CompactList}\item +typedef std::vector$<$ Gene\-Type $>$ \bf{Container\-Type}\label{classmoeoVector_b0fb83132e1f2c8b8258013a01aeb364} + +\begin{CompactList}\small\item\em the container type \item\end{CompactList}\end{CompactItemize} +\subsection*{Public Member Functions} +\begin{CompactItemize} +\item +\bf{moeo\-Vector} (unsigned int \_\-size=0, Gene\-Type \_\-value=Gene\-Type()) +\begin{CompactList}\small\item\em Default ctor. \item\end{CompactList}\item +void \bf{value} (const std::vector$<$ Gene\-Type $>$ \&\_\-v) +\begin{CompactList}\small\item\em We can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor. \item\end{CompactList}\item +bool \bf{operator$<$} (const \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$ \&\_\-moeo) const +\begin{CompactList}\small\item\em To avoid conflicts between \doxyref{MOEO::operator$<$}{p.}{classMOEO_119ef916de4955298febaf3e1c8ad705} and std::vector$<$Gene\-Type$>$::operator$<$. \item\end{CompactList}\item +virtual void \bf{print\-On} (std::ostream \&\_\-os) const +\begin{CompactList}\small\item\em Writing object. \item\end{CompactList}\item +virtual void \bf{read\-From} (std::istream \&\_\-is) +\begin{CompactList}\small\item\em Reading object. \item\end{CompactList}\end{CompactItemize} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity, class Gene\-Type$>$ class moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$} + +Base class for fixed length chromosomes, just derives from \doxyref{MOEO}{p.}{classMOEO} and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). + +Gene\-Type must have the following methods: void ctor (needed for the std::vector$<$$>$), copy ctor. + + + +Definition at line 25 of file moeo\-Vector.h. + +\subsection{Constructor \& Destructor Documentation} +\index{moeoVector@{moeo\-Vector}!moeoVector@{moeoVector}} +\index{moeoVector@{moeoVector}!moeoVector@{moeo\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity, class Gene\-Type$>$ \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$::\bf{moeo\-Vector} (unsigned int {\em \_\-size} = {\tt 0}, Gene\-Type {\em \_\-value} = {\tt GeneType()})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoVector_b109dd4d5ae93cdc4d039eb3c3b07664} + + +Default ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-size}]Length of vector (default is 0) \item[{\em \_\-value}]Initial value of all elements (default is default value of type Gene\-Type) \end{description} +\end{Desc} + + +Definition at line 47 of file moeo\-Vector.h. + +\subsection{Member Function Documentation} +\index{moeoVector@{moeo\-Vector}!value@{value}} +\index{value@{value}!moeoVector@{moeo\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity, class Gene\-Type$>$ void \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$::value (const std::vector$<$ Gene\-Type $>$ \& {\em \_\-v})\hspace{0.3cm}{\tt [inline]}}\label{classmoeoVector_a7fadd876fe492717815510f68a921c5} + + +We can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-v}]a vector of Gene\-Type \end{description} +\end{Desc} + + +Definition at line 56 of file moeo\-Vector.h.\index{moeoVector@{moeo\-Vector}!operator<@{operator$<$}} +\index{operator<@{operator$<$}!moeoVector@{moeo\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity, class Gene\-Type$>$ bool \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$::operator$<$ (const \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$ \& {\em \_\-moeo}) const\hspace{0.3cm}{\tt [inline]}}\label{classmoeoVector_d7a5feff640f00e5d6a29c3ebd11e90b} + + +To avoid conflicts between \doxyref{MOEO::operator$<$}{p.}{classMOEO_119ef916de4955298febaf3e1c8ad705} and std::vector$<$Gene\-Type$>$::operator$<$. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-moeo}]the object to compare with \end{description} +\end{Desc} + + +Definition at line 79 of file moeo\-Vector.h.\index{moeoVector@{moeo\-Vector}!printOn@{printOn}} +\index{printOn@{printOn}!moeoVector@{moeo\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity, class Gene\-Type$>$ virtual void \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$::print\-On (std::ostream \& {\em \_\-os}) const\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoVector_d0a92cb26483ffab754ac4a0efb76308} + + +Writing object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-os}]output stream \end{description} +\end{Desc} + + +Reimplemented from \bf{MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} \doxyref{p.}{classMOEO_a3b6074b3289585bf4dc6998e8397e24}. + +Reimplemented in \bf{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} \doxyref{p.}{classmoeoBitVector_78f821c548cf46d8bcd30aa8a52ffb7c}. + +Definition at line 89 of file moeo\-Vector.h.\index{moeoVector@{moeo\-Vector}!readFrom@{readFrom}} +\index{readFrom@{readFrom}!moeoVector@{moeo\-Vector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$class MOEOObjective\-Vector, class MOEOFitness, class MOEODiversity, class Gene\-Type$>$ virtual void \bf{moeo\-Vector}$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$::read\-From (std::istream \& {\em \_\-is})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmoeoVector_cd8ee0fe79bb9515b29e2a4d3fee5ab9} + + +Reading object. + +\begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em \_\-is}]input stream \end{description} +\end{Desc} + + +Reimplemented from \bf{MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} \doxyref{p.}{classMOEO_1bbd9cb1a7709592bf4bc29dff8c5273}. + +Reimplemented in \bf{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$} \doxyref{p.}{classmoeoBitVector_31cd3f894615d0a27dd116a5c8082521}. + +Definition at line 102 of file moeo\-Vector.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Vector.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.eps new file mode 100644 index 000000000..85372a8a3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 104.167 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.8 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoVectorUnaryMetric< ObjectiveVector, R >) cw +(moeoUnaryMetric< const std::vector< ObjectiveVector > &, R >) cw +(eoUF< const std::vector< ObjectiveVector > &, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoVectorUnaryMetric< ObjectiveVector, R >) 0.5 0 box + (moeoUnaryMetric< const std::vector< ObjectiveVector > &, R >) 0.5 1 box + (eoUF< const std::vector< ObjectiveVector > &, R >) 0 2 box + (moeoMetric) 1 2 box + (eoFunctorBase) 0 3 box + (eoFunctorBase) 1 3 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +0 0 2 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 0 3 in +solid +1 1 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.tex new file mode 100644 index 000000000..c805f24f2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorUnaryMetric.tex @@ -0,0 +1,27 @@ +\section{moeo\-Vector\-Unary\-Metric$<$ Objective\-Vector, R $>$ Class Template Reference} +\label{classmoeoVectorUnaryMetric}\index{moeoVectorUnaryMetric@{moeoVectorUnaryMetric}} +Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors). + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Vector\-Unary\-Metric$<$ Objective\-Vector, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.91667cm]{classmoeoVectorUnaryMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector, class R$>$ class moeo\-Vector\-Unary\-Metric$<$ Objective\-Vector, R $>$} + +Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors). + + + +Definition at line 50 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.eps b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.eps new file mode 100644 index 000000000..f1b6e0933 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.eps @@ -0,0 +1,221 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 115.274 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 4.3375 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 4 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text `arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col `arg1' to `arg2' of row `arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >) cw +(moeoBinaryMetric< A1, A2, R >) cw +(eoBF< A1, A2, R >) cw +(moeoMetric) cw +(eoFunctorBase) cw +(eoFunctorBase) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >) 0.5 0 box + (moeoBinaryMetric< A1, A2, R >) 0.5 1 box + (eoBF< A1, A2, R >) 0 2 box + (moeoMetric) 1 2 box + (eoFunctorBase) 0 3 box + (eoFunctorBase) 1 3 box + +% ----- relations ----- + +solid +0 0.5 0 out +solid +1 0.5 1 in +solid +0 0.5 1 out +solid +0 1 2 conn +solid +1 0 2 in +solid +0 0 2 out +solid +1 1 2 in +solid +0 1 2 out +solid +1 0 3 in +solid +1 1 3 in diff --git a/trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.tex b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.tex new file mode 100644 index 000000000..bcb97e8c4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/classmoeoVectorVsVectorBinaryMetric.tex @@ -0,0 +1,27 @@ +\section{moeo\-Vector\-Vs\-Vector\-Binary\-Metric$<$ Objective\-Vector, R $>$ Class Template Reference} +\label{classmoeoVectorVsVectorBinaryMetric}\index{moeoVectorVsVectorBinaryMetric@{moeoVectorVsVectorBinaryMetric}} +Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors). + + +{\tt \#include $<$moeo\-Metric.h$>$} + +Inheritance diagram for moeo\-Vector\-Vs\-Vector\-Binary\-Metric$<$ Objective\-Vector, R $>$::\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.22767cm]{classmoeoVectorVsVectorBinaryMetric} +\end{center} +\end{figure} + + +\subsection{Detailed Description} +\subsubsection*{template$<$class Objective\-Vector, class R$>$ class moeo\-Vector\-Vs\-Vector\-Binary\-Metric$<$ Objective\-Vector, R $>$} + +Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors). + + + +Definition at line 64 of file moeo\-Metric.h. + +The documentation for this class was generated from the following file:\begin{CompactItemize} +\item +moeo\-Metric.h\end{CompactItemize} diff --git a/trunk/paradiseo-moeo/doc/latex/doxygen.sty b/trunk/paradiseo-moeo/doc/latex/doxygen.sty new file mode 100644 index 000000000..3d0cd4d73 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/doxygen.sty @@ -0,0 +1,78 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} +\RequirePackage{calc} +\RequirePackage{array} +\pagestyle{fancyplain} +\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} +\renewcommand{\chaptermark}[1]{\markboth{#1}{}} +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} +\lhead[\fancyplain{}{\bfseries\thepage}] + {\fancyplain{}{\bfseries\rightmark}} +\rhead[\fancyplain{}{\bfseries\leftmark}] + {\fancyplain{}{\bfseries\thepage}} +\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Tue Jun 26 15:13:04 2007 for Paradis\-EO-MOEO by Doxygen }]{} +\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Tue Jun 26 15:13:04 2007 for Paradis\-EO-MOEO by Doxygen }} +\cfoot{} +\newenvironment{Code} +{\footnotesize} +{\normalsize} +\newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})} +\newenvironment{DocInclude} +{\footnotesize} +{\normalsize} +\newenvironment{VerbInclude} +{\footnotesize} +{\normalsize} +\newenvironment{Image} +{\begin{figure}[H]} +{\end{figure}} +\newenvironment{ImageNoCaption}{}{} +\newenvironment{CompactList} +{\begin{list}{}{ + \setlength{\leftmargin}{0.5cm} + \setlength{\itemsep}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \renewcommand{\makelabel}{\hfill}}} +{\end{list}} +\newenvironment{CompactItemize} +{ + \begin{itemize} + \setlength{\itemsep}{-3pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \setlength{\partopsep}{0pt} +} +{\end{itemize}} +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} +\newlength{\tmplength} +\newenvironment{TabularC}[1] +{ +\setlength{\tmplength} + {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} + \par\begin{tabular*}{\linewidth} + {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} +} +{\end{tabular*}\par} +\newcommand{\entrylabel}[1]{ + {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}} +\newenvironment{Desc} +{\begin{list}{} + { + \settowidth{\labelwidth}{40pt} + \setlength{\leftmargin}{\labelwidth} + \setlength{\parsep}{0pt} + \setlength{\itemsep}{-4pt} + \renewcommand{\makelabel}{\entrylabel} + } +} +{\end{list}} +\newenvironment{Indent} + {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} + \item[]\ignorespaces} + {\unskip\end{list}} +\setlength{\parindent}{0cm} +\setlength{\parskip}{0.2cm} +\addtocounter{secnumdepth}{1} +\sloppy +\usepackage[T1]{fontenc} diff --git a/trunk/paradiseo-moeo/doc/latex/hierarchy.tex b/trunk/paradiseo-moeo/doc/latex/hierarchy.tex new file mode 100644 index 000000000..b2cc3b6cd --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/hierarchy.tex @@ -0,0 +1,223 @@ +\section{Paradis\-EO-MOEO Class Hierarchy} +This inheritance list is sorted roughly, but not completely, alphabetically:\begin{CompactList} +\item eo\-Functor\-Base{\tt [external]}\begin{CompactList} +\item eo\-BF$<$ A1, A2, R $>${\tt [external]}\begin{CompactList} +\item eo\-Replacement$<$ EOT $>${\tt [external]}\begin{CompactList} +\item eo\-Generational\-Replacement$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Generational\-Replacement$<$ MOEOT $>$}{\pageref{classmoeoGenerationalReplacement}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Replacement$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Replacement$<$ MOEOT $>$}{\pageref{classmoeoReplacement}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Elitist\-Replacement$<$ MOEOT $>$}{\pageref{classmoeoElitistReplacement}}{} +\item \contentsline{section}{moeo\-Environmental\-Replacement$<$ MOEOT $>$}{\pageref{classmoeoEnvironmentalReplacement}}{} +\item \contentsline{section}{moeo\-Generational\-Replacement$<$ MOEOT $>$}{\pageref{classmoeoGenerationalReplacement}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Select$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Select}{\pageref{classmoeoEasyEA_1_1eoDummySelect}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ A1, A2, R $>$}{\pageref{classmoeoBinaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$}{\pageref{classmoeoSolutionVsSolutionBinaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, R $>$}{\pageref{classmoeoNormalizedSolutionVsSolutionBinaryMetric}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, double $>$}{\pageref{classmoeoSolutionVsSolutionBinaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Normalized\-Solution\-Vs\-Solution\-Binary\-Metric$<$ Objective\-Vector, double $>$}{\pageref{classmoeoNormalizedSolutionVsSolutionBinaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Additive\-Epsilon\-Binary\-Metric$<$ Objective\-Vector $>$}{\pageref{classmoeoAdditiveEpsilonBinaryMetric}}{} +\item \contentsline{section}{moeo\-Hypervolume\-Binary\-Metric$<$ Objective\-Vector $>$}{\pageref{classmoeoHypervolumeBinaryMetric}}{} +\end{CompactList} +\end{CompactList} +\item \contentsline{section}{moeo\-Vector\-Vs\-Vector\-Binary\-Metric$<$ Objective\-Vector, R $>$}{\pageref{classmoeoVectorVsVectorBinaryMetric}}{} +\item \contentsline{section}{moeo\-Vector\-Vs\-Vector\-Binary\-Metric$<$ Objective\-Vector, double $>$}{\pageref{classmoeoVectorVsVectorBinaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Contribution\-Metric$<$ Objective\-Vector $>$}{\pageref{classmoeoContributionMetric}}{} +\item \contentsline{section}{moeo\-Entropy\-Metric$<$ Objective\-Vector $>$}{\pageref{classmoeoEntropyMetric}}{} +\end{CompactList} +\end{CompactList} +\item \contentsline{section}{moeo\-Comparator$<$ MOEOT $>$}{\pageref{classmoeoComparator}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Aggregative\-Comparator$<$ MOEOT $>$}{\pageref{classmoeoAggregativeComparator}}{} +\item \contentsline{section}{moeo\-Diversity\-Then\-Fitness\-Comparator$<$ MOEOT $>$}{\pageref{classmoeoDiversityThenFitnessComparator}}{} +\item \contentsline{section}{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$::Objective\-Comparator}{\pageref{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator}}{} +\item \contentsline{section}{moeo\-Fitness\-Then\-Diversity\-Comparator$<$ MOEOT $>$}{\pageref{classmoeoFitnessThenDiversityComparator}}{} +\item \contentsline{section}{moeo\-One\-Objective\-Comparator$<$ MOEOT $>$}{\pageref{classmoeoOneObjectiveComparator}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Distance$<$ MOEOT, Type $>$}{\pageref{classmoeoDistance}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Normalized\-Distance$<$ MOEOT, Type $>$}{\pageref{classmoeoNormalizedDistance}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Distance$<$ MOEOT, double $>$}{\pageref{classmoeoDistance}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Normalized\-Distance$<$ MOEOT $>$}{\pageref{classmoeoNormalizedDistance}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Euclidean\-Distance$<$ MOEOT $>$}{\pageref{classmoeoEuclideanDistance}}{} +\item \contentsline{section}{moeo\-Manhattan\-Distance$<$ MOEOT $>$}{\pageref{classmoeoManhattanDistance}}{} +\end{CompactList} +\end{CompactList} +\item \contentsline{section}{moeo\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$}{\pageref{classmoeoObjectiveVectorComparator}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-GDominance\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$}{\pageref{classmoeoGDominanceObjectiveVectorComparator}}{} +\item \contentsline{section}{moeo\-Objective\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$}{\pageref{classmoeoObjectiveObjectiveVectorComparator}}{} +\item \contentsline{section}{moeo\-Pareto\-Objective\-Vector\-Comparator$<$ Objective\-Vector $>$}{\pageref{classmoeoParetoObjectiveVectorComparator}}{} +\end{CompactList} +\end{CompactList} +\item eo\-BF$<$ const const Objective\-Vector \&, Objective\-Vector \&, double $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const Objective\-Vector \&, Objective\-Vector \&, double $>$}{\pageref{classmoeoBinaryMetric}}{} +\end{CompactList} +\item eo\-BF$<$ const const Objective\-Vector \&, Objective\-Vector \&, R $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const Objective\-Vector \&, Objective\-Vector \&, R $>$}{\pageref{classmoeoBinaryMetric}}{} +\end{CompactList} +\item eo\-BF$<$ const const std::vector$<$ Objective\-Vector $>$ \&, std::vector$<$ Objective\-Vector $>$ \&, double $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const std::vector$<$ Objective\-Vector $>$ \&, std::vector$<$ Objective\-Vector $>$ \&, double $>$}{\pageref{classmoeoBinaryMetric}}{} +\end{CompactList} +\item eo\-BF$<$ const const std::vector$<$ Objective\-Vector $>$ \&, std::vector$<$ Objective\-Vector $>$ \&, R $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const std::vector$<$ Objective\-Vector $>$ \&, std::vector$<$ Objective\-Vector $>$ \&, R $>$}{\pageref{classmoeoBinaryMetric}}{} +\end{CompactList} +\item eo\-BF$<$ Type, moeo\-Archive$<$ MOEOT $>$ \&, void $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-LS$<$ MOEOT, Type $>$}{\pageref{classmoeoLS}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Combined\-LS$<$ MOEOT, Type $>$}{\pageref{classmoeoCombinedLS}}{} +\end{CompactList} +\end{CompactList} +\item eo\-F$<$ void $>${\tt [external]}\begin{CompactList} +\item eo\-Updater{\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Archive\-Objective\-Vector\-Saving\-Updater$<$ MOEOT $>$}{\pageref{classmoeoArchiveObjectiveVectorSavingUpdater}}{} +\item \contentsline{section}{moeo\-Archive\-Updater$<$ MOEOT $>$}{\pageref{classmoeoArchiveUpdater}}{} +\item \contentsline{section}{moeo\-Binary\-Metric\-Saving\-Updater$<$ MOEOT $>$}{\pageref{classmoeoBinaryMetricSavingUpdater}}{} +\item \contentsline{section}{moeo\-Hybrid\-LS$<$ MOEOT $>$}{\pageref{classmoeoHybridLS}}{} +\end{CompactList} +\end{CompactList} +\item eo\-UF$<$ A1, R $>${\tt [external]}\begin{CompactList} +\item eo\-Algo$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-EA$<$ MOEOT $>$}{\pageref{classmoeoEA}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Easy\-EA$<$ MOEOT $>$}{\pageref{classmoeoEasyEA}}{} +\item \contentsline{section}{moeo\-IBEA$<$ MOEOT $>$}{\pageref{classmoeoIBEA}}{} +\item \contentsline{section}{moeo\-NSGA$<$ MOEOT $>$}{\pageref{classmoeoNSGA}}{} +\item \contentsline{section}{moeo\-NSGAII$<$ MOEOT $>$}{\pageref{classmoeoNSGAII}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Eval\-Func$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Eval}{\pageref{classmoeoEasyEA_1_1eoDummyEval}}{} +\item \contentsline{section}{moeo\-Eval\-Func$<$ MOEOT $>$}{\pageref{classmoeoEvalFunc}}{} +\end{CompactList} +\item eo\-Select\-One$<$ EOT, Worth\-T $>${\tt [external]}\begin{CompactList} +\item eo\-Random\-Select$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Random\-Select$<$ MOEOT $>$}{\pageref{classmoeoRandomSelect}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Select\-One$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Select\-One$<$ MOEOT $>$}{\pageref{classmoeoSelectOne}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Det\-Tournament\-Select$<$ MOEOT $>$}{\pageref{classmoeoDetTournamentSelect}}{} +\item \contentsline{section}{moeo\-Random\-Select$<$ MOEOT $>$}{\pageref{classmoeoRandomSelect}}{} +\item \contentsline{section}{moeo\-Roulette\-Select$<$ MOEOT $>$}{\pageref{classmoeoRouletteSelect}}{} +\item \contentsline{section}{moeo\-Select\-From\-Pop\-And\-Arch$<$ MOEOT $>$}{\pageref{classmoeoSelectFromPopAndArch}}{} +\item \contentsline{section}{moeo\-Stoch\-Tournament\-Select$<$ MOEOT $>$}{\pageref{classmoeoStochTournamentSelect}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Transform$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Easy\-EA$<$ MOEOT $>$::eo\-Dummy\-Transform}{\pageref{classmoeoEasyEA_1_1eoDummyTransform}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Convert\-Pop\-To\-Objective\-Vectors$<$ MOEOT, Objective\-Vector $>$}{\pageref{classmoeoConvertPopToObjectiveVectors}}{} +\end{CompactList} +\item eo\-UF$<$ A, R $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Unary\-Metric$<$ A, R $>$}{\pageref{classmoeoUnaryMetric}}{} +\end{CompactList} +\item eo\-UF$<$ const eo\-Pop$<$ MOEOT $>$ \&, void $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Distance\-Matrix$<$ MOEOT, Type $>$}{\pageref{classmoeoDistanceMatrix}}{} +\end{CompactList} +\item eo\-UF$<$ const Objective\-Vector \&, R $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Unary\-Metric$<$ const Objective\-Vector \&, R $>$}{\pageref{classmoeoUnaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Solution\-Unary\-Metric$<$ Objective\-Vector, R $>$}{\pageref{classmoeoSolutionUnaryMetric}}{} +\end{CompactList} +\end{CompactList} +\item eo\-UF$<$ const std::vector$<$ Objective\-Vector $>$ \&, R $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Unary\-Metric$<$ const std::vector$<$ Objective\-Vector $>$ \&, R $>$}{\pageref{classmoeoUnaryMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Vector\-Unary\-Metric$<$ Objective\-Vector, R $>$}{\pageref{classmoeoVectorUnaryMetric}}{} +\end{CompactList} +\end{CompactList} +\item eo\-UF$<$ eo\-Pop$<$ MOEOT $>$ \&, void $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Diversity\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoDiversityAssignment}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoCrowdingDistanceDiversityAssignment}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Front\-By\-Front\-Crowding\-Distance\-Diversity\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Dummy\-Diversity\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoDummyDiversityAssignment}}{} +\item \contentsline{section}{moeo\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoSharingDiversityAssignment}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Front\-By\-Front\-Sharing\-Diversity\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoFrontByFrontSharingDiversityAssignment}}{} +\end{CompactList} +\end{CompactList} +\item \contentsline{section}{moeo\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoFitnessAssignment}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Criterion\-Based\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoCriterionBasedFitnessAssignment}}{} +\item \contentsline{section}{moeo\-Dummy\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoDummyFitnessAssignment}}{} +\item \contentsline{section}{moeo\-Indicator\-Based\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoIndicatorBasedFitnessAssignment}}{} +\item \contentsline{section}{moeo\-Pareto\-Based\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoParetoBasedFitnessAssignment}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Fast\-Non\-Dominated\-Sorting\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoFastNonDominatedSortingFitnessAssignment}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Scalar\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoScalarFitnessAssignment}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Achievement\-Fitness\-Assignment$<$ MOEOT $>$}{\pageref{classmoeoAchievementFitnessAssignment}}{} +\end{CompactList} +\end{CompactList} +\end{CompactList} +\item \contentsline{section}{moeo\-Metric}{\pageref{classmoeoMetric}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ A1, A2, R $>$}{\pageref{classmoeoBinaryMetric}}{} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const Objective\-Vector \&, Objective\-Vector \&, double $>$}{\pageref{classmoeoBinaryMetric}}{} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const Objective\-Vector \&, Objective\-Vector \&, R $>$}{\pageref{classmoeoBinaryMetric}}{} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const std::vector$<$ Objective\-Vector $>$ \&, std::vector$<$ Objective\-Vector $>$ \&, double $>$}{\pageref{classmoeoBinaryMetric}}{} +\item \contentsline{section}{moeo\-Binary\-Metric$<$ const const std::vector$<$ Objective\-Vector $>$ \&, std::vector$<$ Objective\-Vector $>$ \&, R $>$}{\pageref{classmoeoBinaryMetric}}{} +\item \contentsline{section}{moeo\-Unary\-Metric$<$ A, R $>$}{\pageref{classmoeoUnaryMetric}}{} +\item \contentsline{section}{moeo\-Unary\-Metric$<$ const Objective\-Vector \&, R $>$}{\pageref{classmoeoUnaryMetric}}{} +\item \contentsline{section}{moeo\-Unary\-Metric$<$ const std::vector$<$ Objective\-Vector $>$ \&, R $>$}{\pageref{classmoeoUnaryMetric}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Object{\tt [external]}\begin{CompactList} +\item EO$<$ MOEOObjective\-Vector $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{MOEO$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$}{\pageref{classMOEO}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, Gene\-Type $>$}{\pageref{classmoeoVector}}{} +\item \contentsline{section}{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, bool $>$}{\pageref{classmoeoVector}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Bit\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$}{\pageref{classmoeoBitVector}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity, double $>$}{\pageref{classmoeoVector}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Real\-Vector$<$ MOEOObjective\-Vector, MOEOFitness, MOEODiversity $>$}{\pageref{classmoeoRealVector}}{} +\end{CompactList} +\end{CompactList} +\end{CompactList} +\item eo\-Pop$<$ MOEOT $>${\tt [external]}\begin{CompactList} +\item \contentsline{section}{moeo\-Archive$<$ MOEOT $>$}{\pageref{classmoeoArchive}}{} +\end{CompactList} +\end{CompactList} +\item eo\-Printable{\tt [external]}\begin{CompactList} +\item eo\-Persistent{\tt [external]}\begin{CompactList} +\item EO$<$ MOEOObjective\-Vector $>${\tt [external]}\item eo\-Pop$<$ MOEOT $>${\tt [external]}\end{CompactList} +\end{CompactList} +\item \contentsline{section}{moeo\-Algo}{\pageref{classmoeoAlgo}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-EA$<$ MOEOT $>$}{\pageref{classmoeoEA}}{} +\item \contentsline{section}{moeo\-LS$<$ MOEOT, Type $>$}{\pageref{classmoeoLS}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Elitist\-Replacement$<$ MOEOT $>$::Cmp}{\pageref{classmoeoElitistReplacement_1_1Cmp}}{} +\item \contentsline{section}{moeo\-Environmental\-Replacement$<$ MOEOT $>$::Cmp}{\pageref{classmoeoEnvironmentalReplacement_1_1Cmp}}{} +\item \contentsline{section}{moeo\-Objective\-Vector$<$ Objective\-Vector\-Traits, Objective\-Vector\-Type $>$}{\pageref{classmoeoObjectiveVector}}{} +\item \contentsline{section}{moeo\-Objective\-Vector$<$ Objective\-Vector\-Traits, double $>$}{\pageref{classmoeoObjectiveVector}}{} +\begin{CompactList} +\item \contentsline{section}{moeo\-Objective\-Vector\-Double$<$ Objective\-Vector\-Traits $>$}{\pageref{classmoeoObjectiveVectorDouble}}{} +\end{CompactList} +\item \contentsline{section}{moeo\-Objective\-Vector\-Traits}{\pageref{classmoeoObjectiveVectorTraits}}{} +\end{CompactList} diff --git a/trunk/paradiseo-moeo/doc/latex/main.tex b/trunk/paradiseo-moeo/doc/latex/main.tex new file mode 100644 index 000000000..8b7f04a2e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/main.tex @@ -0,0 +1,5 @@ +\section{intro}\label{main_intro} +Paradis\-EO-MOEO is a white-box object-oriented generic framework dedicated to the flexible design of evolutionary multi-objective algorithms. This paradigm-free software embeds some features and techniques for Pareto-based resolution and aims to provide a set of classes allowing to ease and speed up the development of computationally efficient programs. It is based on a clear conceptual distinction between the solution methods and the multi-objective problems they are intended to solve. This separation confers a maximum design and code reuse. Paradis\-EO-MOEO provides a broad range of archive-related features (such as elitism or performance metrics) and the most common Pareto-based fitness assignment strategies (MOGA, NSGA, SPEA, IBEA and more). Furthermore, parallel and distributed models as well as hybridization mechanisms can be applied to an algorithm designed within Paradis\-EO-MOEO using the whole version of Paradis\-EO.\section{Tutorials}\label{main_tutorials} +Tutorials for Paradis\-EO-MOEO are available {\tt here}.\section{install}\label{main_install} +The installation procedure of the package is detailed in the README file in the top-directory of the source-tree.\section{design}\label{main_design} +For an introduction to the design of Paradis\-EO-MOEO, you can look at the {\tt Paradis\-EO website}. \ No newline at end of file diff --git a/trunk/paradiseo-moeo/doc/latex/pages.tex b/trunk/paradiseo-moeo/doc/latex/pages.tex new file mode 100644 index 000000000..8297a1563 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/pages.tex @@ -0,0 +1,5 @@ +\section{Paradis\-EO-MOEO Related Pages} +Here is a list of all related documentation pages:\begin{CompactList} +\item \contentsline{section}{Related webpages}{\pageref{webpages}}{} + +\end{CompactList} diff --git a/trunk/paradiseo-moeo/doc/latex/refman.tex b/trunk/paradiseo-moeo/doc/latex/refman.tex new file mode 100644 index 000000000..a955e6ce9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/refman.tex @@ -0,0 +1,116 @@ +\documentclass[a4paper]{book} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{float} +\usepackage{textcomp} +\usepackage{alltt} +\usepackage{doxygen} +\makeindex +\setcounter{tocdepth}{1} +\renewcommand{\footrulewidth}{0.4pt} +\begin{document} +\begin{titlepage} +\vspace*{7cm} +\begin{center} +{\Large Paradis\-EO-MOEO Reference Manual\\[1ex]\large 1.0 }\\ +\vspace*{1cm} +{\large Generated by Doxygen 1.4.7}\\ +\vspace*{0.5cm} +{\small Tue Jun 26 15:13:04 2007}\\ +\end{center} +\end{titlepage} +\clearemptydoublepage +\pagenumbering{roman} +\tableofcontents +\clearemptydoublepage +\pagenumbering{arabic} +\chapter{Welcome to Paradis\-EO-MOEO } +\label{index}\input{main} +\chapter{Paradis\-EO-MOEO Hierarchical Index} +\input{hierarchy} +\chapter{Paradis\-EO-MOEO Class Index} +\input{annotated} +\chapter{Paradis\-EO-MOEO Class Documentation} +\input{classMOEO} +\include{classmoeoAchievementFitnessAssignment} +\include{classmoeoAdditiveEpsilonBinaryMetric} +\include{classmoeoAggregativeComparator} +\include{classmoeoAlgo} +\include{classmoeoArchive} +\include{classmoeoArchiveObjectiveVectorSavingUpdater} +\include{classmoeoArchiveUpdater} +\include{classmoeoBinaryMetric} +\include{classmoeoBinaryMetricSavingUpdater} +\include{classmoeoBitVector} +\include{classmoeoCombinedLS} +\include{classmoeoComparator} +\include{classmoeoContributionMetric} +\include{classmoeoConvertPopToObjectiveVectors} +\include{classmoeoCriterionBasedFitnessAssignment} +\include{classmoeoCrowdingDistanceDiversityAssignment} +\include{classmoeoDetTournamentSelect} +\include{classmoeoDistance} +\include{classmoeoDistanceMatrix} +\include{classmoeoDiversityAssignment} +\include{classmoeoDiversityThenFitnessComparator} +\include{classmoeoDummyDiversityAssignment} +\include{classmoeoDummyFitnessAssignment} +\include{classmoeoEA} +\include{classmoeoEasyEA} +\include{classmoeoEasyEA_1_1eoDummyEval} +\include{classmoeoEasyEA_1_1eoDummySelect} +\include{classmoeoEasyEA_1_1eoDummyTransform} +\include{classmoeoElitistReplacement} +\include{classmoeoElitistReplacement_1_1Cmp} +\include{classmoeoEntropyMetric} +\include{classmoeoEnvironmentalReplacement} +\include{classmoeoEnvironmentalReplacement_1_1Cmp} +\include{classmoeoEuclideanDistance} +\include{classmoeoEvalFunc} +\include{classmoeoFastNonDominatedSortingFitnessAssignment} +\include{classmoeoFastNonDominatedSortingFitnessAssignment_1_1ObjectiveComparator} +\include{classmoeoFitnessAssignment} +\include{classmoeoFitnessThenDiversityComparator} +\include{classmoeoFrontByFrontCrowdingDistanceDiversityAssignment} +\include{classmoeoFrontByFrontSharingDiversityAssignment} +\include{classmoeoGDominanceObjectiveVectorComparator} +\include{classmoeoGenerationalReplacement} +\include{classmoeoHybridLS} +\include{classmoeoHypervolumeBinaryMetric} +\include{classmoeoIBEA} +\include{classmoeoIndicatorBasedFitnessAssignment} +\include{classmoeoLS} +\include{classmoeoManhattanDistance} +\include{classmoeoMetric} +\include{classmoeoNormalizedDistance} +\include{classmoeoNormalizedSolutionVsSolutionBinaryMetric} +\include{classmoeoNSGA} +\include{classmoeoNSGAII} +\include{classmoeoObjectiveObjectiveVectorComparator} +\include{classmoeoObjectiveVector} +\include{classmoeoObjectiveVectorComparator} +\include{classmoeoObjectiveVectorDouble} +\include{classmoeoObjectiveVectorTraits} +\include{classmoeoOneObjectiveComparator} +\include{classmoeoParetoBasedFitnessAssignment} +\include{classmoeoParetoObjectiveVectorComparator} +\include{classmoeoRandomSelect} +\include{classmoeoRealVector} +\include{classmoeoReplacement} +\include{classmoeoRouletteSelect} +\include{classmoeoScalarFitnessAssignment} +\include{classmoeoSelectFromPopAndArch} +\include{classmoeoSelectOne} +\include{classmoeoSharingDiversityAssignment} +\include{classmoeoSolutionUnaryMetric} +\include{classmoeoSolutionVsSolutionBinaryMetric} +\include{classmoeoStochTournamentSelect} +\include{classmoeoUnaryMetric} +\include{classmoeoVector} +\include{classmoeoVectorUnaryMetric} +\include{classmoeoVectorVsVectorBinaryMetric} +\printindex +\end{document} diff --git a/trunk/paradiseo-moeo/doc/latex/webpages.tex b/trunk/paradiseo-moeo/doc/latex/webpages.tex new file mode 100644 index 000000000..f17506321 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/latex/webpages.tex @@ -0,0 +1,3 @@ +\section{Related webpages}\label{webpages} +\begin{itemize} +\item Paradis\-EO {\tt homepage}\item INRIA GForge {\tt project page}\item {\tt README}\item {\tt NEWS} \end{itemize} diff --git a/trunk/paradiseo-moeo/doc/man/man3/MOEO.3 b/trunk/paradiseo-moeo/doc/man/man3/MOEO.3 new file mode 100644 index 000000000..a4060f9a1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/MOEO.3 @@ -0,0 +1,253 @@ +.TH "MOEO" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +MOEO \- Base class allowing to represent a solution (an individual) for multi-objective optimization. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBEO< MOEOObjectiveVector >\fP. +.PP +Inherited by \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >\fP, \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >\fP, and \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of a solution \fP" +.ti -1c +.RI "typedef MOEOFitness \fBFitness\fP" +.br +.RI "\fIthe fitness type of a solution \fP" +.ti -1c +.RI "typedef MOEODiversity \fBDiversity\fP" +.br +.RI "\fIthe diversity type of a solution \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBMOEO\fP ()" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "virtual \fB~MOEO\fP ()" +.br +.RI "\fIVirtual dtor. \fP" +.ti -1c +.RI "\fBObjectiveVector\fP \fBobjectiveVector\fP () const " +.br +.RI "\fIReturns the objective vector of the current solution. \fP" +.ti -1c +.RI "void \fBobjectiveVector\fP (const \fBObjectiveVector\fP &_objectiveVectorValue)" +.br +.RI "\fISets the objective vector of the current solution. \fP" +.ti -1c +.RI "void \fBinvalidateObjectiveVector\fP ()" +.br +.RI "\fISets the objective vector as invalid. \fP" +.ti -1c +.RI "bool \fBinvalidObjectiveVector\fP () const " +.br +.RI "\fIReturns true if the objective vector is invalid, false otherwise. \fP" +.ti -1c +.RI "\fBFitness\fP \fBfitness\fP () const " +.br +.RI "\fIReturns the fitness value of the current solution. \fP" +.ti -1c +.RI "void \fBfitness\fP (const \fBFitness\fP &_fitnessValue)" +.br +.RI "\fISets the fitness value of the current solution. \fP" +.ti -1c +.RI "void \fBinvalidateFitness\fP ()" +.br +.RI "\fISets the fitness value as invalid. \fP" +.ti -1c +.RI "bool \fBinvalidFitness\fP () const " +.br +.RI "\fIReturns true if the fitness value is invalid, false otherwise. \fP" +.ti -1c +.RI "\fBDiversity\fP \fBdiversity\fP () const " +.br +.RI "\fIReturns the diversity value of the current solution. \fP" +.ti -1c +.RI "void \fBdiversity\fP (const \fBDiversity\fP &_diversityValue)" +.br +.RI "\fISets the diversity value of the current solution. \fP" +.ti -1c +.RI "void \fBinvalidateDiversity\fP ()" +.br +.RI "\fISets the diversity value as invalid. \fP" +.ti -1c +.RI "bool \fBinvalidDiversity\fP () const " +.br +.RI "\fIReturns true if the diversity value is invalid, false otherwise. \fP" +.ti -1c +.RI "void \fBinvalidate\fP ()" +.br +.RI "\fISets the objective vector, the fitness value and the diversity value as invalid. \fP" +.ti -1c +.RI "bool \fBinvalid\fP () const " +.br +.RI "\fIReturns true if the fitness value is invalid, false otherwise. \fP" +.ti -1c +.RI "bool \fBoperator<\fP (const \fBMOEO\fP &_other) const " +.br +.RI "\fIReturns true if the objective vector of the current solution is smaller than the objective vector of _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \fP" +.ti -1c +.RI "virtual std::string \fBclassName\fP () const " +.br +.RI "\fIReturn the class id (the class name as a std::string). \fP" +.ti -1c +.RI "virtual void \fBprintOn\fP (std::ostream &_os) const " +.br +.RI "\fIWriting object. \fP" +.ti -1c +.RI "virtual void \fBreadFrom\fP (std::istream &_is)" +.br +.RI "\fIReading object. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBObjectiveVector\fP \fBobjectiveVectorValue\fP" +.br +.RI "\fIthe objective vector of this solution \fP" +.ti -1c +.RI "bool \fBinvalidObjectiveVectorValue\fP" +.br +.RI "\fItrue if the objective vector is invalid \fP" +.ti -1c +.RI "\fBFitness\fP \fBfitnessValue\fP" +.br +.RI "\fIthe fitness value of this solution \fP" +.ti -1c +.RI "bool \fBinvalidFitnessValue\fP" +.br +.RI "\fItrue if the fitness value is invalid \fP" +.ti -1c +.RI "\fBDiversity\fP \fBdiversityValue\fP" +.br +.RI "\fIthe diversity value of this solution \fP" +.ti -1c +.RI "bool \fBinvalidDiversityValue\fP" +.br +.RI "\fItrue if the diversity value is invalid \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >" +Base class allowing to represent a solution (an individual) for multi-objective optimization. + +The template argument MOEOObjectiveVector allows to represent the solution in the objective space (it can be a \fBmoeoObjectiveVector\fP object). The template argument MOEOFitness is an object reflecting the quality of the solution in term of convergence (the fitness of a solution is always to be maximized). The template argument MOEODiversity is an object reflecting the quality of the solution in term of diversity (the diversity of a solution is always to be maximized). All template arguments must have a void and a copy constructor. Using some specific representations, you will have to define a copy constructor if the default one is not what you want. In the same cases, you will also have to define the affectation operator (operator=). Then, you will explicitly have to call the parent copy constructor and the parent affectation operator at the beginning of the corresponding implementation. Besides, note that, contrary to the mono-objective case (and to \fBEO\fP) where the fitness value of a solution is confused with its objective value, the fitness value differs of the objectives values in the multi-objective case. +.PP +Definition at line 34 of file MOEO.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVector (const \fBObjectiveVector\fP & _objectiveVectorValue)\fC [inline]\fP" +.PP +Sets the objective vector of the current solution. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVectorValue\fP the new objective vector +.RE +.PP + +.PP +Definition at line 85 of file MOEO.h. +.PP +References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidObjectiveVectorValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVectorValue. +.SS "template void \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::fitness (const \fBFitness\fP & _fitnessValue)\fC [inline]\fP" +.PP +Sets the fitness value of the current solution. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessValue\fP the new fitness value +.RE +.PP + +.PP +Definition at line 127 of file MOEO.h. +.PP +References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::fitnessValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidFitnessValue. +.SS "template void \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::diversity (const \fBDiversity\fP & _diversityValue)\fC [inline]\fP" +.PP +Sets the diversity value of the current solution. +.PP +\fBParameters:\fP +.RS 4 +\fI_diversityValue\fP the new diversity value +.RE +.PP + +.PP +Definition at line 169 of file MOEO.h. +.PP +References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::diversityValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidDiversityValue. +.SS "template bool \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::operator< (const \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity > & _other) const\fC [inline]\fP" +.PP +Returns true if the objective vector of the current solution is smaller than the objective vector of _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +.PP +You should implement another function in the sub-class of \fBMOEO\fP to have another sorting mecanism. +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBMOEO\fP object to compare with +.RE +.PP + +.PP +Definition at line 220 of file MOEO.h. +.PP +References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVector(). +.SS "template virtual void \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn (std::ostream & _os) const\fC [inline, virtual]\fP" +.PP +Writing object. +.PP +\fBParameters:\fP +.RS 4 +\fI_os\fP output stream +.RE +.PP + +.PP +Reimplemented from \fBEO< MOEOObjectiveVector >\fP. +.PP +Reimplemented in \fBmoeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP, \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >\fP, \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >\fP, and \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >\fP. +.PP +Definition at line 239 of file MOEO.h. +.PP +References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidObjectiveVector(), and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVectorValue. +.SS "template virtual void \fBMOEO\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom (std::istream & _is)\fC [inline, virtual]\fP" +.PP +Reading object. +.PP +\fBParameters:\fP +.RS 4 +\fI_is\fP input stream +.RE +.PP + +.PP +Reimplemented from \fBEO< MOEOObjectiveVector >\fP. +.PP +Reimplemented in \fBmoeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP, \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >\fP, \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >\fP, and \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >\fP. +.PP +Definition at line 256 of file MOEO.h. +.PP +References MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidateObjectiveVector(), MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::invalidObjectiveVectorValue, and MOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::objectiveVectorValue. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoAchievementFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoAchievementFitnessAssignment.3 new file mode 100644 index 000000000..486eb2e8a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoAchievementFitnessAssignment.3 @@ -0,0 +1,185 @@ +.TH "moeoAchievementFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoAchievementFitnessAssignment \- Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoScalarFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoAchievementFitnessAssignment\fP (\fBObjectiveVector\fP &_reference, std::vector< double > &_lambdas, double _spn=0.0001)" +.br +.RI "\fIDefault ctor. \fP" +.ti -1c +.RI "\fBmoeoAchievementFitnessAssignment\fP (\fBObjectiveVector\fP &_reference, double _spn=0.0001)" +.br +.RI "\fICtor with default values for lambdas (1/nObjectives). \fP" +.ti -1c +.RI "virtual void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness values for every solution contained in the population _pop. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do). \fP" +.ti -1c +.RI "void \fBsetReference\fP (const \fBObjectiveVector\fP &_reference)" +.br +.RI "\fISets the reference point. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "double \fBinf\fP () const " +.br +.RI "\fIReturns a big value (regarded as infinite). \fP" +.ti -1c +.RI "void \fBcompute\fP (MOEOT &_moeo)" +.br +.RI "\fIComputes the fitness value for a solution. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBObjectiveVector\fP \fBreference\fP" +.br +.RI "\fIthe reference point \fP" +.ti -1c +.RI "std::vector< double > \fBlambdas\fP" +.br +.RI "\fIthe weighted coefficients vector \fP" +.ti -1c +.RI "double \fBspn\fP" +.br +.RI "\fIan arbitrary small positive number (0 < _spn << 1) \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoAchievementFitnessAssignment< MOEOT >" +Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). +.PP +Definition at line 24 of file moeoAchievementFitnessAssignment.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoAchievementFitnessAssignment\fP< MOEOT >::\fBmoeoAchievementFitnessAssignment\fP (\fBObjectiveVector\fP & _reference, std::vector< double > & _lambdas, double _spn = \fC0.0001\fP)\fC [inline]\fP" +.PP +Default ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_reference\fP reference point vector +.br +\fI_lambdas\fP weighted coefficients vector +.br +\fI_spn\fP arbitrary small positive number (0 < _spn << 1) +.RE +.PP + +.PP +Definition at line 38 of file moeoAchievementFitnessAssignment.h. +.PP +References moeoAchievementFitnessAssignment< MOEOT >::spn. +.SS "template \fBmoeoAchievementFitnessAssignment\fP< MOEOT >::\fBmoeoAchievementFitnessAssignment\fP (\fBObjectiveVector\fP & _reference, double _spn = \fC0.0001\fP)\fC [inline]\fP" +.PP +Ctor with default values for lambdas (1/nObjectives). +.PP +\fBParameters:\fP +.RS 4 +\fI_reference\fP reference point vector +.br +\fI_spn\fP arbitrary small positive number (0 < _spn << 1) +.RE +.PP + +.PP +Definition at line 54 of file moeoAchievementFitnessAssignment.h. +.PP +References moeoAchievementFitnessAssignment< MOEOT >::lambdas, and moeoAchievementFitnessAssignment< MOEOT >::spn. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoAchievementFitnessAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the fitness values for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 75 of file moeoAchievementFitnessAssignment.h. +.PP +References moeoAchievementFitnessAssignment< MOEOT >::compute(). +.SS "template void \fBmoeoAchievementFitnessAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do). +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implements \fBmoeoFitnessAssignment< MOEOT >\fP. +.PP +Definition at line 89 of file moeoAchievementFitnessAssignment.h. +.SS "template void \fBmoeoAchievementFitnessAssignment\fP< MOEOT >::setReference (const \fBObjectiveVector\fP & _reference)\fC [inline]\fP" +.PP +Sets the reference point. +.PP +\fBParameters:\fP +.RS 4 +\fI_reference\fP the new reference point +.RE +.PP + +.PP +Definition at line 99 of file moeoAchievementFitnessAssignment.h. +.PP +References moeoAchievementFitnessAssignment< MOEOT >::reference. +.SS "template void \fBmoeoAchievementFitnessAssignment\fP< MOEOT >::compute (MOEOT & _moeo)\fC [inline, private]\fP" +.PP +Computes the fitness value for a solution. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo\fP the solution +.RE +.PP + +.PP +Definition at line 128 of file moeoAchievementFitnessAssignment.h. +.PP +References moeoAchievementFitnessAssignment< MOEOT >::inf(), moeoAchievementFitnessAssignment< MOEOT >::lambdas, moeoAchievementFitnessAssignment< MOEOT >::reference, and moeoAchievementFitnessAssignment< MOEOT >::spn. +.PP +Referenced by moeoAchievementFitnessAssignment< MOEOT >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoAdditiveEpsilonBinaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoAdditiveEpsilonBinaryMetric.3 new file mode 100644 index 000000000..333cbc392 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoAdditiveEpsilonBinaryMetric.3 @@ -0,0 +1,86 @@ +.TH "moeoAdditiveEpsilonBinaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoAdditiveEpsilonBinaryMetric \- Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "double \fBoperator()\fP (const ObjectiveVector &_o1, const ObjectiveVector &_o2)" +.br +.RI "\fIReturns the minimal distance by which the objective vector _o1 must be translated in all objectives so that it weakly dominates the objective vector _o2. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "double \fBepsilon\fP (const ObjectiveVector &_o1, const ObjectiveVector &_o2, const unsigned int _obj)" +.br +.RI "\fIReturns the epsilon value by which the objective vector _o1 must be translated in the objective _obj so that it dominates the objective vector _o2. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >" +Additive epsilon binary metric allowing to compare two objective vectors as proposed in Zitzler E., Thiele L., Laumanns M., Fonseca C. + +M., Grunert da Fonseca V.: Performance Assessment of Multiobjective Optimizers: An Analysis and Review. IEEE Transactions on Evolutionary Computation 7(2), pp.117–132 (2003). +.PP +Definition at line 24 of file moeoAdditiveEpsilonBinaryMetric.h. +.SH "Member Function Documentation" +.PP +.SS "template double \fBmoeoAdditiveEpsilonBinaryMetric\fP< ObjectiveVector >::operator() (const ObjectiveVector & _o1, const ObjectiveVector & _o2)\fC [inline]\fP" +.PP +Returns the minimal distance by which the objective vector _o1 must be translated in all objectives so that it weakly dominates the objective vector _o2. +.PP +\fBWarning:\fP +.RS 4 +don't forget to set the bounds for every objective before the call of this function +.RE +.PP +\fBParameters:\fP +.RS 4 +\fI_o1\fP the first objective vector +.br +\fI_o2\fP the second objective vector +.RE +.PP + +.PP +Definition at line 35 of file moeoAdditiveEpsilonBinaryMetric.h. +.PP +References moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >::epsilon(). +.SS "template double \fBmoeoAdditiveEpsilonBinaryMetric\fP< ObjectiveVector >::epsilon (const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned int _obj)\fC [inline, private]\fP" +.PP +Returns the epsilon value by which the objective vector _o1 must be translated in the objective _obj so that it dominates the objective vector _o2. +.PP +\fBParameters:\fP +.RS 4 +\fI_o1\fP the first objective vector +.br +\fI_o2\fP the second objective vector +.br +\fI_obj\fP the index of the objective +.RE +.PP + +.PP +Definition at line 64 of file moeoAdditiveEpsilonBinaryMetric.h. +.PP +References moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >::bounds. +.PP +Referenced by moeoAdditiveEpsilonBinaryMetric< ObjectiveVector >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoAggregativeComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoAggregativeComparator.3 new file mode 100644 index 000000000..1591ed30f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoAggregativeComparator.3 @@ -0,0 +1,83 @@ +.TH "moeoAggregativeComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoAggregativeComparator \- Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoComparator< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoAggregativeComparator\fP (double _weightFitness=1.0, double _weightDiversity=1.0)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "const bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 < _moeo2 according to the aggregation of their fitness and diversity values. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "double \fBweightFitness\fP" +.br +.RI "\fIthe weight for fitness \fP" +.ti -1c +.RI "double \fBweightDiversity\fP" +.br +.RI "\fIthe weight for diversity \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoAggregativeComparator< MOEOT >" +Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. +.PP +Definition at line 22 of file moeoAggregativeComparator.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoAggregativeComparator\fP< MOEOT >::\fBmoeoAggregativeComparator\fP (double _weightFitness = \fC1.0\fP, double _weightDiversity = \fC1.0\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_weightFitness\fP the weight for fitness +.br +\fI_weightDiversity\fP the weight for diversity +.RE +.PP + +.PP +Definition at line 31 of file moeoAggregativeComparator.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoAggregativeComparator\fP< MOEOT >::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns true if _moeo1 < _moeo2 according to the aggregation of their fitness and diversity values. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 40 of file moeoAggregativeComparator.h. +.PP +References moeoAggregativeComparator< MOEOT >::weightDiversity, and moeoAggregativeComparator< MOEOT >::weightFitness. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoAlgo.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoAlgo.3 new file mode 100644 index 000000000..472042193 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoAlgo.3 @@ -0,0 +1,23 @@ +.TH "moeoAlgo" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoAlgo \- Abstract class for multi-objective algorithms. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherited by \fBmoeoEA< MOEOT >\fP, \fBmoeoLS< MOEOT, Type >\fP, and \fBmoeoLS< MOEOT, MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP +Abstract class for multi-objective algorithms. +.PP +Definition at line 19 of file moeoAlgo.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoArchive.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoArchive.3 new file mode 100644 index 000000000..d853c3262 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoArchive.3 @@ -0,0 +1,172 @@ +.TH "moeoArchive" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoArchive \- An archive is a secondary population that stores non-dominated solutions. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoPop< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type of an objective vector for a solution. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoArchive\fP ()" +.br +.RI "\fIDefault ctor. \fP" +.ti -1c +.RI "\fBmoeoArchive\fP (\fBmoeoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > &_comparator)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "bool \fBdominates\fP (const \fBObjectiveVector\fP &_objectiveVector) const " +.br +.RI "\fIReturns true if the current archive dominates _objectiveVector according to the \fBmoeoObjectiveVectorComparator\fP given in the constructor. \fP" +.ti -1c +.RI "bool \fBcontains\fP (const \fBObjectiveVector\fP &_objectiveVector) const " +.br +.RI "\fIReturns true if the current archive already contains a solution with the same objective values than _objectiveVector. \fP" +.ti -1c +.RI "void \fBupdate\fP (const MOEOT &_moeo)" +.br +.RI "\fIUpdates the archive with a given individual _moeo. \fP" +.ti -1c +.RI "void \fBupdate\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIUpdates the archive with a given population _pop. \fP" +.ti -1c +.RI "bool \fBequals\fP (const \fBmoeoArchive\fP< MOEOT > &_arch)" +.br +.RI "\fIReturns true if the current archive contains the same objective vectors than the given archive _arch. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > & \fBcomparator\fP" +.br +.RI "\fIThe \fBmoeoObjectiveVectorComparator\fP used to compare solutions. \fP" +.ti -1c +.RI "\fBmoeoParetoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > \fBparetoComparator\fP" +.br +.RI "\fIA \fBmoeoObjectiveVectorComparator\fP based on Pareto dominance (used as default). \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoArchive< MOEOT >" +An archive is a secondary population that stores non-dominated solutions. +.PP +Definition at line 24 of file moeoArchive.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoArchive\fP< MOEOT >::\fBmoeoArchive\fP ()\fC [inline]\fP" +.PP +Default ctor. +.PP +The \fBmoeoObjectiveVectorComparator\fP used to compare solutions is based on Pareto dominance +.PP +Definition at line 44 of file moeoArchive.h. +.SS "template \fBmoeoArchive\fP< MOEOT >::\fBmoeoArchive\fP (\fBmoeoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > & _comparator)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_comparator\fP the \fBmoeoObjectiveVectorComparator\fP used to compare solutions +.RE +.PP + +.PP +Definition at line 52 of file moeoArchive.h. +.SH "Member Function Documentation" +.PP +.SS "template bool \fBmoeoArchive\fP< MOEOT >::dominates (const \fBObjectiveVector\fP & _objectiveVector) const\fC [inline]\fP" +.PP +Returns true if the current archive dominates _objectiveVector according to the \fBmoeoObjectiveVectorComparator\fP given in the constructor. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVector\fP the objective vector to compare with the current archive +.RE +.PP + +.PP +Definition at line 60 of file moeoArchive.h. +.PP +References moeoArchive< MOEOT >::comparator. +.SS "template bool \fBmoeoArchive\fP< MOEOT >::contains (const \fBObjectiveVector\fP & _objectiveVector) const\fC [inline]\fP" +.PP +Returns true if the current archive already contains a solution with the same objective values than _objectiveVector. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVector\fP the objective vector to compare with the current archive +.RE +.PP + +.PP +Definition at line 78 of file moeoArchive.h. +.PP +Referenced by moeoArchive< MOEOT >::equals(). +.SS "template void \fBmoeoArchive\fP< MOEOT >::update (const MOEOT & _moeo)\fC [inline]\fP" +.PP +Updates the archive with a given individual _moeo. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo\fP the given individual +.RE +.PP + +.PP +Definition at line 95 of file moeoArchive.h. +.PP +References moeoArchive< MOEOT >::comparator. +.PP +Referenced by moeoArchive< MOEOT >::update(). +.SS "template void \fBmoeoArchive\fP< MOEOT >::update (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline]\fP" +.PP +Updates the archive with a given population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the given population +.RE +.PP + +.PP +Definition at line 138 of file moeoArchive.h. +.PP +References moeoArchive< MOEOT >::update(). +.SS "template bool \fBmoeoArchive\fP< MOEOT >::equals (const \fBmoeoArchive\fP< MOEOT > & _arch)\fC [inline]\fP" +.PP +Returns true if the current archive contains the same objective vectors than the given archive _arch. +.PP +\fBParameters:\fP +.RS 4 +\fI_arch\fP the given archive +.RE +.PP + +.PP +Definition at line 151 of file moeoArchive.h. +.PP +References moeoArchive< MOEOT >::contains(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoArchiveObjectiveVectorSavingUpdater.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoArchiveObjectiveVectorSavingUpdater.3 new file mode 100644 index 000000000..aa8b73b1e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoArchiveObjectiveVectorSavingUpdater.3 @@ -0,0 +1,81 @@ +.TH "moeoArchiveObjectiveVectorSavingUpdater" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoArchiveObjectiveVectorSavingUpdater \- This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUpdater\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoArchiveObjectiveVectorSavingUpdater\fP (\fBmoeoArchive\fP< MOEOT > &_arch, const std::string &_filename, bool _count=false, int _id=-1)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBoperator()\fP ()" +.br +.RI "\fISaves the fitness of the archive's members into the file. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoArchive\fP< MOEOT > & \fBarch\fP" +.br +.RI "\fIlocal archive \fP" +.ti -1c +.RI "std::string \fBfilename\fP" +.br +.RI "\fItarget filename \fP" +.ti -1c +.RI "bool \fBcount\fP" +.br +.RI "\fIthis variable is set to true if a new file have to be created each time () is called and to false if the file only HAVE to be updated \fP" +.ti -1c +.RI "unsigned int \fBcounter\fP" +.br +.RI "\fIcounter \fP" +.ti -1c +.RI "int \fBid\fP" +.br +.RI "\fIown ID \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoArchiveObjectiveVectorSavingUpdater< MOEOT >" +This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. +.PP +Definition at line 28 of file moeoArchiveObjectiveVectorSavingUpdater.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoArchiveObjectiveVectorSavingUpdater\fP< MOEOT >::\fBmoeoArchiveObjectiveVectorSavingUpdater\fP (\fBmoeoArchive\fP< MOEOT > & _arch, const std::string & _filename, bool _count = \fCfalse\fP, int _id = \fC-1\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_arch\fP local archive +.br +\fI_filename\fP target filename +.br +\fI_count\fP put this variable to true if you want a new file to be created each time () is called and to false if you only want the file to be updated +.br +\fI_id\fP own ID +.RE +.PP + +.PP +Definition at line 39 of file moeoArchiveObjectiveVectorSavingUpdater.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoArchiveUpdater.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoArchiveUpdater.3 new file mode 100644 index 000000000..9345bd580 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoArchiveUpdater.3 @@ -0,0 +1,65 @@ +.TH "moeoArchiveUpdater" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoArchiveUpdater \- This class allows to update the archive at each generation with newly found non-dominated solutions. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUpdater\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoArchiveUpdater\fP (\fBmoeoArchive\fP< MOEOT > &_arch, const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBoperator()\fP ()" +.br +.RI "\fIUpdates the archive with newly found non-dominated solutions contained in the main population. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoArchive\fP< MOEOT > & \fBarch\fP" +.br +.RI "\fIthe archive of non-dominated solutions \fP" +.ti -1c +.RI "const \fBeoPop\fP< MOEOT > & \fBpop\fP" +.br +.RI "\fIthe main population \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoArchiveUpdater< MOEOT >" +This class allows to update the archive at each generation with newly found non-dominated solutions. +.PP +Definition at line 24 of file moeoArchiveUpdater.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoArchiveUpdater\fP< MOEOT >::\fBmoeoArchiveUpdater\fP (\fBmoeoArchive\fP< MOEOT > & _arch, const \fBeoPop\fP< MOEOT > & _pop)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_arch\fP an archive of non-dominated solutions +.br +\fI_pop\fP the main population +.RE +.PP + +.PP +Definition at line 33 of file moeoArchiveUpdater.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetric.3 new file mode 100644 index 000000000..acca45853 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetric.3 @@ -0,0 +1,27 @@ +.TH "moeoBinaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoBinaryMetric \- Base class for binary metrics. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoBF< A1, A2, R >< A1, A2, R >\fP, and \fBmoeoMetric\fP. +.PP +Inherited by \fBmoeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >\fP, \fBmoeoSolutionVsSolutionBinaryMetric< ObjectiveVector, double >\fP, \fBmoeoVectorVsVectorBinaryMetric< ObjectiveVector, R >\fP, and \fBmoeoVectorVsVectorBinaryMetric< ObjectiveVector, double >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoBinaryMetric< A1, A2, R >" +Base class for binary metrics. +.PP +Definition at line 36 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetricSavingUpdater.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetricSavingUpdater.3 new file mode 100644 index 000000000..169825a76 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoBinaryMetricSavingUpdater.3 @@ -0,0 +1,91 @@ +.TH "moeoBinaryMetricSavingUpdater" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoBinaryMetricSavingUpdater \- This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUpdater\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe objective vector type of a solution. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoBinaryMetricSavingUpdater\fP (\fBmoeoVectorVsVectorBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const \fBeoPop\fP< MOEOT > &_pop, std::string _filename)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBoperator()\fP ()" +.br +.RI "\fISaves the metric's value for the current generation. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoVectorVsVectorBinaryMetric\fP< \fBObjectiveVector\fP, double > & \fBmetric\fP" +.br +.RI "\fIbinary metric comparing two Pareto sets \fP" +.ti -1c +.RI "const \fBeoPop\fP< MOEOT > & \fBpop\fP" +.br +.RI "\fImain population \fP" +.ti -1c +.RI "\fBeoPop\fP< MOEOT > \fBoldPop\fP" +.br +.RI "\fI(n-1) population \fP" +.ti -1c +.RI "std::string \fBfilename\fP" +.br +.RI "\fItarget filename \fP" +.ti -1c +.RI "bool \fBfirstGen\fP" +.br +.RI "\fIis it the first generation ? \fP" +.ti -1c +.RI "unsigned int \fBcounter\fP" +.br +.RI "\fIcounter \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoBinaryMetricSavingUpdater< MOEOT >" +This class allows to save the progression of a binary metric comparing the objective vectors of the current population (or archive) with the objective vectors of the population (or archive) of the generation (n-1) into a file. +.PP +Definition at line 28 of file moeoBinaryMetricSavingUpdater.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoBinaryMetricSavingUpdater\fP< MOEOT >::\fBmoeoBinaryMetricSavingUpdater\fP (\fBmoeoVectorVsVectorBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const \fBeoPop\fP< MOEOT > & _pop, std::string _filename)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_metric\fP the binary metric comparing two Pareto sets +.br +\fI_pop\fP the main population +.br +\fI_filename\fP the target filename +.RE +.PP + +.PP +Definition at line 42 of file moeoBinaryMetricSavingUpdater.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoBitVector.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoBitVector.3 new file mode 100644 index 000000000..8e32535b4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoBitVector.3 @@ -0,0 +1,87 @@ +.TH "moeoBitVector" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoBitVector \- This class is an implementationeo of a simple bit-valued \fBmoeoVector\fP. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoBitVector\fP (unsigned int _size=0, bool _value=false)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "virtual void \fBprintOn\fP (std::ostream &_os) const " +.br +.RI "\fIWriting object. \fP" +.ti -1c +.RI "virtual void \fBreadFrom\fP (std::istream &_is)" +.br +.RI "\fIReading object. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >" +This class is an implementationeo of a simple bit-valued \fBmoeoVector\fP. +.PP +Definition at line 22 of file moeoBitVector.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoBitVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::\fBmoeoBitVector\fP (unsigned int _size = \fC0\fP, bool _value = \fCfalse\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_size\fP Length of vector (default is 0) +.br +\fI_value\fP Initial value of all elements (default is default value of type GeneType) +.RE +.PP + +.PP +Definition at line 37 of file moeoBitVector.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoBitVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn (std::ostream & _os) const\fC [inline, virtual]\fP" +.PP +Writing object. +.PP +\fBParameters:\fP +.RS 4 +\fI_os\fP output stream +.RE +.PP + +.PP +Reimplemented from \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >\fP. +.PP +Definition at line 45 of file moeoBitVector.h. +.SS "template virtual void \fBmoeoBitVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom (std::istream & _is)\fC [inline, virtual]\fP" +.PP +Reading object. +.PP +\fBParameters:\fP +.RS 4 +\fI_is\fP input stream +.RE +.PP + +.PP +Reimplemented from \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >\fP. +.PP +Definition at line 58 of file moeoBitVector.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoCombinedLS.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoCombinedLS.3 new file mode 100644 index 000000000..c0c1d9818 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoCombinedLS.3 @@ -0,0 +1,101 @@ +.TH "moeoCombinedLS" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoCombinedLS \- This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoLS< MOEOT, Type >< MOEOT, Type >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoCombinedLS\fP (\fBmoeoLS\fP< MOEOT, Type > &_first_mols)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBadd\fP (\fBmoeoLS\fP< MOEOT, Type > &_mols)" +.br +.RI "\fIAdds a new local search to combine. \fP" +.ti -1c +.RI "void \fBoperator()\fP (Type _type, \fBmoeoArchive\fP< MOEOT > &_arch)" +.br +.RI "\fIGives a new solution in order to explore the neigborhood. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "std::vector< \fBmoeoLS\fP< MOEOT, Type > * > \fBcombinedLS\fP" +.br +.RI "\fIthe vector that contains the combined LS \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoCombinedLS< MOEOT, Type >" +This class allows to embed a set of local searches that are sequentially applied, and so working and updating the same archive of non-dominated solutions. +.PP +Definition at line 25 of file moeoCombinedLS.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoCombinedLS\fP< MOEOT, Type >::\fBmoeoCombinedLS\fP (\fBmoeoLS\fP< MOEOT, Type > & _first_mols)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_first_mols\fP the first multi-objective local search to add +.RE +.PP + +.PP +Definition at line 33 of file moeoCombinedLS.h. +.PP +References moeoCombinedLS< MOEOT, Type >::combinedLS. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoCombinedLS\fP< MOEOT, Type >::add (\fBmoeoLS\fP< MOEOT, Type > & _mols)\fC [inline]\fP" +.PP +Adds a new local search to combine. +.PP +\fBParameters:\fP +.RS 4 +\fI_mols\fP the multi-objective local search to add +.RE +.PP + +.PP +Definition at line 42 of file moeoCombinedLS.h. +.PP +References moeoCombinedLS< MOEOT, Type >::combinedLS. +.SS "template void \fBmoeoCombinedLS\fP< MOEOT, Type >::operator() (Type _type, \fBmoeoArchive\fP< MOEOT > & _arch)\fC [inline, virtual]\fP" +.PP +Gives a new solution in order to explore the neigborhood. +.PP +The new non-dominated solutions are added to the archive +.PP +\fBParameters:\fP +.RS 4 +\fI_type\fP the object to apply the local search to +.br +\fI_arch\fP the archive of non-dominated solutions +.RE +.PP + +.PP +Implements \fBeoBF< Type, moeoArchive< MOEOT > &, void >\fP. +.PP +Definition at line 53 of file moeoCombinedLS.h. +.PP +References moeoCombinedLS< MOEOT, Type >::combinedLS. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoComparator.3 new file mode 100644 index 000000000..0090384ca --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoComparator.3 @@ -0,0 +1,27 @@ +.TH "moeoComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoComparator \- Functor allowing to compare two solutions. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoBF< A1, A2, R >< const const MOEOT &, MOEOT &, bool >\fP. +.PP +Inherited by \fBmoeoAggregativeComparator< MOEOT >\fP, \fBmoeoDiversityThenFitnessComparator< MOEOT >\fP, \fBmoeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator\fP, \fBmoeoFitnessThenDiversityComparator< MOEOT >\fP, and \fBmoeoOneObjectiveComparator< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoComparator< MOEOT >" +Functor allowing to compare two solutions. +.PP +Definition at line 22 of file moeoComparator.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoContributionMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoContributionMetric.3 new file mode 100644 index 000000000..d92764dc7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoContributionMetric.3 @@ -0,0 +1,129 @@ +.TH "moeoContributionMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoContributionMetric \- The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoVectorVsVectorBinaryMetric< ObjectiveVector, double >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "double \fBoperator()\fP (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)" +.br +.RI "\fIReturns the contribution of the Pareto set '_set1' relatively to the Pareto set '_set2'. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "unsigned int \fBcard_C\fP (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)" +.br +.RI "\fIReturns the number of solutions both in '_set1' and '_set2'. \fP" +.ti -1c +.RI "unsigned int \fBcard_W\fP (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)" +.br +.RI "\fIReturns the number of solutions in '_set1' dominating at least one solution of '_set2'. \fP" +.ti -1c +.RI "unsigned int \fBcard_N\fP (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)" +.br +.RI "\fIReturns the number of solutions in '_set1' having no relation of dominance with those from '_set2'. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoParetoObjectiveVectorComparator\fP< ObjectiveVector > \fBparetoComparator\fP" +.br +.RI "\fIFunctor to compare two objective vectors according to Pareto dominance relation. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoContributionMetric< ObjectiveVector >" +The contribution metric evaluates the proportion of non-dominated solutions given by a Pareto set relatively to another Pareto set (Meunier, Talbi, Reininger: 'A multiobjective genetic algorithm for radio network optimization', in Proc. + +of the 2000 Congress on Evolutionary Computation, IEEE Press, pp. 317-324) +.PP +Definition at line 24 of file moeoContributionMetric.h. +.SH "Member Function Documentation" +.PP +.SS "template double \fBmoeoContributionMetric\fP< ObjectiveVector >::operator() (const std::vector< ObjectiveVector > & _set1, const std::vector< ObjectiveVector > & _set2)\fC [inline]\fP" +.PP +Returns the contribution of the Pareto set '_set1' relatively to the Pareto set '_set2'. +.PP +\fBParameters:\fP +.RS 4 +\fI_set1\fP the first Pareto set +.br +\fI_set2\fP the second Pareto set +.RE +.PP + +.PP +Definition at line 33 of file moeoContributionMetric.h. +.PP +References moeoContributionMetric< ObjectiveVector >::card_C(), moeoContributionMetric< ObjectiveVector >::card_N(), and moeoContributionMetric< ObjectiveVector >::card_W(). +.SS "template unsigned int \fBmoeoContributionMetric\fP< ObjectiveVector >::card_C (const std::vector< ObjectiveVector > & _set1, const std::vector< ObjectiveVector > & _set2)\fC [inline, private]\fP" +.PP +Returns the number of solutions both in '_set1' and '_set2'. +.PP +\fBParameters:\fP +.RS 4 +\fI_set1\fP the first Pareto set +.br +\fI_set2\fP the second Pareto set +.RE +.PP + +.PP +Definition at line 54 of file moeoContributionMetric.h. +.PP +Referenced by moeoContributionMetric< ObjectiveVector >::operator()(). +.SS "template unsigned int \fBmoeoContributionMetric\fP< ObjectiveVector >::card_W (const std::vector< ObjectiveVector > & _set1, const std::vector< ObjectiveVector > & _set2)\fC [inline, private]\fP" +.PP +Returns the number of solutions in '_set1' dominating at least one solution of '_set2'. +.PP +\fBParameters:\fP +.RS 4 +\fI_set1\fP the first Pareto set +.br +\fI_set2\fP the second Pareto set +.RE +.PP + +.PP +Definition at line 71 of file moeoContributionMetric.h. +.PP +References moeoContributionMetric< ObjectiveVector >::paretoComparator. +.PP +Referenced by moeoContributionMetric< ObjectiveVector >::operator()(). +.SS "template unsigned int \fBmoeoContributionMetric\fP< ObjectiveVector >::card_N (const std::vector< ObjectiveVector > & _set1, const std::vector< ObjectiveVector > & _set2)\fC [inline, private]\fP" +.PP +Returns the number of solutions in '_set1' having no relation of dominance with those from '_set2'. +.PP +\fBParameters:\fP +.RS 4 +\fI_set1\fP the first Pareto set +.br +\fI_set2\fP the second Pareto set +.RE +.PP + +.PP +Definition at line 89 of file moeoContributionMetric.h. +.PP +References moeoContributionMetric< ObjectiveVector >::paretoComparator. +.PP +Referenced by moeoContributionMetric< ObjectiveVector >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoConvertPopToObjectiveVectors.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoConvertPopToObjectiveVectors.3 new file mode 100644 index 000000000..77c62ac44 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoConvertPopToObjectiveVectors.3 @@ -0,0 +1,47 @@ +.TH "moeoConvertPopToObjectiveVectors" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoConvertPopToObjectiveVectors \- Functor allowing to get a vector of objective vectors from a population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUF< A1, R >< eoPop< MOEOT >, std::vector< ObjectiveVector > >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const std::vector< ObjectiveVector > \fBoperator()\fP (const \fBeoPop\fP< MOEOT > _pop)" +.br +.RI "\fIReturns a vector of the objective vectors from the population _pop. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoConvertPopToObjectiveVectors< MOEOT, ObjectiveVector >" +Functor allowing to get a vector of objective vectors from a population. +.PP +Definition at line 23 of file moeoConvertPopToObjectiveVectors.h. +.SH "Member Function Documentation" +.PP +.SS "template const std::vector< ObjectiveVector > \fBmoeoConvertPopToObjectiveVectors\fP< MOEOT, ObjectiveVector >::operator() (const \fBeoPop\fP< MOEOT > _pop)\fC [inline]\fP" +.PP +Returns a vector of the objective vectors from the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 31 of file moeoConvertPopToObjectiveVectors.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoCriterionBasedFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoCriterionBasedFitnessAssignment.3 new file mode 100644 index 000000000..9c0e8f015 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoCriterionBasedFitnessAssignment.3 @@ -0,0 +1,25 @@ +.TH "moeoCriterionBasedFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoCriterionBasedFitnessAssignment \- \fBmoeoCriterionBasedFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP for criterion-based strategies. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoCriterionBasedFitnessAssignment< MOEOT >" +\fBmoeoCriterionBasedFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP for criterion-based strategies. +.PP +Definition at line 22 of file moeoCriterionBasedFitnessAssignment.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoCrowdingDistanceDiversityAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoCrowdingDistanceDiversityAssignment.3 new file mode 100644 index 000000000..86d032001 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoCrowdingDistanceDiversityAssignment.3 @@ -0,0 +1,126 @@ +.TH "moeoCrowdingDistanceDiversityAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoCrowdingDistanceDiversityAssignment \- Diversity assignment sheme based on crowding distance proposed in: K. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoDiversityAssignment< MOEOT >< MOEOT >\fP. +.PP +Inherited by \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "double \fBinf\fP () const " +.br +.RI "\fIReturns a big value (regarded as infinite). \fP" +.ti -1c +.RI "double \fBtiny\fP () const " +.br +.RI "\fIReturns a very small value that can be used to avoid extreme cases (where the min bound == the max bound). \fP" +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIComputes diversity values for every solution contained in the population _pop. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.in -1c +.SS "Protected Member Functions" + +.in +1c +.ti -1c +.RI "virtual void \fBsetDistances\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the distance values. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoCrowdingDistanceDiversityAssignment< MOEOT >" +Diversity assignment sheme based on crowding distance proposed in: K. + +Deb, A. Pratap, S. Agarwal, T. Meyarivan, 'A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II', IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). +.PP +Definition at line 25 of file moeoCrowdingDistanceDiversityAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoCrowdingDistanceDiversityAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Computes diversity values for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 55 of file moeoCrowdingDistanceDiversityAssignment.h. +.PP +References moeoCrowdingDistanceDiversityAssignment< MOEOT >::inf(), and moeoCrowdingDistanceDiversityAssignment< MOEOT >::setDistances(). +.SS "template void \fBmoeoCrowdingDistanceDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.RE +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! +.RE +.PP + +.PP +Implements \fBmoeoDiversityAssignment< MOEOT >\fP. +.PP +Reimplemented in \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 78 of file moeoCrowdingDistanceDiversityAssignment.h. +.SS "template virtual void \fBmoeoCrowdingDistanceDiversityAssignment\fP< MOEOT >::setDistances (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, protected, virtual]\fP" +.PP +Sets the distance values. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Reimplemented in \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 90 of file moeoCrowdingDistanceDiversityAssignment.h. +.PP +References moeoCrowdingDistanceDiversityAssignment< MOEOT >::inf(). +.PP +Referenced by moeoCrowdingDistanceDiversityAssignment< MOEOT >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDetTournamentSelect.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDetTournamentSelect.3 new file mode 100644 index 000000000..1d84cc663 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDetTournamentSelect.3 @@ -0,0 +1,107 @@ +.TH "moeoDetTournamentSelect" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDetTournamentSelect \- Selection strategy that selects ONE individual by deterministic tournament. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSelectOne< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoDetTournamentSelect\fP (\fBmoeoComparator\fP< MOEOT > &_comparator, unsigned int _tSize=2)" +.br +.RI "\fIFull Ctor. \fP" +.ti -1c +.RI "\fBmoeoDetTournamentSelect\fP (unsigned int _tSize=2)" +.br +.RI "\fICtor without comparator. \fP" +.ti -1c +.RI "const MOEOT & \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApply the tournament to the given population. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoComparator\fP< MOEOT > & \fBcomparator\fP" +.br +.RI "\fIthe comparator (used to compare 2 individuals) \fP" +.ti -1c +.RI "\fBmoeoFitnessThenDiversityComparator\fP< MOEOT > \fBdefaultComparator\fP" +.br +.RI "\fIa fitness then diversity comparator can be used as default \fP" +.ti -1c +.RI "unsigned int \fBtSize\fP" +.br +.RI "\fIthe number of individuals in the tournament \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDetTournamentSelect< MOEOT >" +Selection strategy that selects ONE individual by deterministic tournament. +.PP +Definition at line 24 of file moeoDetTournamentSelect.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoDetTournamentSelect\fP< MOEOT >::\fBmoeoDetTournamentSelect\fP (\fBmoeoComparator\fP< MOEOT > & _comparator, unsigned int _tSize = \fC2\fP)\fC [inline]\fP" +.PP +Full Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_comparator\fP the comparator (used to compare 2 individuals) +.br +\fI_tSize\fP the number of individuals in the tournament (default: 2) +.RE +.PP + +.PP +Definition at line 33 of file moeoDetTournamentSelect.h. +.PP +References moeoDetTournamentSelect< MOEOT >::tSize. +.SS "template \fBmoeoDetTournamentSelect\fP< MOEOT >::\fBmoeoDetTournamentSelect\fP (unsigned int _tSize = \fC2\fP)\fC [inline]\fP" +.PP +Ctor without comparator. +.PP +A \fBmoeoFitnessThenDiversityComparator\fP is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_tSize\fP the number of individuals in the tournament (default: 2) +.RE +.PP + +.PP +Definition at line 49 of file moeoDetTournamentSelect.h. +.PP +References moeoDetTournamentSelect< MOEOT >::tSize. +.SH "Member Function Documentation" +.PP +.SS "template const MOEOT& \fBmoeoDetTournamentSelect\fP< MOEOT >::operator() (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline]\fP" +.PP +Apply the tournament to the given population. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 65 of file moeoDetTournamentSelect.h. +.PP +References moeoDetTournamentSelect< MOEOT >::comparator, and moeoDetTournamentSelect< MOEOT >::tSize. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDistance.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDistance.3 new file mode 100644 index 000000000..0e3d8d383 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDistance.3 @@ -0,0 +1,93 @@ +.TH "moeoDistance" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDistance \- The base class for distance computation. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoBF< A1, A2, R >< const const MOEOT &, MOEOT &, Type >\fP. +.PP +Inherited by \fBmoeoNormalizedDistance< MOEOT, Type >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "virtual void \fBsetup\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fINothing to do. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (double _min, double _max, unsigned int _obj)" +.br +.RI "\fINothing to do. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (\fBeoRealInterval\fP _realInterval, unsigned int _obj)" +.br +.RI "\fINothing to do. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDistance< MOEOT, Type >" +The base class for distance computation. +.PP +Definition at line 22 of file moeoDistance.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoDistance\fP< MOEOT, Type >::setup (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Nothing to do. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Reimplemented in \fBmoeoNormalizedDistance< MOEOT, Type >\fP, and \fBmoeoNormalizedDistance< MOEOT >\fP. +.PP +Definition at line 30 of file moeoDistance.h. +.SS "template virtual void \fBmoeoDistance\fP< MOEOT, Type >::setup (double _min, double _max, unsigned int _obj)\fC [inline, virtual]\fP" +.PP +Nothing to do. +.PP +\fBParameters:\fP +.RS 4 +\fI_min\fP lower bound +.br +\fI_max\fP upper bound +.br +\fI_obj\fP the objective index +.RE +.PP + +.PP +Reimplemented in \fBmoeoNormalizedDistance< MOEOT, Type >\fP, and \fBmoeoNormalizedDistance< MOEOT >\fP. +.PP +Definition at line 40 of file moeoDistance.h. +.SS "template virtual void \fBmoeoDistance\fP< MOEOT, Type >::setup (\fBeoRealInterval\fP _realInterval, unsigned int _obj)\fC [inline, virtual]\fP" +.PP +Nothing to do. +.PP +\fBParameters:\fP +.RS 4 +\fI_realInterval\fP the \fBeoRealInterval\fP object +.br +\fI_obj\fP the objective index +.RE +.PP + +.PP +Reimplemented in \fBmoeoNormalizedDistance< MOEOT, Type >\fP, and \fBmoeoNormalizedDistance< MOEOT >\fP. +.PP +Definition at line 49 of file moeoDistance.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDistanceMatrix.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDistanceMatrix.3 new file mode 100644 index 000000000..691ed8df4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDistanceMatrix.3 @@ -0,0 +1,79 @@ +.TH "moeoDistanceMatrix" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDistanceMatrix \- A matrix to compute distances between every pair of individuals contained in a population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUF< const eoPop< MOEOT > &, void >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoDistanceMatrix\fP (unsigned int _size, \fBmoeoDistance\fP< MOEOT, Type > &_distance)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the distance between every pair of individuals contained in the population _pop. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoDistance\fP< MOEOT, Type > & \fBdistance\fP" +.br +.RI "\fIthe distance to use \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDistanceMatrix< MOEOT, Type >" +A matrix to compute distances between every pair of individuals contained in a population. +.PP +Definition at line 24 of file moeoDistanceMatrix.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoDistanceMatrix\fP< MOEOT, Type >::\fBmoeoDistanceMatrix\fP (unsigned int _size, \fBmoeoDistance\fP< MOEOT, Type > & _distance)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_size\fP size for every dimension of the matrix +.br +\fI_distance\fP the distance to use +.RE +.PP + +.PP +Definition at line 37 of file moeoDistanceMatrix.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoDistanceMatrix\fP< MOEOT, Type >::operator() (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the distance between every pair of individuals contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< const eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 51 of file moeoDistanceMatrix.h. +.PP +References moeoDistanceMatrix< MOEOT, Type >::distance. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDiversityAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDiversityAssignment.3 new file mode 100644 index 000000000..3f6629425 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDiversityAssignment.3 @@ -0,0 +1,81 @@ +.TH "moeoDiversityAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDiversityAssignment \- Functor that sets the diversity values of a whole population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Inherited by \fBmoeoCrowdingDistanceDiversityAssignment< MOEOT >\fP, \fBmoeoDummyDiversityAssignment< MOEOT >\fP, and \fBmoeoSharingDiversityAssignment< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type for objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "virtual void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)=0" +.br +.RI "\fIUpdates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, MOEOT &_moeo)" +.br +.RI "\fIUpdates the diversity values of the whole population _pop by taking the deletion of the individual _moeo into account. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDiversityAssignment< MOEOT >" +Functor that sets the diversity values of a whole population. +.PP +Definition at line 23 of file moeoDiversityAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [pure virtual]\fP" +.PP +Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implemented in \fBmoeoCrowdingDistanceDiversityAssignment< MOEOT >\fP, \fBmoeoDummyDiversityAssignment< MOEOT >\fP, \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >\fP, \fBmoeoFrontByFrontSharingDiversityAssignment< MOEOT >\fP, and \fBmoeoSharingDiversityAssignment< MOEOT >\fP. +.PP +Referenced by moeoDiversityAssignment< MOEOT >::updateByDeleting(). +.SS "template void \fBmoeoDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, MOEOT & _moeo)\fC [inline]\fP" +.PP +Updates the diversity values of the whole population _pop by taking the deletion of the individual _moeo into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_moeo\fP the individual +.RE +.PP + +.PP +Definition at line 44 of file moeoDiversityAssignment.h. +.PP +References moeoDiversityAssignment< MOEOT >::updateByDeleting(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDiversityThenFitnessComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDiversityThenFitnessComparator.3 new file mode 100644 index 000000000..4c4133faa --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDiversityThenFitnessComparator.3 @@ -0,0 +1,49 @@ +.TH "moeoDiversityThenFitnessComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDiversityThenFitnessComparator \- Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoComparator< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 < _moeo2 according to their diversity values, then according to their fitness values. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDiversityThenFitnessComparator< MOEOT >" +Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. +.PP +Definition at line 22 of file moeoDiversityThenFitnessComparator.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoDiversityThenFitnessComparator\fP< MOEOT >::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns true if _moeo1 < _moeo2 according to their diversity values, then according to their fitness values. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 31 of file moeoDiversityThenFitnessComparator.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDummyDiversityAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDummyDiversityAssignment.3 new file mode 100644 index 000000000..5df07ea04 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDummyDiversityAssignment.3 @@ -0,0 +1,77 @@ +.TH "moeoDummyDiversityAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDummyDiversityAssignment \- \fBmoeoDummyDiversityAssignment\fP is a \fBmoeoDiversityAssignment\fP that gives the value '0' as the individual's diversity for a whole population if it is invalid. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoDiversityAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type for objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the diversity to '0' for every individuals of the population _pop if it is invalid. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.RI "\fIUpdates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDummyDiversityAssignment< MOEOT >" +\fBmoeoDummyDiversityAssignment\fP is a \fBmoeoDiversityAssignment\fP that gives the value '0' as the individual's diversity for a whole population if it is invalid. +.PP +Definition at line 22 of file moeoDummyDiversityAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoDummyDiversityAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the diversity to '0' for every individuals of the population _pop if it is invalid. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 34 of file moeoDummyDiversityAssignment.h. +.SS "template void \fBmoeoDummyDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implements \fBmoeoDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 52 of file moeoDummyDiversityAssignment.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoDummyFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoDummyFitnessAssignment.3 new file mode 100644 index 000000000..635c51291 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoDummyFitnessAssignment.3 @@ -0,0 +1,77 @@ +.TH "moeoDummyFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoDummyFitnessAssignment \- \fBmoeoDummyFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP that gives the value '0' as the individual's fitness for a whole population if it is invalid. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type for objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness to '0' for every individuals of the population _pop if it is invalid. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoDummyFitnessAssignment< MOEOT >" +\fBmoeoDummyFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP that gives the value '0' as the individual's fitness for a whole population if it is invalid. +.PP +Definition at line 22 of file moeoDummyFitnessAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoDummyFitnessAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the fitness to '0' for every individuals of the population _pop if it is invalid. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 34 of file moeoDummyFitnessAssignment.h. +.SS "template void \fBmoeoDummyFitnessAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implements \fBmoeoFitnessAssignment< MOEOT >\fP. +.PP +Definition at line 52 of file moeoDummyFitnessAssignment.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEA.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEA.3 new file mode 100644 index 000000000..f72dcc515 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEA.3 @@ -0,0 +1,27 @@ +.TH "moeoEA" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEA \- Abstract class for multi-objective evolutionary algorithms. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoAlgo\fP, and \fBeoAlgo< MOEOT >\fP. +.PP +Inherited by \fBmoeoEasyEA< MOEOT >\fP, \fBmoeoIBEA< MOEOT >\fP, \fBmoeoNSGA< MOEOT >\fP, and \fBmoeoNSGAII< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoEA< MOEOT >" +Abstract class for multi-objective evolutionary algorithms. +.PP +Definition at line 23 of file moeoEA.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA.3 new file mode 100644 index 000000000..8fcaeeddd --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA.3 @@ -0,0 +1,283 @@ +.TH "moeoEasyEA" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEasyEA \- An easy class to design multi-objective evolutionary algorithms. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoEA< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoBreed\fP< MOEOT > &_breed, \fBmoeoReplacement\fP< MOEOT > &_replace, \fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)" +.br +.RI "\fICtor taking a breed and merge. \fP" +.ti -1c +.RI "\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoPopEvalFunc\fP< MOEOT > &_popEval, \fBeoBreed\fP< MOEOT > &_breed, \fBmoeoReplacement\fP< MOEOT > &_replace, \fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)" +.br +.RI "\fICtor taking a breed, a merge and a eoPopEval. \fP" +.ti -1c +.RI "\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoBreed\fP< MOEOT > &_breed, \fBeoMerge\fP< MOEOT > &_merge, \fBeoReduce\fP< MOEOT > &_reduce, \fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)" +.br +.RI "\fICtor taking a breed, a merge and a reduce. \fP" +.ti -1c +.RI "\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoSelect\fP< MOEOT > &_select, \fBeoTransform\fP< MOEOT > &_transform, \fBmoeoReplacement\fP< MOEOT > &_replace, \fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)" +.br +.RI "\fICtor taking a select, a transform and a replacement. \fP" +.ti -1c +.RI "\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoSelect\fP< MOEOT > &_select, \fBeoTransform\fP< MOEOT > &_transform, \fBeoMerge\fP< MOEOT > &_merge, \fBeoReduce\fP< MOEOT > &_reduce, \fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityEval, bool _evalFitAndDivBeforeSelection=false)" +.br +.RI "\fICtor taking a select, a transform, a merge and a reduce. \fP" +.ti -1c +.RI "virtual void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApplies a few generation of evolution to the population _pop. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBeoContinue\fP< MOEOT > & \fBcontinuator\fP" +.br +.RI "\fIthe stopping criteria \fP" +.ti -1c +.RI "\fBeoEvalFunc\fP< MOEOT > & \fBeval\fP" +.br +.RI "\fIthe evaluation functions \fP" +.ti -1c +.RI "\fBeoPopLoopEval\fP< MOEOT > \fBloopEval\fP" +.br +.RI "\fIto evaluate the whole population \fP" +.ti -1c +.RI "\fBeoPopEvalFunc\fP< MOEOT > & \fBpopEval\fP" +.br +.RI "\fIto evaluate the whole population \fP" +.ti -1c +.RI "\fBeoSelectTransform\fP< MOEOT > \fBselectTransform\fP" +.br +.RI "\fIbreed: a select followed by a transform \fP" +.ti -1c +.RI "\fBeoBreed\fP< MOEOT > & \fBbreed\fP" +.br +.RI "\fIthe breeder \fP" +.ti -1c +.RI "\fBeoMergeReduce\fP< MOEOT > \fBmergeReduce\fP" +.br +.RI "\fIreplacement: a merge followed by a reduce \fP" +.ti -1c +.RI "\fBmoeoReplacement\fP< MOEOT > & \fBreplace\fP" +.br +.RI "\fIthe replacment strategy \fP" +.ti -1c +.RI "\fBmoeoFitnessAssignment\fP< MOEOT > & \fBfitnessEval\fP" +.br +.RI "\fIthe fitness assignment strategy \fP" +.ti -1c +.RI "\fBmoeoDiversityAssignment\fP< MOEOT > & \fBdiversityEval\fP" +.br +.RI "\fIthe diversity assignment strategy \fP" +.ti -1c +.RI "bool \fBevalFitAndDivBeforeSelection\fP" +.br +.RI "\fIif this parameter is set to 'true', the fitness and the diversity of the whole population will be re-evaluated before the selection process \fP" +.ti -1c +.RI "\fBmoeoEasyEA::eoDummyEval\fP \fBdummyEval\fP" +.br +.RI "\fIa dummy eval \fP" +.ti -1c +.RI "\fBmoeoEasyEA::eoDummySelect\fP \fBdummySelect\fP" +.br +.RI "\fIa dummy select \fP" +.ti -1c +.RI "\fBmoeoEasyEA::eoDummyTransform\fP \fBdummyTransform\fP" +.br +.RI "\fIa dummy transform \fP" +.ti -1c +.RI "\fBeoNoElitism\fP< MOEOT > \fBdummyMerge\fP" +.br +.RI "\fIa dummy merge \fP" +.ti -1c +.RI "\fBeoTruncate\fP< MOEOT > \fBdummyReduce\fP" +.br +.RI "\fIa dummy reduce \fP" +.in -1c +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBeoDummyEval\fP" +.br +.RI "\fIa dummy eval \fP" +.ti -1c +.RI "class \fBeoDummySelect\fP" +.br +.RI "\fIa dummy select \fP" +.ti -1c +.RI "class \fBeoDummyTransform\fP" +.br +.RI "\fIa dummy transform \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEasyEA< MOEOT >" +An easy class to design multi-objective evolutionary algorithms. +.PP +Definition at line 33 of file moeoEasyEA.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoEasyEA\fP< MOEOT >::\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoBreed\fP< MOEOT > & _breed, \fBmoeoReplacement\fP< MOEOT > & _replace, \fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = \fCfalse\fP)\fC [inline]\fP" +.PP +Ctor taking a breed and merge. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP the stopping criteria +.br +\fI_eval\fP the evaluation functions +.br +\fI_breed\fP the breeder +.br +\fI_replace\fP the replacement strategy +.br +\fI_fitnessEval\fP the fitness evaluation scheme +.br +\fI_diversityEval\fP the diversity evaluation scheme +.br +\fI_evalFitAndDivBeforeSelection\fP put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process +.RE +.PP + +.PP +Definition at line 47 of file moeoEasyEA.h. +.SS "template \fBmoeoEasyEA\fP< MOEOT >::\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoPopEvalFunc\fP< MOEOT > & _popEval, \fBeoBreed\fP< MOEOT > & _breed, \fBmoeoReplacement\fP< MOEOT > & _replace, \fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = \fCfalse\fP)\fC [inline]\fP" +.PP +Ctor taking a breed, a merge and a eoPopEval. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP the stopping criteria +.br +\fI_popEval\fP the evaluation functions for the whole population +.br +\fI_breed\fP the breeder +.br +\fI_replace\fP the replacement strategy +.br +\fI_fitnessEval\fP the fitness evaluation scheme +.br +\fI_diversityEval\fP the diversity evaluation scheme +.br +\fI_evalFitAndDivBeforeSelection\fP put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process +.RE +.PP + +.PP +Definition at line 65 of file moeoEasyEA.h. +.SS "template \fBmoeoEasyEA\fP< MOEOT >::\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoBreed\fP< MOEOT > & _breed, \fBeoMerge\fP< MOEOT > & _merge, \fBeoReduce\fP< MOEOT > & _reduce, \fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = \fCfalse\fP)\fC [inline]\fP" +.PP +Ctor taking a breed, a merge and a reduce. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP the stopping criteria +.br +\fI_eval\fP the evaluation functions +.br +\fI_breed\fP the breeder +.br +\fI_merge\fP the merge scheme +.br +\fI_reduce\fP the reduce scheme +.br +\fI_fitnessEval\fP the fitness evaluation scheme +.br +\fI_diversityEval\fP the diversity evaluation scheme +.br +\fI_evalFitAndDivBeforeSelection\fP put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process +.RE +.PP + +.PP +Definition at line 84 of file moeoEasyEA.h. +.SS "template \fBmoeoEasyEA\fP< MOEOT >::\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoSelect\fP< MOEOT > & _select, \fBeoTransform\fP< MOEOT > & _transform, \fBmoeoReplacement\fP< MOEOT > & _replace, \fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = \fCfalse\fP)\fC [inline]\fP" +.PP +Ctor taking a select, a transform and a replacement. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP the stopping criteria +.br +\fI_eval\fP the evaluation functions +.br +\fI_select\fP the selection scheme +.br +\fI_transform\fP the tranformation scheme +.br +\fI_replace\fP the replacement strategy +.br +\fI_fitnessEval\fP the fitness evaluation scheme +.br +\fI_diversityEval\fP the diversity evaluation scheme +.br +\fI_evalFitAndDivBeforeSelection\fP put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process +.RE +.PP + +.PP +Definition at line 103 of file moeoEasyEA.h. +.SS "template \fBmoeoEasyEA\fP< MOEOT >::\fBmoeoEasyEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoSelect\fP< MOEOT > & _select, \fBeoTransform\fP< MOEOT > & _transform, \fBeoMerge\fP< MOEOT > & _merge, \fBeoReduce\fP< MOEOT > & _reduce, \fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessEval, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = \fCfalse\fP)\fC [inline]\fP" +.PP +Ctor taking a select, a transform, a merge and a reduce. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP the stopping criteria +.br +\fI_eval\fP the evaluation functions +.br +\fI_select\fP the selection scheme +.br +\fI_transform\fP the tranformation scheme +.br +\fI_merge\fP the merge scheme +.br +\fI_reduce\fP the reduce scheme +.br +\fI_fitnessEval\fP the fitness evaluation scheme +.br +\fI_diversityEval\fP the diversity evaluation scheme +.br +\fI_evalFitAndDivBeforeSelection\fP put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process +.RE +.PP + +.PP +Definition at line 123 of file moeoEasyEA.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoEasyEA\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Applies a few generation of evolution to the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 135 of file moeoEasyEA.h. +.PP +References moeoEasyEA< MOEOT >::breed, moeoEasyEA< MOEOT >::continuator, moeoEasyEA< MOEOT >::diversityEval, moeoEasyEA< MOEOT >::evalFitAndDivBeforeSelection, moeoEasyEA< MOEOT >::fitnessEval, moeoEasyEA< MOEOT >::popEval, and moeoEasyEA< MOEOT >::replace. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyEval.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyEval.3 new file mode 100644 index 000000000..7f5765fab --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyEval.3 @@ -0,0 +1,33 @@ +.TH "moeoEasyEA::eoDummyEval" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEasyEA::eoDummyEval \- a dummy eval + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoEvalFunc< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoperator()\fP (MOEOT &)" +.br +.RI "\fIthe dummy functor \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEasyEA< MOEOT >::eoDummyEval" +a dummy eval +.PP +Definition at line 200 of file moeoEasyEA.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummySelect.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummySelect.3 new file mode 100644 index 000000000..2945ed72a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummySelect.3 @@ -0,0 +1,33 @@ +.TH "moeoEasyEA::eoDummySelect" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEasyEA::eoDummySelect \- a dummy select + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoSelect< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &, \fBeoPop\fP< MOEOT > &)" +.br +.RI "\fIthe dummy functor \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEasyEA< MOEOT >::eoDummySelect" +a dummy select +.PP +Definition at line 204 of file moeoEasyEA.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyTransform.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyTransform.3 new file mode 100644 index 000000000..d2acc7daf --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEasyEA_eoDummyTransform.3 @@ -0,0 +1,33 @@ +.TH "moeoEasyEA::eoDummyTransform" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEasyEA::eoDummyTransform \- a dummy transform + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoTransform< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &)" +.br +.RI "\fIthe dummy functor \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEasyEA< MOEOT >::eoDummyTransform" +a dummy transform +.PP +Definition at line 208 of file moeoEasyEA.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement.3 new file mode 100644 index 000000000..1e869d4f9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement.3 @@ -0,0 +1,163 @@ +.TH "moeoElitistReplacement" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoElitistReplacement \- Elitist replacement strategy that consists in keeping the N best individuals. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoReplacement< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityAssignment, \fBmoeoComparator\fP< MOEOT > &_comparator)" +.br +.RI "\fIFull constructor. \fP" +.ti -1c +.RI "\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityAssignment)" +.br +.RI "\fIConstructor without comparator. \fP" +.ti -1c +.RI "\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment, \fBmoeoComparator\fP< MOEOT > &_comparator)" +.br +.RI "\fIConstructor without moeoDiversityAssignement. \fP" +.ti -1c +.RI "\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment)" +.br +.RI "\fIConstructor without moeoDiversityAssignement nor \fBmoeoComparator\fP. \fP" +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_parents, \fBeoPop\fP< MOEOT > &_offspring)" +.br +.RI "\fIReplaces the first population by adding the individuals of the second one, sorting with a \fBmoeoComparator\fP and resizing the whole population obtained. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoFitnessAssignment\fP< MOEOT > & \fBfitnessAssignment\fP" +.br +.RI "\fIthe fitness assignment strategy \fP" +.ti -1c +.RI "\fBmoeoDiversityAssignment\fP< MOEOT > & \fBdiversityAssignment\fP" +.br +.RI "\fIthe diversity assignment strategy \fP" +.ti -1c +.RI "\fBmoeoDummyDiversityAssignment\fP< MOEOT > \fBdefaultDiversity\fP" +.br +.RI "\fIa dummy diversity assignment can be used as default \fP" +.ti -1c +.RI "\fBmoeoFitnessThenDiversityComparator\fP< MOEOT > \fBdefaultComparator\fP" +.br +.RI "\fIa fitness then diversity comparator can be used as default \fP" +.ti -1c +.RI "\fBmoeoElitistReplacement::Cmp\fP \fBcomparator\fP" +.br +.RI "\fIthis object is used to compare solutions in order to sort the population \fP" +.in -1c +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBCmp\fP" +.br +.RI "\fIthis object is used to compare solutions in order to sort the population \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoElitistReplacement< MOEOT >" +Elitist replacement strategy that consists in keeping the N best individuals. +.PP +Definition at line 26 of file moeoElitistReplacement.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoElitistReplacement\fP< MOEOT >::\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityAssignment, \fBmoeoComparator\fP< MOEOT > & _comparator)\fC [inline]\fP" +.PP +Full constructor. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.br +\fI_diversityAssignment\fP the diversity assignment strategy +.br +\fI_comparator\fP the comparator (used to compare 2 individuals) +.RE +.PP + +.PP +Definition at line 36 of file moeoElitistReplacement.h. +.SS "template \fBmoeoElitistReplacement\fP< MOEOT >::\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityAssignment)\fC [inline]\fP" +.PP +Constructor without comparator. +.PP +A moeoFitThenDivComparator is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.br +\fI_diversityAssignment\fP the diversity assignment strategy +.RE +.PP + +.PP +Definition at line 46 of file moeoElitistReplacement.h. +.SS "template \fBmoeoElitistReplacement\fP< MOEOT >::\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment, \fBmoeoComparator\fP< MOEOT > & _comparator)\fC [inline]\fP" +.PP +Constructor without moeoDiversityAssignement. +.PP +A dummy diversity is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.br +\fI_comparator\fP the comparator (used to compare 2 individuals) +.RE +.PP + +.PP +Definition at line 56 of file moeoElitistReplacement.h. +.SS "template \fBmoeoElitistReplacement\fP< MOEOT >::\fBmoeoElitistReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment)\fC [inline]\fP" +.PP +Constructor without moeoDiversityAssignement nor \fBmoeoComparator\fP. +.PP +A moeoFitThenDivComparator and a dummy diversity are used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.RE +.PP + +.PP +Definition at line 66 of file moeoElitistReplacement.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoElitistReplacement\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _parents, \fBeoPop\fP< MOEOT > & _offspring)\fC [inline]\fP" +.PP +Replaces the first population by adding the individuals of the second one, sorting with a \fBmoeoComparator\fP and resizing the whole population obtained. +.PP +\fBParameters:\fP +.RS 4 +\fI_parents\fP the population composed of the parents (the population you want to replace) +.br +\fI_offspring\fP the offspring population +.RE +.PP + +.PP +Definition at line 76 of file moeoElitistReplacement.h. +.PP +References moeoElitistReplacement< MOEOT >::comparator, moeoElitistReplacement< MOEOT >::diversityAssignment, and moeoElitistReplacement< MOEOT >::fitnessAssignment. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement_Cmp.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement_Cmp.3 new file mode 100644 index 000000000..4deab77cf --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoElitistReplacement_Cmp.3 @@ -0,0 +1,57 @@ +.TH "moeoElitistReplacement::Cmp" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoElitistReplacement::Cmp \- this object is used to compare solutions in order to sort the population + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBCmp\fP (\fBmoeoComparator\fP< MOEOT > &_comp)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 is greater than _moeo2 according to the comparator _moeo1 the first individual _moeo2 the first individual. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoComparator\fP< MOEOT > & \fBcomp\fP" +.br +.RI "\fIthe comparator \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoElitistReplacement< MOEOT >::Cmp" +this object is used to compare solutions in order to sort the population +.PP +Definition at line 105 of file moeoElitistReplacement.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoElitistReplacement\fP< MOEOT >::Cmp::Cmp (\fBmoeoComparator\fP< MOEOT > & _comp)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_comp\fP the comparator +.RE +.PP + +.PP +Definition at line 112 of file moeoElitistReplacement.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEntropyMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEntropyMetric.3 new file mode 100644 index 000000000..46e775072 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEntropyMetric.3 @@ -0,0 +1,163 @@ +.TH "moeoEntropyMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEntropyMetric \- The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoVectorVsVectorBinaryMetric< ObjectiveVector, double >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "double \fBoperator()\fP (const std::vector< ObjectiveVector > &_set1, const std::vector< ObjectiveVector > &_set2)" +.br +.RI "\fIReturns the entropy of the Pareto set '_set1' relatively to the Pareto set '_set2'. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "void \fBremoveDominated\fP (std::vector< ObjectiveVector > &_f)" +.br +.RI "\fIRemoves the dominated individuals contained in _f. \fP" +.ti -1c +.RI "void \fBprenormalize\fP (const std::vector< ObjectiveVector > &_f)" +.br +.RI "\fIPrenormalization. \fP" +.ti -1c +.RI "void \fBnormalize\fP (std::vector< ObjectiveVector > &_f)" +.br +.RI "\fINormalization. \fP" +.ti -1c +.RI "void \fBcomputeUnion\fP (const std::vector< ObjectiveVector > &_f1, const std::vector< ObjectiveVector > &_f2, std::vector< ObjectiveVector > &_f)" +.br +.RI "\fIComputation of the union of _f1 and _f2 in _f. \fP" +.ti -1c +.RI "unsigned int \fBhowManyInNicheOf\fP (const std::vector< ObjectiveVector > &_f, const ObjectiveVector &_s, unsigned int _size)" +.br +.RI "\fIHow many in niche. \fP" +.ti -1c +.RI "double \fBeuclidianDistance\fP (const ObjectiveVector &_set1, const ObjectiveVector &_to, unsigned int _deg=2)" +.br +.RI "\fIEuclidian distance. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "std::vector< double > \fBvect_min_val\fP" +.br +.RI "\fIvector of min values \fP" +.ti -1c +.RI "std::vector< double > \fBvect_max_val\fP" +.br +.RI "\fIvector of max values \fP" +.ti -1c +.RI "\fBmoeoParetoObjectiveVectorComparator\fP< ObjectiveVector > \fBparetoComparator\fP" +.br +.RI "\fIFunctor to compare two objective vectors according to Pareto dominance relation. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEntropyMetric< ObjectiveVector >" +The entropy gives an idea of the diversity of a Pareto set relatively to another (Basseur, Seynhaeve, Talbi: 'Design of Multi-objective Evolutionary Algorithms: Application to the Flow-shop Scheduling Problem', in Proc. + +of the 2002 Congress on Evolutionary Computation, IEEE Press, pp. 1155-1156) +.PP +Definition at line 25 of file moeoEntropyMetric.h. +.SH "Member Function Documentation" +.PP +.SS "template double \fBmoeoEntropyMetric\fP< ObjectiveVector >::operator() (const std::vector< ObjectiveVector > & _set1, const std::vector< ObjectiveVector > & _set2)\fC [inline]\fP" +.PP +Returns the entropy of the Pareto set '_set1' relatively to the Pareto set '_set2'. +.PP +\fBParameters:\fP +.RS 4 +\fI_set1\fP the first Pareto set +.br +\fI_set2\fP the second Pareto set +.RE +.PP + +.PP +Definition at line 34 of file moeoEntropyMetric.h. +.PP +References moeoEntropyMetric< ObjectiveVector >::computeUnion(), moeoEntropyMetric< ObjectiveVector >::howManyInNicheOf(), moeoEntropyMetric< ObjectiveVector >::normalize(), moeoEntropyMetric< ObjectiveVector >::prenormalize(), and moeoEntropyMetric< ObjectiveVector >::removeDominated(). +.SS "template void \fBmoeoEntropyMetric\fP< ObjectiveVector >::removeDominated (std::vector< ObjectiveVector > & _f)\fC [inline, private]\fP" +.PP +Removes the dominated individuals contained in _f. +.PP +\fBParameters:\fP +.RS 4 +\fI_f\fP a Pareto set +.RE +.PP + +.PP +Definition at line 85 of file moeoEntropyMetric.h. +.PP +References moeoEntropyMetric< ObjectiveVector >::paretoComparator. +.PP +Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +.SS "template void \fBmoeoEntropyMetric\fP< ObjectiveVector >::prenormalize (const std::vector< ObjectiveVector > & _f)\fC [inline, private]\fP" +.PP +Prenormalization. +.PP +\fBParameters:\fP +.RS 4 +\fI_f\fP a Pareto set +.RE +.PP + +.PP +Definition at line 107 of file moeoEntropyMetric.h. +.PP +References moeoEntropyMetric< ObjectiveVector >::vect_max_val, and moeoEntropyMetric< ObjectiveVector >::vect_min_val. +.PP +Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +.SS "template void \fBmoeoEntropyMetric\fP< ObjectiveVector >::normalize (std::vector< ObjectiveVector > & _f)\fC [inline, private]\fP" +.PP +Normalization. +.PP +\fBParameters:\fP +.RS 4 +\fI_f\fP a Pareto set +.RE +.PP + +.PP +Definition at line 129 of file moeoEntropyMetric.h. +.PP +References moeoEntropyMetric< ObjectiveVector >::vect_max_val, and moeoEntropyMetric< ObjectiveVector >::vect_min_val. +.PP +Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). +.SS "template void \fBmoeoEntropyMetric\fP< ObjectiveVector >::computeUnion (const std::vector< ObjectiveVector > & _f1, const std::vector< ObjectiveVector > & _f2, std::vector< ObjectiveVector > & _f)\fC [inline, private]\fP" +.PP +Computation of the union of _f1 and _f2 in _f. +.PP +\fBParameters:\fP +.RS 4 +\fI_f1\fP the first Pareto set +.br +\fI_f2\fP the second Pareto set +.br +\fI_f\fP the final Pareto set +.RE +.PP + +.PP +Definition at line 142 of file moeoEntropyMetric.h. +.PP +Referenced by moeoEntropyMetric< ObjectiveVector >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement.3 new file mode 100644 index 000000000..7079aad4d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement.3 @@ -0,0 +1,171 @@ +.TH "moeoEnvironmentalReplacement" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEnvironmentalReplacement \- Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoReplacement< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type for objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityAssignment, \fBmoeoComparator\fP< MOEOT > &_comparator)" +.br +.RI "\fIFull constructor. \fP" +.ti -1c +.RI "\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > &_diversityAssignment)" +.br +.RI "\fIConstructor without comparator. \fP" +.ti -1c +.RI "\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment, \fBmoeoComparator\fP< MOEOT > &_comparator)" +.br +.RI "\fIConstructor without moeoDiversityAssignement. \fP" +.ti -1c +.RI "\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > &_fitnessAssignment)" +.br +.RI "\fIConstructor without moeoDiversityAssignement nor \fBmoeoComparator\fP. \fP" +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_parents, \fBeoPop\fP< MOEOT > &_offspring)" +.br +.RI "\fIReplaces the first population by adding the individuals of the second one, sorting with a \fBmoeoComparator\fP and resizing the whole population obtained. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoFitnessAssignment\fP< MOEOT > & \fBfitnessAssignment\fP" +.br +.RI "\fIthe fitness assignment strategy \fP" +.ti -1c +.RI "\fBmoeoDiversityAssignment\fP< MOEOT > & \fBdiversityAssignment\fP" +.br +.RI "\fIthe diversity assignment strategy \fP" +.ti -1c +.RI "\fBmoeoDummyDiversityAssignment\fP< MOEOT > \fBdefaultDiversity\fP" +.br +.RI "\fIa dummy diversity assignment can be used as default \fP" +.ti -1c +.RI "\fBmoeoFitnessThenDiversityComparator\fP< MOEOT > \fBdefaultComparator\fP" +.br +.RI "\fIa fitness then diversity comparator can be used as default \fP" +.ti -1c +.RI "\fBmoeoEnvironmentalReplacement::Cmp\fP \fBcomparator\fP" +.br +.RI "\fIthis object is used to compare solutions in order to sort the population \fP" +.in -1c +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBCmp\fP" +.br +.RI "\fIthis object is used to compare solutions in order to sort the population \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEnvironmentalReplacement< MOEOT >" +Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 and by updating the fitness and diversity values after each deletion. +.PP +Definition at line 26 of file moeoEnvironmentalReplacement.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoEnvironmentalReplacement\fP< MOEOT >::\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityAssignment, \fBmoeoComparator\fP< MOEOT > & _comparator)\fC [inline]\fP" +.PP +Full constructor. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.br +\fI_diversityAssignment\fP the diversity assignment strategy +.br +\fI_comparator\fP the comparator (used to compare 2 individuals) +.RE +.PP + +.PP +Definition at line 40 of file moeoEnvironmentalReplacement.h. +.SS "template \fBmoeoEnvironmentalReplacement\fP< MOEOT >::\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment, \fBmoeoDiversityAssignment\fP< MOEOT > & _diversityAssignment)\fC [inline]\fP" +.PP +Constructor without comparator. +.PP +A moeoFitThenDivComparator is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.br +\fI_diversityAssignment\fP the diversity assignment strategy +.RE +.PP + +.PP +Definition at line 50 of file moeoEnvironmentalReplacement.h. +.SS "template \fBmoeoEnvironmentalReplacement\fP< MOEOT >::\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment, \fBmoeoComparator\fP< MOEOT > & _comparator)\fC [inline]\fP" +.PP +Constructor without moeoDiversityAssignement. +.PP +A dummy diversity is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.br +\fI_comparator\fP the comparator (used to compare 2 individuals) +.RE +.PP + +.PP +Definition at line 60 of file moeoEnvironmentalReplacement.h. +.SS "template \fBmoeoEnvironmentalReplacement\fP< MOEOT >::\fBmoeoEnvironmentalReplacement\fP (\fBmoeoFitnessAssignment\fP< MOEOT > & _fitnessAssignment)\fC [inline]\fP" +.PP +Constructor without moeoDiversityAssignement nor \fBmoeoComparator\fP. +.PP +A moeoFitThenDivComparator and a dummy diversity are used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_fitnessAssignment\fP the fitness assignment strategy +.RE +.PP + +.PP +Definition at line 70 of file moeoEnvironmentalReplacement.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoEnvironmentalReplacement\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _parents, \fBeoPop\fP< MOEOT > & _offspring)\fC [inline]\fP" +.PP +Replaces the first population by adding the individuals of the second one, sorting with a \fBmoeoComparator\fP and resizing the whole population obtained. +.PP +\fBParameters:\fP +.RS 4 +\fI_parents\fP the population composed of the parents (the population you want to replace) +.br +\fI_offspring\fP the offspring population +.RE +.PP + +.PP +Definition at line 80 of file moeoEnvironmentalReplacement.h. +.PP +References moeoEnvironmentalReplacement< MOEOT >::comparator, moeoEnvironmentalReplacement< MOEOT >::diversityAssignment, and moeoEnvironmentalReplacement< MOEOT >::fitnessAssignment. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement_Cmp.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement_Cmp.3 new file mode 100644 index 000000000..de3c16326 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEnvironmentalReplacement_Cmp.3 @@ -0,0 +1,57 @@ +.TH "moeoEnvironmentalReplacement::Cmp" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEnvironmentalReplacement::Cmp \- this object is used to compare solutions in order to sort the population + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBCmp\fP (\fBmoeoComparator\fP< MOEOT > &_comp)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 is greater than _moeo2 according to the comparator _moeo1 the first individual _moeo2 the first individual. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoComparator\fP< MOEOT > & \fBcomp\fP" +.br +.RI "\fIthe comparator \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEnvironmentalReplacement< MOEOT >::Cmp" +this object is used to compare solutions in order to sort the population +.PP +Definition at line 121 of file moeoEnvironmentalReplacement.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoEnvironmentalReplacement\fP< MOEOT >::Cmp::Cmp (\fBmoeoComparator\fP< MOEOT > & _comp)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_comp\fP the comparator +.RE +.PP + +.PP +Definition at line 128 of file moeoEnvironmentalReplacement.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEuclideanDistance.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEuclideanDistance.3 new file mode 100644 index 000000000..eabc5db6f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEuclideanDistance.3 @@ -0,0 +1,61 @@ +.TH "moeoEuclideanDistance" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEuclideanDistance \- A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoNormalizedDistance< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const double \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns the euclidian distance between _moeo1 and _moeo2 in the objective space. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoEuclideanDistance< MOEOT >" +A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. + +between 0 and 1). A distance value then lies between 0 and sqrt(nObjectives). +.PP +Definition at line 24 of file moeoEuclideanDistance.h. +.SH "Member Function Documentation" +.PP +.SS "template const double \fBmoeoEuclideanDistance\fP< MOEOT >::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns the euclidian distance between _moeo1 and _moeo2 in the objective space. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 37 of file moeoEuclideanDistance.h. +.PP +References moeoNormalizedDistance< MOEOT >::bounds. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoEvalFunc.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoEvalFunc.3 new file mode 100644 index 000000000..f8bd77028 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoEvalFunc.3 @@ -0,0 +1,21 @@ +.TH "moeoEvalFunc" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoEvalFunc \- +.SH SYNOPSIS +.br +.PP +Inherits \fBeoEvalFunc< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoEvalFunc< MOEOT >" + +.PP +Definition at line 22 of file moeoEvalFunc.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment.3 new file mode 100644 index 000000000..9ec10b671 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment.3 @@ -0,0 +1,189 @@ +.TH "moeoFastNonDominatedSortingFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoFastNonDominatedSortingFitnessAssignment \- Fitness assignment sheme based on Pareto-dominance count proposed in: N. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoParetoBasedFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoFastNonDominatedSortingFitnessAssignment\fP ()" +.br +.RI "\fIDefault ctor. \fP" +.ti -1c +.RI "\fBmoeoFastNonDominatedSortingFitnessAssignment\fP (\fBmoeoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > &_comparator)" +.br +.RI "\fICtor where you can choose your own way to compare objective vectors. \fP" +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness values for every solution contained in the population _pop. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoneObjective\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness values for mono-objective problems. \fP" +.ti -1c +.RI "void \fBtwoObjectives\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size. \fP" +.ti -1c +.RI "void \fBmObjectives\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness values for problems with more than two objectives with a complexity of O(n² log n), where n stands for the population size. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > & \fBcomparator\fP" +.br +.RI "\fIFunctor to compare two objective vectors. \fP" +.ti -1c +.RI "\fBmoeoParetoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > \fBparetoComparator\fP" +.br +.RI "\fIFunctor to compare two objective vectors according to Pareto dominance relation. \fP" +.ti -1c +.RI "\fBmoeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator\fP \fBobjComparator\fP" +.br +.RI "\fIFunctor allowing to compare two solutions according to their first objective value, then their second, and so on. \fP" +.in -1c +.SS "Classes" + +.in +1c +.ti -1c +.RI "class \fBObjectiveComparator\fP" +.br +.RI "\fIFunctor allowing to compare two solutions according to their first objective value, then their second, and so on. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoFastNonDominatedSortingFitnessAssignment< MOEOT >" +Fitness assignment sheme based on Pareto-dominance count proposed in: N. + +Srinivas, K. Deb, 'Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms', Evolutionary Computation vol. 2, no. 3, pp. 221-248 (1994) and in: K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, 'A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II', IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). This strategy is, for instance, used in NSGA and NSGA-II. +.PP +Definition at line 32 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::\fBmoeoFastNonDominatedSortingFitnessAssignment\fP (\fBmoeoObjectiveVectorComparator\fP< \fBObjectiveVector\fP > & _comparator)\fC [inline]\fP" +.PP +Ctor where you can choose your own way to compare objective vectors. +.PP +\fBParameters:\fP +.RS 4 +\fI_comparator\fP the functor used to compare objective vectors +.RE +.PP + +.PP +Definition at line 51 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the fitness values for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 59 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.PP +References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::mObjectives(), and moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::oneObjective(). +.SS "template void \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implements \fBmoeoFitnessAssignment< MOEOT >\fP. +.PP +Definition at line 101 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.PP +References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::comparator. +.SS "template void \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::oneObjective (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, private]\fP" +.PP +Sets the fitness values for mono-objective problems. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 143 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.PP +References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::objComparator. +.PP +Referenced by moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::operator()(). +.SS "template void \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::twoObjectives (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, private]\fP" +.PP +Sets the fitness values for bi-objective problems with a complexity of O(n log n), where n stands for the population size. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 165 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.SS "template void \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::mObjectives (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, private]\fP" +.PP +Sets the fitness values for problems with more than two objectives with a complexity of O(n² log n), where n stands for the population size. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 175 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.PP +References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::comparator. +.PP +Referenced by moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment_ObjectiveComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment_ObjectiveComparator.3 new file mode 100644 index 000000000..dae6500b6 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoFastNonDominatedSortingFitnessAssignment_ObjectiveComparator.3 @@ -0,0 +1,57 @@ +.TH "moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoFastNonDominatedSortingFitnessAssignment::ObjectiveComparator \- Functor allowing to compare two solutions according to their first objective value, then their second, and so on. + +.PP +.SH SYNOPSIS +.br +.PP +Inherits \fBmoeoComparator< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 < _moeo2 on the first objective, then on the second, and so on. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoObjectiveObjectiveVectorComparator\fP< \fBObjectiveVector\fP > \fBcmp\fP" +.br +.RI "\fIthe corresponding comparator for objective vectors \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator" +Functor allowing to compare two solutions according to their first objective value, then their second, and so on. +.PP +Definition at line 121 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT >::ObjectiveComparator::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns true if _moeo1 < _moeo2 on the first objective, then on the second, and so on. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 129 of file moeoFastNonDominatedSortingFitnessAssignment.h. +.PP +References moeoFastNonDominatedSortingFitnessAssignment< MOEOT >::ObjectiveComparator::cmp. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoFitnessAssignment.3 new file mode 100644 index 000000000..e03e533d1 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoFitnessAssignment.3 @@ -0,0 +1,81 @@ +.TH "moeoFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoFitnessAssignment \- Functor that sets the fitness values of a whole population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Inherited by \fBmoeoCriterionBasedFitnessAssignment< MOEOT >\fP, \fBmoeoDummyFitnessAssignment< MOEOT >\fP, \fBmoeoIndicatorBasedFitnessAssignment< MOEOT >\fP, \fBmoeoParetoBasedFitnessAssignment< MOEOT >\fP, and \fBmoeoScalarFitnessAssignment< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type for objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "virtual void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)=0" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, MOEOT &_moeo)" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the deletion of the individual _moeo into account. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoFitnessAssignment< MOEOT >" +Functor that sets the fitness values of a whole population. +.PP +Definition at line 23 of file moeoFitnessAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoFitnessAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [pure virtual]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implemented in \fBmoeoAchievementFitnessAssignment< MOEOT >\fP, \fBmoeoDummyFitnessAssignment< MOEOT >\fP, \fBmoeoFastNonDominatedSortingFitnessAssignment< MOEOT >\fP, and \fBmoeoIndicatorBasedFitnessAssignment< MOEOT >\fP. +.PP +Referenced by moeoFitnessAssignment< MOEOT >::updateByDeleting(). +.SS "template void \fBmoeoFitnessAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, MOEOT & _moeo)\fC [inline]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the deletion of the individual _moeo into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_moeo\fP the individual +.RE +.PP + +.PP +Definition at line 44 of file moeoFitnessAssignment.h. +.PP +References moeoFitnessAssignment< MOEOT >::updateByDeleting(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoFitnessThenDiversityComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoFitnessThenDiversityComparator.3 new file mode 100644 index 000000000..bf979ca75 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoFitnessThenDiversityComparator.3 @@ -0,0 +1,49 @@ +.TH "moeoFitnessThenDiversityComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoFitnessThenDiversityComparator \- Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoComparator< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 < _moeo2 according to their fitness values, then according to their diversity values. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoFitnessThenDiversityComparator< MOEOT >" +Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. +.PP +Definition at line 22 of file moeoFitnessThenDiversityComparator.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoFitnessThenDiversityComparator\fP< MOEOT >::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns true if _moeo1 < _moeo2 according to their fitness values, then according to their diversity values. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 31 of file moeoFitnessThenDiversityComparator.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontCrowdingDistanceDiversityAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontCrowdingDistanceDiversityAssignment.3 new file mode 100644 index 000000000..3b2f84154 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontCrowdingDistanceDiversityAssignment.3 @@ -0,0 +1,112 @@ +.TH "moeoFrontByFrontCrowdingDistanceDiversityAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoFrontByFrontCrowdingDistanceDiversityAssignment \- Diversity assignment sheme based on crowding distance proposed in: K. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoCrowdingDistanceDiversityAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "void \fBsetDistances\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the distance values. \fP" +.ti -1c +.RI "unsigned int \fBlastIndex\fP (\fBeoPop\fP< MOEOT > &_pop, unsigned int _start)" +.br +.RI "\fIReturns the index of the last individual having the same fitness value than _pop[_start]. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >" +Diversity assignment sheme based on crowding distance proposed in: K. + +Deb, A. Pratap, S. Agarwal, T. Meyarivan, 'A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II', IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). Tis strategy assigns diversity values FRONT BY FRONT. It is, for instance, used in NSGA-II. +.PP +Definition at line 25 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.RE +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! +.RE +.PP + +.PP +Reimplemented from \fBmoeoCrowdingDistanceDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 40 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h. +.SS "template void \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment\fP< MOEOT >::setDistances (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, private, virtual]\fP" +.PP +Sets the distance values. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Reimplemented from \fBmoeoCrowdingDistanceDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 55 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h. +.PP +References moeoCrowdingDistanceDiversityAssignment< MOEOT >::inf(), moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >::lastIndex(), and moeoCrowdingDistanceDiversityAssignment< MOEOT >::tiny(). +.SS "template unsigned int \fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment\fP< MOEOT >::lastIndex (\fBeoPop\fP< MOEOT > & _pop, unsigned int _start)\fC [inline, private]\fP" +.PP +Returns the index of the last individual having the same fitness value than _pop[_start]. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_start\fP the index to start from +.RE +.PP + +.PP +Definition at line 121 of file moeoFrontByFrontCrowdingDistanceDiversityAssignment.h. +.PP +Referenced by moeoFrontByFrontCrowdingDistanceDiversityAssignment< MOEOT >::setDistances(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontSharingDiversityAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontSharingDiversityAssignment.3 new file mode 100644 index 000000000..678dc3b5c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoFrontByFrontSharingDiversityAssignment.3 @@ -0,0 +1,130 @@ +.TH "moeoFrontByFrontSharingDiversityAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoFrontByFrontSharingDiversityAssignment \- Sharing assignment scheme on the way it is used in NSGA. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSharingDiversityAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoFrontByFrontSharingDiversityAssignment\fP (\fBmoeoDistance\fP< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=2.0)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "\fBmoeoFrontByFrontSharingDiversityAssignment\fP (double _nicheSize=0.5, double _alpha=2.0)" +.br +.RI "\fICtor with an euclidean distance (with normalized objective values) in the objective space is used as default. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "void \fBsetSimilarities\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets similarities FRONT BY FRONT for every solution contained in the population _pop. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoFrontByFrontSharingDiversityAssignment< MOEOT >" +Sharing assignment scheme on the way it is used in NSGA. +.PP +Definition at line 22 of file moeoFrontByFrontSharingDiversityAssignment.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoFrontByFrontSharingDiversityAssignment\fP< MOEOT >::\fBmoeoFrontByFrontSharingDiversityAssignment\fP (\fBmoeoDistance\fP< MOEOT, double > & _distance, double _nicheSize = \fC0.5\fP, double _alpha = \fC2.0\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_distance\fP the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) +.br +\fI_nicheSize\fP neighborhood size in terms of radius distance (closely related to the way the distances are computed) +.br +\fI_alpha\fP parameter used to regulate the shape of the sharing function +.RE +.PP + +.PP +Definition at line 36 of file moeoFrontByFrontSharingDiversityAssignment.h. +.SS "template \fBmoeoFrontByFrontSharingDiversityAssignment\fP< MOEOT >::\fBmoeoFrontByFrontSharingDiversityAssignment\fP (double _nicheSize = \fC0.5\fP, double _alpha = \fC2.0\fP)\fC [inline]\fP" +.PP +Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_nicheSize\fP neighborhood size in terms of radius distance (closely related to the way the distances are computed) +.br +\fI_alpha\fP parameter used to regulate the shape of the sharing function +.RE +.PP + +.PP +Definition at line 45 of file moeoFrontByFrontSharingDiversityAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoFrontByFrontSharingDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.RE +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! +.RE +.PP + +.PP +Reimplemented from \fBmoeoSharingDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 56 of file moeoFrontByFrontSharingDiversityAssignment.h. +.SS "template void \fBmoeoFrontByFrontSharingDiversityAssignment\fP< MOEOT >::setSimilarities (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, private, virtual]\fP" +.PP +Sets similarities FRONT BY FRONT for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Reimplemented from \fBmoeoSharingDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 74 of file moeoFrontByFrontSharingDiversityAssignment.h. +.PP +References moeoSharingDiversityAssignment< MOEOT >::distance, moeoSharingDiversityAssignment< MOEOT >::nicheSize, and moeoSharingDiversityAssignment< MOEOT >::sh(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoGDominanceObjectiveVectorComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoGDominanceObjectiveVectorComparator.3 new file mode 100644 index 000000000..bb041ace6 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoGDominanceObjectiveVectorComparator.3 @@ -0,0 +1,107 @@ +.TH "moeoGDominanceObjectiveVectorComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoGDominanceObjectiveVectorComparator \- This functor class allows to compare 2 objective vectors according to g-dominance. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoObjectiveVectorComparator< ObjectiveVector >< ObjectiveVector >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoGDominanceObjectiveVectorComparator\fP (ObjectiveVector &_ref)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "const bool \fBoperator()\fP (const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)" +.br +.RI "\fIReturns true if _objectiveVector1 is g-dominated by _objectiveVector2. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "unsigned int \fBflag\fP (const ObjectiveVector &_objectiveVector)" +.br +.RI "\fIReturns the flag of _objectiveVector according to the reference point. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "ObjectiveVector & \fBref\fP" +.br +.RI "\fIthe reference point \fP" +.ti -1c +.RI "\fBmoeoParetoObjectiveVectorComparator\fP< ObjectiveVector > \fBparetoComparator\fP" +.br +.RI "\fIPareto comparator. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoGDominanceObjectiveVectorComparator< ObjectiveVector >" +This functor class allows to compare 2 objective vectors according to g-dominance. + +The concept of g-dominance as been introduced in: J. Molina, L. V. Santana, A. G. Hernandez-Diaz, C. A. Coello Coello, R. Caballero, 'g-dominance: Reference point based dominance' (2007) +.PP +Definition at line 25 of file moeoGDominanceObjectiveVectorComparator.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoGDominanceObjectiveVectorComparator\fP< ObjectiveVector >::\fBmoeoGDominanceObjectiveVectorComparator\fP (ObjectiveVector & _ref)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_ref\fP the reference point +.RE +.PP + +.PP +Definition at line 33 of file moeoGDominanceObjectiveVectorComparator.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoGDominanceObjectiveVectorComparator\fP< ObjectiveVector >::operator() (const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)\fC [inline]\fP" +.PP +Returns true if _objectiveVector1 is g-dominated by _objectiveVector2. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVector1\fP the first objective vector +.br +\fI_objectiveVector2\fP the second objective vector +.RE +.PP + +.PP +Definition at line 42 of file moeoGDominanceObjectiveVectorComparator.h. +.PP +References moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::flag(), and moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::paretoComparator. +.SS "template unsigned int \fBmoeoGDominanceObjectiveVectorComparator\fP< ObjectiveVector >::flag (const ObjectiveVector & _objectiveVector)\fC [inline, private]\fP" +.PP +Returns the flag of _objectiveVector according to the reference point. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVector\fP the first objective vector +.RE +.PP + +.PP +Definition at line 76 of file moeoGDominanceObjectiveVectorComparator.h. +.PP +References moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::ref. +.PP +Referenced by moeoGDominanceObjectiveVectorComparator< ObjectiveVector >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoGenerationalReplacement.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoGenerationalReplacement.3 new file mode 100644 index 000000000..971461a5d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoGenerationalReplacement.3 @@ -0,0 +1,51 @@ +.TH "moeoGenerationalReplacement" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoGenerationalReplacement \- Generational replacement: only the new individuals are preserved. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoReplacement< MOEOT >< MOEOT >\fP, and \fBeoGenerationalReplacement< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_parents, \fBeoPop\fP< MOEOT > &_offspring)" +.br +.RI "\fISwaps _parents and _offspring. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoGenerationalReplacement< MOEOT >" +Generational replacement: only the new individuals are preserved. +.PP +Definition at line 23 of file moeoGenerationalReplacement.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoGenerationalReplacement\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _parents, \fBeoPop\fP< MOEOT > & _offspring)\fC [inline]\fP" +.PP +Swaps _parents and _offspring. +.PP +\fBParameters:\fP +.RS 4 +\fI_parents\fP the parents population +.br +\fI_offspring\fP the offspring population +.RE +.PP + +.PP +Reimplemented from \fBeoGenerationalReplacement< MOEOT >\fP. +.PP +Definition at line 32 of file moeoGenerationalReplacement.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoHybridLS.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoHybridLS.3 new file mode 100644 index 000000000..5bdeabc59 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoHybridLS.3 @@ -0,0 +1,77 @@ +.TH "moeoHybridLS" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoHybridLS \- This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUpdater\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoHybridLS\fP (\fBeoContinue\fP< MOEOT > &_term, \fBeoSelect\fP< MOEOT > &_select, \fBmoeoLS\fP< MOEOT, MOEOT > &_mols, \fBmoeoArchive\fP< MOEOT > &_arch)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBoperator()\fP ()" +.br +.RI "\fIApplies the multi-objective local search to selected individuals contained in the archive if the stopping criteria is not verified. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBeoContinue\fP< MOEOT > & \fBterm\fP" +.br +.RI "\fIstopping criteria \fP" +.ti -1c +.RI "\fBeoSelect\fP< MOEOT > & \fBselect\fP" +.br +.RI "\fIselector \fP" +.ti -1c +.RI "\fBmoeoLS\fP< MOEOT, MOEOT > & \fBmols\fP" +.br +.RI "\fImulti-objective local search \fP" +.ti -1c +.RI "\fBmoeoArchive\fP< MOEOT > & \fBarch\fP" +.br +.RI "\fIarchive \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoHybridLS< MOEOT >" +This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive at every generation until a stopping criteria is verified. +.PP +Definition at line 28 of file moeoHybridLS.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoHybridLS\fP< MOEOT >::\fBmoeoHybridLS\fP (\fBeoContinue\fP< MOEOT > & _term, \fBeoSelect\fP< MOEOT > & _select, \fBmoeoLS\fP< MOEOT, MOEOT > & _mols, \fBmoeoArchive\fP< MOEOT > & _arch)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_term\fP stopping criteria +.br +\fI_select\fP selector +.br +\fI_mols\fP a multi-objective local search +.br +\fI_arch\fP the archive +.RE +.PP + +.PP +Definition at line 39 of file moeoHybridLS.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoHypervolumeBinaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoHypervolumeBinaryMetric.3 new file mode 100644 index 000000000..46e505aeb --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoHypervolumeBinaryMetric.3 @@ -0,0 +1,120 @@ +.TH "moeoHypervolumeBinaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoHypervolumeBinaryMetric \- Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., Künzli S. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoHypervolumeBinaryMetric\fP (double _rho=1.1)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "double \fBoperator()\fP (const ObjectiveVector &_o1, const ObjectiveVector &_o2)" +.br +.RI "\fIReturns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho. \fP" +.in -1c +.SS "Private Member Functions" + +.in +1c +.ti -1c +.RI "double \fBhypervolume\fP (const ObjectiveVector &_o1, const ObjectiveVector &_o2, const unsigned int _obj, const bool _flag=false)" +.br +.RI "\fIReturns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "double \fBrho\fP" +.br +.RI "\fIvalue used to compute the reference point from the worst values for each objective \fP" +.ti -1c +.RI "\fBmoeoParetoObjectiveVectorComparator\fP< ObjectiveVector > \fBparetoComparator\fP" +.br +.RI "\fIFunctor to compare two objective vectors according to Pareto dominance relation. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoHypervolumeBinaryMetric< ObjectiveVector >" +Hypervolume binary metric allowing to compare two objective vectors as proposed in Zitzler E., Künzli S. + +: Indicator-Based Selection in Multiobjective Search. In Parallel Problem Solving from Nature (PPSN VIII). Lecture Notes in Computer Science 3242, Springer, Birmingham, UK pp.832–842 (2004). This indicator is based on the hypervolume concept introduced in Zitzler, E., Thiele, L.: Multiobjective Optimization Using Evolutionary Algorithms - A Comparative Case Study. Parallel Problem Solving from Nature (PPSN-V), pp.292-301 (1998). +.PP +Definition at line 29 of file moeoHypervolumeBinaryMetric.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoHypervolumeBinaryMetric\fP< ObjectiveVector >::\fBmoeoHypervolumeBinaryMetric\fP (double _rho = \fC1.1\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_rho\fP value used to compute the reference point from the worst values for each objective (default : 1.1) +.RE +.PP + +.PP +Definition at line 37 of file moeoHypervolumeBinaryMetric.h. +.PP +References moeoHypervolumeBinaryMetric< ObjectiveVector >::rho. +.SH "Member Function Documentation" +.PP +.SS "template double \fBmoeoHypervolumeBinaryMetric\fP< ObjectiveVector >::operator() (const ObjectiveVector & _o1, const ObjectiveVector & _o2)\fC [inline]\fP" +.PP +Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho. +.PP +\fBWarning:\fP +.RS 4 +don't forget to set the bounds for every objective before the call of this function +.RE +.PP +\fBParameters:\fP +.RS 4 +\fI_o1\fP the first objective vector +.br +\fI_o2\fP the second objective vector +.RE +.PP + +.PP +Definition at line 63 of file moeoHypervolumeBinaryMetric.h. +.PP +References moeoHypervolumeBinaryMetric< ObjectiveVector >::hypervolume(), and moeoHypervolumeBinaryMetric< ObjectiveVector >::paretoComparator. +.SS "template double \fBmoeoHypervolumeBinaryMetric\fP< ObjectiveVector >::hypervolume (const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned int _obj, const bool _flag = \fCfalse\fP)\fC [inline, private]\fP" +.PP +Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj. +.PP +\fBParameters:\fP +.RS 4 +\fI_o1\fP the first objective vector +.br +\fI_o2\fP the second objective vector +.br +\fI_obj\fP the objective index +.br +\fI_flag\fP used for iteration, if _flag=true _o2 is not talen into account (default : false) +.RE +.PP + +.PP +Definition at line 96 of file moeoHypervolumeBinaryMetric.h. +.PP +References moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, double >::bounds, and moeoHypervolumeBinaryMetric< ObjectiveVector >::rho. +.PP +Referenced by moeoHypervolumeBinaryMetric< ObjectiveVector >::operator()(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoIBEA.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoIBEA.3 new file mode 100644 index 000000000..a8028ec5a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoIBEA.3 @@ -0,0 +1,231 @@ +.TH "moeoIBEA" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoIBEA \- IBEA (Indicator-Based Evolutionary Algorithm) as described in: E. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoEA< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type of objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoIBEA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoGenOp\fP< MOEOT > &_op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const double _kappa=0.05)" +.br +.RI "\fISimple ctor with a \fBeoGenOp\fP. \fP" +.ti -1c +.RI "\fBmoeoIBEA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoTransform\fP< MOEOT > &_op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const double _kappa=0.05)" +.br +.RI "\fISimple ctor with a \fBeoTransform\fP. \fP" +.ti -1c +.RI "\fBmoeoIBEA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoQuadOp\fP< MOEOT > &_crossover, double _pCross, \fBeoMonOp\fP< MOEOT > &_mutation, double _pMut, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const double _kappa=0.05)" +.br +.RI "\fICtor with a crossover, a mutation and their corresponding rates. \fP" +.ti -1c +.RI "\fBmoeoIBEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoGenOp\fP< MOEOT > &_op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const double _kappa=0.05)" +.br +.RI "\fICtor with a continuator (instead of _maxGen) and a \fBeoGenOp\fP. \fP" +.ti -1c +.RI "\fBmoeoIBEA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoTransform\fP< MOEOT > &_op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const double _kappa=0.05)" +.br +.RI "\fICtor with a continuator (instead of _maxGen) and a \fBeoTransform\fP. \fP" +.ti -1c +.RI "virtual void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApply a few generation of evolution to the population _pop until the stopping criteria is verified. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBeoGenContinue\fP< MOEOT > \fBdefaultGenContinuator\fP" +.br +.RI "\fIa continuator based on the number of generations (used as default) \fP" +.ti -1c +.RI "\fBeoContinue\fP< MOEOT > & \fBcontinuator\fP" +.br +.RI "\fIstopping criteria \fP" +.ti -1c +.RI "\fBeoPopLoopEval\fP< MOEOT > \fBpopEval\fP" +.br +.RI "\fIevaluation function used to evaluate the whole population \fP" +.ti -1c +.RI "\fBmoeoDetTournamentSelect\fP< MOEOT > \fBselect\fP" +.br +.RI "\fIbinary tournament selection \fP" +.ti -1c +.RI "\fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT > \fBfitnessAssignment\fP" +.br +.RI "\fIfitness assignment used in IBEA \fP" +.ti -1c +.RI "\fBmoeoDummyDiversityAssignment\fP< MOEOT > \fBdummyDiversityAssignment\fP" +.br +.RI "\fIdummy diversity assignment \fP" +.ti -1c +.RI "\fBmoeoEnvironmentalReplacement\fP< MOEOT > \fBreplace\fP" +.br +.RI "\fIelitist replacement \fP" +.ti -1c +.RI "\fBeoSGAGenOp\fP< MOEOT > \fBdefaultSGAGenOp\fP" +.br +.RI "\fIan object for genetic operators (used as default) \fP" +.ti -1c +.RI "\fBeoGeneralBreeder\fP< MOEOT > \fBgenBreed\fP" +.br +.RI "\fIgeneral breeder \fP" +.ti -1c +.RI "\fBeoBreed\fP< MOEOT > & \fBbreed\fP" +.br +.RI "\fIbreeder \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoIBEA< MOEOT >" +IBEA (Indicator-Based Evolutionary Algorithm) as described in: E. + +Zitzler, S. Künzli, 'Indicator-Based Selection in Multiobjective Search', Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). This class builds the IBEA algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. +.PP +Definition at line 38 of file moeoIBEA.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoIBEA\fP< MOEOT >::\fBmoeoIBEA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoGenOp\fP< MOEOT > & _op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const double _kappa = \fC0.05\fP)\fC [inline]\fP" +.PP +Simple ctor with a \fBeoGenOp\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_metric\fP metric +.br +\fI_kappa\fP scaling factor kappa +.RE +.PP + +.PP +Definition at line 54 of file moeoIBEA.h. +.SS "template \fBmoeoIBEA\fP< MOEOT >::\fBmoeoIBEA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoTransform\fP< MOEOT > & _op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const double _kappa = \fC0.05\fP)\fC [inline]\fP" +.PP +Simple ctor with a \fBeoTransform\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_metric\fP metric +.br +\fI_kappa\fP scaling factor kappa +.RE +.PP + +.PP +Definition at line 68 of file moeoIBEA.h. +.SS "template \fBmoeoIBEA\fP< MOEOT >::\fBmoeoIBEA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoQuadOp\fP< MOEOT > & _crossover, double _pCross, \fBeoMonOp\fP< MOEOT > & _mutation, double _pMut, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const double _kappa = \fC0.05\fP)\fC [inline]\fP" +.PP +Ctor with a crossover, a mutation and their corresponding rates. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_crossover\fP crossover +.br +\fI_pCross\fP crossover probability +.br +\fI_mutation\fP mutation +.br +\fI_pMut\fP mutation probability +.br +\fI_metric\fP metric +.br +\fI_kappa\fP scaling factor kappa +.RE +.PP + +.PP +Definition at line 85 of file moeoIBEA.h. +.SS "template \fBmoeoIBEA\fP< MOEOT >::\fBmoeoIBEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoGenOp\fP< MOEOT > & _op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const double _kappa = \fC0.05\fP)\fC [inline]\fP" +.PP +Ctor with a continuator (instead of _maxGen) and a \fBeoGenOp\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP stopping criteria +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_metric\fP metric +.br +\fI_kappa\fP scaling factor kappa +.RE +.PP + +.PP +Definition at line 100 of file moeoIBEA.h. +.SS "template \fBmoeoIBEA\fP< MOEOT >::\fBmoeoIBEA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoTransform\fP< MOEOT > & _op, \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const double _kappa = \fC0.05\fP)\fC [inline]\fP" +.PP +Ctor with a continuator (instead of _maxGen) and a \fBeoTransform\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP stopping criteria +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_metric\fP metric +.br +\fI_kappa\fP scaling factor kappa +.RE +.PP + +.PP +Definition at line 114 of file moeoIBEA.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoIBEA\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Apply a few generation of evolution to the population _pop until the stopping criteria is verified. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 124 of file moeoIBEA.h. +.PP +References moeoIBEA< MOEOT >::breed, moeoIBEA< MOEOT >::continuator, moeoIBEA< MOEOT >::dummyDiversityAssignment, moeoIBEA< MOEOT >::fitnessAssignment, moeoIBEA< MOEOT >::popEval, and moeoIBEA< MOEOT >::replace. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoIndicatorBasedFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoIndicatorBasedFitnessAssignment.3 new file mode 100644 index 000000000..ed8c9d36b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoIndicatorBasedFitnessAssignment.3 @@ -0,0 +1,223 @@ +.TH "moeoIndicatorBasedFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoIndicatorBasedFitnessAssignment \- Fitness assignment sheme based an Indicator proposed in: E. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIThe type of objective vector. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoIndicatorBasedFitnessAssignment\fP (\fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > &_metric, const double _kappa=0.05)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness values for every solution contained in the population _pop. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. \fP" +.ti -1c +.RI "double \fBupdateByAdding\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.RI "\fIUpdates the fitness values of the whole population _pop by taking the adding of the objective vector _objVec into account and returns the fitness value of _objVec. \fP" +.in -1c +.SS "Protected Member Functions" + +.in +1c +.ti -1c +.RI "void \fBsetup\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the bounds for every objective using the min and the max value for every objective vector of _pop. \fP" +.ti -1c +.RI "void \fBcomputeValues\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fICompute every indicator value in values (values[i] = I(_v[i], _o)). \fP" +.ti -1c +.RI "void \fBsetFitnesses\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the fitness value of the whple population. \fP" +.ti -1c +.RI "double \fBcomputeFitness\fP (const unsigned int _idx)" +.br +.RI "\fIReturns the fitness value of the _idx th individual of the population. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & \fBmetric\fP" +.br +.RI "\fIthe quality indicator \fP" +.ti -1c +.RI "double \fBkappa\fP" +.br +.RI "\fIthe scaling factor \fP" +.ti -1c +.RI "std::vector< std::vector< double > > \fBvalues\fP" +.br +.RI "\fIthe computed indicator values \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoIndicatorBasedFitnessAssignment< MOEOT >" +Fitness assignment sheme based an Indicator proposed in: E. + +Zitzler, S. Künzli, 'Indicator-Based Selection in Multiobjective Search', Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). This strategy is, for instance, used in IBEA. +.PP +Definition at line 29 of file moeoIndicatorBasedFitnessAssignment.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::\fBmoeoIndicatorBasedFitnessAssignment\fP (\fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< \fBObjectiveVector\fP, double > & _metric, const double _kappa = \fC0.05\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_metric\fP the quality indicator +.br +\fI_kappa\fP the scaling factor +.RE +.PP + +.PP +Definition at line 42 of file moeoIndicatorBasedFitnessAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the fitness values for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 50 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::computeValues(), moeoIndicatorBasedFitnessAssignment< MOEOT >::setFitnesses(), and moeoIndicatorBasedFitnessAssignment< MOEOT >::setup(). +.SS "template void \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Implements \fBmoeoFitnessAssignment< MOEOT >\fP. +.PP +Definition at line 66 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::kappa, and moeoIndicatorBasedFitnessAssignment< MOEOT >::metric. +.SS "template double \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::updateByAdding (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline]\fP" +.PP +Updates the fitness values of the whole population _pop by taking the adding of the objective vector _objVec into account and returns the fitness value of _objVec. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP + +.PP +Definition at line 87 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::kappa, and moeoIndicatorBasedFitnessAssignment< MOEOT >::metric. +.SS "template void \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::setup (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline, protected]\fP" +.PP +Sets the bounds for every objective using the min and the max value for every objective vector of _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 130 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::metric, and moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >::setup(). +.PP +Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::operator()(). +.SS "template void \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::computeValues (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline, protected]\fP" +.PP +Compute every indicator value in values (values[i] = I(_v[i], _o)). +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 152 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::metric, and moeoIndicatorBasedFitnessAssignment< MOEOT >::values. +.PP +Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::operator()(). +.SS "template void \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::setFitnesses (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, protected]\fP" +.PP +Sets the fitness value of the whple population. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 174 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::computeFitness(). +.PP +Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::operator()(). +.SS "template double \fBmoeoIndicatorBasedFitnessAssignment\fP< MOEOT >::computeFitness (const unsigned int _idx)\fC [inline, protected]\fP" +.PP +Returns the fitness value of the _idx th individual of the population. +.PP +\fBParameters:\fP +.RS 4 +\fI_idx\fP the index +.RE +.PP + +.PP +Definition at line 187 of file moeoIndicatorBasedFitnessAssignment.h. +.PP +References moeoIndicatorBasedFitnessAssignment< MOEOT >::kappa, and moeoIndicatorBasedFitnessAssignment< MOEOT >::values. +.PP +Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::setFitnesses(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoLS.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoLS.3 new file mode 100644 index 000000000..4299546a6 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoLS.3 @@ -0,0 +1,29 @@ +.TH "moeoLS" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoLS \- Abstract class for local searches applied to multi-objective optimization. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoAlgo\fP, and \fBeoBF< Type, moeoArchive< MOEOT > &, void >\fP. +.PP +Inherited by \fBmoeoCombinedLS< MOEOT, Type >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoLS< MOEOT, Type >" +Abstract class for local searches applied to multi-objective optimization. + +Starting from a Type (i.e.: an individual, a pop, an archive...), it produces a set of new non-dominated solutions. +.PP +Definition at line 25 of file moeoLS.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoManhattanDistance.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoManhattanDistance.3 new file mode 100644 index 000000000..824c01438 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoManhattanDistance.3 @@ -0,0 +1,61 @@ +.TH "moeoManhattanDistance" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoManhattanDistance \- A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoNormalizedDistance< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const double \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns the Manhattan distance between _moeo1 and _moeo2 in the objective space. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoManhattanDistance< MOEOT >" +A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. + +between 0 and 1). A distance value then lies between 0 and nObjectives. +.PP +Definition at line 24 of file moeoManhattanDistance.h. +.SH "Member Function Documentation" +.PP +.SS "template const double \fBmoeoManhattanDistance\fP< MOEOT >::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns the Manhattan distance between _moeo1 and _moeo2 in the objective space. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 37 of file moeoManhattanDistance.h. +.PP +References moeoNormalizedDistance< MOEOT >::bounds. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoMetric.3 new file mode 100644 index 000000000..fb1318b47 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoMetric.3 @@ -0,0 +1,25 @@ +.TH "moeoMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoMetric \- Base class for performance metrics (also known as quality indicators). + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoFunctorBase\fP. +.PP +Inherited by \fBmoeoBinaryMetric< A1, A2, R >\fP, \fBmoeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, double >\fP, \fBmoeoBinaryMetric< const const ObjectiveVector &, ObjectiveVector &, R >\fP, \fBmoeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, double >\fP, \fBmoeoBinaryMetric< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, R >\fP, \fBmoeoUnaryMetric< A, R >\fP, \fBmoeoUnaryMetric< const ObjectiveVector &, R >\fP, and \fBmoeoUnaryMetric< const std::vector< ObjectiveVector > &, R >\fP. +.PP +.SH "Detailed Description" +.PP +Base class for performance metrics (also known as quality indicators). +.PP +Definition at line 22 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoNSGA.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoNSGA.3 new file mode 100644 index 000000000..4ec4f822c --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoNSGA.3 @@ -0,0 +1,213 @@ +.TH "moeoNSGA" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoNSGA \- NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoEA< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoNSGA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoGenOp\fP< MOEOT > &_op, double _nicheSize=0.5)" +.br +.RI "\fISimple ctor with a \fBeoGenOp\fP. \fP" +.ti -1c +.RI "\fBmoeoNSGA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoTransform\fP< MOEOT > &_op, double _nicheSize=0.5)" +.br +.RI "\fISimple ctor with a \fBeoTransform\fP. \fP" +.ti -1c +.RI "\fBmoeoNSGA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoQuadOp\fP< MOEOT > &_crossover, double _pCross, \fBeoMonOp\fP< MOEOT > &_mutation, double _pMut, double _nicheSize=0.5)" +.br +.RI "\fICtor with a crossover, a mutation and their corresponding rates. \fP" +.ti -1c +.RI "\fBmoeoNSGA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoGenOp\fP< MOEOT > &_op, double _nicheSize=0.5)" +.br +.RI "\fICtor with a continuator (instead of _maxGen) and a \fBeoGenOp\fP. \fP" +.ti -1c +.RI "\fBmoeoNSGA\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoTransform\fP< MOEOT > &_op, double _nicheSize=0.5)" +.br +.RI "\fICtor with a continuator (instead of _maxGen) and a \fBeoTransform\fP. \fP" +.ti -1c +.RI "virtual void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApply a few generation of evolution to the population _pop until the stopping criteria is verified. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBeoGenContinue\fP< MOEOT > \fBdefaultGenContinuator\fP" +.br +.RI "\fIa continuator based on the number of generations (used as default) \fP" +.ti -1c +.RI "\fBeoContinue\fP< MOEOT > & \fBcontinuator\fP" +.br +.RI "\fIstopping criteria \fP" +.ti -1c +.RI "\fBeoPopLoopEval\fP< MOEOT > \fBpopEval\fP" +.br +.RI "\fIevaluation function used to evaluate the whole population \fP" +.ti -1c +.RI "\fBmoeoDetTournamentSelect\fP< MOEOT > \fBselect\fP" +.br +.RI "\fIbinary tournament selection \fP" +.ti -1c +.RI "\fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT > \fBfitnessAssignment\fP" +.br +.RI "\fIfitness assignment used in NSGA-II \fP" +.ti -1c +.RI "\fBmoeoFrontByFrontSharingDiversityAssignment\fP< MOEOT > \fBdiversityAssignment\fP" +.br +.RI "\fIdiversity assignment used in NSGA-II \fP" +.ti -1c +.RI "\fBmoeoElitistReplacement\fP< MOEOT > \fBreplace\fP" +.br +.RI "\fIelitist replacement \fP" +.ti -1c +.RI "\fBeoSGAGenOp\fP< MOEOT > \fBdefaultSGAGenOp\fP" +.br +.RI "\fIan object for genetic operators (used as default) \fP" +.ti -1c +.RI "\fBeoGeneralBreeder\fP< MOEOT > \fBgenBreed\fP" +.br +.RI "\fIgeneral breeder \fP" +.ti -1c +.RI "\fBeoBreed\fP< MOEOT > & \fBbreed\fP" +.br +.RI "\fIbreeder \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoNSGA< MOEOT >" +NSGA (Non-dominated Sorting Genetic Algorithm) as described in: N. + +Srinivas, K. Deb, 'Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms'. Evolutionary Computation, Vol. 2(3), No 2, pp. 221-248 (1994). This class builds the NSGA algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. +.PP +Definition at line 37 of file moeoNSGA.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoNSGA\fP< MOEOT >::\fBmoeoNSGA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoGenOp\fP< MOEOT > & _op, double _nicheSize = \fC0.5\fP)\fC [inline]\fP" +.PP +Simple ctor with a \fBeoGenOp\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_nicheSize\fP niche size +.RE +.PP + +.PP +Definition at line 48 of file moeoNSGA.h. +.SS "template \fBmoeoNSGA\fP< MOEOT >::\fBmoeoNSGA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoTransform\fP< MOEOT > & _op, double _nicheSize = \fC0.5\fP)\fC [inline]\fP" +.PP +Simple ctor with a \fBeoTransform\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_nicheSize\fP niche size +.RE +.PP + +.PP +Definition at line 61 of file moeoNSGA.h. +.SS "template \fBmoeoNSGA\fP< MOEOT >::\fBmoeoNSGA\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoQuadOp\fP< MOEOT > & _crossover, double _pCross, \fBeoMonOp\fP< MOEOT > & _mutation, double _pMut, double _nicheSize = \fC0.5\fP)\fC [inline]\fP" +.PP +Ctor with a crossover, a mutation and their corresponding rates. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_crossover\fP crossover +.br +\fI_pCross\fP crossover probability +.br +\fI_mutation\fP mutation +.br +\fI_pMut\fP mutation probability +.br +\fI_nicheSize\fP niche size +.RE +.PP + +.PP +Definition at line 77 of file moeoNSGA.h. +.SS "template \fBmoeoNSGA\fP< MOEOT >::\fBmoeoNSGA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoGenOp\fP< MOEOT > & _op, double _nicheSize = \fC0.5\fP)\fC [inline]\fP" +.PP +Ctor with a continuator (instead of _maxGen) and a \fBeoGenOp\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP stopping criteria +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_nicheSize\fP niche size +.RE +.PP + +.PP +Definition at line 91 of file moeoNSGA.h. +.SS "template \fBmoeoNSGA\fP< MOEOT >::\fBmoeoNSGA\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoTransform\fP< MOEOT > & _op, double _nicheSize = \fC0.5\fP)\fC [inline]\fP" +.PP +Ctor with a continuator (instead of _maxGen) and a \fBeoTransform\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP stopping criteria +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.br +\fI_nicheSize\fP niche size +.RE +.PP + +.PP +Definition at line 104 of file moeoNSGA.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoNSGA\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Apply a few generation of evolution to the population _pop until the stopping criteria is verified. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 114 of file moeoNSGA.h. +.PP +References moeoNSGA< MOEOT >::breed, moeoNSGA< MOEOT >::continuator, moeoNSGA< MOEOT >::diversityAssignment, moeoNSGA< MOEOT >::fitnessAssignment, moeoNSGA< MOEOT >::popEval, and moeoNSGA< MOEOT >::replace. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoNSGAII.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoNSGAII.3 new file mode 100644 index 000000000..f3f5d13a2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoNSGAII.3 @@ -0,0 +1,203 @@ +.TH "moeoNSGAII" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoNSGAII \- NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoEA< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoNSGAII\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoGenOp\fP< MOEOT > &_op)" +.br +.RI "\fISimple ctor with a \fBeoGenOp\fP. \fP" +.ti -1c +.RI "\fBmoeoNSGAII\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoTransform\fP< MOEOT > &_op)" +.br +.RI "\fISimple ctor with a \fBeoTransform\fP. \fP" +.ti -1c +.RI "\fBmoeoNSGAII\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoQuadOp\fP< MOEOT > &_crossover, double _pCross, \fBeoMonOp\fP< MOEOT > &_mutation, double _pMut)" +.br +.RI "\fICtor with a crossover, a mutation and their corresponding rates. \fP" +.ti -1c +.RI "\fBmoeoNSGAII\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoGenOp\fP< MOEOT > &_op)" +.br +.RI "\fICtor with a continuator (instead of _maxGen) and a \fBeoGenOp\fP. \fP" +.ti -1c +.RI "\fBmoeoNSGAII\fP (\fBeoContinue\fP< MOEOT > &_continuator, \fBeoEvalFunc\fP< MOEOT > &_eval, \fBeoTransform\fP< MOEOT > &_op)" +.br +.RI "\fICtor with a continuator (instead of _maxGen) and a \fBeoTransform\fP. \fP" +.ti -1c +.RI "virtual void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApply a few generation of evolution to the population _pop until the stopping criteria is verified. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBeoGenContinue\fP< MOEOT > \fBdefaultGenContinuator\fP" +.br +.RI "\fIa continuator based on the number of generations (used as default) \fP" +.ti -1c +.RI "\fBeoContinue\fP< MOEOT > & \fBcontinuator\fP" +.br +.RI "\fIstopping criteria \fP" +.ti -1c +.RI "\fBeoPopLoopEval\fP< MOEOT > \fBpopEval\fP" +.br +.RI "\fIevaluation function used to evaluate the whole population \fP" +.ti -1c +.RI "\fBmoeoDetTournamentSelect\fP< MOEOT > \fBselect\fP" +.br +.RI "\fIbinary tournament selection \fP" +.ti -1c +.RI "\fBmoeoFastNonDominatedSortingFitnessAssignment\fP< MOEOT > \fBfitnessAssignment\fP" +.br +.RI "\fIfitness assignment used in NSGA-II \fP" +.ti -1c +.RI "\fBmoeoFrontByFrontCrowdingDistanceDiversityAssignment\fP< MOEOT > \fBdiversityAssignment\fP" +.br +.RI "\fIdiversity assignment used in NSGA-II \fP" +.ti -1c +.RI "\fBmoeoElitistReplacement\fP< MOEOT > \fBreplace\fP" +.br +.RI "\fIelitist replacement \fP" +.ti -1c +.RI "\fBeoSGAGenOp\fP< MOEOT > \fBdefaultSGAGenOp\fP" +.br +.RI "\fIan object for genetic operators (used as default) \fP" +.ti -1c +.RI "\fBeoGeneralBreeder\fP< MOEOT > \fBgenBreed\fP" +.br +.RI "\fIgeneral breeder \fP" +.ti -1c +.RI "\fBeoBreed\fP< MOEOT > & \fBbreed\fP" +.br +.RI "\fIbreeder \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoNSGAII< MOEOT >" +NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: Deb, K., S. + +Agrawal, A. Pratap, and T. Meyarivan : 'A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II'. In IEEE Transactions on Evolutionary Computation, Vol. 6, No 2, pp 182-197 (April 2002). This class builds the NSGA-II algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. +.PP +Definition at line 37 of file moeoNSGAII.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoNSGAII\fP< MOEOT >::\fBmoeoNSGAII\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoGenOp\fP< MOEOT > & _op)\fC [inline]\fP" +.PP +Simple ctor with a \fBeoGenOp\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.RE +.PP + +.PP +Definition at line 47 of file moeoNSGAII.h. +.SS "template \fBmoeoNSGAII\fP< MOEOT >::\fBmoeoNSGAII\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoTransform\fP< MOEOT > & _op)\fC [inline]\fP" +.PP +Simple ctor with a \fBeoTransform\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.RE +.PP + +.PP +Definition at line 59 of file moeoNSGAII.h. +.SS "template \fBmoeoNSGAII\fP< MOEOT >::\fBmoeoNSGAII\fP (unsigned int _maxGen, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoQuadOp\fP< MOEOT > & _crossover, double _pCross, \fBeoMonOp\fP< MOEOT > & _mutation, double _pMut)\fC [inline]\fP" +.PP +Ctor with a crossover, a mutation and their corresponding rates. +.PP +\fBParameters:\fP +.RS 4 +\fI_maxGen\fP number of generations before stopping +.br +\fI_eval\fP evaluation function +.br +\fI_crossover\fP crossover +.br +\fI_pCross\fP crossover probability +.br +\fI_mutation\fP mutation +.br +\fI_pMut\fP mutation probability +.RE +.PP + +.PP +Definition at line 74 of file moeoNSGAII.h. +.SS "template \fBmoeoNSGAII\fP< MOEOT >::\fBmoeoNSGAII\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoGenOp\fP< MOEOT > & _op)\fC [inline]\fP" +.PP +Ctor with a continuator (instead of _maxGen) and a \fBeoGenOp\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP stopping criteria +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.RE +.PP + +.PP +Definition at line 87 of file moeoNSGAII.h. +.SS "template \fBmoeoNSGAII\fP< MOEOT >::\fBmoeoNSGAII\fP (\fBeoContinue\fP< MOEOT > & _continuator, \fBeoEvalFunc\fP< MOEOT > & _eval, \fBeoTransform\fP< MOEOT > & _op)\fC [inline]\fP" +.PP +Ctor with a continuator (instead of _maxGen) and a \fBeoTransform\fP. +.PP +\fBParameters:\fP +.RS 4 +\fI_continuator\fP stopping criteria +.br +\fI_eval\fP evaluation function +.br +\fI_op\fP variation operator +.RE +.PP + +.PP +Definition at line 99 of file moeoNSGAII.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoNSGAII\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Apply a few generation of evolution to the population _pop until the stopping criteria is verified. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 109 of file moeoNSGAII.h. +.PP +References moeoNSGAII< MOEOT >::breed, moeoNSGAII< MOEOT >::continuator, moeoNSGAII< MOEOT >::diversityAssignment, moeoNSGAII< MOEOT >::fitnessAssignment, moeoNSGAII< MOEOT >::popEval, and moeoNSGAII< MOEOT >::replace. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedDistance.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedDistance.3 new file mode 100644 index 000000000..b760ac91b --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedDistance.3 @@ -0,0 +1,123 @@ +.TH "moeoNormalizedDistance" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoNormalizedDistance \- The base class for double distance computation with normalized objective values (i.e. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoDistance< MOEOT, Type >< MOEOT, Type >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoNormalizedDistance\fP ()" +.br +.RI "\fIDefault ctr. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets the lower and the upper bounds for every objective using extremes values for solutions contained in the population _pop. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (double _min, double _max, unsigned int _obj)" +.br +.RI "\fISets the lower bound (_min) and the upper bound (_max) for the objective _obj. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (\fBeoRealInterval\fP _realInterval, unsigned int _obj)" +.br +.RI "\fISets the lower bound and the upper bound for the objective _obj using a \fBeoRealInterval\fP object. \fP" +.in -1c +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "static double \fBtiny\fP ()" +.br +.RI "\fIReturns a very small value that can be used to avoid extreme cases (where the min bound == the max bound). \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "std::vector< \fBeoRealInterval\fP > \fBbounds\fP" +.br +.RI "\fIthe bounds for every objective (bounds[i] = bounds for the objective i) \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoNormalizedDistance< MOEOT, Type >" +The base class for double distance computation with normalized objective values (i.e. + +between 0 and 1). +.PP +Definition at line 24 of file moeoNormalizedDistance.h. +.SH "Member Function Documentation" +.PP +.SS "template virtual void \fBmoeoNormalizedDistance\fP< MOEOT, Type >::setup (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets the lower and the upper bounds for every objective using extremes values for solutions contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Reimplemented from \fBmoeoDistance< MOEOT, Type >\fP. +.PP +Definition at line 59 of file moeoNormalizedDistance.h. +.PP +Referenced by moeoNormalizedDistance< MOEOT >::setup(). +.SS "template virtual void \fBmoeoNormalizedDistance\fP< MOEOT, Type >::setup (double _min, double _max, unsigned int _obj)\fC [inline, virtual]\fP" +.PP +Sets the lower bound (_min) and the upper bound (_max) for the objective _obj. +.PP +\fBParameters:\fP +.RS 4 +\fI_min\fP lower bound +.br +\fI_max\fP upper bound +.br +\fI_obj\fP the objective index +.RE +.PP + +.PP +Reimplemented from \fBmoeoDistance< MOEOT, Type >\fP. +.PP +Definition at line 83 of file moeoNormalizedDistance.h. +.SS "template virtual void \fBmoeoNormalizedDistance\fP< MOEOT, Type >::setup (\fBeoRealInterval\fP _realInterval, unsigned int _obj)\fC [inline, virtual]\fP" +.PP +Sets the lower bound and the upper bound for the objective _obj using a \fBeoRealInterval\fP object. +.PP +\fBParameters:\fP +.RS 4 +\fI_realInterval\fP the \fBeoRealInterval\fP object +.br +\fI_obj\fP the objective index +.RE +.PP + +.PP +Reimplemented from \fBmoeoDistance< MOEOT, Type >\fP. +.PP +Definition at line 99 of file moeoNormalizedDistance.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedSolutionVsSolutionBinaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedSolutionVsSolutionBinaryMetric.3 new file mode 100644 index 000000000..d29cb9ac5 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoNormalizedSolutionVsSolutionBinaryMetric.3 @@ -0,0 +1,93 @@ +.TH "moeoNormalizedSolutionVsSolutionBinaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoNormalizedSolutionVsSolutionBinaryMetric \- Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >< ObjectiveVector, R >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP ()" +.br +.RI "\fIDefault ctr for any \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP object. \fP" +.ti -1c +.RI "void \fBsetup\fP (double _min, double _max, unsigned int _obj)" +.br +.RI "\fISets the lower bound (_min) and the upper bound (_max) for the objective _obj. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (\fBeoRealInterval\fP _realInterval, unsigned int _obj)" +.br +.RI "\fISets the lower bound and the upper bound for the objective _obj using a \fBeoRealInterval\fP object. \fP" +.in -1c +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "static double \fBtiny\fP ()" +.br +.RI "\fIReturns a very small value that can be used to avoid extreme cases (where the min bound == the max bound). \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "std::vector< \fBeoRealInterval\fP > \fBbounds\fP" +.br +.RI "\fIthe bounds for every objective (bounds[i] = bounds for the objective i) \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >" +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. + +Then, indicator values lie in the interval [-1,1]. Note that you have to set the bounds for every objective before using the operator(). +.PP +Definition at line 26 of file moeoNormalizedSolutionVsSolutionBinaryMetric.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< ObjectiveVector, R >::setup (double _min, double _max, unsigned int _obj)\fC [inline]\fP" +.PP +Sets the lower bound (_min) and the upper bound (_max) for the objective _obj. +.PP +\fBParameters:\fP +.RS 4 +\fI_min\fP lower bound +.br +\fI_max\fP upper bound +.br +\fI_obj\fP the objective index +.RE +.PP + +.PP +Definition at line 50 of file moeoNormalizedSolutionVsSolutionBinaryMetric.h. +.PP +Referenced by moeoIndicatorBasedFitnessAssignment< MOEOT >::setup(). +.SS "template virtual void \fBmoeoNormalizedSolutionVsSolutionBinaryMetric\fP< ObjectiveVector, R >::setup (\fBeoRealInterval\fP _realInterval, unsigned int _obj)\fC [inline, virtual]\fP" +.PP +Sets the lower bound and the upper bound for the objective _obj using a \fBeoRealInterval\fP object. +.PP +\fBParameters:\fP +.RS 4 +\fI_realInterval\fP the \fBeoRealInterval\fP object +.br +\fI_obj\fP the objective index +.RE +.PP + +.PP +Definition at line 66 of file moeoNormalizedSolutionVsSolutionBinaryMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveObjectiveVectorComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveObjectiveVectorComparator.3 new file mode 100644 index 000000000..fb122b478 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveObjectiveVectorComparator.3 @@ -0,0 +1,49 @@ +.TH "moeoObjectiveObjectiveVectorComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoObjectiveObjectiveVectorComparator \- Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoObjectiveVectorComparator< ObjectiveVector >< ObjectiveVector >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const bool \fBoperator()\fP (const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)" +.br +.RI "\fIReturns true if _objectiveVector1 < _objectiveVector2 on the first objective, then on the second, and so on. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoObjectiveObjectiveVectorComparator< ObjectiveVector >" +Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. +.PP +Definition at line 22 of file moeoObjectiveObjectiveVectorComparator.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoObjectiveObjectiveVectorComparator\fP< ObjectiveVector >::operator() (const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)\fC [inline]\fP" +.PP +Returns true if _objectiveVector1 < _objectiveVector2 on the first objective, then on the second, and so on. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVector1\fP the first objective vector +.br +\fI_objectiveVector2\fP the second objective vector +.RE +.PP + +.PP +Definition at line 31 of file moeoObjectiveObjectiveVectorComparator.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVector.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVector.3 new file mode 100644 index 000000000..ae34b9421 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVector.3 @@ -0,0 +1,123 @@ +.TH "moeoObjectiveVector" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoObjectiveVector \- Abstract class allowing to represent a solution in the objective space (phenotypic representation). + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef ObjectiveVectorTraits \fBTraits\fP" +.br +.RI "\fIThe traits of objective vectors. \fP" +.ti -1c +.RI "typedef ObjectiveVectorType \fBType\fP" +.br +.RI "\fIThe type of an objective value. \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoObjectiveVector\fP (\fBType\fP _value=\fBType\fP())" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "\fBmoeoObjectiveVector\fP (std::vector< \fBType\fP > &_v)" +.br +.RI "\fICtor from a vector of Type. \fP" +.in -1c +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "static void \fBsetup\fP (unsigned int _nObjectives, std::vector< bool > &_bObjectives)" +.br +.RI "\fI\fBParameters\fP setting (for the objective vector of any solution). \fP" +.ti -1c +.RI "static unsigned int \fBnObjectives\fP ()" +.br +.RI "\fIReturns the number of objectives. \fP" +.ti -1c +.RI "static bool \fBminimizing\fP (unsigned int _i)" +.br +.RI "\fIReturns true if the _ith objective have to be minimized. \fP" +.ti -1c +.RI "static bool \fBmaximizing\fP (unsigned int _i)" +.br +.RI "\fIReturns true if the _ith objective have to be maximized. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoObjectiveVector< ObjectiveVectorTraits, ObjectiveVectorType >" +Abstract class allowing to represent a solution in the objective space (phenotypic representation). + +The template argument ObjectiveVectorTraits defaults to \fBmoeoObjectiveVectorTraits\fP, but it can be replaced at will by any other class that implements the static functions defined therein. Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's. +.PP +Definition at line 25 of file moeoObjectiveVector.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoObjectiveVector\fP< ObjectiveVectorTraits, ObjectiveVectorType >::\fBmoeoObjectiveVector\fP (std::vector< \fBType\fP > & _v)\fC [inline]\fP" +.PP +Ctor from a vector of Type. +.PP +\fBParameters:\fP +.RS 4 +\fI_v\fP the std::vector < Type > +.RE +.PP + +.PP +Definition at line 46 of file moeoObjectiveVector.h. +.SH "Member Function Documentation" +.PP +.SS "template static void \fBmoeoObjectiveVector\fP< ObjectiveVectorTraits, ObjectiveVectorType >::setup (unsigned int _nObjectives, std::vector< bool > & _bObjectives)\fC [inline, static]\fP" +.PP +\fBParameters\fP setting (for the objective vector of any solution). +.PP +\fBParameters:\fP +.RS 4 +\fI_nObjectives\fP the number of objectives +.br +\fI_bObjectives\fP the min/max vector (true = min / false = max) +.RE +.PP + +.PP +Definition at line 55 of file moeoObjectiveVector.h. +.SS "template static bool \fBmoeoObjectiveVector\fP< ObjectiveVectorTraits, ObjectiveVectorType >::minimizing (unsigned int _i)\fC [inline, static]\fP" +.PP +Returns true if the _ith objective have to be minimized. +.PP +\fBParameters:\fP +.RS 4 +\fI_i\fP the index +.RE +.PP + +.PP +Definition at line 74 of file moeoObjectiveVector.h. +.SS "template static bool \fBmoeoObjectiveVector\fP< ObjectiveVectorTraits, ObjectiveVectorType >::maximizing (unsigned int _i)\fC [inline, static]\fP" +.PP +Returns true if the _ith objective have to be maximized. +.PP +\fBParameters:\fP +.RS 4 +\fI_i\fP the index +.RE +.PP + +.PP +Definition at line 84 of file moeoObjectiveVector.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorComparator.3 new file mode 100644 index 000000000..fbd19e2c4 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorComparator.3 @@ -0,0 +1,29 @@ +.TH "moeoObjectiveVectorComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoObjectiveVectorComparator \- Abstract class allowing to compare 2 objective vectors. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoBF< A1, A2, R >< const const ObjectiveVector &, ObjectiveVector &, bool >\fP. +.PP +Inherited by \fBmoeoGDominanceObjectiveVectorComparator< ObjectiveVector >\fP, \fBmoeoObjectiveObjectiveVectorComparator< ObjectiveVector >\fP, and \fBmoeoParetoObjectiveVectorComparator< ObjectiveVector >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoObjectiveVectorComparator< ObjectiveVector >" +Abstract class allowing to compare 2 objective vectors. + +The template argument ObjectiveVector have to be a \fBmoeoObjectiveVector\fP. +.PP +Definition at line 24 of file moeoObjectiveVectorComparator.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorDouble.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorDouble.3 new file mode 100644 index 000000000..478ccb1ba --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorDouble.3 @@ -0,0 +1,179 @@ +.TH "moeoObjectiveVectorDouble" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoObjectiveVectorDouble \- This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoObjectiveVector< ObjectiveVectorTraits, double >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoObjectiveVectorDouble\fP (double _value=0.0)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "\fBmoeoObjectiveVectorDouble\fP (std::vector< double > &_v)" +.br +.RI "\fICtor from a vector of doubles. \fP" +.ti -1c +.RI "bool \fBdominates\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector dominates _other according to the Pareto dominance relation (but it's better to use a \fBmoeoObjectiveVectorComparator\fP object to compare solutions). \fP" +.ti -1c +.RI "bool \fBoperator==\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector is equal to _other (according to a tolerance value). \fP" +.ti -1c +.RI "bool \fBoperator!=\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector is different than _other (according to a tolerance value). \fP" +.ti -1c +.RI "bool \fBoperator<\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector is smaller than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \fP" +.ti -1c +.RI "bool \fBoperator>\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector is greater than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \fP" +.ti -1c +.RI "bool \fBoperator<=\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector is smaller than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \fP" +.ti -1c +.RI "bool \fBoperator>=\fP (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > &_other) const " +.br +.RI "\fIReturns true if the current objective vector is greater than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoObjectiveVectorDouble< ObjectiveVectorTraits >" +This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, i.e. + +that an objective value is represented using a double, and this for any objective. +.PP +Definition at line 27 of file moeoObjectiveVectorDouble.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::\fBmoeoObjectiveVectorDouble\fP (std::vector< double > & _v)\fC [inline]\fP" +.PP +Ctor from a vector of doubles. +.PP +\fBParameters:\fP +.RS 4 +\fI_v\fP the std::vector < double > +.RE +.PP + +.PP +Definition at line 45 of file moeoObjectiveVectorDouble.h. +.SH "Member Function Documentation" +.PP +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::dominates (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector dominates _other according to the Pareto dominance relation (but it's better to use a \fBmoeoObjectiveVectorComparator\fP object to compare solutions). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 54 of file moeoObjectiveVectorDouble.h. +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::operator== (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector is equal to _other (according to a tolerance value). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 65 of file moeoObjectiveVectorDouble.h. +.PP +Referenced by moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator!=(), and moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>=(). +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::operator!= (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector is different than _other (according to a tolerance value). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 82 of file moeoObjectiveVectorDouble.h. +.PP +References moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator==(). +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::operator< (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector is smaller than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 93 of file moeoObjectiveVectorDouble.h. +.PP +Referenced by moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator<=(). +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::operator> (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector is greater than _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 105 of file moeoObjectiveVectorDouble.h. +.PP +Referenced by moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>=(). +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::operator<= (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector is smaller than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 116 of file moeoObjectiveVectorDouble.h. +.PP +References moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator<(). +.SS "template bool \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits >::operator>= (const \fBmoeoObjectiveVectorDouble\fP< ObjectiveVectorTraits > & _other) const\fC [inline]\fP" +.PP +Returns true if the current objective vector is greater than or equal to _other on the first objective, then on the second, and so on (can be usefull for sorting/printing). +.PP +\fBParameters:\fP +.RS 4 +\fI_other\fP the other \fBmoeoObjectiveVectorDouble\fP object to compare with +.RE +.PP + +.PP +Definition at line 127 of file moeoObjectiveVectorDouble.h. +.PP +References moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator==(), and moeoObjectiveVectorDouble< ObjectiveVectorTraits >::operator>(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorTraits.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorTraits.3 new file mode 100644 index 000000000..4db325d5e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoObjectiveVectorTraits.3 @@ -0,0 +1,105 @@ +.TH "moeoObjectiveVectorTraits" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoObjectiveVectorTraits \- A traits class for \fBmoeoObjectiveVector\fP to specify the number of objectives and which ones have to be minimized or maximized. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +.SS "Static Public Member Functions" + +.in +1c +.ti -1c +.RI "static void \fBsetup\fP (unsigned int _nObjectives, std::vector< bool > &_bObjectives)" +.br +.RI "\fI\fBParameters\fP setting. \fP" +.ti -1c +.RI "static unsigned int \fBnObjectives\fP ()" +.br +.RI "\fIReturns the number of objectives. \fP" +.ti -1c +.RI "static bool \fBminimizing\fP (unsigned int _i)" +.br +.RI "\fIReturns true if the _ith objective have to be minimized. \fP" +.ti -1c +.RI "static bool \fBmaximizing\fP (unsigned int _i)" +.br +.RI "\fIReturns true if the _ith objective have to be maximized. \fP" +.ti -1c +.RI "static double \fBtolerance\fP ()" +.br +.RI "\fIReturns the tolerance value (to compare solutions). \fP" +.in -1c +.SS "Static Private Attributes" + +.in +1c +.ti -1c +.RI "static unsigned int \fBnObj\fP" +.br +.RI "\fIThe number of objectives. \fP" +.ti -1c +.RI "static std::vector< bool > \fBbObj\fP" +.br +.RI "\fIThe min/max vector. \fP" +.in -1c +.SH "Detailed Description" +.PP +A traits class for \fBmoeoObjectiveVector\fP to specify the number of objectives and which ones have to be minimized or maximized. +.PP +Definition at line 23 of file moeoObjectiveVectorTraits.h. +.SH "Member Function Documentation" +.PP +.SS "static void moeoObjectiveVectorTraits::setup (unsigned int _nObjectives, std::vector< bool > & _bObjectives)\fC [inline, static]\fP" +.PP +\fBParameters\fP setting. +.PP +\fBParameters:\fP +.RS 4 +\fI_nObjectives\fP the number of objectives +.br +\fI_bObjectives\fP the min/max vector (true = min / false = max) +.RE +.PP + +.PP +Definition at line 32 of file moeoObjectiveVectorTraits.h. +.PP +References bObj, and nObj. +.SS "static bool moeoObjectiveVectorTraits::minimizing (unsigned int _i)\fC [inline, static]\fP" +.PP +Returns true if the _ith objective have to be minimized. +.PP +\fBParameters:\fP +.RS 4 +\fI_i\fP the index +.RE +.PP + +.PP +Definition at line 67 of file moeoObjectiveVectorTraits.h. +.PP +References bObj. +.PP +Referenced by maximizing(). +.SS "static bool moeoObjectiveVectorTraits::maximizing (unsigned int _i)\fC [inline, static]\fP" +.PP +Returns true if the _ith objective have to be maximized. +.PP +\fBParameters:\fP +.RS 4 +\fI_i\fP the index +.RE +.PP + +.PP +Definition at line 80 of file moeoObjectiveVectorTraits.h. +.PP +References minimizing(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoOneObjectiveComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoOneObjectiveComparator.3 new file mode 100644 index 000000000..60ef82c62 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoOneObjectiveComparator.3 @@ -0,0 +1,79 @@ +.TH "moeoOneObjectiveComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoOneObjectiveComparator \- Functor allowing to compare two solutions according to one objective. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoComparator< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoOneObjectiveComparator\fP (unsigned int _obj)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "const bool \fBoperator()\fP (const MOEOT &_moeo1, const MOEOT &_moeo2)" +.br +.RI "\fIReturns true if _moeo1 < _moeo2 on the obj objective. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "unsigned int \fBobj\fP" +.br +.RI "\fIthe index of objective \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoOneObjectiveComparator< MOEOT >" +Functor allowing to compare two solutions according to one objective. +.PP +Definition at line 22 of file moeoOneObjectiveComparator.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoOneObjectiveComparator\fP< MOEOT >::\fBmoeoOneObjectiveComparator\fP (unsigned int _obj)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_obj\fP the index of objective +.RE +.PP + +.PP +Definition at line 30 of file moeoOneObjectiveComparator.h. +.PP +References moeoOneObjectiveComparator< MOEOT >::obj. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoOneObjectiveComparator\fP< MOEOT >::operator() (const MOEOT & _moeo1, const MOEOT & _moeo2)\fC [inline]\fP" +.PP +Returns true if _moeo1 < _moeo2 on the obj objective. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo1\fP the first solution +.br +\fI_moeo2\fP the second solution +.RE +.PP + +.PP +Definition at line 44 of file moeoOneObjectiveComparator.h. +.PP +References moeoOneObjectiveComparator< MOEOT >::obj. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoParetoBasedFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoParetoBasedFitnessAssignment.3 new file mode 100644 index 000000000..deee2a91e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoParetoBasedFitnessAssignment.3 @@ -0,0 +1,27 @@ +.TH "moeoParetoBasedFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoParetoBasedFitnessAssignment \- \fBmoeoParetoBasedFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP for Pareto-based strategies. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +Inherited by \fBmoeoFastNonDominatedSortingFitnessAssignment< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoParetoBasedFitnessAssignment< MOEOT >" +\fBmoeoParetoBasedFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP for Pareto-based strategies. +.PP +Definition at line 22 of file moeoParetoBasedFitnessAssignment.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoParetoObjectiveVectorComparator.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoParetoObjectiveVectorComparator.3 new file mode 100644 index 000000000..15fac443a --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoParetoObjectiveVectorComparator.3 @@ -0,0 +1,49 @@ +.TH "moeoParetoObjectiveVectorComparator" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoParetoObjectiveVectorComparator \- This functor class allows to compare 2 objective vectors according to Pareto dominance. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoObjectiveVectorComparator< ObjectiveVector >< ObjectiveVector >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "const bool \fBoperator()\fP (const ObjectiveVector &_objectiveVector1, const ObjectiveVector &_objectiveVector2)" +.br +.RI "\fIReturns true if _objectiveVector1 is dominated by _objectiveVector2. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoParetoObjectiveVectorComparator< ObjectiveVector >" +This functor class allows to compare 2 objective vectors according to Pareto dominance. +.PP +Definition at line 22 of file moeoParetoObjectiveVectorComparator.h. +.SH "Member Function Documentation" +.PP +.SS "template const bool \fBmoeoParetoObjectiveVectorComparator\fP< ObjectiveVector >::operator() (const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2)\fC [inline]\fP" +.PP +Returns true if _objectiveVector1 is dominated by _objectiveVector2. +.PP +\fBParameters:\fP +.RS 4 +\fI_objectiveVector1\fP the first objective vector +.br +\fI_objectiveVector2\fP the second objective vector +.RE +.PP + +.PP +Definition at line 31 of file moeoParetoObjectiveVectorComparator.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoRandomSelect.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoRandomSelect.3 new file mode 100644 index 000000000..1940abea3 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoRandomSelect.3 @@ -0,0 +1,37 @@ +.TH "moeoRandomSelect" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoRandomSelect \- Selection strategy that selects only one element randomly from a whole population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSelectOne< MOEOT >< MOEOT >\fP, and \fBeoRandomSelect< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoRandomSelect\fP ()" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "const MOEOT & \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIReturn one individual at random by using an \fBeoRandomSelect\fP. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoRandomSelect< MOEOT >" +Selection strategy that selects only one element randomly from a whole population. +.PP +Definition at line 23 of file moeoRandomSelect.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoRealVector.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoRealVector.3 new file mode 100644 index 000000000..991515694 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoRealVector.3 @@ -0,0 +1,49 @@ +.TH "moeoRealVector" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoRealVector \- This class is an implementation of a simple double-valued \fBmoeoVector\fP. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoRealVector\fP (unsigned int _size=0, double _value=0.0)" +.br +.RI "\fICtor. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoRealVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >" +This class is an implementation of a simple double-valued \fBmoeoVector\fP. +.PP +Definition at line 22 of file moeoRealVector.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoRealVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity >::\fBmoeoRealVector\fP (unsigned int _size = \fC0\fP, double _value = \fC0.0\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_size\fP Length of vector (default is 0) +.br +\fI_value\fP Initial value of all elements (default is default value of type GeneType) +.RE +.PP + +.PP +Definition at line 31 of file moeoRealVector.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoReplacement.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoReplacement.3 new file mode 100644 index 000000000..6bafd8b5e --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoReplacement.3 @@ -0,0 +1,27 @@ +.TH "moeoReplacement" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoReplacement \- Replacement strategy for multi-objective optimization. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoReplacement< MOEOT >\fP. +.PP +Inherited by \fBmoeoElitistReplacement< MOEOT >\fP, \fBmoeoEnvironmentalReplacement< MOEOT >\fP, and \fBmoeoGenerationalReplacement< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoReplacement< MOEOT >" +Replacement strategy for multi-objective optimization. +.PP +Definition at line 22 of file moeoReplacement.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoRouletteSelect.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoRouletteSelect.3 new file mode 100644 index 000000000..d93975533 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoRouletteSelect.3 @@ -0,0 +1,84 @@ +.TH "moeoRouletteSelect" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoRouletteSelect \- Selection strategy that selects ONE individual by using roulette wheel process. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSelectOne< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoRouletteSelect\fP (unsigned int _tSize=2)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "const MOEOT & \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApply the tournament to the given population. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "double & \fBtSize\fP" +.br +.RI "\fIsize \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoRouletteSelect< MOEOT >" +Selection strategy that selects ONE individual by using roulette wheel process. + +\fBWarning:\fP +.RS 4 +This selection only uses fitness values (and not diversity values). +.RE +.PP + +.PP +Definition at line 24 of file moeoRouletteSelect.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoRouletteSelect\fP< MOEOT >::\fBmoeoRouletteSelect\fP (unsigned int _tSize = \fC2\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_tSize\fP the number of individuals in the tournament (default: 2) +.RE +.PP + +.PP +Definition at line 32 of file moeoRouletteSelect.h. +.PP +References moeoRouletteSelect< MOEOT >::tSize. +.SH "Member Function Documentation" +.PP +.SS "template const MOEOT& \fBmoeoRouletteSelect\fP< MOEOT >::operator() (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline]\fP" +.PP +Apply the tournament to the given population. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 48 of file moeoRouletteSelect.h. +.PP +References moeoRouletteSelect< MOEOT >::tSize. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoScalarFitnessAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoScalarFitnessAssignment.3 new file mode 100644 index 000000000..ece7f611f --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoScalarFitnessAssignment.3 @@ -0,0 +1,27 @@ +.TH "moeoScalarFitnessAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoScalarFitnessAssignment \- \fBmoeoScalarFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP for scalar strategies. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoFitnessAssignment< MOEOT >< MOEOT >\fP. +.PP +Inherited by \fBmoeoAchievementFitnessAssignment< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoScalarFitnessAssignment< MOEOT >" +\fBmoeoScalarFitnessAssignment\fP is a \fBmoeoFitnessAssignment\fP for scalar strategies. +.PP +Definition at line 22 of file moeoScalarFitnessAssignment.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoSelectFromPopAndArch.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoSelectFromPopAndArch.3 new file mode 100644 index 000000000..da203befc --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoSelectFromPopAndArch.3 @@ -0,0 +1,105 @@ +.TH "moeoSelectFromPopAndArch" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoSelectFromPopAndArch \- Elitist selection process that consists in choosing individuals in the archive as well as in the current population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSelectOne< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoSelectFromPopAndArch\fP (\fBmoeoSelectOne\fP< MOEOT > &_popSelectOne, \fBmoeoSelectOne\fP< MOEOT > _archSelectOne, \fBmoeoArchive\fP< MOEOT > &_arch, double _ratioFromPop=0.5)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "\fBmoeoSelectFromPopAndArch\fP (\fBmoeoSelectOne\fP< MOEOT > &_popSelectOne, \fBmoeoArchive\fP< MOEOT > &_arch, double _ratioFromPop=0.5)" +.br +.RI "\fIDefaulr ctor - the archive's selection operator is a random selector. \fP" +.ti -1c +.RI "virtual const MOEOT & \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &pop)" +.br +.RI "\fIThe selection process. \fP" +.ti -1c +.RI "virtual void \fBsetup\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISetups some population stats. \fP" +.in -1c +.SS "Private Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoSelectOne\fP< MOEOT > & \fBpopSelectOne\fP" +.br +.RI "\fIThe population's selection operator. \fP" +.ti -1c +.RI "\fBmoeoSelectOne\fP< MOEOT > & \fBarchSelectOne\fP" +.br +.RI "\fIThe archive's selection operator. \fP" +.ti -1c +.RI "\fBmoeoArchive\fP< MOEOT > & \fBarch\fP" +.br +.RI "\fIThe archive. \fP" +.ti -1c +.RI "double \fBratioFromPop\fP" +.br +.RI "\fIThe ratio of selected individuals from the population. \fP" +.ti -1c +.RI "\fBmoeoRandomSelect\fP< MOEOT > \fBrandomSelectOne\fP" +.br +.RI "\fIA random selection operator (used as default for archSelectOne). \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoSelectFromPopAndArch< MOEOT >" +Elitist selection process that consists in choosing individuals in the archive as well as in the current population. +.PP +Definition at line 26 of file moeoSelectFromPopAndArch.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoSelectFromPopAndArch\fP< MOEOT >::\fBmoeoSelectFromPopAndArch\fP (\fBmoeoSelectOne\fP< MOEOT > & _popSelectOne, \fBmoeoSelectOne\fP< MOEOT > _archSelectOne, \fBmoeoArchive\fP< MOEOT > & _arch, double _ratioFromPop = \fC0.5\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_popSelectOne\fP the population's selection operator +.br +\fI_archSelectOne\fP the archive's selection operator +.br +\fI_arch\fP the archive +.br +\fI_ratioFromPop\fP the ratio of selected individuals from the population +.RE +.PP + +.PP +Definition at line 37 of file moeoSelectFromPopAndArch.h. +.SS "template \fBmoeoSelectFromPopAndArch\fP< MOEOT >::\fBmoeoSelectFromPopAndArch\fP (\fBmoeoSelectOne\fP< MOEOT > & _popSelectOne, \fBmoeoArchive\fP< MOEOT > & _arch, double _ratioFromPop = \fC0.5\fP)\fC [inline]\fP" +.PP +Defaulr ctor - the archive's selection operator is a random selector. +.PP +\fBParameters:\fP +.RS 4 +\fI_popSelectOne\fP the population's selection operator +.br +\fI_arch\fP the archive +.br +\fI_ratioFromPop\fP the ratio of selected individuals from the population +.RE +.PP + +.PP +Definition at line 48 of file moeoSelectFromPopAndArch.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoSelectOne.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoSelectOne.3 new file mode 100644 index 000000000..52f68ea41 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoSelectOne.3 @@ -0,0 +1,27 @@ +.TH "moeoSelectOne" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoSelectOne \- Selection strategy for multi-objective optimization that selects only one element from a whole population. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoSelectOne< MOEOT >\fP. +.PP +Inherited by \fBmoeoDetTournamentSelect< MOEOT >\fP, \fBmoeoRandomSelect< MOEOT >\fP, \fBmoeoRouletteSelect< MOEOT >\fP, \fBmoeoSelectFromPopAndArch< MOEOT >\fP, and \fBmoeoStochTournamentSelect< MOEOT >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoSelectOne< MOEOT >" +Selection strategy for multi-objective optimization that selects only one element from a whole population. +.PP +Definition at line 22 of file moeoSelectOne.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoSharingDiversityAssignment.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoSharingDiversityAssignment.3 new file mode 100644 index 000000000..a4676f5c2 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoSharingDiversityAssignment.3 @@ -0,0 +1,198 @@ +.TH "moeoSharingDiversityAssignment" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoSharingDiversityAssignment \- Sharing assignment scheme originally porposed by: D. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoDiversityAssignment< MOEOT >< MOEOT >\fP. +.PP +Inherited by \fBmoeoFrontByFrontSharingDiversityAssignment< MOEOT >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef MOEOT::ObjectiveVector \fBObjectiveVector\fP" +.br +.RI "\fIthe objective vector type of the solutions \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoSharingDiversityAssignment\fP (\fBmoeoDistance\fP< MOEOT, double > &_distance, double _nicheSize=0.5, double _alpha=1.0)" +.br +.RI "\fICtor. \fP" +.ti -1c +.RI "\fBmoeoSharingDiversityAssignment\fP (double _nicheSize=0.5, double _alpha=1.0)" +.br +.RI "\fICtor with an euclidean distance (with normalized objective values) in the objective space is used as default. \fP" +.ti -1c +.RI "void \fBoperator()\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets diversity values for every solution contained in the population _pop. \fP" +.ti -1c +.RI "void \fBupdateByDeleting\fP (\fBeoPop\fP< MOEOT > &_pop, \fBObjectiveVector\fP &_objVec)" +.br +.in -1c +.SS "Protected Member Functions" + +.in +1c +.ti -1c +.RI "virtual void \fBsetSimilarities\fP (\fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fISets similarities for every solution contained in the population _pop. \fP" +.ti -1c +.RI "double \fBsh\fP (double _dist)" +.br +.RI "\fISharing function. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoDistance\fP< MOEOT, double > & \fBdistance\fP" +.br +.RI "\fIthe distance used to compute the neighborhood of solutions \fP" +.ti -1c +.RI "\fBmoeoEuclideanDistance\fP< MOEOT > \fBdefaultDistance\fP" +.br +.RI "\fIeuclidean distancein the objective space (can be used as default) \fP" +.ti -1c +.RI "double \fBnicheSize\fP" +.br +.RI "\fIneighborhood size in terms of radius distance \fP" +.ti -1c +.RI "double \fBalpha\fP" +.br +.RI "\fIparameter used to regulate the shape of the sharing function \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoSharingDiversityAssignment< MOEOT >" +Sharing assignment scheme originally porposed by: D. + +E. Goldberg, 'Genetic Algorithms in Search, Optimization and Machine Learning', Addision-Wesley, MA, USA (1989). +.PP +Definition at line 28 of file moeoSharingDiversityAssignment.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoSharingDiversityAssignment\fP< MOEOT >::\fBmoeoSharingDiversityAssignment\fP (\fBmoeoDistance\fP< MOEOT, double > & _distance, double _nicheSize = \fC0.5\fP, double _alpha = \fC1.0\fP)\fC [inline]\fP" +.PP +Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_distance\fP the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) +.br +\fI_nicheSize\fP neighborhood size in terms of radius distance (closely related to the way the distances are computed) +.br +\fI_alpha\fP parameter used to regulate the shape of the sharing function +.RE +.PP + +.PP +Definition at line 42 of file moeoSharingDiversityAssignment.h. +.SS "template \fBmoeoSharingDiversityAssignment\fP< MOEOT >::\fBmoeoSharingDiversityAssignment\fP (double _nicheSize = \fC0.5\fP, double _alpha = \fC1.0\fP)\fC [inline]\fP" +.PP +Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_nicheSize\fP neighborhood size in terms of radius distance (closely related to the way the distances are computed) +.br +\fI_alpha\fP parameter used to regulate the shape of the sharing function +.RE +.PP + +.PP +Definition at line 51 of file moeoSharingDiversityAssignment.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoSharingDiversityAssignment\fP< MOEOT >::operator() (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, virtual]\fP" +.PP +Sets diversity values for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Implements \fBeoUF< eoPop< MOEOT > &, void >\fP. +.PP +Definition at line 59 of file moeoSharingDiversityAssignment.h. +.PP +References moeoSharingDiversityAssignment< MOEOT >::setSimilarities(). +.SS "template void \fBmoeoSharingDiversityAssignment\fP< MOEOT >::updateByDeleting (\fBeoPop\fP< MOEOT > & _pop, \fBObjectiveVector\fP & _objVec)\fC [inline, virtual]\fP" +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. +.RE +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.br +\fI_objVec\fP the objective vector +.RE +.PP +\fBWarning:\fP +.RS 4 +NOT IMPLEMENTED, DO NOTHING ! +.RE +.PP + +.PP +Implements \fBmoeoDiversityAssignment< MOEOT >\fP. +.PP +Reimplemented in \fBmoeoFrontByFrontSharingDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 80 of file moeoSharingDiversityAssignment.h. +.SS "template virtual void \fBmoeoSharingDiversityAssignment\fP< MOEOT >::setSimilarities (\fBeoPop\fP< MOEOT > & _pop)\fC [inline, protected, virtual]\fP" +.PP +Sets similarities for every solution contained in the population _pop. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Reimplemented in \fBmoeoFrontByFrontSharingDiversityAssignment< MOEOT >\fP. +.PP +Definition at line 102 of file moeoSharingDiversityAssignment.h. +.PP +References moeoSharingDiversityAssignment< MOEOT >::distance, and moeoSharingDiversityAssignment< MOEOT >::sh(). +.PP +Referenced by moeoSharingDiversityAssignment< MOEOT >::operator()(). +.SS "template double \fBmoeoSharingDiversityAssignment\fP< MOEOT >::sh (double _dist)\fC [inline, protected]\fP" +.PP +Sharing function. +.PP +\fBParameters:\fP +.RS 4 +\fI_dist\fP the distance value +.RE +.PP + +.PP +Definition at line 125 of file moeoSharingDiversityAssignment.h. +.PP +References moeoSharingDiversityAssignment< MOEOT >::alpha, and moeoSharingDiversityAssignment< MOEOT >::nicheSize. +.PP +Referenced by moeoSharingDiversityAssignment< MOEOT >::setSimilarities(), and moeoFrontByFrontSharingDiversityAssignment< MOEOT >::setSimilarities(). + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoSolutionUnaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoSolutionUnaryMetric.3 new file mode 100644 index 000000000..12b5ae836 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoSolutionUnaryMetric.3 @@ -0,0 +1,25 @@ +.TH "moeoSolutionUnaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoSolutionUnaryMetric \- Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoUnaryMetric< const ObjectiveVector &, R >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoSolutionUnaryMetric< ObjectiveVector, R >" +Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. +.PP +Definition at line 43 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoSolutionVsSolutionBinaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoSolutionVsSolutionBinaryMetric.3 new file mode 100644 index 000000000..33fabf5a0 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoSolutionVsSolutionBinaryMetric.3 @@ -0,0 +1,27 @@ +.TH "moeoSolutionVsSolutionBinaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoSolutionVsSolutionBinaryMetric \- Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoBinaryMetric< A1, A2, R >< const const ObjectiveVector &, ObjectiveVector &, R >\fP. +.PP +Inherited by \fBmoeoNormalizedSolutionVsSolutionBinaryMetric< ObjectiveVector, R >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoSolutionVsSolutionBinaryMetric< ObjectiveVector, R >" +Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. +.PP +Definition at line 57 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoStochTournamentSelect.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoStochTournamentSelect.3 new file mode 100644 index 000000000..3fa824d57 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoStochTournamentSelect.3 @@ -0,0 +1,107 @@ +.TH "moeoStochTournamentSelect" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoStochTournamentSelect \- Selection strategy that selects ONE individual by stochastic tournament. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoSelectOne< MOEOT >< MOEOT >\fP. +.PP +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoStochTournamentSelect\fP (\fBmoeoComparator\fP< MOEOT > &_comparator, double _tRate=1.0)" +.br +.RI "\fIFull Ctor. \fP" +.ti -1c +.RI "\fBmoeoStochTournamentSelect\fP (double _tRate=1.0)" +.br +.RI "\fICtor without comparator. \fP" +.ti -1c +.RI "const MOEOT & \fBoperator()\fP (const \fBeoPop\fP< MOEOT > &_pop)" +.br +.RI "\fIApply the tournament to the given population. \fP" +.in -1c +.SS "Protected Attributes" + +.in +1c +.ti -1c +.RI "\fBmoeoComparator\fP< MOEOT > & \fBcomparator\fP" +.br +.RI "\fIthe comparator (used to compare 2 individuals) \fP" +.ti -1c +.RI "\fBmoeoFitnessThenDiversityComparator\fP< MOEOT > \fBdefaultComparator\fP" +.br +.RI "\fIa fitness then diversity comparator can be used as default \fP" +.ti -1c +.RI "double \fBtRate\fP" +.br +.RI "\fIthe tournament rate \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoStochTournamentSelect< MOEOT >" +Selection strategy that selects ONE individual by stochastic tournament. +.PP +Definition at line 24 of file moeoStochTournamentSelect.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoStochTournamentSelect\fP< MOEOT >::\fBmoeoStochTournamentSelect\fP (\fBmoeoComparator\fP< MOEOT > & _comparator, double _tRate = \fC1.0\fP)\fC [inline]\fP" +.PP +Full Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_comparator\fP the comparator (used to compare 2 individuals) +.br +\fI_tRate\fP the tournament rate +.RE +.PP + +.PP +Definition at line 33 of file moeoStochTournamentSelect.h. +.PP +References moeoStochTournamentSelect< MOEOT >::tRate. +.SS "template \fBmoeoStochTournamentSelect\fP< MOEOT >::\fBmoeoStochTournamentSelect\fP (double _tRate = \fC1.0\fP)\fC [inline]\fP" +.PP +Ctor without comparator. +.PP +A \fBmoeoFitnessThenDiversityComparator\fP is used as default. +.PP +\fBParameters:\fP +.RS 4 +\fI_tRate\fP the tournament rate +.RE +.PP + +.PP +Definition at line 53 of file moeoStochTournamentSelect.h. +.PP +References moeoStochTournamentSelect< MOEOT >::tRate. +.SH "Member Function Documentation" +.PP +.SS "template const MOEOT& \fBmoeoStochTournamentSelect\fP< MOEOT >::operator() (const \fBeoPop\fP< MOEOT > & _pop)\fC [inline]\fP" +.PP +Apply the tournament to the given population. +.PP +\fBParameters:\fP +.RS 4 +\fI_pop\fP the population +.RE +.PP + +.PP +Definition at line 73 of file moeoStochTournamentSelect.h. +.PP +References moeoStochTournamentSelect< MOEOT >::comparator, and moeoStochTournamentSelect< MOEOT >::tRate. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoUnaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoUnaryMetric.3 new file mode 100644 index 000000000..3ce8754d9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoUnaryMetric.3 @@ -0,0 +1,25 @@ +.TH "moeoUnaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoUnaryMetric \- Base class for unary metrics. + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBeoUF< A, R >\fP, and \fBmoeoMetric\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoUnaryMetric< A, R >" +Base class for unary metrics. +.PP +Definition at line 29 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoVector.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoVector.3 new file mode 100644 index 000000000..43949f7e8 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoVector.3 @@ -0,0 +1,137 @@ +.TH "moeoVector" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoVector \- Base class for fixed length chromosomes, just derives from \fBMOEO\fP and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP. +.PP +.SS "Public Types" + +.in +1c +.ti -1c +.RI "typedef GeneType \fBAtomType\fP" +.br +.RI "\fIthe atomic type \fP" +.ti -1c +.RI "typedef std::vector< GeneType > \fBContainerType\fP" +.br +.RI "\fIthe container type \fP" +.in -1c +.SS "Public Member Functions" + +.in +1c +.ti -1c +.RI "\fBmoeoVector\fP (unsigned int _size=0, GeneType _value=GeneType())" +.br +.RI "\fIDefault ctor. \fP" +.ti -1c +.RI "void \fBvalue\fP (const std::vector< GeneType > &_v)" +.br +.RI "\fIWe can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor. \fP" +.ti -1c +.RI "bool \fBoperator<\fP (const \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > &_moeo) const " +.br +.RI "\fITo avoid conflicts between \fBMOEO::operator<\fP and std::vector::operator<. \fP" +.ti -1c +.RI "virtual void \fBprintOn\fP (std::ostream &_os) const " +.br +.RI "\fIWriting object. \fP" +.ti -1c +.RI "virtual void \fBreadFrom\fP (std::istream &_is)" +.br +.RI "\fIReading object. \fP" +.in -1c +.SH "Detailed Description" +.PP + +.SS "template class moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >" +Base class for fixed length chromosomes, just derives from \fBMOEO\fP and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). + +GeneType must have the following methods: void ctor (needed for the std::vector<>), copy ctor. +.PP +Definition at line 25 of file moeoVector.h. +.SH "Constructor & Destructor Documentation" +.PP +.SS "template \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::\fBmoeoVector\fP (unsigned int _size = \fC0\fP, GeneType _value = \fCGeneType()\fP)\fC [inline]\fP" +.PP +Default ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_size\fP Length of vector (default is 0) +.br +\fI_value\fP Initial value of all elements (default is default value of type GeneType) +.RE +.PP + +.PP +Definition at line 47 of file moeoVector.h. +.SH "Member Function Documentation" +.PP +.SS "template void \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::value (const std::vector< GeneType > & _v)\fC [inline]\fP" +.PP +We can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor. +.PP +\fBParameters:\fP +.RS 4 +\fI_v\fP a vector of GeneType +.RE +.PP + +.PP +Definition at line 56 of file moeoVector.h. +.SS "template bool \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::operator< (const \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType > & _moeo) const\fC [inline]\fP" +.PP +To avoid conflicts between \fBMOEO::operator<\fP and std::vector::operator<. +.PP +\fBParameters:\fP +.RS 4 +\fI_moeo\fP the object to compare with +.RE +.PP + +.PP +Definition at line 79 of file moeoVector.h. +.SS "template virtual void \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::printOn (std::ostream & _os) const\fC [inline, virtual]\fP" +.PP +Writing object. +.PP +\fBParameters:\fP +.RS 4 +\fI_os\fP output stream +.RE +.PP + +.PP +Reimplemented from \fBMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP. +.PP +Reimplemented in \fBmoeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP. +.PP +Definition at line 89 of file moeoVector.h. +.SS "template virtual void \fBmoeoVector\fP< MOEOObjectiveVector, MOEOFitness, MOEODiversity, GeneType >::readFrom (std::istream & _is)\fC [inline, virtual]\fP" +.PP +Reading object. +.PP +\fBParameters:\fP +.RS 4 +\fI_is\fP input stream +.RE +.PP + +.PP +Reimplemented from \fBMOEO< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP. +.PP +Reimplemented in \fBmoeoBitVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity >\fP. +.PP +Definition at line 102 of file moeoVector.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoVectorUnaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoVectorUnaryMetric.3 new file mode 100644 index 000000000..7d85be30d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoVectorUnaryMetric.3 @@ -0,0 +1,25 @@ +.TH "moeoVectorUnaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoVectorUnaryMetric \- Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors). + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoUnaryMetric< const std::vector< ObjectiveVector > &, R >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoVectorUnaryMetric< ObjectiveVector, R >" +Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors). +.PP +Definition at line 50 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/moeoVectorVsVectorBinaryMetric.3 b/trunk/paradiseo-moeo/doc/man/man3/moeoVectorVsVectorBinaryMetric.3 new file mode 100644 index 000000000..e0a146a6d --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/moeoVectorVsVectorBinaryMetric.3 @@ -0,0 +1,25 @@ +.TH "moeoVectorVsVectorBinaryMetric" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +moeoVectorVsVectorBinaryMetric \- Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors). + +.PP +.SH SYNOPSIS +.br +.PP +\fC#include \fP +.PP +Inherits \fBmoeoBinaryMetric< A1, A2, R >< const const std::vector< ObjectiveVector > &, std::vector< ObjectiveVector > &, R >\fP. +.PP +.SH "Detailed Description" +.PP + +.SS "template class moeoVectorVsVectorBinaryMetric< ObjectiveVector, R >" +Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors). +.PP +Definition at line 64 of file moeoMetric.h. + +.SH "Author" +.PP +Generated automatically by Doxygen for ParadisEO-MOEO from the source code. diff --git a/trunk/paradiseo-moeo/doc/man/man3/webpages.3 b/trunk/paradiseo-moeo/doc/man/man3/webpages.3 new file mode 100644 index 000000000..cf89a55f9 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/man/man3/webpages.3 @@ -0,0 +1,15 @@ +.TH "webpages" 3 "26 Jun 2007" "Version 1.0" "ParadisEO-MOEO" \" -*- nroff -*- +.ad l +.nh +.SH NAME +webpages \- Related webpages +.IP "\(bu" 2 +ParadisEO \fChomepage\fP +.IP "\(bu" 2 +INRIA GForge \fCproject page\fP +.IP "\(bu" 2 +\fCREADME\fP +.IP "\(bu" 2 +\fCNEWS\fP +.PP + diff --git a/trunk/paradiseo-moeo/doc/moeo.doxyfile b/trunk/paradiseo-moeo/doc/moeo.doxyfile new file mode 100644 index 000000000..c5066b5c7 --- /dev/null +++ b/trunk/paradiseo-moeo/doc/moeo.doxyfile @@ -0,0 +1,237 @@ +# Doxyfile 1.5.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = ParadisEO-MOEO +PROJECT_NUMBER = 1.0 +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = . ../src +FILE_PATTERNS = *.cpp \ + *.h \ + NEWS README +RECURSIVE = YES +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = * +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 3 +IGNORE_PREFIX = moeo +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = YES +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = ../../paradiseo-eo/doc/eo.doxytag=../../../paradiseo-eo/doc/html +GENERATE_TAGFILE = moeo.doxytag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = YES diff --git a/trunk/paradiseo-moeo/src/Makefile.am b/trunk/paradiseo-moeo/src/Makefile.am index ae1e51b3c..63f989053 100644 --- a/trunk/paradiseo-moeo/src/Makefile.am +++ b/trunk/paradiseo-moeo/src/Makefile.am @@ -1 +1 @@ -# Nothing to compile ! +SUBDIRS = core diff --git a/trunk/paradiseo-moeo/src/algo/moeoAlgo.h b/trunk/paradiseo-moeo/src/algo/moeoAlgo.h new file mode 100644 index 000000000..0bc47ee8a --- /dev/null +++ b/trunk/paradiseo-moeo/src/algo/moeoAlgo.h @@ -0,0 +1,21 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoAlgo.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOALGO_H_ +#define MOEOALGO_H_ + +/** + * Abstract class for multi-objective algorithms. + */ +class moeoAlgo {}; + +#endif /*MOEOALGO_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoCombinedLS.h b/trunk/paradiseo-moeo/src/algo/moeoCombinedLS.h similarity index 92% rename from trunk/paradiseo-moeo/src/moeoCombinedLS.h rename to trunk/paradiseo-moeo/src/algo/moeoCombinedLS.h index 98727f700..78b5b55a7 100644 --- a/trunk/paradiseo-moeo/src/moeoCombinedLS.h +++ b/trunk/paradiseo-moeo/src/algo/moeoCombinedLS.h @@ -13,8 +13,9 @@ #ifndef MOEOCOMBINEDLS_H_ #define MOEOCOMBINEDLS_H_ -#include -#include +#include +#include +#include /** * This class allows to embed a set of local searches that are sequentially applied, @@ -51,7 +52,7 @@ public: */ void operator () (Type _type, moeoArchive < MOEOT > & _arch) { - for (unsigned i=0; i operator()(_type, _arch); } diff --git a/trunk/paradiseo-moeo/src/moeoEA.h b/trunk/paradiseo-moeo/src/algo/moeoEA.h similarity index 87% rename from trunk/paradiseo-moeo/src/moeoEA.h rename to trunk/paradiseo-moeo/src/algo/moeoEA.h index 901dba540..d01264cec 100644 --- a/trunk/paradiseo-moeo/src/moeoEA.h +++ b/trunk/paradiseo-moeo/src/algo/moeoEA.h @@ -14,12 +14,12 @@ #define MOEOEA_H_ #include +#include /** * Abstract class for multi-objective evolutionary algorithms. */ template < class MOEOT > -class moeoEA : public eoAlgo < MOEOT > {}; - +class moeoEA : public moeoAlgo, public eoAlgo < MOEOT > {}; #endif /*MOEOEA_H_*/ diff --git a/trunk/paradiseo-moeo/src/algo/moeoEasyEA.h b/trunk/paradiseo-moeo/src/algo/moeoEasyEA.h new file mode 100755 index 000000000..883a95e76 --- /dev/null +++ b/trunk/paradiseo-moeo/src/algo/moeoEasyEA.h @@ -0,0 +1,218 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoEasyEA.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef _MOEOEASYEA_H +#define _MOEOEASYEA_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * An easy class to design multi-objective evolutionary algorithms. + */ +template < class MOEOT > +class moeoEasyEA: public moeoEA < MOEOT > +{ +public: + + /** + * Ctor taking a breed and merge. + * @param _continuator the stopping criteria + * @param _eval the evaluation functions + * @param _breed the breeder + * @param _replace the replacement strategy + * @param _fitnessEval the fitness evaluation scheme + * @param _diversityEval the diversity evaluation scheme + * @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process + */ + moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace, + moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false) + : + continuator(_continuator), eval (_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace), + fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection) + {} + + + /** + * Ctor taking a breed, a merge and a eoPopEval. + * @param _continuator the stopping criteria + * @param _popEval the evaluation functions for the whole population + * @param _breed the breeder + * @param _replace the replacement strategy + * @param _fitnessEval the fitness evaluation scheme + * @param _diversityEval the diversity evaluation scheme + * @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process + */ + moeoEasyEA(eoContinue < MOEOT > & _continuator, eoPopEvalFunc < MOEOT > & _popEval, eoBreed < MOEOT > & _breed, moeoReplacement < MOEOT > & _replace, + moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false) + : + continuator(_continuator), eval (dummyEval), loopEval(dummyEval), popEval(_popEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(dummyMerge, dummyReduce), replace(_replace), + fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection) + {} + + + /** + * Ctor taking a breed, a merge and a reduce. + * @param _continuator the stopping criteria + * @param _eval the evaluation functions + * @param _breed the breeder + * @param _merge the merge scheme + * @param _reduce the reduce scheme + * @param _fitnessEval the fitness evaluation scheme + * @param _diversityEval the diversity evaluation scheme + * @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process + */ + moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce, + moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false) + : + continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(dummySelect, dummyTransform), breed(_breed), mergeReduce(_merge,_reduce), replace(mergeReduce), + fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection) + {} + + + /** + * Ctor taking a select, a transform and a replacement. + * @param _continuator the stopping criteria + * @param _eval the evaluation functions + * @param _select the selection scheme + * @param _transform the tranformation scheme + * @param _replace the replacement strategy + * @param _fitnessEval the fitness evaluation scheme + * @param _diversityEval the diversity evaluation scheme + * @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process + */ + moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, moeoReplacement < MOEOT > & _replace, + moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false) + : + continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(dummyMerge, dummyReduce), replace(_replace), + fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection) + {} + + + /** + * Ctor taking a select, a transform, a merge and a reduce. + * @param _continuator the stopping criteria + * @param _eval the evaluation functions + * @param _select the selection scheme + * @param _transform the tranformation scheme + * @param _merge the merge scheme + * @param _reduce the reduce scheme + * @param _fitnessEval the fitness evaluation scheme + * @param _diversityEval the diversity evaluation scheme + * @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process + */ + moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoSelect < MOEOT > & _select, eoTransform < MOEOT > & _transform, eoMerge < MOEOT > & _merge, eoReduce< MOEOT > & _reduce, + moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false) + : + continuator(_continuator), eval(_eval), loopEval(_eval), popEval(loopEval), selectTransform(_select, _transform), breed(selectTransform), mergeReduce(_merge,_reduce), replace(mergeReduce), + fitnessEval(_fitnessEval), diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection) + {} + + + /** + * Applies a few generation of evolution to the population _pop. + * @param _pop the population + */ + virtual void operator()(eoPop < MOEOT > & _pop) + { + eoPop < MOEOT > offspring, empty_pop; + popEval(empty_pop, _pop); // A first eval of pop. + bool firstTime = true; + do + { + try + { + unsigned int pSize = _pop.size(); + offspring.clear(); // new offspring + // fitness and diversity assignment (if you want to or if it is the first generation) + if (evalFitAndDivBeforeSelection || firstTime) + { + firstTime = false; + fitnessEval(_pop); + diversityEval(_pop); + } + breed(_pop, offspring); + popEval(_pop, offspring); // eval of parents + offspring if necessary + replace(_pop, offspring); // after replace, the new pop. is in _pop + if (pSize > _pop.size()) + { + throw std::runtime_error("Population shrinking!"); + } + else if (pSize < _pop.size()) + { + throw std::runtime_error("Population growing!"); + } + } + catch (std::exception& e) + { + std::string s = e.what(); + s.append( " in moeoEasyEA"); + throw std::runtime_error( s ); + } + } while (continuator(_pop)); + } + + +protected: + + /** the stopping criteria */ + eoContinue < MOEOT > & continuator; + /** the evaluation functions */ + eoEvalFunc < MOEOT > & eval; + /** to evaluate the whole population */ + eoPopLoopEval < MOEOT > loopEval; + /** to evaluate the whole population */ + eoPopEvalFunc < MOEOT > & popEval; + /** breed: a select followed by a transform */ + eoSelectTransform < MOEOT > selectTransform; + /** the breeder */ + eoBreed < MOEOT > & breed; + /** replacement: a merge followed by a reduce */ + eoMergeReduce < MOEOT > mergeReduce; + /** the replacment strategy */ + moeoReplacement < MOEOT > & replace; + /** the fitness assignment strategy */ + moeoFitnessAssignment < MOEOT > & fitnessEval; + /** the diversity assignment strategy */ + moeoDiversityAssignment < MOEOT > & diversityEval; + /** if this parameter is set to 'true', the fitness and the diversity of the whole population will be re-evaluated before the selection process */ + bool evalFitAndDivBeforeSelection; + /** a dummy eval */ + class eoDummyEval : public eoEvalFunc < MOEOT > + { public: /** the dummy functor */ + void operator()(MOEOT &) {}} dummyEval; + /** a dummy select */ + class eoDummySelect : public eoSelect < MOEOT > + { public: /** the dummy functor */ + void operator()(const eoPop < MOEOT > &, eoPop < MOEOT > &) {} } dummySelect; + /** a dummy transform */ + class eoDummyTransform : public eoTransform < MOEOT > + { public: /** the dummy functor */ + void operator()(eoPop < MOEOT > &) {} } dummyTransform; + /** a dummy merge */ + eoNoElitism < MOEOT > dummyMerge; + /** a dummy reduce */ + eoTruncate < MOEOT > dummyReduce; + +}; + +#endif /*MOEOEASYEA_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoHybridLS.h b/trunk/paradiseo-moeo/src/algo/moeoHybridLS.h similarity index 94% rename from trunk/paradiseo-moeo/src/moeoHybridLS.h rename to trunk/paradiseo-moeo/src/algo/moeoHybridLS.h index 95aad42e0..3f2d6fd6f 100644 --- a/trunk/paradiseo-moeo/src/moeoHybridLS.h +++ b/trunk/paradiseo-moeo/src/algo/moeoHybridLS.h @@ -17,8 +17,8 @@ #include #include #include -#include -#include +#include +#include /** * This class allows to apply a multi-objective local search to a number of selected individuals contained in the archive @@ -52,7 +52,7 @@ public: eoPop < MOEOT > selectedSolutions; select(arch, selectedSolutions); // apply the local search to every selected solution - for (unsigned i=0; i +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * IBEA (Indicator-Based Evolutionary Algorithm) as described in: + * E. Zitzler, S. Künzli, "Indicator-Based Selection in Multiobjective Search", Proc. 8th International Conference on Parallel Problem Solving from Nature (PPSN VIII), pp. 832-842, Birmingham, UK (2004). + * This class builds the IBEA algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. + */ +template < class MOEOT > +class moeoIBEA : public moeoEA < MOEOT > +{ +public: + + /** The type of objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Simple ctor with a eoGenOp. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _op variation operator + * @param _metric metric + * @param _kappa scaling factor kappa + */ + moeoIBEA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2), + fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Simple ctor with a eoTransform. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _op variation operator + * @param _metric metric + * @param _kappa scaling factor kappa + */ + moeoIBEA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2), + fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Ctor with a crossover, a mutation and their corresponding rates. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _crossover crossover + * @param _pCross crossover probability + * @param _mutation mutation + * @param _pMut mutation probability + * @param _metric metric + * @param _kappa scaling factor kappa + */ + moeoIBEA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select (2), + fitnessAssignment(_metric, _kappa), replace (fitnessAssignment, dummyDiversityAssignment), defaultSGAGenOp(_crossover, _pCross, _mutation, _pMut), + genBreed (select, defaultSGAGenOp), breed (genBreed) + {} + + + /** + * Ctor with a continuator (instead of _maxGen) and a eoGenOp. + * @param _continuator stopping criteria + * @param _eval evaluation function + * @param _op variation operator + * @param _metric metric + * @param _kappa scaling factor kappa + */ + moeoIBEA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) : + continuator(_continuator), popEval(_eval), select(2), + fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Ctor with a continuator (instead of _maxGen) and a eoTransform. + * @param _continuator stopping criteria + * @param _eval evaluation function + * @param _op variation operator + * @param _metric metric + * @param _kappa scaling factor kappa + */ + moeoIBEA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa=0.05) : + continuator(_continuator), popEval(_eval), select(2), + fitnessAssignment(_metric, _kappa), replace(fitnessAssignment, dummyDiversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Apply a few generation of evolution to the population _pop until the stopping criteria is verified. + * @param _pop the population + */ + virtual void operator () (eoPop < MOEOT > &_pop) + { + eoPop < MOEOT > offspring, empty_pop; + popEval (empty_pop, _pop); // a first eval of _pop + // evaluate fitness and diversity + fitnessAssignment(_pop); + dummyDiversityAssignment(_pop); + do + { + // generate offspring, worths are recalculated if necessary + breed (_pop, offspring); + // eval of offspring + popEval (_pop, offspring); + // after replace, the new pop is in _pop. Worths are recalculated if necessary + replace (_pop, offspring); + } while (continuator (_pop)); + } + + +protected: + + /** a continuator based on the number of generations (used as default) */ + eoGenContinue < MOEOT > defaultGenContinuator; + /** stopping criteria */ + eoContinue < MOEOT > & continuator; + /** evaluation function used to evaluate the whole population */ + eoPopLoopEval < MOEOT > popEval; + /** binary tournament selection */ + moeoDetTournamentSelect < MOEOT > select; + /** fitness assignment used in IBEA */ + moeoIndicatorBasedFitnessAssignment < MOEOT > fitnessAssignment; + /** dummy diversity assignment */ + moeoDummyDiversityAssignment < MOEOT > dummyDiversityAssignment; + /** elitist replacement */ + moeoEnvironmentalReplacement < MOEOT > replace; + /** an object for genetic operators (used as default) */ + eoSGAGenOp < MOEOT > defaultSGAGenOp; + /** general breeder */ + eoGeneralBreeder < MOEOT > genBreed; + /** breeder */ + eoBreed < MOEOT > & breed; + +}; + +#endif /*MOEOIBEA_H_*/ diff --git a/trunk/paradiseo-moeo/src/algo/moeoIBMOLS.h b/trunk/paradiseo-moeo/src/algo/moeoIBMOLS.h new file mode 100755 index 000000000..e34a459fc --- /dev/null +++ b/trunk/paradiseo-moeo/src/algo/moeoIBMOLS.h @@ -0,0 +1,280 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoIBMOLS.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOIBMOLS_H_ +#define MOEOIBMOLS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Indicator-Based Multi-Objective Local Search (IBMOLS) as described in + * Basseur M., Burke K. : "Indicator-Based Multi-Objective Local Search" (2007). + */ +template < class MOEOT, class Move > +class moeoIBMOLS : public moeoLS < MOEOT, eoPop < MOEOT > & > +{ +public: + + /** The type of objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Ctor. + * @param _moveInit the move initializer + * @param _nextMove the neighborhood explorer + * @param _eval the full evaluation + * @param _moveIncrEval the incremental evaluation + * @param _fitnessAssignment the fitness assignment strategy + * @param _continuator the stopping criteria + */ + moeoIBMOLS( + moMoveInit < Move > & _moveInit, + moNextMove < Move > & _nextMove, + eoEvalFunc < MOEOT > & _eval, + moeoMoveIncrEval < Move > & _moveIncrEval, + moeoIndicatorBasedFitnessAssignment < MOEOT > & _fitnessAssignment, + eoContinue < MOEOT > & _continuator + ) : + moveInit(_moveInit), + nextMove(_nextMove), + eval(_eval), + moveIncrEval(_moveIncrEval), + fitnessAssignment (_fitnessAssignment), + continuator (_continuator) + {} + + + /** + * Apply the local search until a local archive does not change or + * another stopping criteria is met and update the archive _arch with new non-dominated solutions. + * @param _pop the initial population + * @param _arch the (updated) archive + */ + void operator() (eoPop < MOEOT > & _pop, moeoArchive < MOEOT > & _arch) + { + // evaluation of the objective values + /* + for (unsigned int i=0; i<_pop.size(); i++) + { + eval(_pop[i]); + } + */ + // fitness assignment for the whole population + fitnessAssignment(_pop); + // creation of a local archive + moeoArchive < MOEOT > archive; + // creation of another local archive (for the stopping criteria) + moeoArchive < MOEOT > previousArchive; + // update the archive with the initial population + archive.update(_pop); + do + { + previousArchive.update(archive); + oneStep(_pop); + archive.update(_pop); + } while ( (! archive.equals(previousArchive)) && (continuator(_arch)) ); + _arch.update(archive); + } + + +private: + + /** the move initializer */ + moMoveInit < Move > & moveInit; + /** the neighborhood explorer */ + moNextMove < Move > & nextMove; + /** the full evaluation */ + eoEvalFunc < MOEOT > & eval; + /** the incremental evaluation */ + moeoMoveIncrEval < Move > & moveIncrEval; + /** the fitness assignment strategy */ + moeoIndicatorBasedFitnessAssignment < MOEOT > & fitnessAssignment; + /** the stopping criteria */ + eoContinue < MOEOT > & continuator; + + + /** + * Apply one step of the local search to the population _pop + * @param _pop the population + */ + void oneStep (eoPop < MOEOT > & _pop) + { +//////////////////////////////////////////// + int ext_0_idx, ext_1_idx; + ObjectiveVector ext_0_objVec, ext_1_objVec; +/////////////////////////////////////////// + // the move + Move move; + // the objective vector and the fitness of the current solution + ObjectiveVector x_objVec; + double x_fitness; + // the index, the objective vector and the fitness of the worst solution in the population (-1 implies that the worst is the newly created one) + int worst_idx; + ObjectiveVector worst_objVec; + double worst_fitness; + // the index current of the current solution to be explored + unsigned int i=0; + // initilization of the move for the first individual + moveInit(move, _pop[i]); + while (i<_pop.size() && continuator(_pop)) + { + // x = one neigbour of pop[i] + // evaluate x in the objective space + x_objVec = moveIncrEval(move, _pop[i]); + // update every fitness values to take x into account and compute the fitness of x + x_fitness = fitnessAssignment.updateByAdding(_pop, x_objVec); + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +// qui sont les extremes ? (=> min only !!!) + ext_0_idx = -1; + ext_0_objVec = x_objVec; + ext_1_idx = -1; + ext_1_objVec = x_objVec; + for (unsigned int k=0; k<_pop.size(); k++) + { + // ext_0 + if (_pop[k].objectiveVector()[0] < ext_0_objVec[0]) + { + ext_0_idx = k; + ext_0_objVec = _pop[k].objectiveVector(); + } + else if ( (_pop[k].objectiveVector()[0] == ext_0_objVec[0]) && (_pop[k].objectiveVector()[1] < ext_0_objVec[1]) ) + { + ext_0_idx = k; + ext_0_objVec = _pop[k].objectiveVector(); + } + // ext_1 + else if (_pop[k].objectiveVector()[1] < ext_1_objVec[1]) + { + ext_1_idx = k; + ext_1_objVec = _pop[k].objectiveVector(); + } + else if ( (_pop[k].objectiveVector()[1] == ext_1_objVec[1]) && (_pop[k].objectiveVector()[0] < ext_1_objVec[0]) ) + { + ext_1_idx = k; + ext_1_objVec = _pop[k].objectiveVector(); + } + } +// worst init + if (ext_0_idx == -1) + { + unsigned int ind = 0; + while (ind == ext_1_idx) + { + ind++; + } + worst_idx = ind; + worst_objVec = _pop[ind].objectiveVector(); + worst_fitness = _pop[ind].fitness(); + } + else if (ext_1_idx == -1) + { + unsigned int ind = 0; + while (ind == ext_0_idx) + { + ind++; + } + worst_idx = ind; + worst_objVec = _pop[ind].objectiveVector(); + worst_fitness = _pop[ind].fitness(); + } + else + { + worst_idx = -1; + worst_objVec = x_objVec; + worst_fitness = x_fitness; + } +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////// + + // who is the worst ? + for (unsigned int j=0; j<_pop.size(); j++) + { + if ( (j!=ext_0_idx) && (j!=ext_1_idx) ) + { + if (_pop[j].fitness() < worst_fitness) + { + worst_idx = j; + worst_objVec = _pop[j].objectiveVector(); + worst_fitness = _pop[j].fitness(); + } + } + } + // if the worst solution is the new one + if (worst_idx == -1) + { + // if all its neighbours have been explored, + // let's explore the neighborhoud of the next individual + if (! nextMove(move, _pop[i])) + { + i++; + if (i<_pop.size()) + { + // initilization of the move for the next individual + moveInit(move, _pop[i]); + } + } + } + // if the worst solution is located before _pop[i] + else if (worst_idx <= i) + { + // the new solution takes place insteed of _pop[worst_idx] + _pop[worst_idx] = _pop[i]; + move(_pop[worst_idx]); + _pop[worst_idx].objectiveVector(x_objVec); + _pop[worst_idx].fitness(x_fitness); + // let's explore the neighborhoud of the next individual + i++; + if (i<_pop.size()) + { + // initilization of the move for the next individual + moveInit(move, _pop[i]); + } + } + // if the worst solution is located after _pop[i] + else if (worst_idx > i) + { + // the new solution takes place insteed of _pop[i+1] and _pop[worst_idx] is deleted + _pop[worst_idx] = _pop[i+1]; + _pop[i+1] = _pop[i]; + move(_pop[i+1]); + _pop[i+1].objectiveVector(x_objVec); + _pop[i+1].fitness(x_fitness); + // let's explore the neighborhoud of the individual _pop[i+2] + i += 2; + if (i<_pop.size()) + { + // initilization of the move for the next individual + moveInit(move, _pop[i]); + } + } + // update fitness values + fitnessAssignment.updateByDeleting(_pop, worst_objVec); + } + } + +}; + +#endif /*MOEOIBMOLS_H_*/ diff --git a/trunk/paradiseo-moeo/src/algo/moeoIteratedIBMOLS.h b/trunk/paradiseo-moeo/src/algo/moeoIteratedIBMOLS.h new file mode 100755 index 000000000..c70fd27b2 --- /dev/null +++ b/trunk/paradiseo-moeo/src/algo/moeoIteratedIBMOLS.h @@ -0,0 +1,215 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoIteratedIBMOLS.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOITERATEDIBMOLS_H_ +#define MOEOITERATEDIBMOLS_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +//#include + + + +/** + * Iterated version of IBMOLS as described in + * Basseur M., Burke K. : "Indicator-Based Multi-Objective Local Search" (2007). + */ +template < class MOEOT, class Move > +class moeoIteratedIBMOLS : public moeoLS < MOEOT, eoPop < MOEOT > & > +{ +public: + + /** The type of objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Ctor. + * @param _moveInit the move initializer + * @param _nextMove the neighborhood explorer + * @param _eval the full evaluation + * @param _moveIncrEval the incremental evaluation + * @param _fitnessAssignment the fitness assignment strategy + * @param _continuator the stopping criteria + * @param _monOp the monary operator + * @param _randomMonOp the random monary operator (or random initializer) + * @param _nNoiseIterations the number of iterations to apply the random noise + */ + moeoIteratedIBMOLS( + moMoveInit < Move > & _moveInit, + moNextMove < Move > & _nextMove, + eoEvalFunc < MOEOT > & _eval, + moeoMoveIncrEval < Move > & _moveIncrEval, + moeoIndicatorBasedFitnessAssignment < MOEOT > & _fitnessAssignment, + eoContinue < MOEOT > & _continuator, + eoMonOp < MOEOT > & _monOp, + eoMonOp < MOEOT > & _randomMonOp, + unsigned int _nNoiseIterations=1 + ) : + ibmols(_moveInit, _nextMove, _eval, _moveIncrEval, _fitnessAssignment, _continuator), + eval(_eval), + continuator(_continuator), + monOp(_monOp), + randomMonOp(_randomMonOp), + nNoiseIterations(_nNoiseIterations) + {} + + + /** + * Apply the local search iteratively until the stopping criteria is met. + * @param _pop the initial population + * @param _arch the (updated) archive + */ + void operator() (eoPop < MOEOT > & _pop, moeoArchive < MOEOT > & _arch) + { + _arch.update(_pop); + ibmols(_pop, _arch); + while (continuator(_arch)) + { + // generate new solutions from the archive + generateNewSolutions(_pop, _arch); + // apply the local search (the global archive is updated in the sub-function) + ibmols(_pop, _arch); + } + } + + +private: + + /** the local search to iterate */ + moeoIBMOLS < MOEOT, Move > ibmols; + /** the full evaluation */ + eoEvalFunc < MOEOT > & eval; + /** the stopping criteria */ + eoContinue < MOEOT > & continuator; + /** the monary operator */ + eoMonOp < MOEOT > & monOp; + /** the random monary operator (or random initializer) */ + eoMonOp < MOEOT > & randomMonOp; + /** the number of iterations to apply the random noise */ + unsigned int nNoiseIterations; + + + /** + * Creates new population randomly initialized and/or initialized from the archive _arch. + * @param _pop the output population + * @param _arch the archive + */ + void generateNewSolutions(eoPop < MOEOT > & _pop, const moeoArchive < MOEOT > & _arch) + { + // shuffle vector for the random selection of individuals + vector shuffle; + shuffle.resize(std::max(_pop.size(), _arch.size())); + // init shuffle + for (unsigned int i=0; i gen; + std::random_shuffle(shuffle.begin(), shuffle.end(), gen); + // start the creation of new solutions + for (unsigned int i=0; i<_pop.size(); i++) + { + if (shuffle[i] < _arch.size()) + // the given archive contains the individual i + { + // add it to the resulting pop + _pop[i] = _arch[shuffle[i]]; + // then, apply the operator nIterationsNoise times + for (unsigned int j=0; j & _pop, const moeoArchive < MOEOT > & _arch) + { + // here, we must have a QuadOp ! + //eoQuadOp < MOEOT > quadOp; + rsCrossQuad quadOp; + // shuffle vector for the random selection of individuals + vector shuffle; + shuffle.resize(_arch.size()); + // init shuffle + for (unsigned int i=0; i gen; + std::random_shuffle(shuffle.begin(), shuffle.end(), gen); + // start the creation of new solutions + unsigned int i=0; + while ((i<_pop.size()-1) && (i<_arch.size()-1)) + { + _pop[i] = _arch[shuffle[i]]; + _pop[i+1] = _arch[shuffle[i+1]]; + // then, apply the operator nIterationsNoise times + for (unsigned int j=0; j -#include +#include +#include /** * Abstract class for local searches applied to multi-objective optimization. * Starting from a Type (i.e.: an individual, a pop, an archive...), it produces a set of new non-dominated solutions. */ template < class MOEOT, class Type > -class moeoLS: public eoBF < Type, moeoArchive < MOEOT > &, void > - {}; +class moeoLS: public moeoAlgo, public eoBF < Type, moeoArchive < MOEOT > &, void > {}; #endif /*MOEOLS_H_*/ diff --git a/trunk/paradiseo-moeo/src/algo/moeoNSGA.h b/trunk/paradiseo-moeo/src/algo/moeoNSGA.h new file mode 100644 index 000000000..b1bd71076 --- /dev/null +++ b/trunk/paradiseo-moeo/src/algo/moeoNSGA.h @@ -0,0 +1,158 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoNSGA.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEONSGA_H_ +#define MOEONSGA_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * NSGA (Non-dominated Sorting Genetic Algorithm) as described in: + * N. Srinivas, K. Deb, "Multiobjective Optimization Using Nondominated Sorting in Genetic Algorithms". + * Evolutionary Computation, Vol. 2(3), No 2, pp. 221-248 (1994). + * This class builds the NSGA algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. + */ +template < class MOEOT > +class moeoNSGA: public moeoEA < MOEOT > +{ +public: + + /** + * Simple ctor with a eoGenOp. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _op variation operator + * @param _nicheSize niche size + */ + moeoNSGA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, double _nicheSize = 0.5) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2), + diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Simple ctor with a eoTransform. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _op variation operator + * @param _nicheSize niche size + */ + moeoNSGA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, double _nicheSize = 0.5) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2), + diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Ctor with a crossover, a mutation and their corresponding rates. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _crossover crossover + * @param _pCross crossover probability + * @param _mutation mutation + * @param _pMut mutation probability + * @param _nicheSize niche size + */ + moeoNSGA (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut, double _nicheSize = 0.5) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select (2), + diversityAssignment(_nicheSize), replace (fitnessAssignment, diversityAssignment), + defaultSGAGenOp(_crossover, _pCross, _mutation, _pMut), genBreed (select, defaultSGAGenOp), breed (genBreed) + {} + + + /** + * Ctor with a continuator (instead of _maxGen) and a eoGenOp. + * @param _continuator stopping criteria + * @param _eval evaluation function + * @param _op variation operator + * @param _nicheSize niche size + */ + moeoNSGA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op, double _nicheSize = 0.5) : + continuator(_continuator), popEval(_eval), select(2), + diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Ctor with a continuator (instead of _maxGen) and a eoTransform. + * @param _continuator stopping criteria + * @param _eval evaluation function + * @param _op variation operator + * @param _nicheSize niche size + */ + moeoNSGA (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op, double _nicheSize = 0.5) : + continuator(_continuator), popEval(_eval), select(2), + diversityAssignment(_nicheSize), replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Apply a few generation of evolution to the population _pop until the stopping criteria is verified. + * @param _pop the population + */ + virtual void operator () (eoPop < MOEOT > &_pop) + { + eoPop < MOEOT > offspring, empty_pop; + popEval (empty_pop, _pop); // a first eval of _pop + // evaluate fitness and diversity + fitnessAssignment(_pop); + diversityAssignment(_pop); + do + { + // generate offspring, worths are recalculated if necessary + breed (_pop, offspring); + // eval of offspring + popEval (_pop, offspring); + // after replace, the new pop is in _pop. Worths are recalculated if necessary + replace (_pop, offspring); + } while (continuator (_pop)); + } + + +protected: + + /** a continuator based on the number of generations (used as default) */ + eoGenContinue < MOEOT > defaultGenContinuator; + /** stopping criteria */ + eoContinue < MOEOT > & continuator; + /** evaluation function used to evaluate the whole population */ + eoPopLoopEval < MOEOT > popEval; + /** binary tournament selection */ + moeoDetTournamentSelect < MOEOT > select; + /** fitness assignment used in NSGA-II */ + moeoFastNonDominatedSortingFitnessAssignment < MOEOT > fitnessAssignment; + /** diversity assignment used in NSGA-II */ + moeoFrontByFrontSharingDiversityAssignment < MOEOT > diversityAssignment; + /** elitist replacement */ + moeoElitistReplacement < MOEOT > replace; + /** an object for genetic operators (used as default) */ + eoSGAGenOp < MOEOT > defaultSGAGenOp; + /** general breeder */ + eoGeneralBreeder < MOEOT > genBreed; + /** breeder */ + eoBreed < MOEOT > & breed; + +}; + +#endif /*MOEONSGAII_H_*/ diff --git a/trunk/paradiseo-moeo/src/algo/moeoNSGAII.h b/trunk/paradiseo-moeo/src/algo/moeoNSGAII.h new file mode 100644 index 000000000..0c27bfd15 --- /dev/null +++ b/trunk/paradiseo-moeo/src/algo/moeoNSGAII.h @@ -0,0 +1,153 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoNSGAII.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEONSGAII_H_ +#define MOEONSGAII_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * NSGA-II (Non-dominated Sorting Genetic Algorithm II) as described in: + * Deb, K., S. Agrawal, A. Pratap, and T. Meyarivan : "A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II". + * In IEEE Transactions on Evolutionary Computation, Vol. 6, No 2, pp 182-197 (April 2002). + * This class builds the NSGA-II algorithm only by using the fine-grained components of the ParadisEO-MOEO framework. + */ +template < class MOEOT > +class moeoNSGAII: public moeoEA < MOEOT > +{ +public: + + /** + * Simple ctor with a eoGenOp. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _op variation operator + */ + moeoNSGAII (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2), + replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Simple ctor with a eoTransform. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _op variation operator + */ + moeoNSGAII (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select(2), + replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Ctor with a crossover, a mutation and their corresponding rates. + * @param _maxGen number of generations before stopping + * @param _eval evaluation function + * @param _crossover crossover + * @param _pCross crossover probability + * @param _mutation mutation + * @param _pMut mutation probability + */ + moeoNSGAII (unsigned int _maxGen, eoEvalFunc < MOEOT > & _eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut) : + defaultGenContinuator(_maxGen), continuator(defaultGenContinuator), popEval(_eval), select (2), + replace (fitnessAssignment, diversityAssignment), defaultSGAGenOp(_crossover, _pCross, _mutation, _pMut), + genBreed (select, defaultSGAGenOp), breed (genBreed) + {} + + + /** + * Ctor with a continuator (instead of _maxGen) and a eoGenOp. + * @param _continuator stopping criteria + * @param _eval evaluation function + * @param _op variation operator + */ + moeoNSGAII (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op) : + continuator(_continuator), popEval(_eval), select(2), + replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Ctor with a continuator (instead of _maxGen) and a eoTransform. + * @param _continuator stopping criteria + * @param _eval evaluation function + * @param _op variation operator + */ + moeoNSGAII (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoTransform < MOEOT > & _op) : + continuator(_continuator), popEval(_eval), select(2), + replace(fitnessAssignment, diversityAssignment), genBreed(select, _op), breed(genBreed) + {} + + + /** + * Apply a few generation of evolution to the population _pop until the stopping criteria is verified. + * @param _pop the population + */ + virtual void operator () (eoPop < MOEOT > &_pop) + { + eoPop < MOEOT > offspring, empty_pop; + popEval (empty_pop, _pop); // a first eval of _pop + // evaluate fitness and diversity + fitnessAssignment(_pop); + diversityAssignment(_pop); + do + { + // generate offspring, worths are recalculated if necessary + breed (_pop, offspring); + // eval of offspring + popEval (_pop, offspring); + // after replace, the new pop is in _pop. Worths are recalculated if necessary + replace (_pop, offspring); + } while (continuator (_pop)); + } + + +protected: + + /** a continuator based on the number of generations (used as default) */ + eoGenContinue < MOEOT > defaultGenContinuator; + /** stopping criteria */ + eoContinue < MOEOT > & continuator; + /** evaluation function used to evaluate the whole population */ + eoPopLoopEval < MOEOT > popEval; + /** binary tournament selection */ + moeoDetTournamentSelect < MOEOT > select; + /** fitness assignment used in NSGA-II */ + moeoFastNonDominatedSortingFitnessAssignment < MOEOT > fitnessAssignment; + /** diversity assignment used in NSGA-II */ + moeoFrontByFrontCrowdingDistanceDiversityAssignment < MOEOT > diversityAssignment; + /** elitist replacement */ + moeoElitistReplacement < MOEOT > replace; + /** an object for genetic operators (used as default) */ + eoSGAGenOp < MOEOT > defaultSGAGenOp; + /** general breeder */ + eoGeneralBreeder < MOEOT > genBreed; + /** breeder */ + eoBreed < MOEOT > & breed; + +}; + +#endif /*MOEONSGAII_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoArchive.h b/trunk/paradiseo-moeo/src/archive/moeoArchive.h similarity index 81% rename from trunk/paradiseo-moeo/src/moeoArchive.h rename to trunk/paradiseo-moeo/src/archive/moeoArchive.h index d9dfa0a01..9338799d8 100644 --- a/trunk/paradiseo-moeo/src/moeoArchive.h +++ b/trunk/paradiseo-moeo/src/archive/moeoArchive.h @@ -14,7 +14,8 @@ #define MOEOARCHIVE_H_ #include -#include +#include +#include /** * An archive is a secondary population that stores non-dominated solutions. @@ -24,10 +25,10 @@ class moeoArchive : public eoPop < MOEOT > { public: - using std::vector < MOEOT > :: size; - using std::vector < MOEOT > :: operator[]; - using std::vector < MOEOT > :: back; - using std::vector < MOEOT > :: pop_back; + using eoPop < MOEOT > :: size; + using eoPop < MOEOT > :: operator[]; + using eoPop < MOEOT > :: back; + using eoPop < MOEOT > :: pop_back; /** @@ -58,9 +59,10 @@ public: */ bool dominates (const ObjectiveVector & _objectiveVector) const { - for (unsigned i = 0; i & _pop) { - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { update(_pop[i]); } @@ -143,20 +145,19 @@ public: /** - * Returns true if the current archive contains the same objective vectors - * than the given archive _arch + * Returns true if the current archive contains the same objective vectors than the given archive _arch * @param _arch the given archive */ bool equals (const moeoArchive < MOEOT > & _arch) { - for (unsigned i=0; i + +/** + * Functor allowing to compare two solutions according to their fitness and diversity values, each according to its aggregative value. + */ +template < class MOEOT > +class moeoAggregativeComparator : public moeoComparator < MOEOT > +{ +public: + + /** + * Ctor. + * @param _weightFitness the weight for fitness + * @param _weightDiversity the weight for diversity + */ + moeoAggregativeComparator(double _weightFitness = 1.0, double _weightDiversity = 1.0) : weightFitness(_weightFitness), weightDiversity(_weightDiversity) + {} + + + /** + * Returns true if _moeo1 < _moeo2 according to the aggregation of their fitness and diversity values + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + return ( weightFitness * _moeo1.fitness() + weightDiversity * _moeo1.diversity() ) < ( weightFitness * _moeo2.fitness() + weightDiversity * _moeo2.diversity() ); + } + + +private: + + /** the weight for fitness */ + double weightFitness; + /** the weight for diversity */ + double weightDiversity; + +}; + +#endif /*MOEOAGGREGATIVECOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoComparator.h new file mode 100644 index 000000000..9243a57bc --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoComparator.h @@ -0,0 +1,24 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOCOMPARATOR_H_ +#define MOEOCOMPARATOR_H_ + +#include + +/** + * Functor allowing to compare two solutions. + */ +template < class MOEOT > +class moeoComparator : public eoBF < const MOEOT &, const MOEOT &, const bool > {}; + +#endif /*MOEOCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoDiversityThenFitnessComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoDiversityThenFitnessComparator.h new file mode 100644 index 000000000..54df59b82 --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoDiversityThenFitnessComparator.h @@ -0,0 +1,45 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDiversityThenFitnessComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODIVERSITYTHENFITNESSCOMPARATOR_H_ +#define MOEODIVERSITYTHENFITNESSCOMPARATOR_H_ + +#include + +/** + * Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. + */ +template < class MOEOT > +class moeoDiversityThenFitnessComparator : public moeoComparator < MOEOT > +{ +public: + + /** + * Returns true if _moeo1 < _moeo2 according to their diversity values, then according to their fitness values + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + if (_moeo1.diversity() == _moeo2.diversity()) + { + return _moeo1.fitness() < _moeo2.fitness(); + } + else + { + return _moeo1.diversity() < _moeo2.diversity(); + } + } + +}; + +#endif /*MOEODIVERSITYTHENFITNESSCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoFitnessThenDiversityComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoFitnessThenDiversityComparator.h new file mode 100644 index 000000000..5baf10097 --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoFitnessThenDiversityComparator.h @@ -0,0 +1,45 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoFitnessThenDiversityComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOFITNESSTHENDIVERSITYCOMPARATOR_H_ +#define MOEOFITNESSTHENDIVERSITYCOMPARATOR_H_ + +#include + +/** + * Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. + */ +template < class MOEOT > +class moeoFitnessThenDiversityComparator : public moeoComparator < MOEOT > +{ +public: + + /** + * Returns true if _moeo1 < _moeo2 according to their fitness values, then according to their diversity values + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + if (_moeo1.fitness() == _moeo2.fitness()) + { + return _moeo1.diversity() < _moeo2.diversity(); + } + else + { + return _moeo1.fitness() < _moeo2.fitness(); + } + } + +}; + +#endif /*MOEOFITNESSTHENDIVERSITYCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoGDominanceObjectiveVectorComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoGDominanceObjectiveVectorComparator.h new file mode 100644 index 000000000..006d1c4f2 --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoGDominanceObjectiveVectorComparator.h @@ -0,0 +1,102 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoGDominanceObjectiveVectorComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOGDOMINANCEOBJECTIVEVECTORCOMPARATOR_H_ +#define MOEOGDOMINANCEOBJECTIVEVECTORCOMPARATOR_H_ + +#include + +/** + * This functor class allows to compare 2 objective vectors according to g-dominance. + * The concept of g-dominance as been introduced in: + * J. Molina, L. V. Santana, A. G. Hernandez-Diaz, C. A. Coello Coello, R. Caballero, + * "g-dominance: Reference point based dominance" (2007) + */ +template < class ObjectiveVector > +class moeoGDominanceObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector > +{ +public: + + /** + * Ctor. + * @param _ref the reference point + */ + moeoGDominanceObjectiveVectorComparator(ObjectiveVector & _ref) : ref(_ref) + {} + + + /** + * Returns true if _objectiveVector1 is g-dominated by _objectiveVector2. + * @param _objectiveVector1 the first objective vector + * @param _objectiveVector2 the second objective vector + */ + const bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2) + { + unsigned int flag1 = flag(_objectiveVector1); + unsigned int flag2 = flag(_objectiveVector2); + if (flag2==0) + { + // cannot dominate + return false; + } + else if ( (flag2==1) && (flag1==0) ) + { + // is dominated + return true; + } + else // (flag1==1) && (flag2==1) + { + // both are on the good region, so let's use the classical Pareto dominance + return paretoComparator(_objectiveVector1, _objectiveVector2); + } + } + + +private: + + /** the reference point */ + ObjectiveVector & ref; + /** Pareto comparator */ + moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; + + + /** + * Returns the flag of _objectiveVector according to the reference point + * @param _objectiveVector the first objective vector + */ + unsigned int flag(const ObjectiveVector & _objectiveVector) + { + unsigned int result=1; + for (unsigned int i=0; i ref[i]) + { + result=0; + } + } + if (result==0) + { + result=1; + for (unsigned int i=0; i + +/** + * Functor allowing to compare two objective vectors according to their first objective value, then their second, and so on. + */ +template < class ObjectiveVector > +class moeoObjectiveObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector > +{ +public: + + /** + * Returns true if _objectiveVector1 < _objectiveVector2 on the first objective, then on the second, and so on + * @param _objectiveVector1 the first objective vector + * @param _objectiveVector2 the second objective vector + */ + const bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2) + { + for (unsigned int i=0; i ObjectiveVector::Traits::tolerance() ) + { + if (_objectiveVector1[i] < _objectiveVector2[i]) + { + return true; + } + else + { + return false; + } + } + } + return false; + } + +}; + +#endif /*MOEOOBJECTIVEOBJECTIVEVECTORCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoObjectiveVectorComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoObjectiveVectorComparator.h new file mode 100644 index 000000000..75608ad12 --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoObjectiveVectorComparator.h @@ -0,0 +1,26 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoObjectiveVectorComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOOBJECTIVEVECTORCOMPARATOR_H_ +#define MOEOOBJECTIVEVECTORCOMPARATOR_H_ + +#include +#include + +/** + * Abstract class allowing to compare 2 objective vectors. + * The template argument ObjectiveVector have to be a moeoObjectiveVector. + */ +template < class ObjectiveVector > +class moeoObjectiveVectorComparator : public eoBF < const ObjectiveVector &, const ObjectiveVector &, const bool > {}; + +#endif /*MOEOOBJECTIVEVECTORCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoOneObjectiveComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoOneObjectiveComparator.h new file mode 100644 index 000000000..74be47bb3 --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoOneObjectiveComparator.h @@ -0,0 +1,57 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoOneObjectiveComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOONEOBJECTIVECOMPARATOR_H_ +#define MOEOONEOBJECTIVECOMPARATOR_H_ + +#include + +/** + * Functor allowing to compare two solutions according to one objective. + */ +template < class MOEOT > +class moeoOneObjectiveComparator : public moeoComparator < MOEOT > +{ +public: + + /** + * Ctor. + * @param _obj the index of objective + */ + moeoOneObjectiveComparator(unsigned int _obj) : obj(_obj) + { + if (obj > MOEOT::ObjectiveVector::nObjectives()) + { + throw std::runtime_error("Problem with the index of objective in moeoOneObjectiveComparator"); + } + } + + + /** + * Returns true if _moeo1 < _moeo2 on the obj objective + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + return _moeo1.objectiveVector()[obj] < _moeo2.objectiveVector()[obj]; + } + + +private: + + /** the index of objective */ + unsigned int obj; + +}; + +#endif /*MOEOONEOBJECTIVECOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/comparator/moeoParetoObjectiveVectorComparator.h b/trunk/paradiseo-moeo/src/comparator/moeoParetoObjectiveVectorComparator.h new file mode 100644 index 000000000..c9f8e8260 --- /dev/null +++ b/trunk/paradiseo-moeo/src/comparator/moeoParetoObjectiveVectorComparator.h @@ -0,0 +1,70 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoParetoObjectiveVectorComparator.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOPARETOOBJECTIVEVECTORCOMPARATOR_H_ +#define MOEOPARETOOBJECTIVEVECTORCOMPARATOR_H_ + +#include + +/** + * This functor class allows to compare 2 objective vectors according to Pareto dominance. + */ +template < class ObjectiveVector > +class moeoParetoObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector > +{ +public: + + /** + * Returns true if _objectiveVector1 is dominated by _objectiveVector2 + * @param _objectiveVector1 the first objective vector + * @param _objectiveVector2 the second objective vector + */ + const bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2) + { + bool dom = false; + for (unsigned int i=0; i ObjectiveVector::Traits::tolerance() ) + { + // if the ith objective have to be minimized... + if (ObjectiveVector::minimizing(i)) + { + if (_objectiveVector1[i] > _objectiveVector2[i]) + { + dom = true; //_objectiveVector1[i] is not better than _objectiveVector2[i] + } + else + { + return false; //_objectiveVector2 cannot dominate _objectiveVector1 + } + } + // if the ith objective have to be maximized... + else if (ObjectiveVector::maximizing(i)) + { + if (_objectiveVector1[i] > _objectiveVector2[i]) + { + dom = true; //_objectiveVector1[i] is not better than _objectiveVector2[i] + } + else + { + return false; //_objectiveVector2 cannot dominate _objectiveVector1 + } + } + } + } + return dom; + } + +}; + +#endif /*MOEOPARETOOBJECTIVEVECTORCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/MOEO.h b/trunk/paradiseo-moeo/src/core/MOEO.h similarity index 92% rename from trunk/paradiseo-moeo/src/MOEO.h rename to trunk/paradiseo-moeo/src/core/MOEO.h index 05d9b32a2..ed288facc 100644 --- a/trunk/paradiseo-moeo/src/MOEO.h +++ b/trunk/paradiseo-moeo/src/core/MOEO.h @@ -24,6 +24,9 @@ * The template argument MOEOFitness is an object reflecting the quality of the solution in term of convergence (the fitness of a solution is always to be maximized). * The template argument MOEODiversity is an object reflecting the quality of the solution in term of diversity (the diversity of a solution is always to be maximized). * All template arguments must have a void and a copy constructor. + * Using some specific representations, you will have to define a copy constructor if the default one is not what you want. + * In the same cases, you will also have to define the affectation operator (operator=). + * Then, you will explicitly have to call the parent copy constructor and the parent affectation operator at the beginning of the corresponding implementation. * Besides, note that, contrary to the mono-objective case (and to EO) where the fitness value of a solution is confused with its objective value, * the fitness value differs of the objectives values in the multi-objective case. */ @@ -69,7 +72,7 @@ public: { if ( invalidObjectiveVector() ) { - throw std::runtime_error("invalid objective vector"); + throw std::runtime_error("invalid objective vector in MOEO"); } return objectiveVectorValue; } @@ -111,7 +114,7 @@ public: { if ( invalidFitness() ) { - throw std::runtime_error("invalid fitness (MOEO)"); + throw std::runtime_error("invalid fitness in MOEO"); } return fitnessValue; } @@ -153,7 +156,7 @@ public: { if ( invalidDiversity() ) { - throw std::runtime_error("invalid diversity"); + throw std::runtime_error("invalid diversity in MOEO"); } return diversityValue; } diff --git a/trunk/paradiseo-moeo/src/core/Makefile.am b/trunk/paradiseo-moeo/src/core/Makefile.am new file mode 100644 index 000000000..8e2a6f0cd --- /dev/null +++ b/trunk/paradiseo-moeo/src/core/Makefile.am @@ -0,0 +1,9 @@ +lib_LIBRARIES = libmoeo.a + +libmoeo_a_SOURCES = moeoObjectiveVectorTraits.cpp + +pkginclude_HEADERS = moeoObjectiveVectorTraits.h + +INCLUDES = -I$(EO_DIR)/src/ -I$(top_srcdir)/src/ + +AM_CXXFLAGS = -Wall -ansi -pedantic diff --git a/trunk/paradiseo-moeo/src/core/moeoBitVector.h b/trunk/paradiseo-moeo/src/core/moeoBitVector.h new file mode 100644 index 000000000..61ed4b7ed --- /dev/null +++ b/trunk/paradiseo-moeo/src/core/moeoBitVector.h @@ -0,0 +1,74 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoBitVector.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOBITVECTOR_H_ +#define MOEOBITVECTOR_H_ + +#include + +/** + * This class is an implementationeo of a simple bit-valued moeoVector. + */ +template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity > +class moeoBitVector : public moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > +{ +public: + + using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: begin; + using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: end; + using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: resize; + using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: size; + + + /** + * Ctor + * @param _size Length of vector (default is 0) + * @param _value Initial value of all elements (default is default value of type GeneType) + */ + moeoBitVector(unsigned int _size = 0, bool _value = false) : moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >(_size, _value) + {} + + + /** + * Writing object + * @param _os output stream + */ + virtual void printOn(std::ostream & _os) const + { + MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn(_os); + _os << ' '; + _os << size() << ' '; + std::copy(begin(), end(), std::ostream_iterator(_os)); + } + + + /** + * Reading object + * @param _is input stream + */ + virtual void readFrom(std::istream & _is) + { + MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom(_is); + unsigned int s; + _is >> s; + std::string bits; + _is >> bits; + if (_is) + { + resize(bits.size()); + std::transform(bits.begin(), bits.end(), begin(), std::bind2nd(std::equal_to(), '1')); + } + } + +}; + +#endif /*MOEOBITVECTOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoEvalFunc.h b/trunk/paradiseo-moeo/src/core/moeoEvalFunc.h similarity index 100% rename from trunk/paradiseo-moeo/src/moeoEvalFunc.h rename to trunk/paradiseo-moeo/src/core/moeoEvalFunc.h diff --git a/trunk/paradiseo-moeo/src/core/moeoObjectiveVector.h b/trunk/paradiseo-moeo/src/core/moeoObjectiveVector.h new file mode 100644 index 000000000..867f6a3d3 --- /dev/null +++ b/trunk/paradiseo-moeo/src/core/moeoObjectiveVector.h @@ -0,0 +1,91 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoObjectiveVector.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOOBJECTIVEVECTOR_H_ +#define MOEOOBJECTIVEVECTOR_H_ + +#include + +/** + * Abstract class allowing to represent a solution in the objective space (phenotypic representation). + * The template argument ObjectiveVectorTraits defaults to moeoObjectiveVectorTraits, + * but it can be replaced at will by any other class that implements the static functions defined therein. + * Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's. + */ +template < class ObjectiveVectorTraits, class ObjectiveVectorType > +class moeoObjectiveVector : public std::vector < ObjectiveVectorType > +{ +public: + + /** The traits of objective vectors */ + typedef ObjectiveVectorTraits Traits; + /** The type of an objective value */ + typedef ObjectiveVectorType Type; + + + /** + * Ctor + */ + moeoObjectiveVector(Type _value = Type()) : std::vector < Type > (ObjectiveVectorTraits::nObjectives(), _value) + {} + + + /** + * Ctor from a vector of Type + * @param _v the std::vector < Type > + */ + moeoObjectiveVector(std::vector < Type > & _v) : std::vector < Type > (_v) + {} + + + /** + * Parameters setting (for the objective vector of any solution) + * @param _nObjectives the number of objectives + * @param _bObjectives the min/max vector (true = min / false = max) + */ + static void setup(unsigned int _nObjectives, std::vector < bool > & _bObjectives) + { + ObjectiveVectorTraits::setup(_nObjectives, _bObjectives); + } + + + /** + * Returns the number of objectives + */ + static unsigned int nObjectives() + { + return ObjectiveVectorTraits::nObjectives(); + } + + + /** + * Returns true if the _ith objective have to be minimized + * @param _i the index + */ + static bool minimizing(unsigned int _i) + { + return ObjectiveVectorTraits::minimizing(_i); + } + + + /** + * Returns true if the _ith objective have to be maximized + * @param _i the index + */ + static bool maximizing(unsigned int _i) + { + return ObjectiveVectorTraits::maximizing(_i); + } + +}; + +#endif /*MOEOOBJECTIVEVECTOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoObjectiveVector.h b/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorDouble.h similarity index 64% rename from trunk/paradiseo-moeo/src/moeoObjectiveVector.h rename to trunk/paradiseo-moeo/src/core/moeoObjectiveVectorDouble.h index b4b2b78bd..6b296a69c 100644 --- a/trunk/paradiseo-moeo/src/moeoObjectiveVector.h +++ b/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorDouble.h @@ -1,7 +1,7 @@ // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- //----------------------------------------------------------------------------- -// moeoObjectiveVector.h +// moeoObjectiveVectorDouble.h // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 /* This library... @@ -10,92 +10,40 @@ */ //----------------------------------------------------------------------------- -#ifndef MOEOOBJECTIVEVECTOR_H_ -#define MOEOOBJECTIVEVECTOR_H_ +#ifndef MOEOOBJECTIVEVECTORDOUBLE_H_ +#define MOEOOBJECTIVEVECTORDOUBLE_H_ #include #include -#include -#include - -/** - * Abstract class allowing to represent a solution in the objective space (phenotypic representation). - * The template argument ObjectiveVectorTraits defaults to moeoObjectiveVectorTraits, - * but it can be replaced at will by any other class that implements the static functions defined therein. - * Some static funtions to access to the traits characteristics are re-defined in order not to write a lot of typedef's. - */ -template < class ObjectiveVectorTraits > -class moeoObjectiveVector -{ -public: - - /** The traits of objective vectors */ - typedef ObjectiveVectorTraits Traits; - - - /** - * Parameters setting (for the objective vector of any solution) - * @param _nObjectives the number of objectives - * @param _bObjectives the min/max vector (true = min / false = max) - */ - static void setup(unsigned _nObjectives, std::vector < bool > & _bObjectives) - { - ObjectiveVectorTraits::setup(_nObjectives, _bObjectives); - } - - - /** - * Returns the number of objectives - */ - static unsigned nObjectives() - { - return ObjectiveVectorTraits::nObjectives(); - } - - - /** - * Returns true if the _ith objective have to be minimized - * @param _i the index - */ - static bool minimizing(unsigned _i) { - return ObjectiveVectorTraits::minimizing(_i); - } - - - /** - * Returns true if the _ith objective have to be maximized - * @param _i the index - */ - static bool maximizing(unsigned _i) { - return ObjectiveVectorTraits::maximizing(_i); - } - -}; - +#include +#include +#include /** * This class allows to represent a solution in the objective space (phenotypic representation) by a std::vector of doubles, * i.e. that an objective value is represented using a double, and this for any objective. */ template < class ObjectiveVectorTraits > -class moeoObjectiveVectorDouble : public moeoObjectiveVector < ObjectiveVectorTraits >, public std::vector < double > +class moeoObjectiveVectorDouble : public moeoObjectiveVector < ObjectiveVectorTraits, double > { public: - using std::vector< double >::size; - using std::vector< double >::operator[]; + using moeoObjectiveVector < ObjectiveVectorTraits, double >::size; + using moeoObjectiveVector < ObjectiveVectorTraits, double >::operator[]; /** * Ctor */ - moeoObjectiveVectorDouble() : std::vector < double > (ObjectiveVectorTraits::nObjectives(), 0.0) {} + moeoObjectiveVectorDouble(double _value = 0.0) : moeoObjectiveVector < ObjectiveVectorTraits, double > (_value) + {} /** * Ctor from a vector of doubles * @param _v the std::vector < double > */ - moeoObjectiveVectorDouble(std::vector & _v) : std::vector < double > (_v) {} + moeoObjectiveVectorDouble(std::vector < double > & _v) : moeoObjectiveVector < ObjectiveVectorTraits, double > (_v) + {} /** @@ -106,7 +54,7 @@ public: bool dominates(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const { moeoParetoObjectiveVectorComparator < moeoObjectiveVectorDouble > comparator; - return comparator(*this, _other); + return comparator(_other, *this); } @@ -116,7 +64,7 @@ public: */ bool operator==(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const { - for (unsigned i=0; i < size(); i++) + for (unsigned int i=0; i < size(); i++) { if ( fabs(operator[](i) - _other[i]) > ObjectiveVectorTraits::tolerance() ) { @@ -144,21 +92,8 @@ public: */ bool operator<(const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _other) const { - for (unsigned i=0; i < size(); i++) - { - if ( fabs(operator[](i) - _other[i]) > ObjectiveVectorTraits::tolerance() ) - { - if (operator[](i) < _other[i]) - { - return true; - } - else - { - return false; - } - } - } - return false; + moeoObjectiveObjectiveVectorComparator < moeoObjectiveVectorDouble < ObjectiveVectorTraits > > cmp; + return cmp(*this, _other); } @@ -205,7 +140,7 @@ public: template < class ObjectiveVectorTraits > std::ostream & operator<<(std::ostream & _os, const moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _objectiveVector) { - for (unsigned i=0; i<_objectiveVector.size(); i++) + for (unsigned int i=0; i<_objectiveVector.size(); i++) { _os << _objectiveVector[i] << '\t'; } @@ -221,11 +156,11 @@ template < class ObjectiveVectorTraits > std::istream & operator>>(std::istream & _is, moeoObjectiveVectorDouble < ObjectiveVectorTraits > & _objectiveVector) { _objectiveVector = moeoObjectiveVectorDouble < ObjectiveVectorTraits > (); - for (unsigned i=0; i<_objectiveVector.size(); i++) + for (unsigned int i=0; i<_objectiveVector.size(); i++) { _is >> _objectiveVector[i]; } return _is; } -#endif /*MOEOOBJECTIVEVECTOR_H_*/ +#endif /*MOEOOBJECTIVEVECTORDOUBLE_H_*/ diff --git a/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.cpp b/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.cpp new file mode 100644 index 000000000..84d507fca --- /dev/null +++ b/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.cpp @@ -0,0 +1,17 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoObjectiveVectorTraits.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + +// The static variables of the moeoObjectiveVectorTraits class need to be allocated +unsigned int moeoObjectiveVectorTraits::nObj; +std::vector < bool > moeoObjectiveVectorTraits::bObj; diff --git a/trunk/paradiseo-moeo/src/moeoObjectiveVectorTraits.h b/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.h similarity index 84% rename from trunk/paradiseo-moeo/src/moeoObjectiveVectorTraits.h rename to trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.h index 897513b04..9c51c7463 100644 --- a/trunk/paradiseo-moeo/src/moeoObjectiveVectorTraits.h +++ b/trunk/paradiseo-moeo/src/core/moeoObjectiveVectorTraits.h @@ -13,9 +13,9 @@ #ifndef MOEOOBJECTIVEVECTORTRAITS_H_ #define MOEOOBJECTIVEVECTORTRAITS_H_ -#include #include #include +#include /** * A traits class for moeoObjectiveVector to specify the number of objectives and which ones have to be minimized or maximized. @@ -29,7 +29,7 @@ public: * @param _nObjectives the number of objectives * @param _bObjectives the min/max vector (true = min / false = max) */ - static void setup(unsigned _nObjectives, std::vector < bool > & _bObjectives) + static void setup(unsigned int _nObjectives, std::vector < bool > & _bObjectives) { // in case the number of objectives was already set to a different value if ( nObj && (nObj != _nObjectives) ) { @@ -47,10 +47,11 @@ public: throw std::runtime_error("Number of objectives and min/max size don't match in moeoObjectiveVectorTraits::setup"); } + /** * Returns the number of objectives */ - static unsigned nObjectives() + static unsigned int nObjectives() { // in case the number of objectives would not be assigned yet if (! nObj) @@ -58,11 +59,12 @@ public: return nObj; } + /** * Returns true if the _ith objective have to be minimized * @param _i the index */ - static bool minimizing(unsigned _i) + static bool minimizing(unsigned int _i) { // in case there would be a wrong index if (_i >= bObj.size()) @@ -70,14 +72,16 @@ public: return bObj[_i]; } + /** * Returns true if the _ith objective have to be maximized * @param _i the index */ - static bool maximizing(unsigned _i) { + static bool maximizing(unsigned int _i) { return (! minimizing(_i)); } + /** * Returns the tolerance value (to compare solutions) */ @@ -90,16 +94,10 @@ public: private: /** The number of objectives */ - static unsigned nObj; + static unsigned int nObj; /** The min/max vector */ static std::vector < bool > bObj; }; #endif /*MOEOOBJECTIVEVECTORTRAITS_H_*/ - - -// The static variables of the moeoObjectiveVectorTraits class need to be allocated -// (maybe it would have been better to put this on a moeoObjectiveVectorTraits.cpp file) -unsigned moeoObjectiveVectorTraits::nObj; -std::vector < bool > moeoObjectiveVectorTraits::bObj; diff --git a/trunk/paradiseo-moeo/src/core/moeoRealVector.h b/trunk/paradiseo-moeo/src/core/moeoRealVector.h new file mode 100644 index 000000000..9c2816e18 --- /dev/null +++ b/trunk/paradiseo-moeo/src/core/moeoRealVector.h @@ -0,0 +1,36 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoRealVector.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOREALVECTOR_H_ +#define MOEOREALVECTOR_H_ + +#include + +/** + * This class is an implementation of a simple double-valued moeoVector. + */ +template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity > +class moeoRealVector : public moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > +{ +public: + + /** + * Ctor + * @param _size Length of vector (default is 0) + * @param _value Initial value of all elements (default is default value of type GeneType) + */ + moeoRealVector(unsigned int _size = 0, double _value = 0.0) : moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >(_size, _value) + {} + +}; + +#endif /*MOEOREALVECTOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoVector.h b/trunk/paradiseo-moeo/src/core/moeoVector.h similarity index 63% rename from trunk/paradiseo-moeo/src/moeoVector.h rename to trunk/paradiseo-moeo/src/core/moeoVector.h index 404a54ad3..680306ff6 100644 --- a/trunk/paradiseo-moeo/src/moeoVector.h +++ b/trunk/paradiseo-moeo/src/core/moeoVector.h @@ -13,9 +13,9 @@ #ifndef MOEOVECTOR_H_ #define MOEOVECTOR_H_ -#include #include -#include +#include +#include /** * Base class for fixed length chromosomes, just derives from MOEO and std::vector and redirects the smaller than operator to MOEO (objective vector based comparison). @@ -44,11 +44,11 @@ public: * @param _size Length of vector (default is 0) * @param _value Initial value of all elements (default is default value of type GeneType) */ - moeoVector(unsigned _size = 0, GeneType _value = GeneType()) : + moeoVector(unsigned int _size = 0, GeneType _value = GeneType()) : MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >(), std::vector(_size, _value) {} - - + + /** * We can't have a Ctor from a std::vector as it would create ambiguity with the copy Ctor. * @param _v a vector of GeneType @@ -62,6 +62,10 @@ public: std::cout << "Warning: Changing size in moeoVector assignation"<::printOn(_os); @@ -92,16 +96,16 @@ public: /** - * Reading object - * @param _is input stream - */ + * Reading object + * @param _is input stream + */ virtual void readFrom(std::istream & _is) { MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom(_is); - unsigned sz; + unsigned int sz; _is >> sz; resize(sz); - unsigned i; + unsigned int i; for (i = 0; i < sz; ++i) { AtomType atom; @@ -136,81 +140,4 @@ bool operator>(const moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity return _moeo1.operator>(_moeo2); } - -/** - * This class is an implementationeo of a simple double-valued moeoVector. - */ -template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity > -class moeoRealVector : public moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, double > -{ -public: - - /** - * Ctor - * @param _size Length of vector (default is 0) - * @param _value Initial value of all elements (default is default value of type GeneType) - */ - moeoRealVector(unsigned _size = 0, double _value = 0.0) : moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, double >(_size, _value) - {} - -}; - - -/** - * This class is an implementationeo of a simple bit-valued moeoVector. - */ -template < class MOEOObjectiveVector, class MOEOFitness, class MOEODiversity > -class moeoBitVector : public moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > -{ -public: - - using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: begin; - using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: end; - using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: resize; - using moeoVector < MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool > :: size; - - - /** - * Ctor - * @param _size Length of vector (default is 0) - * @param _value Initial value of all elements (default is default value of type GeneType) - */ - moeoBitVector(unsigned _size = 0, bool _value = false) : moeoVector< MOEOObjectiveVector, MOEOFitness, MOEODiversity, bool >(_size, _value) - {} - - - /** - * Writing object - * @param _os output stream - */ - virtual void printOn(std::ostream & _os) const - { - MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::printOn(_os); - _os << ' '; - _os << size() << ' '; - std::copy(begin(), end(), std::ostream_iterator(_os)); - } - - - /** - * Reading object - * @param _is input stream - */ - virtual void readFrom(std::istream & _is) - { - MOEO < MOEOObjectiveVector, MOEOFitness, MOEODiversity >::readFrom(_is); - unsigned s; - _is >> s; - std::string bits; - _is >> bits; - if (_is) - { - resize(bits.size()); - std::transform(bits.begin(), bits.end(), begin(), std::bind2nd(std::equal_to(), '1')); - } - } - -}; - - #endif /*MOEOVECTOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/distance/moeoDistance.h b/trunk/paradiseo-moeo/src/distance/moeoDistance.h new file mode 100644 index 000000000..61b8fb670 --- /dev/null +++ b/trunk/paradiseo-moeo/src/distance/moeoDistance.h @@ -0,0 +1,54 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDistance.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODISTANCE_H_ +#define MOEODISTANCE_H_ + +#include + +/** + * The base class for distance computation. + */ +template < class MOEOT , class Type > +class moeoDistance : public eoBF < const MOEOT &, const MOEOT &, const Type > +{ +public: + + /** + * Nothing to do + * @param _pop the population + */ + virtual void setup(const eoPop < MOEOT > & _pop) + {} + + + /** + * Nothing to do + * @param _min lower bound + * @param _max upper bound + * @param _obj the objective index + */ + virtual void setup(double _min, double _max, unsigned int _obj) + {} + + + /** + * Nothing to do + * @param _realInterval the eoRealInterval object + * @param _obj the objective index + */ + virtual void setup(eoRealInterval _realInterval, unsigned int _obj) + {} + +}; + +#endif /*MOEODISTANCE_H_*/ diff --git a/trunk/paradiseo-moeo/src/distance/moeoDistanceMatrix.h b/trunk/paradiseo-moeo/src/distance/moeoDistanceMatrix.h new file mode 100644 index 000000000..b9a9e924e --- /dev/null +++ b/trunk/paradiseo-moeo/src/distance/moeoDistanceMatrix.h @@ -0,0 +1,76 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDistanceMatrix.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODISTANCEMATRIX_H_ +#define MOEODISTANCEMATRIX_H_ + +#include +#include +#include + +/** + * A matrix to compute distances between every pair of individuals contained in a population. + */ +template < class MOEOT , class Type > +class moeoDistanceMatrix : public eoUF < const eoPop < MOEOT > &, void > , public std::vector< std::vector < Type > > +{ +public: + + using std::vector< std::vector < Type > > :: size; + using std::vector< std::vector < Type > > :: operator[]; + + + /** + * Ctor + * @param _size size for every dimension of the matrix + * @param _distance the distance to use + */ + moeoDistanceMatrix (unsigned int _size, moeoDistance < MOEOT , Type > & _distance) : distance(_distance) + { + this->resize(_size); + for (unsigned int i=0; i<_size; i++) + { + this->operator[](i).resize(_size); + } + } + + + /** + * Sets the distance between every pair of individuals contained in the population _pop + * @param _pop the population + */ + void operator()(const eoPop < MOEOT > & _pop) + { + // 1 - setup the bounds (if necessary) + distance.setup(_pop); + // 2 - compute distances + this->operator[](0).operator[](0) = Type(); + for (unsigned int i=0; ioperator[](i).operator[](i) = Type(); + for (unsigned int j=0; joperator[](i).operator[](j) = distance(_pop[i], _pop[j]); + this->operator[](j).operator[](i) = this->operator[](i).operator[](j); + } + } + } + + +private: + + /** the distance to use */ + moeoDistance < MOEOT , Type > & distance; + +}; + +#endif /*MOEODISTANCEMATRIX_H_*/ diff --git a/trunk/paradiseo-moeo/src/distance/moeoEuclideanDistance.h b/trunk/paradiseo-moeo/src/distance/moeoEuclideanDistance.h new file mode 100644 index 000000000..2d8d8ec49 --- /dev/null +++ b/trunk/paradiseo-moeo/src/distance/moeoEuclideanDistance.h @@ -0,0 +1,58 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoEuclideanDistance.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOEUCLIDEANDISTANCE_H_ +#define MOEOEUCLIDEANDISTANCE_H_ + +#include +#include + +/** + * A class allowing to compute an euclidian distance between two solutions in the objective space with normalized objective values (i.e. between 0 and 1). + * A distance value then lies between 0 and sqrt(nObjectives). + */ +template < class MOEOT > +class moeoEuclideanDistance : public moeoNormalizedDistance < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Returns the euclidian distance between _moeo1 and _moeo2 in the objective space + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const double operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + double result = 0.0; + double tmp1, tmp2; + for (unsigned int i=0; i :: bounds; + +}; + +#endif /*MOEOEUCLIDEANDISTANCE_H_*/ diff --git a/trunk/paradiseo-moeo/src/distance/moeoManhattanDistance.h b/trunk/paradiseo-moeo/src/distance/moeoManhattanDistance.h new file mode 100644 index 000000000..f4c145fe7 --- /dev/null +++ b/trunk/paradiseo-moeo/src/distance/moeoManhattanDistance.h @@ -0,0 +1,58 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoManhattanDistance.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOMANHATTANDISTANCE_H_ +#define MOEOMANHATTANDISTANCE_H_ + +#include +#include + +/** + * A class allowing to compute the Manhattan distance between two solutions in the objective space normalized objective values (i.e. between 0 and 1). + * A distance value then lies between 0 and nObjectives. + */ +template < class MOEOT > +class moeoManhattanDistance : public moeoNormalizedDistance < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Returns the Manhattan distance between _moeo1 and _moeo2 in the objective space + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const double operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + double result = 0.0; + double tmp1, tmp2; + for (unsigned int i=0; i :: bounds; + +}; + +#endif /*MOEOMANHATTANDISTANCE_H_*/ diff --git a/trunk/paradiseo-moeo/src/distance/moeoNormalizedDistance.h b/trunk/paradiseo-moeo/src/distance/moeoNormalizedDistance.h new file mode 100644 index 000000000..ee1a2caa8 --- /dev/null +++ b/trunk/paradiseo-moeo/src/distance/moeoNormalizedDistance.h @@ -0,0 +1,112 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoNormalizedDistance.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEONORMALIZEDDISTANCE_H_ +#define MOEONORMALIZEDDISTANCE_H_ + +#include +#include +#include + +/** + * The base class for double distance computation with normalized objective values (i.e. between 0 and 1). + */ +template < class MOEOT , class Type = double > +class moeoNormalizedDistance : public moeoDistance < MOEOT , Type > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Default ctr + */ + moeoNormalizedDistance() + { + bounds.resize(ObjectiveVector::Traits::nObjectives()); + // initialize bounds in case someone does not want to use them + for (unsigned int i=0; i & _pop) + { + double min, max; + for (unsigned int i=0; i bounds; + +}; + +#endif /*MOEONORMALIZEDDISTANCE_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoCrowdingDistanceDiversityAssignment.h b/trunk/paradiseo-moeo/src/diversity/moeoCrowdingDistanceDiversityAssignment.h similarity index 76% rename from trunk/paradiseo-moeo/src/moeoCrowdingDistanceDiversityAssignment.h rename to trunk/paradiseo-moeo/src/diversity/moeoCrowdingDistanceDiversityAssignment.h index aa8eec28e..bece3da4f 100755 --- a/trunk/paradiseo-moeo/src/moeoCrowdingDistanceDiversityAssignment.h +++ b/trunk/paradiseo-moeo/src/diversity/moeoCrowdingDistanceDiversityAssignment.h @@ -14,13 +14,12 @@ #define MOEOCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ #include -#include -#include +#include +#include /** * Diversity assignment sheme based on crowding distance proposed in: * K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). - * This strategy is, for instance, used in NSGA-II. */ template < class MOEOT > class moeoCrowdingDistanceDiversityAssignment : public moeoDiversityAssignment < MOEOT > @@ -40,6 +39,15 @@ public: } + /** + * Returns a very small value that can be used to avoid extreme cases (where the min bound == the max bound) + */ + double tiny() const + { + return 1e-6; + } + + /** * Computes diversity values for every solution contained in the population _pop * @param _pop the population @@ -48,7 +56,7 @@ public: { if (_pop.size() <= 2) { - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { _pop[i].diversity(inf()); } @@ -69,39 +77,39 @@ public: */ void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) { - cout << "WARNING : updateByDeleting not implemented in moeoCrowdingDiversityAssignment" << endl; + std::cout << "WARNING : updateByDeleting not implemented in moeoCrowdingDiversityAssignment" << std::endl; } -private: +protected: /** * Sets the distance values * @param _pop the population */ - void setDistances (eoPop < MOEOT > & _pop) + virtual void setDistances (eoPop < MOEOT > & _pop) { double min, max, distance; - unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives(); + unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives(); // set diversity to 0 - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { _pop[i].diversity(0); } // for each objective - for (unsigned obj=0; obj comp(obj); + moeoOneObjectiveComparator < MOEOT > objComp(obj); // sort - std::sort(_pop.begin(), _pop.end(), comp); + std::sort(_pop.begin(), _pop.end(), objComp); // min & max min = _pop[0].objectiveVector()[obj]; max = _pop[_pop.size()-1].objectiveVector()[obj]; // set the diversity value to infiny for min and max _pop[0].diversity(inf()); _pop[_pop.size()-1].diversity(inf()); - for (unsigned i=1; i<_pop.size()-1; i++) + for (unsigned int i=1; i<_pop.size()-1; i++) { distance = (_pop[i+1].objectiveVector()[obj] - _pop[i-1].objectiveVector()[obj]) / (max-min); _pop[i].diversity(_pop[i].diversity() + distance); diff --git a/trunk/paradiseo-moeo/src/moeoDiversityAssignment.h b/trunk/paradiseo-moeo/src/diversity/moeoDiversityAssignment.h similarity index 56% rename from trunk/paradiseo-moeo/src/moeoDiversityAssignment.h rename to trunk/paradiseo-moeo/src/diversity/moeoDiversityAssignment.h index 66e50dd38..05151be7a 100644 --- a/trunk/paradiseo-moeo/src/moeoDiversityAssignment.h +++ b/trunk/paradiseo-moeo/src/diversity/moeoDiversityAssignment.h @@ -48,46 +48,4 @@ public: }; - -/** - * moeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population if it is invalid. - */ -template < class MOEOT > -class moeoDummyDiversityAssignment : public moeoDiversityAssignment < MOEOT > -{ -public: - - /** The type for objective vector */ - typedef typename MOEOT::ObjectiveVector ObjectiveVector; - - - /** - * Sets the diversity to '0' for every individuals of the population _pop if it is invalid - * @param _pop the population - */ - void operator () (eoPop < MOEOT > & _pop) - { - for (unsigned idx = 0; idx<_pop.size (); idx++) - { - if (_pop[idx].invalidDiversity()) - { - // set the diversity to 0 - _pop[idx].diversity(0.0); - } - } - } - - - /** - * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. - * @param _pop the population - * @param _objVec the objective vector - */ - void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) - { - // nothing to do... ;-) - } - -}; - #endif /*MOEODIVERSITYASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/diversity/moeoDummyDiversityAssignment.h b/trunk/paradiseo-moeo/src/diversity/moeoDummyDiversityAssignment.h new file mode 100644 index 000000000..b7305801c --- /dev/null +++ b/trunk/paradiseo-moeo/src/diversity/moeoDummyDiversityAssignment.h @@ -0,0 +1,59 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDummyDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODUMMYDIVERSITYASSIGNMENT_H_ +#define MOEODUMMYDIVERSITYASSIGNMENT_H_ + +#include + +/** + * moeoDummyDiversityAssignment is a moeoDiversityAssignment that gives the value '0' as the individual's diversity for a whole population if it is invalid. + */ +template < class MOEOT > +class moeoDummyDiversityAssignment : public moeoDiversityAssignment < MOEOT > +{ +public: + + /** The type for objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Sets the diversity to '0' for every individuals of the population _pop if it is invalid + * @param _pop the population + */ + void operator () (eoPop < MOEOT > & _pop) + { + for (unsigned int idx = 0; idx<_pop.size (); idx++) + { + if (_pop[idx].invalidDiversity()) + { + // set the diversity to 0 + _pop[idx].diversity(0.0); + } + } + } + + + /** + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + // nothing to do... ;-) + } + +}; + +#endif /*MOEODUMMYDIVERSITYASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h b/trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h new file mode 100644 index 000000000..b4d35ac6e --- /dev/null +++ b/trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontCrowdingDistanceDiversityAssignment.h @@ -0,0 +1,133 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoFrontByFrontCrowdingDistanceDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ +#define MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_ + +#include +#include + +/** + * Diversity assignment sheme based on crowding distance proposed in: + * K. Deb, A. Pratap, S. Agarwal, T. Meyarivan, "A Fast and Elitist Multi-Objective Genetic Algorithm: NSGA-II", IEEE Transactions on Evolutionary Computation, vol. 6, no. 2 (2002). + * Tis strategy assigns diversity values FRONT BY FRONT. It is, for instance, used in NSGA-II. + */ +template < class MOEOT > +class moeoFrontByFrontCrowdingDistanceDiversityAssignment : public moeoCrowdingDistanceDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoFrontByFrontCrowdingDistanceDiversityAssignment" << std::endl; + } + + +private: + + using moeoCrowdingDistanceDiversityAssignment < MOEOT >::inf; + using moeoCrowdingDistanceDiversityAssignment < MOEOT >::tiny; + + /** + * Sets the distance values + * @param _pop the population + */ + void setDistances (eoPop < MOEOT > & _pop) + { + unsigned int a,b; + double min, max, distance; + unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives(); + // set diversity to 0 for every individual + for (unsigned int i=0; i<_pop.size(); i++) + { + _pop[i].diversity(0.0); + } + // sort the whole pop according to fitness values + moeoFitnessThenDiversityComparator < MOEOT > fitnessComparator; + std::sort(_pop.begin(), _pop.end(), fitnessComparator); + // compute the crowding distance values for every individual "front" by "front" (front : from a to b) + a = 0; // the front starts at a + while (a < _pop.size()) + { + b = lastIndex(_pop,a); // the front ends at b + // if there is less than 2 individuals in the front... + if ((b-a) < 2) + { + for (unsigned int i=a; i<=b; i++) + { + _pop[i].diversity(inf()); + } + } + // else... + else + { + // for each objective + for (unsigned int obj=0; obj objComp(obj); + std::sort(_pop.begin()+a, _pop.begin()+b+1, objComp); + // min & max + min = _pop[b].objectiveVector()[obj]; + max = _pop[a].objectiveVector()[obj]; + // avoid extreme case + if (min == max) + { + min -= tiny(); + max += tiny(); + } + // set the diversity value to infiny for min and max + _pop[a].diversity(inf()); + _pop[b].diversity(inf()); + // set the diversity values for the other individuals + for (unsigned int i=a+1; i & _pop, unsigned int _start) + { + unsigned int i=_start; + while ( (i<_pop.size()-1) && (_pop[i].fitness()==_pop[i+1].fitness()) ) + { + i++; + } + return i; + } + +}; + +#endif /*MOEOFRONTBYFRONTCROWDINGDISTANCEDIVERSITYASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h b/trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h new file mode 100644 index 000000000..dea3b342d --- /dev/null +++ b/trunk/paradiseo-moeo/src/diversity/moeoFrontByFrontSharingDiversityAssignment.h @@ -0,0 +1,106 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoFrontByFrontSharingDiversityAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_ +#define MOEOFRONTBYFRONTSHARINGDIVERSITYASSIGNMENT_H_ + +#include + +/** + * Sharing assignment scheme on the way it is used in NSGA. + */ +template < class MOEOT > +class moeoFrontByFrontSharingDiversityAssignment : public moeoSharingDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Ctor + * @param _distance the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoFrontByFrontSharingDiversityAssignment(moeoDistance & _distance, double _nicheSize = 0.5, double _alpha = 2.0) : moeoSharingDiversityAssignment < MOEOT >(_distance, _nicheSize, _alpha) + {} + + + /** + * Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoFrontByFrontSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 2.0) : moeoSharingDiversityAssignment < MOEOT >(_nicheSize, _alpha) + {} + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl; + } + + +private: + + using moeoSharingDiversityAssignment < MOEOT >::distance; + using moeoSharingDiversityAssignment < MOEOT >::nicheSize; + using moeoSharingDiversityAssignment < MOEOT >::sh; + using moeoSharingDiversityAssignment < MOEOT >::operator(); + + + /** + * Sets similarities FRONT BY FRONT for every solution contained in the population _pop + * @param _pop the population + */ + void setSimilarities(eoPop < MOEOT > & _pop) + { + // compute distances between every individuals + moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance); + dMatrix(_pop); + // sets the distance to bigger than the niche size for every couple of solutions that do not belong to the same front + for (unsigned int i=0; i<_pop.size(); i++) + { + for (unsigned int j=0; j +#include +#include +#include +#include +#include + +/** + * Sharing assignment scheme originally porposed by: + * D. E. Goldberg, "Genetic Algorithms in Search, Optimization and Machine Learning", Addision-Wesley, MA, USA (1989). + */ +template < class MOEOT > +class moeoSharingDiversityAssignment : public moeoDiversityAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Ctor + * @param _distance the distance used to compute the neighborhood of solutions (can be related to the decision space or the objective space) + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoSharingDiversityAssignment(moeoDistance & _distance, double _nicheSize = 0.5, double _alpha = 1.0) : distance(_distance), nicheSize(_nicheSize), alpha(_alpha) + {} + + + /** + * Ctor with an euclidean distance (with normalized objective values) in the objective space is used as default + * @param _nicheSize neighborhood size in terms of radius distance (closely related to the way the distances are computed) + * @param _alpha parameter used to regulate the shape of the sharing function + */ + moeoSharingDiversityAssignment(double _nicheSize = 0.5, double _alpha = 1.0) : distance(defaultDistance), nicheSize(_nicheSize), alpha(_alpha) + {} + + + /** + * Sets diversity values for every solution contained in the population _pop + * @param _pop the population + */ + void operator()(eoPop < MOEOT > & _pop) + { + // 1 - set simuilarities + setSimilarities(_pop); + // 2 - a higher diversity is better, so the values need to be inverted + moeoDiversityThenFitnessComparator < MOEOT > divComparator; + double max = std::max_element(_pop.begin(), _pop.end(), divComparator)->diversity(); + for (unsigned int i=0 ; i<_pop.size() ; i++) + { + _pop[i].diversity(max - _pop[i].diversity()); + } + } + + + /** + * @warning NOT IMPLEMENTED, DO NOTHING ! + * Updates the diversity values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + * @warning NOT IMPLEMENTED, DO NOTHING ! + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + std::cout << "WARNING : updateByDeleting not implemented in moeoSharingDiversityAssignment" << std::endl; + } + + +protected: + + /** the distance used to compute the neighborhood of solutions */ + moeoDistance < MOEOT , double > & distance; + /** euclidean distancein the objective space (can be used as default) */ + moeoEuclideanDistance < MOEOT > defaultDistance; + /** neighborhood size in terms of radius distance */ + double nicheSize; + /** parameter used to regulate the shape of the sharing function */ + double alpha; + + + /** + * Sets similarities for every solution contained in the population _pop + * @param _pop the population + */ + virtual void setSimilarities(eoPop < MOEOT > & _pop) + { + // compute distances between every individuals + moeoDistanceMatrix < MOEOT , double > dMatrix (_pop.size(), distance); + dMatrix(_pop); + // compute similarities + double sum; + for (unsigned int i=0; i<_pop.size(); i++) + { + sum = 0.0; + for (unsigned int j=0; j<_pop.size(); j++) + { + sum += sh(dMatrix[i][j]); + } + _pop[i].diversity(sum); + } + } + + + /** + * Sharing function + * @param _dist the distance value + */ + double sh(double _dist) + { + double result; + if (_dist < nicheSize) + { + result = 1.0 - pow(_dist / nicheSize, alpha); + } + else + { + result = 0.0; + } + return result; + } + +}; + + +#endif /*MOEOSHARINGDIVERSITYASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/do/make_checkpoint_moeo.h b/trunk/paradiseo-moeo/src/do/make_checkpoint_moeo.h index 65957e51f..14ea4a336 100755 --- a/trunk/paradiseo-moeo/src/do/make_checkpoint_moeo.h +++ b/trunk/paradiseo-moeo/src/do/make_checkpoint_moeo.h @@ -21,11 +21,11 @@ #include #include #include -#include -#include -#include #include #include +#include +#include +#include bool testDirRes(std::string _dirName, bool _erase); @@ -44,16 +44,16 @@ eoCheckPoint < MOEOT > & do_make_checkpoint_moeo (eoParser & _parser, eoState & eoCheckPoint < MOEOT > & checkpoint = _state.storeFunctor(new eoCheckPoint < MOEOT > (_continue)); /* the objective vector type */ typedef typename MOEOT::ObjectiveVector ObjectiveVector; - + /////////////////// // Counters ////////////////// // is nb Eval to be used as counter? //bool useEval = _parser.getORcreateParam(true, "useEval", "Use nb of eval. as counter (vs nb of gen.)", '\0', "Output").value(); // Create anyway a generation-counter parameter - eoValueParam *generationCounter = new eoValueParam(0, "Gen."); + eoValueParam *generationCounter = new eoValueParam(0, "Gen."); // Create an incrementor (sub-class of eoUpdater). - eoIncrementor & increment = _state.storeFunctor( new eoIncrementor(generationCounter->value()) ); + eoIncrementor & increment = _state.storeFunctor( new eoIncrementor(generationCounter->value()) ); // Add it to the checkpoint checkpoint.add(increment); // dir for DISK output @@ -77,13 +77,13 @@ eoCheckPoint < MOEOT > & do_make_checkpoint_moeo (eoParser & _parser, eoState & ////////////////////////////// // feed the state to state savers // save state every N generation - eoValueParam& saveFrequencyParam = _parser.createParam(unsigned(0), "saveFrequency", "Save every F generation (0 = only final state, absent = never)", '\0', "Persistence" ); + eoValueParam& saveFrequencyParam = _parser.createParam((unsigned int)(0), "saveFrequency", "Save every F generation (0 = only final state, absent = never)", '\0', "Persistence" ); if (_parser.isItThere(saveFrequencyParam)) { // first make sure dirName is OK if (! dirOK ) dirOK = testDirRes(dirName, eraseParam.value()); // TRUE - unsigned freq = (saveFrequencyParam.value()>0 ? saveFrequencyParam.value() : UINT_MAX ); + unsigned int freq = (saveFrequencyParam.value()>0 ? saveFrequencyParam.value() : UINT_MAX ); #ifdef _MSVC std::string stmp = dirName + "\generations"; #else @@ -94,7 +94,7 @@ eoCheckPoint < MOEOT > & do_make_checkpoint_moeo (eoParser & _parser, eoState & checkpoint.add(*stateSaver1); } // save state every T seconds - eoValueParam& saveTimeIntervalParam = _parser.getORcreateParam(unsigned(0), "saveTimeInterval", "Save every T seconds (0 or absent = never)", '\0',"Persistence" ); + eoValueParam& saveTimeIntervalParam = _parser.getORcreateParam((unsigned int)(0), "saveTimeInterval", "Save every T seconds (0 or absent = never)", '\0',"Persistence" ); if (_parser.isItThere(saveTimeIntervalParam) && saveTimeIntervalParam.value()>0) { // first make sure dirName is OK diff --git a/trunk/paradiseo-moeo/src/do/make_continue_moeo.h b/trunk/paradiseo-moeo/src/do/make_continue_moeo.h index 5000c3b0c..66ebf0501 100755 --- a/trunk/paradiseo-moeo/src/do/make_continue_moeo.h +++ b/trunk/paradiseo-moeo/src/do/make_continue_moeo.h @@ -54,7 +54,7 @@ eoContinue & do_make_continue_moeo(eoParser& _parser, eoState& _state, eo eoCombinedContinue *continuator = NULL; // First the eoGenContinue - need a default value so you can run blind // but we also need to be able to avoid it <--> 0 - eoValueParam& maxGenParam = _parser.createParam(unsigned(100), "maxGen", "Maximum number of generations (0 = none)",'G',"Stopping criterion"); + eoValueParam& maxGenParam = _parser.createParam((unsigned int)(100), "maxGen", "Maximum number of generations (0 = none)",'G',"Stopping criterion"); if (maxGenParam.value()) // positive: -> define and store { eoGenContinue *genCont = new eoGenContinue(maxGenParam.value()); @@ -63,7 +63,7 @@ eoContinue & do_make_continue_moeo(eoParser& _parser, eoState& _state, eo continuator = make_combinedContinue(continuator, genCont); } // maxEval - eoValueParam& maxEvalParam = _parser.getORcreateParam((unsigned long)0, "maxEval", "Maximum number of evaluations (0 = none)", 'E', "Stopping criterion"); + eoValueParam& maxEvalParam = _parser.getORcreateParam((unsigned long)(0), "maxEval", "Maximum number of evaluations (0 = none)", 'E', "Stopping criterion"); if (maxEvalParam.value()) { eoEvalContinue *evalCont = new eoEvalContinue(_eval, maxEvalParam.value()); @@ -72,7 +72,7 @@ eoContinue & do_make_continue_moeo(eoParser& _parser, eoState& _state, eo continuator = make_combinedContinue(continuator, evalCont); } // maxTime - eoValueParam& maxTimeParam = _parser.getORcreateParam((unsigned long)0, "maxTime", "Maximum running time in seconds (0 = none)", 'T', "Stopping criterion"); + eoValueParam& maxTimeParam = _parser.getORcreateParam((unsigned long)(0), "maxTime", "Maximum running time in seconds (0 = none)", 'T', "Stopping criterion"); if (maxTimeParam.value()) // positive: -> define and store { eoTimeContinue *timeCont = new eoTimeContinue(maxTimeParam.value()); diff --git a/trunk/paradiseo-moeo/src/do/make_ea_moeo.h b/trunk/paradiseo-moeo/src/do/make_ea_moeo.h index f442a04e6..e9f8ef7ae 100755 --- a/trunk/paradiseo-moeo/src/do/make_ea_moeo.h +++ b/trunk/paradiseo-moeo/src/do/make_ea_moeo.h @@ -20,6 +20,7 @@ #include #include #include +<<<<<<< .courant #include #include #include @@ -37,7 +38,37 @@ #include #include #include +======= + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +>>>>>>> .fusion-droit.r399 #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + /** * This functions allows to build a moeoEA from the parser @@ -57,10 +88,10 @@ moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalF /* the fitness assignment strategy */ - string & fitnessParam = _parser.createParam(string("FastNonDominatedSorting"), "fitness", + std::string & fitnessParam = _parser.createParam(std::string("FastNonDominatedSorting"), "fitness", "Fitness assignment scheme: Dummy, FastNonDominatedSorting or IndicatorBased", 'F', "Evolution Engine").value(); - string & indicatorParam = _parser.createParam(string("Epsilon"), "indicator", + std::string & indicatorParam = _parser.createParam(std::string("Epsilon"), "indicator", "Binary indicator for IndicatorBased: Epsilon, Hypervolume", 'i', "Evolution Engine").value(); double rho = _parser.createParam(1.1, "rho", "reference point for the hypervolume indicator", 'r', @@ -68,76 +99,96 @@ moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalF double kappa = _parser.createParam(0.05, "kappa", "Scaling factor kappa for IndicatorBased", 'k', "Evolution Engine").value(); moeoFitnessAssignment < MOEOT > * fitnessAssignment; - if (fitnessParam == string("Dummy")) + if (fitnessParam == std::string("Dummy")) { fitnessAssignment = new moeoDummyFitnessAssignment < MOEOT> (); } - else if (fitnessParam == string("FastNonDominatedSorting")) + else if (fitnessParam == std::string("FastNonDominatedSorting")) { fitnessAssignment = new moeoFastNonDominatedSortingFitnessAssignment < MOEOT> (); } - else if (fitnessParam == string("IndicatorBased")) + else if (fitnessParam == std::string("IndicatorBased")) { // metric moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > *metric; - if (indicatorParam == string("Epsilon")) + if (indicatorParam == std::string("Epsilon")) { metric = new moeoAdditiveEpsilonBinaryMetric < ObjectiveVector >; } - else if (indicatorParam == string("Hypervolume")) + else if (indicatorParam == std::string("Hypervolume")) { metric = new moeoHypervolumeBinaryMetric < ObjectiveVector > (rho); } else { - string stmp = string("Invalid binary quality indicator: ") + indicatorParam; + std::string stmp = std::string("Invalid binary quality indicator: ") + indicatorParam; throw std::runtime_error(stmp.c_str()); } - fitnessAssignment = new moeoIndicatorBasedFitnessAssignment < MOEOT> (metric, kappa); + fitnessAssignment = new moeoIndicatorBasedFitnessAssignment < MOEOT > (*metric, kappa); } else { - string stmp = string("Invalid fitness assignment strategy: ") + fitnessParam; + std::string stmp = std::string("Invalid fitness assignment strategy: ") + fitnessParam; throw std::runtime_error(stmp.c_str()); } _state.storeFunctor(fitnessAssignment); /* the diversity assignment strategy */ - string & diversityParam = _parser.createParam(string("Dummy"), "diversity", - "Diversity assignment scheme: Dummy or CrowdingDistance", 'D', "Evolution Engine").value(); + eoValueParam & diversityParam = _parser.createParam(eoParamParamType("Dummy"), "diversity", + "Diversity assignment scheme: Dummy, Sharing(nicheSize) or Crowding", 'D', "Evolution Engine"); + eoParamParamType & diversityParamValue = diversityParam.value(); moeoDiversityAssignment < MOEOT > * diversityAssignment; - if (diversityParam == string("CrowdingDistance")) - { - diversityAssignment = new moeoCrowdingDistanceDiversityAssignment < MOEOT> (); - } - else if (diversityParam == string("Dummy")) + if (diversityParamValue.first == std::string("Dummy")) { diversityAssignment = new moeoDummyDiversityAssignment < MOEOT> (); } + else if (diversityParamValue.first == std::string("Sharing")) + { + double nicheSize; + if (!diversityParamValue.second.size()) // no parameter added + { + std::cerr << "WARNING, no niche size given for Sharing, using 0.5" << std::endl; + nicheSize = 0.5; + diversityParamValue.second.push_back(std::string("0.5")); + } + else + { + nicheSize = atoi(diversityParamValue.second[0].c_str()); + } + diversityAssignment = new moeoFrontByFrontSharingDiversityAssignment < MOEOT> (nicheSize); + } + else if (diversityParamValue.first == std::string("Crowding")) + { + diversityAssignment = new moeoFrontByFrontCrowdingDistanceDiversityAssignment < MOEOT> (); + } else { - string stmp = string("Invalid diversity assignment strategy: ") + diversityParam; + std::string stmp = std::string("Invalid diversity assignment strategy: ") + diversityParamValue.first; throw std::runtime_error(stmp.c_str()); } _state.storeFunctor(diversityAssignment); /* the comparator strategy */ - string & comparatorParam = _parser.createParam(string("FitnessThenDiversity"), "comparator", - "Comparator scheme: FitnessThenDiversity or DiversityThenFitness", 'C', "Evolution Engine").value(); + std::string & comparatorParam = _parser.createParam(std::string("FitnessThenDiversity"), "comparator", + "Comparator scheme: FitnessThenDiversity, DiversityThenFitness or Aggregative", 'C', "Evolution Engine").value(); moeoComparator < MOEOT > * comparator; - if (comparatorParam == string("FitnessThenDiversity")) + if (comparatorParam == std::string("FitnessThenDiversity")) { comparator = new moeoFitnessThenDiversityComparator < MOEOT> (); } - else if (comparatorParam == string("DiversityThenFitness")) + else if (comparatorParam == std::string("DiversityThenFitness")) { comparator = new moeoDiversityThenFitnessComparator < MOEOT> (); } + else if (comparatorParam == std::string("Aggregative")) + { + comparator = new moeoAggregativeComparator < MOEOT> (); + } else { - string stmp = string("Invalid comparator strategy: ") + comparatorParam; + std::string stmp = std::string("Invalid comparator strategy: ") + comparatorParam; throw std::runtime_error(stmp.c_str()); } _state.storeFunctor(comparator); @@ -148,15 +199,15 @@ moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalF "Selection scheme: DetTour(T), StochTour(t) or Random", 'S', "Evolution Engine"); eoParamParamType & ppSelect = selectionParam.value(); moeoSelectOne < MOEOT > * select; - if (ppSelect.first == string("DetTour")) + if (ppSelect.first == std::string("DetTour")) { - unsigned tSize; + unsigned int tSize; if (!ppSelect.second.size()) // no parameter added { - cerr << "WARNING, no parameter passed to DetTour, using 2" << endl; + std::cerr << "WARNING, no parameter passed to DetTour, using 2" << std::endl; tSize = 2; // put back 2 in parameter for consistency (and status file) - ppSelect.second.push_back(string("2")); + ppSelect.second.push_back(std::string("2")); } else // parameter passed by user as DetTour(T) { @@ -164,15 +215,15 @@ moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalF } select = new moeoDetTournamentSelect < MOEOT > (*comparator, tSize); } - else if (ppSelect.first == string("StochTour")) + else if (ppSelect.first == std::string("StochTour")) { double tRate; if (!ppSelect.second.size()) // no parameter added { - cerr << "WARNING, no parameter passed to StochTour, using 1" << endl; + std::cerr << "WARNING, no parameter passed to StochTour, using 1" << std::endl; tRate = 1; // put back 1 in parameter for consistency (and status file) - ppSelect.second.push_back(string("1")); + ppSelect.second.push_back(std::string("1")); } else // parameter passed by user as StochTour(T) { @@ -180,42 +231,44 @@ moeoEA < MOEOT > & do_make_ea_moeo(eoParser & _parser, eoState & _state, eoEvalF } select = new moeoStochTournamentSelect < MOEOT > (*comparator, tRate); } + /* else if (ppSelect.first == string("Roulette")) { // TO DO ! // ... } - else if (ppSelect.first == string("Random")) + */ + else if (ppSelect.first == std::string("Random")) { select = new moeoRandomSelect (); } else { - string stmp = string("Invalid selection strategy: ") + ppSelect.first; + std::string stmp = std::string("Invalid selection strategy: ") + ppSelect.first; throw std::runtime_error(stmp.c_str()); } _state.storeFunctor(select); /* the replacement strategy */ - string & replacementParam = _parser.createParam(string("Elitist"), "replacement", + std::string & replacementParam = _parser.createParam(std::string("Elitist"), "replacement", "Replacement scheme: Elitist, Environmental or Generational", 'R', "Evolution Engine").value(); moeoReplacement < MOEOT > * replace; - if (replacementParam == string("Elitist")) + if (replacementParam == std::string("Elitist")) { replace = new moeoElitistReplacement < MOEOT> (*fitnessAssignment, *diversityAssignment, *comparator); } - else if (replacementParam == string("Environmental")) + else if (replacementParam == std::string("Environmental")) { replace = new moeoEnvironmentalReplacement < MOEOT> (*fitnessAssignment, *diversityAssignment, *comparator); } - else if (replacementParam == string("Generational")) + else if (replacementParam == std::string("Generational")) { replace = new moeoGenerationalReplacement < MOEOT> (); } else { - string stmp = string("Invalid replacement strategy: ") + replacementParam; + std::string stmp = std::string("Invalid replacement strategy: ") + replacementParam; throw std::runtime_error(stmp.c_str()); } _state.storeFunctor(replace); diff --git a/trunk/paradiseo-moeo/src/fitness/moeoAchievementFitnessAssignment.h b/trunk/paradiseo-moeo/src/fitness/moeoAchievementFitnessAssignment.h new file mode 100644 index 000000000..7cd5c4bba --- /dev/null +++ b/trunk/paradiseo-moeo/src/fitness/moeoAchievementFitnessAssignment.h @@ -0,0 +1,145 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoAchievementFitnessAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOACHIEVEMENTFITNESSASSIGNMENT_H_ +#define MOEOACHIEVEMENTFITNESSASSIGNMENT_H_ + +#include +#include +#include + +/** + * Fitness assignment sheme based on the achievement scalarizing function propozed by Wiersbicki (1980). + */ +template < class MOEOT > +class moeoAchievementFitnessAssignment : public moeoScalarFitnessAssignment < MOEOT > +{ +public: + + /** the objective vector type of the solutions */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Default ctor + * @param _reference reference point vector + * @param _lambdas weighted coefficients vector + * @param _spn arbitrary small positive number (0 < _spn << 1) + */ + moeoAchievementFitnessAssignment(ObjectiveVector & _reference, std::vector < double > & _lambdas, double _spn=0.0001) : reference(_reference), lambdas(_lambdas), spn(_spn) + { + // consistency check + if ((spn < 0.0) || (spn > 1.0)) + { + std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n"; + spn = 0.0001; + } + } + + + /** + * Ctor with default values for lambdas (1/nObjectives) + * @param _reference reference point vector + * @param _spn arbitrary small positive number (0 < _spn << 1) + */ + moeoAchievementFitnessAssignment(ObjectiveVector & _reference, double _spn=0.0001) : reference(_reference), spn(_spn) + { + // compute the default values for lambdas + lambdas = std::vector < double > (ObjectiveVector::nObjectives()); + for (unsigned int i=0 ; i 1.0)) + { + std::cout << "Warning, the arbitrary small positive number should be > 0 and <<1, adjusted to 0.0001\n"; + spn = 0.0001; + } + } + + + /** + * Sets the fitness values for every solution contained in the population _pop + * @param _pop the population + */ + virtual void operator()(eoPop < MOEOT > & _pop) + { + for (unsigned int i=0; i<_pop.size() ; i++) + { + compute(_pop[i]); + } + } + + + /** + * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account (nothing to do). + * @param _pop the population + * @param _objVec the objective vector + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + // nothing to do ;-) + } + + + /** + * Sets the reference point + * @param _reference the new reference point + */ + void setReference(const ObjectiveVector & _reference) + { + reference = _reference; + } + + +private: + + /** the reference point */ + ObjectiveVector reference; + /** the weighted coefficients vector */ + std::vector < double > lambdas; + /** an arbitrary small positive number (0 < _spn << 1) */ + double spn; + + + /** + * Returns a big value (regarded as infinite) + */ + double inf() const + { + return std::numeric_limits::max(); + } + + + /** + * Computes the fitness value for a solution + * @param _moeo the solution + */ + void compute(MOEOT & _moeo) + { + unsigned int nobj = MOEOT::ObjectiveVector::nObjectives(); + double temp; + double min = inf(); + double sum = 0; + for (unsigned int obj=0; obj + +/** + * moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies. + */ +template < class MOEOT > +class moeoCriterionBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > {}; + +#endif /*MOEOCRITERIONBASEDFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/fitness/moeoDummyFitnessAssignment.h b/trunk/paradiseo-moeo/src/fitness/moeoDummyFitnessAssignment.h new file mode 100644 index 000000000..e82436b4b --- /dev/null +++ b/trunk/paradiseo-moeo/src/fitness/moeoDummyFitnessAssignment.h @@ -0,0 +1,59 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoDummyFitnessAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEODUMMYFITNESSASSIGNMENT_H_ +#define MOEODUMMYFITNESSASSIGNMENT_H_ + +#include + +/** + * moeoDummyFitnessAssignment is a moeoFitnessAssignment that gives the value '0' as the individual's fitness for a whole population if it is invalid. + */ +template < class MOEOT > +class moeoDummyFitnessAssignment : public moeoFitnessAssignment < MOEOT > +{ +public: + + /** The type for objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Sets the fitness to '0' for every individuals of the population _pop if it is invalid + * @param _pop the population + */ + void operator () (eoPop < MOEOT > & _pop) + { + for (unsigned int idx = 0; idx<_pop.size (); idx++) + { + if (_pop[idx].invalidFitness()) + { + // set the diversity to 0 + _pop[idx].fitness(0.0); + } + } + } + + + /** + * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + // nothing to do... ;-) + } + +}; + +#endif /*MOEODUMMYFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoFastNonDominatedSortingFitnessAssignment.h b/trunk/paradiseo-moeo/src/fitness/moeoFastNonDominatedSortingFitnessAssignment.h similarity index 69% rename from trunk/paradiseo-moeo/src/moeoFastNonDominatedSortingFitnessAssignment.h rename to trunk/paradiseo-moeo/src/fitness/moeoFastNonDominatedSortingFitnessAssignment.h index 95e558c02..c379eb5ef 100644 --- a/trunk/paradiseo-moeo/src/moeoFastNonDominatedSortingFitnessAssignment.h +++ b/trunk/paradiseo-moeo/src/fitness/moeoFastNonDominatedSortingFitnessAssignment.h @@ -13,10 +13,13 @@ #ifndef MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_ #define MOEOFASTNONDOMINATEDSORTINGFITNESSASSIGNMENT_H_ +#include #include -#include -#include -#include +#include +#include +#include +#include + /** * Fitness assignment sheme based on Pareto-dominance count proposed in: @@ -56,7 +59,7 @@ public: void operator()(eoPop < MOEOT > & _pop) { // number of objectives for the problem under consideration - unsigned nObjectives = MOEOT::ObjectiveVector::nObjectives(); + unsigned int nObjectives = MOEOT::ObjectiveVector::nObjectives(); if (nObjectives == 1) { // one objective @@ -79,11 +82,11 @@ public: } // a higher fitness is better, so the values need to be inverted double max = _pop[0].fitness(); - for (unsigned i=1 ; i<_pop.size() ; i++) + for (unsigned int i=1 ; i<_pop.size() ; i++) { max = std::max(max, _pop[i].fitness()); } - for (unsigned i=0 ; i<_pop.size() ; i++) + for (unsigned int i=0 ; i<_pop.size() ; i++) { _pop[i].fitness(max - _pop[i].fitness()); } @@ -91,15 +94,20 @@ public: /** - * @warning NOT IMPLEMENTED, DO NOTHING ! * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. * @param _pop the population * @param _objVec the objective vector - * @warning NOT IMPLEMENTED, DO NOTHING ! */ void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) { - cout << "WARNING : updateByDeleting not implemented in moeoNonDominatedSortingFitnessAssignment" << endl; + for (unsigned int i=0; i<_pop.size(); i++) + { + // if _pop[i] is dominated by _objVec + if ( comparator(_pop[i].objectiveVector(), _objVec) ) + { + _pop[i].fitness(_pop[i].fitness()+1); + } + } } @@ -109,8 +117,23 @@ private: moeoObjectiveVectorComparator < ObjectiveVector > & comparator; /** Functor to compare two objective vectors according to Pareto dominance relation */ moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; - - + /** Functor allowing to compare two solutions according to their first objective value, then their second, and so on. */ + class ObjectiveComparator : public moeoComparator < MOEOT > + { + public: + /** + * Returns true if _moeo1 < _moeo2 on the first objective, then on the second, and so on + * @param _moeo1 the first solution + * @param _moeo2 the second solution + */ + const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) + { + return cmp(_moeo1.objectiveVector(), _moeo2.objectiveVector()); + } + private: + /** the corresponding comparator for objective vectors */ + moeoObjectiveObjectiveVectorComparator < ObjectiveVector > cmp; + } objComparator; /** @@ -119,12 +142,18 @@ private: */ void oneObjective (eoPop < MOEOT > & _pop) { - // Functor to compare two solutions on the first objective, then on the second, and so on - moeoObjectiveComparator < MOEOT > objComparator; + // sorts the population in the ascending order std::sort(_pop.begin(), _pop.end(), objComparator); - for (unsigned i=0; i<_pop.size(); i++) + // assign fitness values + unsigned int rank = 1; + _pop[_pop.size()-1].fitness(rank); + for (unsigned int i=_pop.size()-2; i>=0; i--) { - _pop[i].fitness(i+1); + if (_pop[i].objectiveVector() != _pop[i+1].objectiveVector()) + { + rank++; + } + _pop[i].fitness(rank); } } @@ -146,25 +175,25 @@ private: void mObjectives (eoPop < MOEOT > & _pop) { // S[i] = indexes of the individuals dominated by _pop[i] - std::vector < std::vector > S(_pop.size()); + std::vector < std::vector > S(_pop.size()); // n[i] = number of individuals that dominate the individual _pop[i] - std::vector < unsigned > n(_pop.size(), 0); + std::vector < unsigned int > n(_pop.size(), 0); // fronts: F[i] = indexes of the individuals contained in the ith front - std::vector < std::vector > F(_pop.size()+1); + std::vector < std::vector > F(_pop.size()+2); // used to store the number of the first front F[1].reserve(_pop.size()); - for (unsigned p=0; p<_pop.size(); p++) + for (unsigned int p=0; p<_pop.size(); p++) { - for (unsigned q=0; q<_pop.size(); q++) + for (unsigned int q=0; q<_pop.size(); q++) { - // if p dominates q - if ( comparator(_pop[p].objectiveVector(), _pop[q].objectiveVector()) ) + // if q is dominated by p + if ( comparator(_pop[q].objectiveVector(), _pop[p].objectiveVector()) ) { // add q to the set of solutions dominated by p S[p].push_back(q); } - // if q dominates p - else if ( comparator(_pop[q].objectiveVector(), _pop[p].objectiveVector()) ) + // if p is dominated by q + else if ( comparator(_pop[p].objectiveVector(), _pop[q].objectiveVector()) ) { // increment the domination counter of p n[p]++; @@ -179,16 +208,16 @@ private: } } // front counter - unsigned counter=1; - unsigned p,q; + unsigned int counter=1; + unsigned int p,q; while (! F[counter].empty()) { // used to store the number of the next front F[counter+1].reserve(_pop.size()); - for (unsigned i=0; i +#include + +/** + * Functor that sets the fitness values of a whole population. + */ +template < class MOEOT > +class moeoFitnessAssignment : public eoUF < eoPop < MOEOT > &, void > +{ +public: + + /** The type for objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + + /** + * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + */ + virtual void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) = 0; + + + /** + * Updates the fitness values of the whole population _pop by taking the deletion of the individual _moeo into account. + * @param _pop the population + * @param _moeo the individual + */ + void updateByDeleting(eoPop < MOEOT > & _pop, MOEOT & _moeo) + { + updateByDeleting(_pop, _moeo.objectiveVector()); + } + +}; + +#endif /*MOEOFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoIndicatorBasedFitnessAssignment.h b/trunk/paradiseo-moeo/src/fitness/moeoIndicatorBasedFitnessAssignment.h similarity index 77% rename from trunk/paradiseo-moeo/src/moeoIndicatorBasedFitnessAssignment.h rename to trunk/paradiseo-moeo/src/fitness/moeoIndicatorBasedFitnessAssignment.h index 0fcec7363..54b183ec3 100644 --- a/trunk/paradiseo-moeo/src/moeoIndicatorBasedFitnessAssignment.h +++ b/trunk/paradiseo-moeo/src/fitness/moeoIndicatorBasedFitnessAssignment.h @@ -14,10 +14,11 @@ #define MOEOINDICATORBASEDFITNESSASSIGNMENT_H_ #include +#include #include -#include -#include +#include #include +#include /** * Fitness assignment sheme based an Indicator proposed in: @@ -25,7 +26,7 @@ * This strategy is, for instance, used in IBEA. */ template < class MOEOT > -class moeoIndicatorBasedFitnessAssignment : public moeoParetoBasedFitnessAssignment < MOEOT > +class moeoIndicatorBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > { public: @@ -38,7 +39,7 @@ public: * @param _metric the quality indicator * @param _kappa the scaling factor */ - moeoIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > * _metric, const double _kappa) : metric(_metric), kappa(_kappa) + moeoIndicatorBasedFitnessAssignment(moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric, const double _kappa = 0.05) : metric(_metric), kappa(_kappa) {} @@ -64,13 +65,13 @@ public: */ void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) { - vector < double > v; + std::vector < double > v; v.resize(_pop.size()); - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { - v[i] = (*metric)(_objVec, _pop[i].objectiveVector()); + v[i] = metric(_objVec, _pop[i].objectiveVector()); } - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { _pop[i].fitness( _pop[i].fitness() + exp(-v[i]/kappa) ); } @@ -85,26 +86,26 @@ public: */ double updateByAdding(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) { - vector < double > v; + std::vector < double > v; // update every fitness values to take the new individual into account v.resize(_pop.size()); - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { - v[i] = (*metric)(_objVec, _pop[i].objectiveVector()); + v[i] = metric(_objVec, _pop[i].objectiveVector()); } - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { _pop[i].fitness( _pop[i].fitness() - exp(-v[i]/kappa) ); } // compute the fitness of the new individual v.clear(); v.resize(_pop.size()); - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { - v[i] = (*metric)(_pop[i].objectiveVector(), _objVec); + v[i] = metric(_pop[i].objectiveVector(), _objVec); } double result = 0; - for (unsigned i=0; i * metric; + moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & metric; /** the scaling factor */ double kappa; /** the computed indicator values */ @@ -129,17 +130,17 @@ protected: void setup(const eoPop < MOEOT > & _pop) { double min, max; - for (unsigned i=0; i & _pop) { - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { _pop[i].fitness(computeFitness(i)); } @@ -183,10 +184,10 @@ protected: * Returns the fitness value of the _idx th individual of the population * @param _idx the index */ - double computeFitness(const unsigned _idx) + double computeFitness(const unsigned int _idx) { double result = 0; - for (unsigned i=0; i + +/** + * moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies. + */ +template < class MOEOT > +class moeoParetoBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > {}; + +#endif /*MOEOPARETOBASEDFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/fitness/moeoReferencePointIndicatorBasedFitnessAssignment.h b/trunk/paradiseo-moeo/src/fitness/moeoReferencePointIndicatorBasedFitnessAssignment.h new file mode 100755 index 000000000..027cc9ea3 --- /dev/null +++ b/trunk/paradiseo-moeo/src/fitness/moeoReferencePointIndicatorBasedFitnessAssignment.h @@ -0,0 +1,109 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoReferencePointIndicatorBasedFitnessAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOREFERENCEPOINTINDICATORBASEDFITNESSASSIGNMENT_H_ +#define MOEOREFERENCEPOINTINDICATORBASEDFITNESSASSIGNMENT_H_ + +#include +#include +#include +#include + +/** + * Fitness assignment sheme based a Reference Point and a Quality Indicator. + */ +template < class MOEOT > +class moeoReferencePointIndicatorBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > +{ +public: + + /** The type of objective vector */ + typedef typename MOEOT::ObjectiveVector ObjectiveVector; + + /** + * Ctor + * @param _refPoint the reference point + * @param _metric the quality indicator + */ + moeoReferencePointIndicatorBasedFitnessAssignment (ObjectiveVector & _refPoint, moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & _metric) : + refPoint(_refPoint), metric(_metric) + {} + + + /** + * Sets the fitness values for every solution contained in the population _pop + * @param _pop the population + */ + void operator()(eoPop < MOEOT > & _pop) + { + // 1 - setting of the bounds + setup(_pop); + // 2 - setting fitnesses + setFitnesses(_pop); + } + + + /** + * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. + * @param _pop the population + * @param _objVec the objective vector + */ + void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) + { + // nothing to do ;-) + } + + +protected: + + /** the reference point */ + ObjectiveVector & refPoint; + /** the quality indicator */ + moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > & metric; + + + /** + * Sets the bounds for every objective using the min and the max value for every objective vector of _pop (and the reference point) + * @param _pop the population + */ + void setup(const eoPop < MOEOT > & _pop) + { + double min, max; + for (unsigned int i=0; i & _pop) + { + for (unsigned int i=0; i<_pop.size(); i++) + { + _pop[i].fitness(- metric(_pop[i].objectiveVector(), refPoint) ); + } + } + +}; + +#endif /*MOEOREFERENCEPOINTINDICATORBASEDFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/fitness/moeoScalarFitnessAssignment.h b/trunk/paradiseo-moeo/src/fitness/moeoScalarFitnessAssignment.h new file mode 100644 index 000000000..d2e8508f3 --- /dev/null +++ b/trunk/paradiseo-moeo/src/fitness/moeoScalarFitnessAssignment.h @@ -0,0 +1,24 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoScalarFitnessAssignment.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOSCALARFITNESSASSIGNMENT_H_ +#define MOEOSCALARFITNESSASSIGNMENT_H_ + +#include + +/** + * moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies. + */ +template < class MOEOT > +class moeoScalarFitnessAssignment : public moeoFitnessAssignment < MOEOT > {}; + +#endif /*MOEOSCALARFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/metric/moeoAdditiveEpsilonBinaryMetric.h b/trunk/paradiseo-moeo/src/metric/moeoAdditiveEpsilonBinaryMetric.h new file mode 100644 index 000000000..95304becb --- /dev/null +++ b/trunk/paradiseo-moeo/src/metric/moeoAdditiveEpsilonBinaryMetric.h @@ -0,0 +1,84 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoAdditiveEpsilonBinaryMetric.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOADDITIVEEPSILONBINARYMETRIC_H_ +#define MOEOADDITIVEEPSILONBINARYMETRIC_H_ + +#include + +/** + * Additive epsilon binary metric allowing to compare two objective vectors as proposed in + * Zitzler E., Thiele L., Laumanns M., Fonseca C. M., Grunert da Fonseca V.: + * Performance Assessment of Multiobjective Optimizers: An Analysis and Review. IEEE Transactions on Evolutionary Computation 7(2), pp.117–132 (2003). + */ +template < class ObjectiveVector > +class moeoAdditiveEpsilonBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > +{ +public: + + /** + * Returns the minimal distance by which the objective vector _o1 must be translated in all objectives + * so that it weakly dominates the objective vector _o2 + * @warning don't forget to set the bounds for every objective before the call of this function + * @param _o1 the first objective vector + * @param _o2 the second objective vector + */ + double operator()(const ObjectiveVector & _o1, const ObjectiveVector & _o2) + { + // computation of the epsilon value for the first objective + double result = epsilon(_o1, _o2, 0); + // computation of the epsilon value for the other objectives + double tmp; + for (unsigned int i=1; i :: bounds; + + + /** + * Returns the epsilon value by which the objective vector _o1 must be translated in the objective _obj + * so that it dominates the objective vector _o2 + * @param _o1 the first objective vector + * @param _o2 the second objective vector + * @param _obj the index of the objective + */ + double epsilon(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned int _obj) + { + double result; + // if the objective _obj have to be minimized + if (ObjectiveVector::Traits::minimizing(_obj)) + { + // _o1[_obj] - _o2[_obj] + result = ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ); + } + // if the objective _obj have to be maximized + else + { + // _o2[_obj] - _o1[_obj] + result = ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ); + } + return result; + } + +}; + +#endif /*MOEOADDITIVEEPSILONBINARYMETRIC_H_*/ diff --git a/trunk/paradiseo-moeo/src/metric/moeoContributionMetric.h b/trunk/paradiseo-moeo/src/metric/moeoContributionMetric.h index 325a11229..28736427c 100644 --- a/trunk/paradiseo-moeo/src/metric/moeoContributionMetric.h +++ b/trunk/paradiseo-moeo/src/metric/moeoContributionMetric.h @@ -13,6 +13,7 @@ #ifndef MOEOCONTRIBUTIONMETRIC_H_ #define MOEOCONTRIBUTIONMETRIC_H_ +#include #include /** @@ -30,26 +31,30 @@ public: * @param _set2 the second Pareto set */ double operator()(const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { - unsigned c = card_C(_set1, _set2); - unsigned w1 = card_W(_set1, _set2); - unsigned n1 = card_N(_set1, _set2); - unsigned w2 = card_W(_set2, _set1); - unsigned n2 = card_N(_set2, _set1); + unsigned int c = card_C(_set1, _set2); + unsigned int w1 = card_W(_set1, _set2); + unsigned int n1 = card_N(_set1, _set2); + unsigned int w2 = card_W(_set2, _set1); + unsigned int n2 = card_N(_set2, _set1); return (double) (c / 2.0 + w1 + n1) / (c + w1 + n1 + w2 + n2); } private: + /** Functor to compare two objective vectors according to Pareto dominance relation */ + moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; + + /** * Returns the number of solutions both in '_set1' and '_set2' * @param _set1 the first Pareto set * @param _set2 the second Pareto set */ - unsigned card_C (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { - unsigned c=0; - for (unsigned i=0; i<_set1.size(); i++) - for (unsigned j=0; j<_set2.size(); j++) + unsigned int card_C (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { + unsigned int c=0; + for (unsigned int i=0; i<_set1.size(); i++) + for (unsigned int j=0; j<_set2.size(); j++) if (_set1[i] == _set2[j]) { c++; break; @@ -57,33 +62,37 @@ private: return c; } + /** * Returns the number of solutions in '_set1' dominating at least one solution of '_set2' * @param _set1 the first Pareto set * @param _set2 the second Pareto set */ - unsigned card_W (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { - unsigned w=0; - for (unsigned i=0; i<_set1.size(); i++) - for (unsigned j=0; j<_set2.size(); j++) - if (_set1[i].dominates(_set2[j])) { + unsigned int card_W (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { + unsigned int w=0; + for (unsigned int i=0; i<_set1.size(); i++) + for (unsigned int j=0; j<_set2.size(); j++) + if (paretoComparator(_set2[j], _set1[i])) + { w++; break; } return w; } + /** * Returns the number of solutions in '_set1' having no relation of dominance with those from '_set2' * @param _set1 the first Pareto set * @param _set2 the second Pareto set */ - unsigned card_N (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { - unsigned n=0; - for (unsigned i=0; i<_set1.size(); i++) { + unsigned int card_N (const std::vector < ObjectiveVector > & _set1, const std::vector < ObjectiveVector > & _set2) { + unsigned int n=0; + for (unsigned int i=0; i<_set1.size(); i++) { bool domin_rel = false; - for (unsigned j=0; j<_set2.size(); j++) - if (_set1[i].dominates(_set2[j]) || _set2[j].dominates(_set1 [i])) { + for (unsigned int j=0; j<_set2.size(); j++) + if ( (paretoComparator(_set2[j], _set1[i])) || (paretoComparator(_set1[i], _set2[j])) ) + { domin_rel = true; break; } diff --git a/trunk/paradiseo-moeo/src/metric/moeoEntropyMetric.h b/trunk/paradiseo-moeo/src/metric/moeoEntropyMetric.h index 8c3f5c936..a19e029f8 100644 --- a/trunk/paradiseo-moeo/src/metric/moeoEntropyMetric.h +++ b/trunk/paradiseo-moeo/src/metric/moeoEntropyMetric.h @@ -13,6 +13,8 @@ #ifndef MOEOENTROPYMETRIC_H_ #define MOEOENTROPYMETRIC_H_ +#include +#include #include /** @@ -48,13 +50,13 @@ public: std::vector< ObjectiveVector > union_set1_star; // rotf again ... computeUnion (set1, star, union_set1_star); - unsigned C = union_set1_star.size(); + unsigned int C = union_set1_star.size(); float omega=0; float entropy=0; - for (unsigned i=0 ; i 0) { omega += 1.0 / N_i; entropy += (float) n_i / (N_i * C) * log (((float) n_i / C) / log (2.0)); @@ -72,6 +74,8 @@ private: std::vector vect_min_val; /** vector of max values */ std::vector vect_max_val; + /** Functor to compare two objective vectors according to Pareto dominance relation */ + moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; /** @@ -79,10 +83,11 @@ private: * @param _f a Pareto set */ void removeDominated(std::vector < ObjectiveVector > & _f) { - for (unsigned i=0 ; i<_f.size(); i++) { + for (unsigned int i=0 ; i<_f.size(); i++) { bool dom = false; - for (unsigned j=0; j<_f.size(); j++) - if (i != j && _f[j].dominates(_f[i])) { + for (unsigned int j=0; j<_f.size(); j++) + if (i != j && paretoComparator(_f[i],_f[j])) + { dom = true; break; } @@ -103,9 +108,9 @@ private: vect_min_val.clear(); vect_max_val.clear(); - for (unsigned char i=0 ; imax_val) @@ -122,8 +127,8 @@ private: * @param _f a Pareto set */ void normalize (std::vector< ObjectiveVector > & _f) { - for (unsigned i=0 ; i & _f1, const std::vector< ObjectiveVector > & _f2, std::vector< ObjectiveVector > & _f) { _f = _f1 ; - for (unsigned i=0; i<_f2.size(); i++) { + for (unsigned int i=0; i<_f2.size(); i++) { bool b = false; - for (unsigned j=0; j<_f1.size(); j ++) + for (unsigned int j=0; j<_f1.size(); j ++) if (_f1[j] == _f2[i]) { b = true; break; @@ -152,9 +157,9 @@ private: /** * How many in niche */ - unsigned howManyInNicheOf (const std::vector< ObjectiveVector > & _f, const ObjectiveVector & _s, unsigned _size) { - unsigned n=0; - for (unsigned i=0 ; i<_f.size(); i++) { + unsigned int howManyInNicheOf (const std::vector< ObjectiveVector > & _f, const ObjectiveVector & _s, unsigned int _size) { + unsigned int n=0; + for (unsigned int i=0 ; i<_f.size(); i++) { if (euclidianDistance(_f[i], _s) < (_s.size() / (double) _size)) n++; } @@ -165,9 +170,9 @@ private: /** * Euclidian distance */ - double euclidianDistance (const ObjectiveVector & _set1, const ObjectiveVector & _to, unsigned _deg = 2) { + double euclidianDistance (const ObjectiveVector & _set1, const ObjectiveVector & _to, unsigned int _deg = 2) { double dist=0; - for (unsigned i=0; i<_set1.size(); i++) + for (unsigned int i=0; i<_set1.size(); i++) dist += pow(fabs(_set1[i] - _to[i]), (int)_deg); return pow(dist, 1.0 / _deg); } diff --git a/trunk/paradiseo-moeo/src/metric/moeoHypervolumeBinaryMetric.h b/trunk/paradiseo-moeo/src/metric/moeoHypervolumeBinaryMetric.h new file mode 100644 index 000000000..39c51ec63 --- /dev/null +++ b/trunk/paradiseo-moeo/src/metric/moeoHypervolumeBinaryMetric.h @@ -0,0 +1,141 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoHypervolumeBinaryMetric.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOHYPERVOLUMEBINARYMETRIC_H_ +#define MOEOHYPERVOLUMEBINARYMETRIC_H_ + +#include +#include +#include + +/** + * Hypervolume binary metric allowing to compare two objective vectors as proposed in + * Zitzler E., Künzli S.: Indicator-Based Selection in Multiobjective Search. In Parallel Problem Solving from Nature (PPSN VIII). + * Lecture Notes in Computer Science 3242, Springer, Birmingham, UK pp.832–842 (2004). + * This indicator is based on the hypervolume concept introduced in + * Zitzler, E., Thiele, L.: Multiobjective Optimization Using Evolutionary Algorithms - A Comparative Case Study. + * Parallel Problem Solving from Nature (PPSN-V), pp.292-301 (1998). + */ +template < class ObjectiveVector > +class moeoHypervolumeBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > +{ +public: + + /** + * Ctor + * @param _rho value used to compute the reference point from the worst values for each objective (default : 1.1) + */ + moeoHypervolumeBinaryMetric(double _rho = 1.1) : rho(_rho) + { + // not-a-maximization problem check + for (unsigned int i=0; i :: bounds; + /** Functor to compare two objective vectors according to Pareto dominance relation */ + moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; + + + /** + * Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj. + * @param _o1 the first objective vector + * @param _o2 the second objective vector + * @param _obj the objective index + * @param _flag used for iteration, if _flag=true _o2 is not talen into account (default : false) + */ + double hypervolume(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned int _obj, const bool _flag = false) + { + double result; + double range = rho * bounds[_obj].range(); + double max = bounds[_obj].minimum() + range; + // value of _1 for the objective _obj + double v1 = _o1[_obj]; + // value of _2 for the objective _obj (if _flag=true, v2=max) + double v2; + if (_flag) + { + v2 = max; + } + else + { + v2 = _o2[_obj]; + } + // computation of the volume + if (_obj == 0) + { + if (v1 < v2) + { + result = (v2 - v1) / range; + } + else + { + result = 0; + } + } + else + { + if (v1 < v2) + { + result = ( hypervolume(_o1, _o2, _obj-1, true) * (v2 - v1) / range ) + ( hypervolume(_o1, _o2, _obj-1) * (max - v2) / range ); + } + else + { + result = hypervolume(_o1, _o2, _obj-1) * (max - v2) / range; + } + } + return result; + } + +}; + +#endif /*MOEOHYPERVOLUMEBINARYMETRIC_H_*/ diff --git a/trunk/paradiseo-moeo/src/metric/moeoMetric.h b/trunk/paradiseo-moeo/src/metric/moeoMetric.h index 93917daef..6678e9a1d 100644 --- a/trunk/paradiseo-moeo/src/metric/moeoMetric.h +++ b/trunk/paradiseo-moeo/src/metric/moeoMetric.h @@ -13,61 +13,55 @@ #ifndef MOEOMETRIC_H_ #define MOEOMETRIC_H_ +#include #include /** * Base class for performance metrics (also known as quality indicators). */ -class moeoMetric : public eoFunctorBase - {}; +class moeoMetric : public eoFunctorBase {}; /** * Base class for unary metrics. */ template < class A, class R > -class moeoUnaryMetric : public eoUF < A, R >, public moeoMetric - {}; +class moeoUnaryMetric : public eoUF < A, R >, public moeoMetric {}; /** * Base class for binary metrics. */ template < class A1, class A2, class R > -class moeoBinaryMetric : public eoBF < A1, A2, R >, public moeoMetric - {}; +class moeoBinaryMetric : public eoBF < A1, A2, R >, public moeoMetric {}; /** * Base class for unary metrics dedicated to the performance evaluation of a single solution's objective vector. */ template < class ObjectiveVector, class R > -class moeoSolutionUnaryMetric : public moeoUnaryMetric < const ObjectiveVector &, R > - {}; +class moeoSolutionUnaryMetric : public moeoUnaryMetric < const ObjectiveVector &, R > {}; /** * Base class for unary metrics dedicated to the performance evaluation of a Pareto set (a vector of objective vectors) */ template < class ObjectiveVector, class R > -class moeoVectorUnaryMetric : public moeoUnaryMetric < const std::vector < ObjectiveVector > &, R > - {}; +class moeoVectorUnaryMetric : public moeoUnaryMetric < const std::vector < ObjectiveVector > &, R > {}; /** * Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors. */ template < class ObjectiveVector, class R > -class moeoSolutionVsSolutionBinaryMetric : public moeoBinaryMetric < const ObjectiveVector &, const ObjectiveVector &, R > - {}; +class moeoSolutionVsSolutionBinaryMetric : public moeoBinaryMetric < const ObjectiveVector &, const ObjectiveVector &, R > {}; /** * Base class for binary metrics dedicated to the performance comparison between two Pareto sets (two vectors of objective vectors) */ template < class ObjectiveVector, class R > -class moeoVectorVsVectorBinaryMetric : public moeoBinaryMetric < const std::vector < ObjectiveVector > &, const std::vector < ObjectiveVector > &, R > - {}; +class moeoVectorVsVectorBinaryMetric : public moeoBinaryMetric < const std::vector < ObjectiveVector > &, const std::vector < ObjectiveVector > &, R > {}; #endif /*MOEOMETRIC_H_*/ diff --git a/trunk/paradiseo-moeo/src/metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h b/trunk/paradiseo-moeo/src/metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h index be9e6659c..e3e390a7e 100644 --- a/trunk/paradiseo-moeo/src/metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h +++ b/trunk/paradiseo-moeo/src/metric/moeoNormalizedSolutionVsSolutionBinaryMetric.h @@ -13,10 +13,10 @@ #ifndef MOEONORMALIZEDSOLUTIONVSSOLUTIONBINARYMETRIC_H_ #define MOEONORMALIZEDSOLUTIONVSSOLUTIONBINARYMETRIC_H_ -#include +#include +#include #include - /** * Base class for binary metrics dedicated to the performance comparison between two solutions's objective vectors using normalized values. * Then, indicator values lie in the interval [-1,1]. @@ -33,16 +33,21 @@ public: moeoNormalizedSolutionVsSolutionBinaryMetric() { bounds.resize(ObjectiveVector::Traits::nObjectives()); + // initialize bounds in case someone does not want to use them + for (unsigned int i=0; i -class moeoAdditiveEpsilonBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > -{ -public: - - /** - * Returns the minimal distance by which the objective vector _o1 must be translated in all objectives - * so that it weakly dominates the objective vector _o2 - * @warning don't forget to set the bounds for every objective before the call of this function - * @param _o1 the first objective vector - * @param _o2 the second objective vector - */ - double operator()(const ObjectiveVector & _o1, const ObjectiveVector & _o2) - { - // computation of the epsilon value for the first objective - double result = epsilon(_o1, _o2, 0); - // computation of the epsilon value for the other objectives - double tmp; - for (unsigned i=1; i :: bounds; - - - /** - * Returns the epsilon value by which the objective vector _o1 must be translated in the objective _obj - * so that it dominates the objective vector _o2 - * @param _o1 the first objective vector - * @param _o2 the second objective vector - * @param _obj the index of the objective - */ - double epsilon(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned _obj) - { - double result; - // if the objective _obj have to be minimized - if (ObjectiveVector::Traits::minimizing(_obj)) - { - // _o1[_obj] - _o2[_obj] - result = ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ); - } - // if the objective _obj have to be maximized - else - { - // _o2[_obj] - _o1[_obj] - result = ( (_o2[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ) - ( (_o1[_obj] - bounds[_obj].minimum()) / bounds[_obj].range() ); - } - return result; - } - -}; - - -/** - * Hypervolume binary metric allowing to compare two objective vectors as proposed in - * Zitzler E., Künzli S.: Indicator-Based Selection in Multiobjective Search. In Parallel Problem Solving from Nature (PPSN VIII). - * Lecture Notes in Computer Science 3242, Springer, Birmingham, UK pp.832–842 (2004). - * This indicator is based on the hypervolume concept introduced in - * Zitzler, E., Thiele, L.: Multiobjective Optimization Using Evolutionary Algorithms - A Comparative Case Study. - * Parallel Problem Solving from Nature (PPSN-V), pp.292-301 (1998). - */ -template < class ObjectiveVector > -class moeoHypervolumeBinaryMetric : public moeoNormalizedSolutionVsSolutionBinaryMetric < ObjectiveVector, double > -{ -public: - - /** - * Ctor - * @param _rho value used to compute the reference point from the worst values for each objective (default : 1.1) - */ - moeoHypervolumeBinaryMetric(double _rho = 1.1) : rho(_rho) - { - // not-a-maximization problem check - for (unsigned i=0; i :: bounds; - /** Functor to compare two objective vectors according to Pareto dominance relation */ - moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; - - /** - * Returns the volume of the space that is dominated by _o2 but not by _o1 with respect to a reference point computed using rho for the objective _obj. - * @param _o1 the first objective vector - * @param _o2 the second objective vector - * @param _obj the objective index - * @param _flag used for iteration, if _flag=true _o2 is not talen into account (default : false) - */ - double hypervolume(const ObjectiveVector & _o1, const ObjectiveVector & _o2, const unsigned _obj, const bool _flag = false) - { - double result; - double range = rho * bounds[_obj].range(); - double max = bounds[_obj].minimum() + range; - // value of _1 for the objective _obj - double v1 = _o1[_obj]; - // value of _2 for the objective _obj (if _flag=true, v2=max) - double v2; - if (_flag) - { - v2 = max; - } - else - { - v2 = _o2[_obj]; - } - // computation of the volume - if (_obj == 0) - { - if (v1 < v2) - { - result = (v2 - v1) / range; - } - else - { - result = 0; - } - } - else - { - if (v1 < v2) - { - result = ( hypervolume(_o1, _o2, _obj-1, true) * (v2 - v1) / range ) + ( hypervolume(_o1, _o2, _obj-1) * (max - v2) / range ); - } - else - { - result = hypervolume(_o1, _o2, _obj-1) * (max - v2) / range; - } - } - return result; - } - -}; - - #endif /*MOEONORMALIZEDSOLUTIONVSSOLUTIONBINARYMETRIC_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeo b/trunk/paradiseo-moeo/src/moeo index dbb9a7ba1..6297623aa 100644 --- a/trunk/paradiseo-moeo/src/moeo +++ b/trunk/paradiseo-moeo/src/moeo @@ -15,6 +15,7 @@ #include +<<<<<<< .courant #include #include #include @@ -46,9 +47,88 @@ #include #include #include +======= +#include +#include +#include +#include +#include +#include +//#include +//#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +//#include +#include + +#include +>>>>>>> .fusion-droit.r399 #include #include +#include #include #include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + #endif /*MOEO_*/ diff --git a/trunk/paradiseo-moeo/src/moeoArchiveObjectiveVectorSavingUpdater.h b/trunk/paradiseo-moeo/src/moeoArchiveObjectiveVectorSavingUpdater.h deleted file mode 100644 index 16c3c3d4c..000000000 --- a/trunk/paradiseo-moeo/src/moeoArchiveObjectiveVectorSavingUpdater.h +++ /dev/null @@ -1,70 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoArchiveObjectiveVectorSavingUpdater.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_ -#define MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_ - -#include -#include -#include -#include -#include - -#define MAX_BUFFER_SIZE 1000 - -/** - * This class allows to save the fitnesses of solutions contained in an archive into a file at each generation. - */ -template -class moeoArchiveObjectiveVectorSavingUpdater : public eoUpdater -{ -public: - - /** - * Ctor - * @param _arch local archive - * @param _filename target filename - * @param _id own ID - */ - moeoArchiveObjectiveVectorSavingUpdater (moeoArchive & _arch, const std::string & _filename, int _id = -1) : arch(_arch), filename(_filename), id(_id), counter(0) - {} - - /** - * Saves the fitness of the archive's members into the file - */ - void operator()() { - char buff[MAX_BUFFER_SIZE]; - if (id == -1) - sprintf (buff, "%s.%u", filename.c_str(), counter ++); - else - sprintf (buff, "%s.%u.%u", filename.c_str(), id, counter ++); - std::ofstream f(buff); - for (unsigned i = 0; i < arch.size (); i++) - f << arch[i].objectiveVector() << std::endl; - f.close (); - } - - -private: - - /** local archive */ - moeoArchive & arch; - /** target filename */ - std::string filename; - /** own ID */ - int id; - /** counter */ - unsigned counter; - -}; - -#endif /*MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoComparator.h b/trunk/paradiseo-moeo/src/moeoComparator.h deleted file mode 100644 index 064c0f78a..000000000 --- a/trunk/paradiseo-moeo/src/moeoComparator.h +++ /dev/null @@ -1,133 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoComparator.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEOCOMPARATOR_H_ -#define MOEOCOMPARATOR_H_ - -#include - -/** - * Functor allowing to compare two solutions. - */ -template < class MOEOT > -class moeoComparator : public eoBF < const MOEOT &, const MOEOT &, const bool > - {}; - - -/** - * Functor allowing to compare two solutions according to their first objective value, then their second, and so on. - */ -template < class MOEOT > -class moeoObjectiveComparator : public moeoComparator < MOEOT > -{ -public: - /** - * Returns true if _moeo1 is greater than _moeo2 on the first objective, then on the second, and so on - * @param _moeo1 the first solution - * @param _moeo2 the second solution - */ - const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) - { - return _moeo1.objectiveVector() > _moeo2.objectiveVector(); - } -}; - -/** - * Functor allowing to compare two solutions according to one objective. - */ -template < class MOEOT > -class moeoOneObjectiveComparator : public moeoComparator < MOEOT > -{ -public: - - /** - * Ctor. - * @param _obj the index of objective - */ - moeoOneObjectiveComparator(unsigned _obj) : obj(_obj) - { - if (obj > MOEOT::ObjectiveVector::nObjectives()) - { - throw std::runtime_error("Problem with the index of objective in moeoOneObjectiveComparator"); - } - } - - /** - * Returns true if _moeo1 is greater than _moeo2 on the obj objective - * @param _moeo1 the first solution - * @param _moeo2 the second solution - */ - const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) - { - return _moeo1.objectiveVector()[obj] > _moeo2.objectiveVector()[obj]; - } - -private: - /** the index of objective */ - unsigned obj; - -}; - - -/** - * Functor allowing to compare two solutions according to their fitness values, then according to their diversity values. - */ -template < class MOEOT > -class moeoFitnessThenDiversityComparator : public moeoComparator < MOEOT > -{ -public: - /** - * Returns true if _moeo1 is greater than _moeo2 according to their fitness values, then according to their diversity values - * @param _moeo1 the first solution - * @param _moeo2 the second solution - */ - const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) - { - if (_moeo1.fitness() == _moeo2.fitness()) - { - return _moeo1.diversity() > _moeo2.diversity(); - } - else - { - return _moeo1.fitness() > _moeo2.fitness(); - } - } -}; - - -/** - * Functor allowing to compare two solutions according to their diversity values, then according to their fitness values. - */ -template < class MOEOT > -class moeoDiversityThenFitnessComparator : public moeoComparator < MOEOT > -{ -public: - /** - * Returns true if _moeo1 is greater than _moeo2 according to their diversity values, then according to their fitness values - * @param _moeo1 the first solution - * @param _moeo2 the second solution - */ - const bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) - { - if (_moeo1.diversity() == _moeo2.diversity()) - { - return _moeo1.fitness() > _moeo2.fitness(); - } - else - { - return _moeo1.diversity() > _moeo2.diversity(); - } - } -}; - - -#endif /*MOEOCOMPARATOR_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoEasyEA.h b/trunk/paradiseo-moeo/src/moeoEasyEA.h deleted file mode 100755 index 718bd2cab..000000000 --- a/trunk/paradiseo-moeo/src/moeoEasyEA.h +++ /dev/null @@ -1,120 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoEasyEA.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef _MOEOEASYEA_H -#define _MOEOEASYEA_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * An easy class to design multi-objective evolutionary algorithms. - */ -template < class MOEOT > -class moeoEasyEA: public moeoEA < MOEOT > -{ -public: - - /** - * Ctor. - * @param _continuator the stopping criteria - * @param _eval the evaluation functions - * @param _breed the breeder - * @param _replace the replacment strategy - * @param _fitnessEval the fitness evaluation scheme - * @param _diversityEval the diversity evaluation scheme - * @param _evalFitAndDivBeforeSelection put this parameter to 'true' if you want to re-evalue the fitness and the diversity of the population before the selection process - */ - moeoEasyEA(eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoBreed < MOEOT > & _breed, eoReplacement < MOEOT > & _replace, - moeoFitnessAssignment < MOEOT > & _fitnessEval, moeoDiversityAssignment < MOEOT > & _diversityEval, bool _evalFitAndDivBeforeSelection = false) - : - continuator(_continuator), eval (_eval), loopEval(_eval), popEval(loopEval), breed(_breed), replace(_replace), fitnessEval(_fitnessEval), - diversityEval(_diversityEval), evalFitAndDivBeforeSelection(_evalFitAndDivBeforeSelection) - {} - - - /** - * Applies a few generation of evolution to the population _pop. - * @param _pop the population - */ - virtual void operator()(eoPop < MOEOT > & _pop) - { - eoPop < MOEOT > offspring, empty_pop; - popEval(empty_pop, _pop); // A first eval of pop. - bool firstTime = true; - do - { - try - { - unsigned pSize = _pop.size(); - offspring.clear(); // new offspring - // fitness and diversity assignment (if you want to or if it is the first generation) - if (evalFitAndDivBeforeSelection || firstTime) - { - firstTime = false; - fitnessEval(_pop); - diversityEval(_pop); - } - breed(_pop, offspring); - popEval(_pop, offspring); // eval of parents + offspring if necessary - replace(_pop, offspring); // after replace, the new pop. is in _pop - if (pSize > _pop.size()) - { - throw std::runtime_error("Population shrinking!"); - } - else if (pSize < _pop.size()) - { - throw std::runtime_error("Population growing!"); - } - } - catch (std::exception& e) - { - std::string s = e.what(); - s.append( " in moeoEasyEA"); - throw std::runtime_error( s ); - } - } while (continuator(_pop)); - } - - -protected: - - /** the stopping criteria */ - eoContinue < MOEOT > & continuator; - /** the evaluation functions */ - eoEvalFunc < MOEOT > & eval; - /** to evaluate the whole population */ - eoPopLoopEval < MOEOT > loopEval; - /** to evaluate the whole population */ - eoPopEvalFunc < MOEOT > & popEval; - /** the breeder */ - eoBreed < MOEOT > & breed; - /** the replacment strategy */ - eoReplacement < MOEOT > & replace; - /** the fitness assignment strategy */ - moeoFitnessAssignment < MOEOT > & fitnessEval; - /** the diversity assignment strategy */ - moeoDiversityAssignment < MOEOT > & diversityEval; - /** if this parameter is set to 'true', the fitness and the diversity of the whole population will be re-evaluated before the selection process */ - bool evalFitAndDivBeforeSelection; - -}; - -#endif /*MOEOEASYEA_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoFitnessAssignment.h b/trunk/paradiseo-moeo/src/moeoFitnessAssignment.h deleted file mode 100644 index 37c6a5ccc..000000000 --- a/trunk/paradiseo-moeo/src/moeoFitnessAssignment.h +++ /dev/null @@ -1,118 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoFitnessAssignment.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEOFITNESSASSIGNMENT_H_ -#define MOEOFITNESSASSIGNMENT_H_ - -#include -#include - -/** - * Functor that sets the fitness values of a whole population. - */ -template < class MOEOT > -class moeoFitnessAssignment : public eoUF < eoPop < MOEOT > &, void > -{ -public: - - /** The type for objective vector */ - typedef typename MOEOT::ObjectiveVector ObjectiveVector; - - - /** - * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. - * @param _pop the population - * @param _objVec the objective vector - */ - virtual void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) = 0; - - - /** - * Updates the fitness values of the whole population _pop by taking the deletion of the individual _moeo into account. - * @param _pop the population - * @param _moeo the individual - */ - void updateByDeleting(eoPop < MOEOT > & _pop, MOEOT & _moeo) - { - updateByDeleting(_pop, _moeo.objectiveVector()); - } - -}; - - -/** - * moeoDummyFitnessAssignment is a moeoFitnessAssignment that gives the value '0' as the individual's fitness for a whole population if it is invalid. - */ -template < class MOEOT > -class moeoDummyFitnessAssignment : public moeoFitnessAssignment < MOEOT > -{ -public: - - /** The type for objective vector */ - typedef typename MOEOT::ObjectiveVector ObjectiveVector; - - - /** - * Sets the fitness to '0' for every individuals of the population _pop if it is invalid - * @param _pop the population - */ - void operator () (eoPop < MOEOT > & _pop) - { - for (unsigned idx = 0; idx<_pop.size (); idx++) - { - if (_pop[idx].invalidFitness()) - { - // set the diversity to 0 - _pop[idx].fitness(0.0); - } - } - } - - - /** - * Updates the fitness values of the whole population _pop by taking the deletion of the objective vector _objVec into account. - * @param _pop the population - * @param _objVec the objective vector - */ - void updateByDeleting(eoPop < MOEOT > & _pop, ObjectiveVector & _objVec) - { - // nothing to do... ;-) - } - -}; - - -/** - * moeoScalarFitnessAssignment is a moeoFitnessAssignment for scalar strategies. - */ -template < class MOEOT > -class moeoScalarFitnessAssignment : public moeoFitnessAssignment < MOEOT > - {}; - - -/** - * moeoCriterionBasedFitnessAssignment is a moeoFitnessAssignment for criterion-based strategies. - */ -template < class MOEOT > -class moeoCriterionBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > - {}; - - -/** - * moeoParetoBasedFitnessAssignment is a moeoFitnessAssignment for Pareto-based strategies. - */ -template < class MOEOT > -class moeoParetoBasedFitnessAssignment : public moeoFitnessAssignment < MOEOT > - {}; - - -#endif /*MOEOFITNESSASSIGNMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoNSGAII.h b/trunk/paradiseo-moeo/src/moeoNSGAII.h deleted file mode 100644 index a83f6bb9a..000000000 --- a/trunk/paradiseo-moeo/src/moeoNSGAII.h +++ /dev/null @@ -1,127 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoNSGAII.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEONSGAII_H_ -#define MOEONSGAII_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * The NSGA-II algorithm as described in: - * Deb, K., S. Agrawal, A. Pratap, and T. Meyarivan : "A fast elitist non-dominated sorting genetic algorithm for multi-objective optimization: NSGA-II". - * In IEEE Transactions on Evolutionary Computation, Vol. 6, No 2, pp 182-197 (April 2002). - * This class builds the NSGA-II algorithm only by using the components of the ParadisEO-MOEO framework. - */ -template < class MOEOT > -class moeoNSGAII: public moeoEA < MOEOT > -{ -public: - - /** - * This constructor builds the algorithm as descibed in the paper. - * @param _max_gen number of generations before stopping - * @param _eval evaluation function - * @param _op variation operator - */ - moeoNSGAII (unsigned _max_gen, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > &_op) : - continuator (*(new eoGenContinue < MOEOT > (_max_gen))), eval (_eval), loopEval (_eval), popEval (loopEval), select (2), // binary tournament selection - replace (fitnessAssignment, diversityAssignment), genBreed (select, _op), breed (genBreed) - {} - - - /** - * Ctor taking _max_gen, crossover and mutation. - * @param _max_gen number of generations before stopping - * @param _eval evaluation function - * @param _crossover crossover - * @param _pCross crossover probability - * @param _mutation mutation - * @param _pMut mutation probability - */ - moeoNSGAII (unsigned _max_gen, eoEvalFunc < MOEOT > &_eval, eoQuadOp < MOEOT > & _crossover, double _pCross, eoMonOp < MOEOT > & _mutation, double _pMut) : - continuator (*(new eoGenContinue < MOEOT > (_max_gen))), eval (_eval), loopEval (_eval), popEval (loopEval), select (2), // binary tournament selection - replace (fitnessAssignment, diversityAssignment), genBreed (select, *new eoSGAGenOp < MOEOT > (_crossover, _pCross, _mutation, _pMut)), breed (genBreed) - {} - - - /** - * Ctor taking a continuator instead of _gen_max. - * @param _continuator stopping criteria - * @param _eval evaluation function - * @param _op variation operator - */ - moeoNSGAII (eoContinue < MOEOT > & _continuator, eoEvalFunc < MOEOT > & _eval, eoGenOp < MOEOT > & _op) : - continuator (_continuator), eval (_eval), loopEval (_eval), popEval (loopEval), select (2), // binary tournament selection - replace (fitnessAssignment, diversityAssignment), genBreed (select, _op), breed (genBreed) - {} - - - /** - * Apply a few generation of evolution to the population _pop. - * @param _pop the population - */ - virtual void operator () (eoPop < MOEOT > &_pop) - { - eoPop < MOEOT > offspring, empty_pop; - popEval (empty_pop, _pop); // a first eval of _pop - // evaluate fitness and diversity - fitnessAssignment(_pop); - diversityAssignment(_pop); - do - { - // generate offspring, worths are recalculated if necessary - breed (_pop, offspring); - // eval of offspring - popEval (_pop, offspring); - // after replace, the new pop is in _pop. Worths are recalculated if necessary - replace (_pop, offspring); - } while (continuator (_pop)); - } - - -protected: - - /** stopping criteria */ - eoContinue < MOEOT > & continuator; - /** evaluation function */ - eoEvalFunc < MOEOT > & eval; - /** to evaluate the whole population */ - eoPopLoopEval < MOEOT > loopEval; - /** to evaluate the whole population */ - eoPopEvalFunc < MOEOT > & popEval; - /** binary tournament selection */ - moeoDetTournamentSelect < MOEOT > select; - /** elitist replacement */ - moeoElitistReplacement < MOEOT > replace; - /** general breeder */ - eoGeneralBreeder < MOEOT > genBreed; - /** breeder */ - eoBreed < MOEOT > & breed; - /** fitness assignment used in NSGA-II */ - moeoFastNonDominatedSortingFitnessAssignment < MOEOT > fitnessAssignment; - /** Diversity assignment used in NSGA-II */ - moeoCrowdingDistanceDiversityAssignment < MOEOT > diversityAssignment; - -}; - -#endif /*MOEONSGAII_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoObjectiveVectorComparator.h b/trunk/paradiseo-moeo/src/moeoObjectiveVectorComparator.h deleted file mode 100644 index 4f2cfee8f..000000000 --- a/trunk/paradiseo-moeo/src/moeoObjectiveVectorComparator.h +++ /dev/null @@ -1,165 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// moeoObjectiveVectorComparator.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MOEOOBJECTIVEVECTORCOMPARATOR_H_ -#define MOEOOBJECTIVEVECTORCOMPARATOR_H_ - -#include -#include - -/** - * Abstract class allowing to compare 2 objective vectors. - * The template argument ObjectiveVector have to be a moeoObjectiveVector. - */ -template < class ObjectiveVector > -class moeoObjectiveVectorComparator : public eoBF < const ObjectiveVector &, const ObjectiveVector &, bool > - {}; - - -/** - * This functor class allows to compare 2 objective vectors according to Pareto dominance. - */ -template < class ObjectiveVector > -class moeoParetoObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector > -{ -public: - - /** - * Returns true if _objectiveVector1 dominates _objectiveVector2 - * @param _objectiveVector1 the first objective vector - * @param _objectiveVector2 the second objective vector - */ - bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2) - { - bool dom = false; - for (unsigned i=0; i ObjectiveVector::Traits::tolerance() ) - { - // if the ith objective have to be minimized... - if (ObjectiveVector::minimizing(i)) - { - if (_objectiveVector1[i] < _objectiveVector2[i]) - { - dom = true; //_objectiveVector1[i] is better than _objectiveVector2[i] - } - else - { - return false; //_objectiveVector1 cannot dominate _objectiveVector2 - } - } - // if the ith objective have to be maximized... - else if (ObjectiveVector::maximizing(i)) - { - if (_objectiveVector1[i] > _objectiveVector2[i]) - { - dom = true; //_objectiveVector1[i] is better than _objectiveVector2[i] - } - else - { - return false; //_objectiveVector1 cannot dominate _objectiveVector2 - } - } - } - } - return dom; - } - -}; - - -/** - * This functor class allows to compare 2 objective vectors according to g-dominance. - * The concept of g-dominance as been introduced in: - * J. Molina, L. V. Santana, A. G. Hernandez-Diaz, C. A. Coello Coello, R. Caballero, - * "g-dominance: Reference point based dominance" (2007) - */ -template < class ObjectiveVector > -class moeoGDominanceObjectiveVectorComparator : public moeoObjectiveVectorComparator < ObjectiveVector > -{ -public: - - /** - * Ctor. - * @param _ref the reference point - */ - moeoGDominanceObjectiveVectorComparator(ObjectiveVector _ref) : ref(_ref) - {} - - - /** - * Returns true if _objectiveVector1 g-dominates _objectiveVector2. - * @param _objectiveVector1 the first objective vector - * @param _objectiveVector2 the second objective vector - */ - bool operator()(const ObjectiveVector & _objectiveVector1, const ObjectiveVector & _objectiveVector2) - { - unsigned flag1 = flag(_objectiveVector1); - unsigned flag2 = flag(_objectiveVector2); - if (flag1==0) - { - // cannot dominate - return false; - } - else if ( (flag1==1) && (flag2==0) ) - { - // dominates - return true; - } - else // (flag1==1) && (flag2==1) - { - // both are on the good region, so let's use the classical Pareto dominance - return paretoComparator(_objectiveVector1, _objectiveVector2); - } - } - - -private: - - /** the reference point */ - ObjectiveVector ref; - /** Pareto comparator */ - moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator; - - - /** - * Returns the flag of _objectiveVector according to the reference point - * @param _objectiveVector the first objective vector - */ - unsigned flag(const ObjectiveVector & _objectiveVector) - { - unsigned result=1; - for (unsigned i=0; i ref[i]) - { - result=0; - } - } - if (result==0) - { - result=1; - for (unsigned i=0; i + +template < class Move > +class moeoMoveIncrEval : public eoBF < const Move &, const typename Move::EOType &, typename Move::EOType::ObjectiveVector > {}; + +#endif diff --git a/trunk/paradiseo-moeo/src/moeoElitistReplacement.h b/trunk/paradiseo-moeo/src/replacement/moeoElitistReplacement.h similarity index 50% rename from trunk/paradiseo-moeo/src/moeoElitistReplacement.h rename to trunk/paradiseo-moeo/src/replacement/moeoElitistReplacement.h index 49b8e4cd4..b6bb9807d 100644 --- a/trunk/paradiseo-moeo/src/moeoElitistReplacement.h +++ b/trunk/paradiseo-moeo/src/replacement/moeoElitistReplacement.h @@ -13,10 +13,12 @@ #ifndef MOEOELITISTREPLACEMENT_H_ #define MOEOELITISTREPLACEMENT_H_ -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include /** * Elitist replacement strategy that consists in keeping the N best individuals. @@ -27,42 +29,42 @@ public: /** * Full constructor. - * @param _evalFitness the fitness assignment strategy - * @param _evalDiversity the diversity assignment strategy + * @param _fitnessAssignment the fitness assignment strategy + * @param _diversityAssignment the diversity assignment strategy * @param _comparator the comparator (used to compare 2 individuals) */ - moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity, moeoComparator < MOEOT > & _comparator) : - evalFitness (_evalFitness), evalDiversity (_evalDiversity), comparator (_comparator) + moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment, moeoComparator < MOEOT > & _comparator) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (_comparator) {} /** * Constructor without comparator. A moeoFitThenDivComparator is used as default. - * @param _evalFitness the fitness assignment strategy - * @param _evalDiversity the diversity assignment strategy + * @param _fitnessAssignment the fitness assignment strategy + * @param _diversityAssignment the diversity assignment strategy */ - moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity) : - evalFitness (_evalFitness), evalDiversity (_evalDiversity), comparator (*(new moeoFitnessThenDiversityComparator < MOEOT >)) + moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (defaultComparator) {} /** * Constructor without moeoDiversityAssignement. A dummy diversity is used as default. - * @param _evalFitness the fitness assignment strategy + * @param _fitnessAssignment the fitness assignment strategy * @param _comparator the comparator (used to compare 2 individuals) */ - moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoComparator < MOEOT > & _comparator) : - evalFitness (_evalFitness), evalDiversity (*(new moeoDummyDiversityAssignment < MOEOT >)), comparator (_comparator) + moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoComparator < MOEOT > & _comparator) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (_comparator) {} /** * Constructor without moeoDiversityAssignement nor moeoComparator. * A moeoFitThenDivComparator and a dummy diversity are used as default. - * @param _evalFitness the fitness assignment strategy + * @param _fitnessAssignment the fitness assignment strategy */ - moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness) : - evalFitness (_evalFitness), evalDiversity (*(new moeoDummyDiversityAssignment < MOEOT >)), comparator (*(new moeoFitnessThenDiversityComparator < MOEOT >)) + moeoElitistReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (defaultComparator) {} @@ -73,16 +75,15 @@ public: */ void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring) { - unsigned sz = _parents.size (); + unsigned int sz = _parents.size (); // merges offspring and parents into a global population _parents.reserve (_parents.size () + _offspring.size ()); - copy (_offspring.begin (), _offspring.end (), back_inserter (_parents)); + std::copy (_offspring.begin (), _offspring.end (), back_inserter (_parents)); // evaluates the fitness and the diversity of this global population - evalFitness (_parents); - evalDiversity (_parents); + fitnessAssignment (_parents); + diversityAssignment (_parents); // sorts the whole population according to the comparator - Cmp cmp(comparator); - std::sort(_parents.begin(), _parents.end(), cmp); + std::sort(_parents.begin(), _parents.end(), comparator); // finally, resize this global population _parents.resize (sz); // and clear the offspring population @@ -93,27 +94,23 @@ public: protected: /** the fitness assignment strategy */ - moeoFitnessAssignment < MOEOT > & evalFitness; + moeoFitnessAssignment < MOEOT > & fitnessAssignment; /** the diversity assignment strategy */ - moeoDiversityAssignment < MOEOT > & evalDiversity; - /** the comparator (used to compare 2 individuals) */ - moeoComparator < MOEOT > & comparator; - - /** - * This class is used to compare solutions in order to sort the population. - */ + moeoDiversityAssignment < MOEOT > & diversityAssignment; + /** a dummy diversity assignment can be used as default */ + moeoDummyDiversityAssignment < MOEOT > defaultDiversity; + /** a fitness then diversity comparator can be used as default */ + moeoFitnessThenDiversityComparator < MOEOT > defaultComparator; + /** this object is used to compare solutions in order to sort the population */ class Cmp { public: - /** * Ctor. - * @param _comparator the comparator + * @param _comp the comparator */ - Cmp(moeoComparator < MOEOT > & _comparator) : comparator(_comparator) + Cmp(moeoComparator < MOEOT > & _comp) : comp(_comp) {} - - /** * Returns true if _moeo1 is greater than _moeo2 according to the comparator * _moeo1 the first individual @@ -121,16 +118,12 @@ protected: */ bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) { - return comparator(_moeo1,_moeo2); + return comp(_moeo2,_moeo1); } - - private: - /** the comparator */ - moeoComparator < MOEOT > & comparator; - - }; + moeoComparator < MOEOT > & comp; + } comparator; }; diff --git a/trunk/paradiseo-moeo/src/moeoEnvironmentalReplacement.h b/trunk/paradiseo-moeo/src/replacement/moeoEnvironmentalReplacement.h similarity index 50% rename from trunk/paradiseo-moeo/src/moeoEnvironmentalReplacement.h rename to trunk/paradiseo-moeo/src/replacement/moeoEnvironmentalReplacement.h index f7dce3c50..68bc032c1 100755 --- a/trunk/paradiseo-moeo/src/moeoEnvironmentalReplacement.h +++ b/trunk/paradiseo-moeo/src/replacement/moeoEnvironmentalReplacement.h @@ -13,10 +13,11 @@ #ifndef MOEOENVIRONMENTALREPLACEMENT_H_ #define MOEOENVIRONMENTALREPLACEMENT_H_ -#include -#include -#include -#include +#include +#include +#include +#include +#include /** * Environmental replacement strategy that consists in keeping the N best individuals by deleting individuals 1 by 1 @@ -32,69 +33,74 @@ public: /** * Full constructor. - * @param _evalFitness the fitness assignment strategy - * @param _evalDiversity the diversity assignment strategy + * @param _fitnessAssignment the fitness assignment strategy + * @param _diversityAssignment the diversity assignment strategy * @param _comparator the comparator (used to compare 2 individuals) */ - moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity, moeoComparator < MOEOT > & _comparator) : - evalFitness (_evalFitness), evalDiversity (_evalDiversity), comparator (_comparator) + moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment, moeoComparator < MOEOT > & _comparator) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (_comparator) {} /** * Constructor without comparator. A moeoFitThenDivComparator is used as default. - * @param _evalFitness the fitness assignment strategy - * @param _evalDiversity the diversity assignment strategy + * @param _fitnessAssignment the fitness assignment strategy + * @param _diversityAssignment the diversity assignment strategy */ - moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoDiversityAssignment < MOEOT > & _evalDiversity) : - evalFitness (_evalFitness), evalDiversity (_evalDiversity), comparator (*(new moeoFitnessThenDiversityComparator < MOEOT >)) + moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoDiversityAssignment < MOEOT > & _diversityAssignment) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (_diversityAssignment), comparator (defaultComparator) {} /** * Constructor without moeoDiversityAssignement. A dummy diversity is used as default. - * @param _evalFitness the fitness assignment strategy + * @param _fitnessAssignment the fitness assignment strategy * @param _comparator the comparator (used to compare 2 individuals) */ - moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness, moeoComparator < MOEOT > & _comparator) : - evalFitness (_evalFitness), evalDiversity (*(new moeoDummyDiversityAssignment < MOEOT >)), comparator (_comparator) + moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment, moeoComparator < MOEOT > & _comparator) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (_comparator) {} /** * Constructor without moeoDiversityAssignement nor moeoComparator. * A moeoFitThenDivComparator and a dummy diversity are used as default. - * @param _evalFitness the fitness assignment strategy + * @param _fitnessAssignment the fitness assignment strategy */ - moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _evalFitness) : - evalFitness (_evalFitness), evalDiversity (*(new moeoDummyDiversityAssignment < MOEOT >)), comparator (*(new moeoFitnessThenDiversityComparator < MOEOT >)) + moeoEnvironmentalReplacement (moeoFitnessAssignment < MOEOT > & _fitnessAssignment) : + fitnessAssignment (_fitnessAssignment), diversityAssignment (defaultDiversity), comparator (defaultComparator) {} /** * Replaces the first population by adding the individuals of the second one, sorting with a moeoComparator and resizing the whole population obtained. - * @param _parents the population composed of the parents (the population you want to replace) - * @param _offspring the offspring population + * @param _parents the population composed of the parents (the population you want to replace) + * @param _offspring the offspring population */ void operator () (eoPop < MOEOT > &_parents, eoPop < MOEOT > &_offspring) { - unsigned sz = _parents.size(); + unsigned int sz = _parents.size(); // merges offspring and parents into a global population _parents.reserve (_parents.size() + _offspring.size()); - copy (_offspring.begin(), _offspring.end(), back_inserter(_parents)); + std::copy (_offspring.begin(), _offspring.end(), back_inserter(_parents)); // evaluates the fitness and the diversity of this global population - evalFitness (_parents); - evalDiversity (_parents); + fitnessAssignment (_parents); + diversityAssignment (_parents); // remove individuals 1 by 1 and update the fitness values - Cmp cmp(comparator); + unsigned int worstIdx; ObjectiveVector worstObjVec; while (_parents.size() > sz) { - std::sort (_parents.begin(), _parents.end(), cmp); - worstObjVec = _parents[_parents.size()-1].objectiveVector(); - _parents.resize(_parents.size()-1); - evalFitness.updateByDeleting(_parents, worstObjVec); - evalDiversity.updateByDeleting(_parents, worstObjVec); + // the individual to delete + worstIdx = std::min_element(_parents.begin(), _parents.end(), comparator) - _parents.begin(); + worstObjVec = _parents[worstIdx].objectiveVector(); + // remove the woorst individual + _parents[worstIdx] = _parents.back(); + _parents.pop_back(); + // update of the fitness and diversity values + fitnessAssignment.updateByDeleting(_parents, worstObjVec); + diversityAssignment.updateByDeleting(_parents, worstObjVec); + } // clear the offspring population _offspring.clear (); @@ -104,28 +110,23 @@ public: protected: /** the fitness assignment strategy */ - moeoFitnessAssignment < MOEOT > & evalFitness; + moeoFitnessAssignment < MOEOT > & fitnessAssignment; /** the diversity assignment strategy */ - moeoDiversityAssignment < MOEOT > & evalDiversity; - /** the comparator (used to compare 2 individuals) */ - moeoComparator < MOEOT > & comparator; - - - /** - * This class is used to compare solutions in order to sort the population. - */ + moeoDiversityAssignment < MOEOT > & diversityAssignment; + /** a dummy diversity assignment can be used as default */ + moeoDummyDiversityAssignment < MOEOT > defaultDiversity; + /** a fitness then diversity comparator can be used as default */ + moeoFitnessThenDiversityComparator < MOEOT > defaultComparator; + /** this object is used to compare solutions in order to sort the population */ class Cmp { public: - /** * Ctor. - * @param _comparator the comparator + * @param _comp the comparator */ - Cmp(moeoComparator < MOEOT > & _comparator) : comparator(_comparator) + Cmp(moeoComparator < MOEOT > & _comp) : comp(_comp) {} - - /** * Returns true if _moeo1 is greater than _moeo2 according to the comparator * _moeo1 the first individual @@ -133,16 +134,12 @@ protected: */ bool operator()(const MOEOT & _moeo1, const MOEOT & _moeo2) { - return comparator(_moeo1,_moeo2); + return comp(_moeo1,_moeo2); } - - private: - /** the comparator */ - moeoComparator < MOEOT > & comparator; - - }; + moeoComparator < MOEOT > & comp; + } comparator; }; diff --git a/trunk/paradiseo-moeo/src/moeoGenerationalReplacement.h b/trunk/paradiseo-moeo/src/replacement/moeoGenerationalReplacement.h similarity index 96% rename from trunk/paradiseo-moeo/src/moeoGenerationalReplacement.h rename to trunk/paradiseo-moeo/src/replacement/moeoGenerationalReplacement.h index b7b800625..e3d1f6235 100644 --- a/trunk/paradiseo-moeo/src/moeoGenerationalReplacement.h +++ b/trunk/paradiseo-moeo/src/replacement/moeoGenerationalReplacement.h @@ -14,7 +14,7 @@ #define MOEOGENERATIONALREPLACEMENT_H_ #include -#include +#include /** * Generational replacement: only the new individuals are preserved. diff --git a/trunk/paradiseo-moeo/src/moeoReplacement.h b/trunk/paradiseo-moeo/src/replacement/moeoReplacement.h similarity index 91% rename from trunk/paradiseo-moeo/src/moeoReplacement.h rename to trunk/paradiseo-moeo/src/replacement/moeoReplacement.h index 708529db0..aa0631754 100644 --- a/trunk/paradiseo-moeo/src/moeoReplacement.h +++ b/trunk/paradiseo-moeo/src/replacement/moeoReplacement.h @@ -19,7 +19,6 @@ * Replacement strategy for multi-objective optimization. */ template < class MOEOT > -class moeoReplacement : public eoReplacement < MOEOT > - {}; +class moeoReplacement : public eoReplacement < MOEOT > {}; #endif /*MOEOREPLACEMENT_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoDetTournamentSelect.h b/trunk/paradiseo-moeo/src/selection/moeoDetTournamentSelect.h similarity index 65% rename from trunk/paradiseo-moeo/src/moeoDetTournamentSelect.h rename to trunk/paradiseo-moeo/src/selection/moeoDetTournamentSelect.h index e2b565ef2..e60709c5b 100644 --- a/trunk/paradiseo-moeo/src/moeoDetTournamentSelect.h +++ b/trunk/paradiseo-moeo/src/selection/moeoDetTournamentSelect.h @@ -13,15 +13,15 @@ #ifndef MOEODETTOURNAMENTSELECT_H_ #define MOEODETTOURNAMENTSELECT_H_ -#include -#include -#include +#include +#include +#include +#include /** * Selection strategy that selects ONE individual by deterministic tournament. */ -template < class MOEOT > class moeoDetTournamentSelect:public moeoSelectOne < - MOEOT > +template < class MOEOT > class moeoDetTournamentSelect:public moeoSelectOne < MOEOT > { public: @@ -30,8 +30,7 @@ public: * @param _comparator the comparator (used to compare 2 individuals) * @param _tSize the number of individuals in the tournament (default: 2) */ - moeoDetTournamentSelect (moeoComparator < MOEOT > &_comparator, unsigned _tSize = 2): - comparator (_comparator), tSize (_tSize) + moeoDetTournamentSelect (moeoComparator < MOEOT > & _comparator, unsigned int _tSize = 2) : comparator (_comparator), tSize (_tSize) { // consistency check if (tSize < 2) @@ -44,12 +43,10 @@ public: /** - * Ctor without comparator. A moeoFitnessThenDiversityComparator is used as default. - * @param _tSize the number of individuals in the tournament (default: 2) - */ - moeoDetTournamentSelect (unsigned _tSize = 2): - comparator (*(new moeoFitnessThenDiversityComparator < MOEOT > ())), - tSize (_tSize) + * Ctor without comparator. A moeoFitnessThenDiversityComparator is used as default. + * @param _tSize the number of individuals in the tournament (default: 2) + */ + moeoDetTournamentSelect (unsigned int _tSize = 2) : comparator (defaultComparator), tSize (_tSize) { // consistency check if (tSize < 2) @@ -65,7 +62,7 @@ public: * Apply the tournament to the given population * @param _pop the population */ - const MOEOT & operator () (const eoPop < MOEOT > &_pop) + const MOEOT & operator() (const eoPop < MOEOT > &_pop) { // use the selector return mo_deterministic_tournament (_pop, tSize, comparator); @@ -75,10 +72,12 @@ public: protected: /** the comparator (used to compare 2 individuals) */ - moeoComparator < MOEOT > &comparator; - + moeoComparator < MOEOT > & comparator; + /** a fitness then diversity comparator can be used as default */ + moeoFitnessThenDiversityComparator < MOEOT > defaultComparator; /** the number of individuals in the tournament */ - unsigned tSize; + unsigned int tSize; + }; #endif /*MOEODETTOURNAMENTSELECT_H_ */ diff --git a/trunk/paradiseo-moeo/src/moeoRandomSelect.h b/trunk/paradiseo-moeo/src/selection/moeoRandomSelect.h similarity index 96% rename from trunk/paradiseo-moeo/src/moeoRandomSelect.h rename to trunk/paradiseo-moeo/src/selection/moeoRandomSelect.h index 04d7cfcc0..2b5bbd088 100644 --- a/trunk/paradiseo-moeo/src/moeoRandomSelect.h +++ b/trunk/paradiseo-moeo/src/selection/moeoRandomSelect.h @@ -13,8 +13,9 @@ #ifndef MOEORANDOMSELECT_H_ #define MOEORANDOMSELECT_H_ -#include #include +#include + /** * Selection strategy that selects only one element randomly from a whole population. diff --git a/trunk/paradiseo-moeo/src/selection/moeoRouletteSelect.h b/trunk/paradiseo-moeo/src/selection/moeoRouletteSelect.h new file mode 100644 index 000000000..e53b82cfc --- /dev/null +++ b/trunk/paradiseo-moeo/src/selection/moeoRouletteSelect.h @@ -0,0 +1,62 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoRouletteSelect.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOROULETTESELECT_H_ +#define MOEOROULETTESELECT_H_ + +#include +#include + +/** + * Selection strategy that selects ONE individual by using roulette wheel process. + * @WARNING This selection only uses fitness values (and not diversity values). + */ +template < class MOEOT > +class moeoRouletteSelect:public moeoSelectOne < MOEOT > +{ +public: + + /** + * Ctor. + * @param _tSize the number of individuals in the tournament (default: 2) + */ + moeoRouletteSelect (unsigned int _tSize = 2) : tSize (_tSize) + { + // consistency check + if (tSize < 2) + { + std:: + cout << "Warning, Tournament size should be >= 2\nAdjusted to 2\n"; + tSize = 2; + } + } + + + /** + * Apply the tournament to the given population + * @param _pop the population + */ + const MOEOT & operator () (const eoPop < MOEOT > & _pop) + { + // use the selector + return mo_roulette_wheel(_pop,tSize); + } + + +protected: + + /** size */ + double & tSize; + +}; + +#endif /*MOEOROULETTESELECT_H_ */ diff --git a/trunk/paradiseo-moeo/src/moeoSelectFromPopAndArch.h b/trunk/paradiseo-moeo/src/selection/moeoSelectFromPopAndArch.h similarity index 96% rename from trunk/paradiseo-moeo/src/moeoSelectFromPopAndArch.h rename to trunk/paradiseo-moeo/src/selection/moeoSelectFromPopAndArch.h index ad2d0482d..078a51c19 100644 --- a/trunk/paradiseo-moeo/src/moeoSelectFromPopAndArch.h +++ b/trunk/paradiseo-moeo/src/selection/moeoSelectFromPopAndArch.h @@ -15,9 +15,9 @@ #include #include -#include -#include -#include +#include +#include +#include /** * Elitist selection process that consists in choosing individuals in the archive as well as in the current population. @@ -38,6 +38,7 @@ public: : popSelectOne(_popSelectOne), archSelectOne(_archSelectOne), arch(_arch), ratioFromPop(_ratioFromPop) {} + /** * Defaulr ctor - the archive's selection operator is a random selector * @param _popSelectOne the population's selection operator @@ -48,6 +49,7 @@ public: : popSelectOne(_popSelectOne), archSelectOne(randomSelectOne), arch(_arch), ratioFromPop(_ratioFromPop) {} + /** * The selection process */ @@ -62,6 +64,7 @@ public: return popSelectOne(pop); } + /** * Setups some population stats */ diff --git a/trunk/paradiseo-moeo/src/moeoSelectOne.h b/trunk/paradiseo-moeo/src/selection/moeoSelectOne.h similarity index 100% rename from trunk/paradiseo-moeo/src/moeoSelectOne.h rename to trunk/paradiseo-moeo/src/selection/moeoSelectOne.h diff --git a/trunk/paradiseo-moeo/src/moeoSelectors.h b/trunk/paradiseo-moeo/src/selection/moeoSelectors.h similarity index 88% rename from trunk/paradiseo-moeo/src/moeoSelectors.h rename to trunk/paradiseo-moeo/src/selection/moeoSelectors.h index c151001c6..35f913ae4 100644 --- a/trunk/paradiseo-moeo/src/moeoSelectors.h +++ b/trunk/paradiseo-moeo/src/selection/moeoSelectors.h @@ -13,43 +13,40 @@ #ifndef MOEOSELECTORS_H_ #define MOEOSELECTORS_H_ -#include +#include template -It mo_deterministic_tournament(It _begin, It _end, unsigned _t_size,moeoComparator& _comparator ,eoRng& _gen = rng) +It mo_deterministic_tournament(It _begin, It _end, unsigned int _t_size,moeoComparator& _comparator ,eoRng& _gen = rng) { It best = _begin + _gen.random(_end - _begin); - for (unsigned i = 0; i < _t_size - 1; ++i) + for (unsigned int i = 0; i < _t_size - 1; ++i) { It competitor = _begin + _gen.random(_end - _begin); - // compare the two individuals by using the comparator - if (_comparator(*best,*competitor)) - + if (_comparator(*best, *competitor)) // best "better" than competitor best=competitor; } - return best; } template -const MOEOT& mo_deterministic_tournament(const eoPop& _pop, unsigned _t_size,moeoComparator& _comparator, eoRng& _gen = rng) +const MOEOT& mo_deterministic_tournament(const eoPop& _pop, unsigned int _t_size,moeoComparator& _comparator, eoRng& _gen = rng) { return *mo_deterministic_tournament(_pop.begin(), _pop.end(),_t_size,_comparator, _gen); } + template -MOEOT& mo_deterministic_tournament(eoPop& _pop, unsigned _t_size,moeoComparator& _comparator,eoRng& _gen = rng) +MOEOT& mo_deterministic_tournament(eoPop& _pop, unsigned int _t_size,moeoComparator& _comparator,eoRng& _gen = rng) { return *mo_deterministic_tournament(_pop.begin(), _pop.end(), _t_size,_comparator, _gen); } - template It mo_stochastic_tournament(It _begin, It _end, double _t_rate,moeoComparator& _comparator ,eoRng& _gen = rng) { @@ -58,7 +55,7 @@ It mo_stochastic_tournament(It _begin, It _end, double _t_rate,moeoComparator const MOEOT& mo_stochastic_tournament(const eoPop& _pop, double _t_rate,moeoComparator& _comparator, eoRng& _gen = rng) { return *mo_stochastic_tournament(_pop.begin(), _pop.end(), _t_rate,_comparator, _gen); } + template MOEOT& mo_stochastic_tournament(eoPop& _pop, double _t_rate, eoRng& _gen = rng) { @@ -88,7 +87,6 @@ MOEOT& mo_stochastic_tournament(eoPop& _pop, double _t_rate, eoRng& _gen } - template It mo_roulette_wheel(It _begin, It _end, double total, eoRng& _gen = rng) { @@ -108,6 +106,7 @@ It mo_roulette_wheel(It _begin, It _end, double total, eoRng& _gen = rng) return --i; } + template const MOEOT& mo_roulette_wheel(const eoPop& _pop, double total, eoRng& _gen = rng) { @@ -126,6 +125,7 @@ const MOEOT& mo_roulette_wheel(const eoPop& _pop, double total, eoRng& _g return *--i; } + template MOEOT& mo_roulette_wheel(eoPop& _pop, double total, eoRng& _gen = rng) { @@ -138,13 +138,14 @@ MOEOT& mo_roulette_wheel(eoPop& _pop, double total, eoRng& _gen = rng) while (roulette > 0.0) { - // fitness ? + // fitness only roulette -= static_cast((i++)->fitness()); } return *--i; } + #endif /*MOEOSELECTORS_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoStochTournamentSelect.h b/trunk/paradiseo-moeo/src/selection/moeoStochTournamentSelect.h similarity index 67% rename from trunk/paradiseo-moeo/src/moeoStochTournamentSelect.h rename to trunk/paradiseo-moeo/src/selection/moeoStochTournamentSelect.h index 1891be0b6..61365c038 100644 --- a/trunk/paradiseo-moeo/src/moeoStochTournamentSelect.h +++ b/trunk/paradiseo-moeo/src/selection/moeoStochTournamentSelect.h @@ -13,8 +13,10 @@ #ifndef MOEOSTOCHTOURNAMENTSELECT_H_ #define MOEOSTOCHTOURNAMENTSELECT_H_ -#include -#include +#include +#include +#include +#include /** * Selection strategy that selects ONE individual by stochastic tournament. @@ -28,45 +30,37 @@ public: * @param _comparator the comparator (used to compare 2 individuals) * @param _tRate the tournament rate */ - moeoStochTournamentSelect (moeoComparator < MOEOT > & _comparator, double _tRate = 1.0) : - comparator (_comparator), tRate (_tRate) + moeoStochTournamentSelect (moeoComparator < MOEOT > & _comparator, double _tRate = 1.0) : comparator (_comparator), tRate (_tRate) { // consistency checks if (tRate < 0.5) { - std:: - cerr << - "Warning, Tournament rate should be > 0.5\nAdjusted to 0.55\n"; + std::cerr << "Warning, Tournament rate should be > 0.5\nAdjusted to 0.55\n"; tRate = 0.55; } if (tRate > 1) { - std:: - cerr << "Warning, Tournament rate should be < 1\nAdjusted to 1\n"; + std::cerr << "Warning, Tournament rate should be < 1\nAdjusted to 1\n"; tRate = 1; } } + /** * Ctor without comparator. A moeoFitnessThenDiversityComparator is used as default. * @param _tRate the tournament rate */ - moeoStochTournamentSelect (double _tRate = 1.0) - :comparator (*(new moeoFitnessThenDiversityComparator < MOEOT > ())), tRate (_tRate) - + moeoStochTournamentSelect (double _tRate = 1.0) : comparator (defaultComparator), tRate (_tRate) { // consistency checks if (tRate < 0.5) { - std:: - cerr << - "Warning, Tournament rate should be > 0.5\nAdjusted to 0.55\n"; + std::cerr << "Warning, Tournament rate should be > 0.5\nAdjusted to 0.55\n"; tRate = 0.55; } if (tRate > 1) { - std:: - cerr << "Warning, Tournament rate should be < 1\nAdjusted to 1\n"; + std::cerr << "Warning, Tournament rate should be < 1\nAdjusted to 1\n"; tRate = 1; } } @@ -83,11 +77,12 @@ public: } - protected: - /** the diversity assignment strategy */ + /** the comparator (used to compare 2 individuals) */ moeoComparator < MOEOT > & comparator; + /** a fitness then diversity comparator can be used as default */ + moeoFitnessThenDiversityComparator < MOEOT > defaultComparator; /** the tournament rate */ double tRate; diff --git a/trunk/paradiseo-moeo/src/utils/moeoArchiveObjectiveVectorSavingUpdater.h b/trunk/paradiseo-moeo/src/utils/moeoArchiveObjectiveVectorSavingUpdater.h new file mode 100644 index 000000000..3c6035e16 --- /dev/null +++ b/trunk/paradiseo-moeo/src/utils/moeoArchiveObjectiveVectorSavingUpdater.h @@ -0,0 +1,94 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// moeoArchiveObjectiveVectorSavingUpdater.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_ +#define MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_ + +#include +#include +#include +#include +#include + +#define MAX_BUFFER_SIZE 1000 + +/** + * This class allows to save the objective vectors of the solutions contained in an archive into a file at each generation. + */ +template < class MOEOT > +class moeoArchiveObjectiveVectorSavingUpdater : public eoUpdater +{ +public: + + /** + * Ctor + * @param _arch local archive + * @param _filename target filename + * @param _count put this variable to true if you want a new file to be created each time () is called and to false if you only want the file to be updated + * @param _id own ID + */ + moeoArchiveObjectiveVectorSavingUpdater (moeoArchive & _arch, const std::string & _filename, bool _count = false, int _id = -1) : + arch(_arch), filename(_filename), count(_count), counter(0), id(_id) + {} + + + /** + * Saves the fitness of the archive's members into the file + */ + void operator()() { + char buff[MAX_BUFFER_SIZE]; + if (count) + { + if (id == -1) + { + sprintf (buff, "%s.%u", filename.c_str(), counter ++); + } + else + { + sprintf (buff, "%s.%u.%u", filename.c_str(), id, counter ++); + } + } + else + { + if (id == -1) + { + sprintf (buff, "%s", filename.c_str()); + } + else + { + sprintf (buff, "%s.%u", filename.c_str(), id); + } + counter ++; + } + std::ofstream f(buff); + for (unsigned int i = 0; i < arch.size (); i++) + f << arch[i].objectiveVector() << std::endl; + f.close (); + } + + +private: + + /** local archive */ + moeoArchive & arch; + /** target filename */ + std::string filename; + /** this variable is set to true if a new file have to be created each time () is called and to false if the file only HAVE to be updated */ + bool count; + /** counter */ + unsigned int counter; + /** own ID */ + int id; + +}; + +#endif /*MOEOARCHIVEOBJECTIVEVECTORSAVINGUPDATER_H_*/ diff --git a/trunk/paradiseo-moeo/src/moeoArchiveUpdater.h b/trunk/paradiseo-moeo/src/utils/moeoArchiveUpdater.h similarity index 97% rename from trunk/paradiseo-moeo/src/moeoArchiveUpdater.h rename to trunk/paradiseo-moeo/src/utils/moeoArchiveUpdater.h index 73fbdc687..6596940c2 100644 --- a/trunk/paradiseo-moeo/src/moeoArchiveUpdater.h +++ b/trunk/paradiseo-moeo/src/utils/moeoArchiveUpdater.h @@ -15,7 +15,7 @@ #include #include -#include +#include /** * This class allows to update the archive at each generation with newly found non-dominated solutions. diff --git a/trunk/paradiseo-moeo/src/metric/moeoBinaryMetricSavingUpdater.h b/trunk/paradiseo-moeo/src/utils/moeoBinaryMetricSavingUpdater.h similarity index 92% rename from trunk/paradiseo-moeo/src/metric/moeoBinaryMetricSavingUpdater.h rename to trunk/paradiseo-moeo/src/utils/moeoBinaryMetricSavingUpdater.h index b2fb8aa3a..237ea4909 100644 --- a/trunk/paradiseo-moeo/src/metric/moeoBinaryMetricSavingUpdater.h +++ b/trunk/paradiseo-moeo/src/utils/moeoBinaryMetricSavingUpdater.h @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -28,11 +29,10 @@ class moeoBinaryMetricSavingUpdater : public eoUpdater { public: - /** - * The objective vector type of a solution - */ + /** The objective vector type of a solution */ typedef typename MOEOT::ObjectiveVector ObjectiveVector; + /** * Ctor * @param _metric the binary metric comparing two Pareto sets @@ -43,6 +43,7 @@ public: metric(_metric), pop(_pop), filename(_filename), counter(1) {} + /** * Saves the metric's value for the current generation */ @@ -55,9 +56,9 @@ public: // creation of the two Pareto sets std::vector < ObjectiveVector > from; std::vector < ObjectiveVector > to; - for (unsigned i=0; i #include /** @@ -31,12 +32,13 @@ public: { std::vector < ObjectiveVector > result; result.resize(_pop.size()); - for (unsigned i=0; i<_pop.size(); i++) + for (unsigned int i=0; i<_pop.size(); i++) { result.push_back(_pop[i].objectiveVector()); } return result; } + }; #endif /*MOEOPOPTOOBJECTIVEVECTORS_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.cpp new file mode 100644 index 000000000..7e01baabc --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.cpp @@ -0,0 +1,107 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopEA.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + + +// moeo general include +#include +// for the creation of an evaluator +#include +// for the creation of an initializer +#include +// for the creation of the variation operators +#include +// how to initialize the population +#include +// the stopping criterion +#include +// outputs (stats, population dumps, ...) +#include +// evolution engine (selection and replacement) +#include +// simple call to the algo +#include +// checks for help demand, and writes the status file and make_help; in libutils +void make_help(eoParser & _parser); +// definition of the representation +#include + + +using namespace std; + + +int main(int argc, char* argv[]) +{ + try + { + + eoParser parser(argc, argv); // for user-parameter reading + eoState state; // to keep all things allocated + + + /*** the representation-dependent things ***/ + + // The fitness evaluation + eoEvalFuncCounter& eval = do_make_eval(parser, state); + // the genotype (through a genotype initializer) + eoInit& init = do_make_genotype(parser, state); + // the variation operators + eoGenOp& op = do_make_op(parser, state); + + + /*** the representation-independent things ***/ + + // initialization of the population + eoPop& pop = do_make_pop(parser, state, init); + // definition of the archive + moeoArchive arch; + // stopping criteria + eoContinue& term = do_make_continue_moeo(parser, state, eval); + // output + eoCheckPoint& checkpoint = do_make_checkpoint_moeo(parser, state, eval, term, pop, arch); + // algorithm + eoAlgo& algo = do_make_ea_moeo(parser, state, eval, checkpoint, op, arch); + + + /*** Go ! ***/ + + // help ? + make_help(parser); + + // first evalution + apply(eval, pop); + + // printing of the initial population + cout << "Initial Population\n"; + pop.sortedPrintOn(cout); + cout << endl; + + // run the algo + do_run(algo, pop); + + // printing of the final population + cout << "Final Population\n"; + pop.sortedPrintOn(cout); + cout << endl; + + // printing of the final archive + cout << "Final Archive\n"; + arch.sortedPrintOn(cout); + cout << endl; + + + } + catch (exception& e) + { + cout << e.what() << endl; + } + return EXIT_SUCCESS; +} diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.param b/trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.param new file mode 100644 index 000000000..b1a0a118a --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/FlowShopEA.param @@ -0,0 +1,49 @@ + +###### General ###### +--help=0 # -h : Prints this message +--stopOnUnknownParam=1 # Stop if unkown param entered +# --seed=1182849833 # -S : Random number seed + +###### Evolution Engine ###### +--popSize=20 # -P : Population Size +--updateArch=1 # Update the archive at each gen. +--fitness=FastNonDominatedSorting # -F : Fitness assignment scheme: Dummy, FastNonDominatedSorting or IndicatorBased +--indicator=Epsilon # -i : Binary indicator for IndicatorBased: Epsilon, Hypervolume +--rho=1.1 # -r : reference point for the hypervolume indicator +--kappa=0.05 # -k : Scaling factor kappa for IndicatorBased +--diversity=Dummy # -D : Diversity assignment scheme: Dummy, Sharing(nicheSize) or Crowding +--comparator=FitnessThenDiversity # -C : Comparator scheme: FitnessThenDiversity, DiversityThenFitness or Aggregative +--selection=DetTour(2) # -S : Selection scheme: DetTour(T), StochTour(t) or Random +--replacement=Elitist # -R : Replacement scheme: Elitist, Environmental or Generational +--nbOffspring=100% # -O : Number of offspring (percentage or absolute) + +###### Output ###### +--resDir=Res # Directory to store DISK outputs +--eraseDir=1 # erase files in dirName if any +--printPop=0 # Print sorted pop. every gen. +--storeArch=0 # Store the archive's objective vectors at each gen. +--contribution=0 # Store the contribution of the archive at each gen. +--entropy=0 # Store the entropy of the archive at each gen. + +###### Persistence ###### +--Load= # -L : A save file to restart from +--recomputeFitness=0 # -r : Recompute the fitness after re-loading the pop.? +--saveFrequency=0 # Save every F generation (0 = only final state, absent = never) +--saveTimeInterval=0 # Save every T seconds (0 or absent = never) +--status=./FlowShopEA.status # Status file + +###### Representation ###### +--BenchmarkFile=benchmarks/020_10_01.txt # -B : Benchmark file name (benchmarks are available at www.lifl.fr/~liefooga/benchmarks) REQUIRED + +###### Stopping criterion ###### +--maxGen=100 # -G : Maximum number of generations (0 = none) +--maxEval=0 # -E : Maximum number of evaluations (0 = none) +--maxTime=0 # -T : Maximum running time in seconds (0 = none) +--CtrlC=1 # -C : Terminate current generation upon Ctrl C + +###### Variation Operators ###### +--crossRate=1 # Relative rate for the only crossover +--shiftMutRate=0.5 # Relative rate for shift mutation +--exchangeMutRate=0.5 # Relative rate for exchange mutation +--pCross=0.25 # -c : Probability of Crossover +--pMut=0.35 # -m : Probability of Mutation diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/Makefile.am b/trunk/paradiseo-moeo/tutorial/Lesson1/Makefile.am new file mode 100644 index 000000000..d2994a37a --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/Makefile.am @@ -0,0 +1,11 @@ +SUBDIRS = flowshop + +noinst_PROGRAMS = FlowShopEA + +FlowShopEA_SOURCES = FlowShopEA.cpp + +LDADD = ${EO_DIR}/src/libeo.a ${EO_DIR}/src/utils/libeoutils.a $(top_srcdir)/src/core/libmoeo.a flowshop/libflowshop.a + +INCLUDES = -Iflowshop -I${EO_DIR}/src/ -I$(top_srcdir)/src/ + +AM_CXXFLAGS = -Wall -ansi -pedantic diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_05_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_05_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_05_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_05_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_05_02.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_05_02.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_05_02.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_05_02.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_10_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_10_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_10_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_10_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_10_02.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_10_02.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_10_02.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_10_02.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_20_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_20_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/020_20_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/020_20_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/050_05_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/050_05_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/050_05_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/050_05_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/050_10_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/050_10_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/050_10_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/050_10_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/050_20_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/050_20_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/050_20_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/050_20_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/100_05_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/100_05_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/100_05_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/100_05_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/100_10_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/100_10_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/100_10_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/100_10_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/100_20_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/100_20_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/100_20_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/100_20_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/200_10_01.txt b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/200_10_01.txt similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/200_10_01.txt rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/200_10_01.txt diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/README b/trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/README similarity index 100% rename from trunk/paradiseo-moeo/tutorials/lesson1/benchmarks/README rename to trunk/paradiseo-moeo/tutorial/Lesson1/benchmarks/README diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.cpp new file mode 100644 index 000000000..1ee6b9d0d --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.cpp @@ -0,0 +1,18 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShop.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + +std::string FlowShop::className() const +{ + return "FlowShop"; +} diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.h new file mode 100644 index 000000000..232ff8b64 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShop.h @@ -0,0 +1,33 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShop.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef FLOWSHOP_H_ +#define FLOWSHOP_H_ + +#include +#include + +/** + * Structure of the genotype for the flow-shop scheduling problem: a vector of unsigned int int. + */ +class FlowShop: public moeoVector < FlowShopObjectiveVector , double , double , unsigned int > +{ +public: + + /** + * class name + */ + std::string className() const; + +}; + +#endif /*FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopBenchmarkParser.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopBenchmarkParser.cpp new file mode 100644 index 000000000..0ca8c857e --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopBenchmarkParser.cpp @@ -0,0 +1,101 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopBenchmarkParser.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include +#include + +FlowShopBenchmarkParser::FlowShopBenchmarkParser(const std::string _benchmarkFileName) +{ + init(_benchmarkFileName); +} + + +const unsigned int FlowShopBenchmarkParser::getM() +{ + return M; +} + + +const unsigned int FlowShopBenchmarkParser::getN() +{ + return N; +} + + +const std::vector< std::vector > FlowShopBenchmarkParser::getP() +{ + return p; +} + + +const std::vector FlowShopBenchmarkParser::getD() +{ + return d; +} + + +void FlowShopBenchmarkParser::printOn(std::ostream & _os) const +{ + _os << "M=" << M << " N=" << N << std::endl; + _os << "*** processing times" << std::endl; + for (unsigned int i=0; i > (M,N); + d = std::vector (N); + // for each job... + for (unsigned int j=0 ; j j) + getline(inputFile, buffer, '\n'); + // due-date of the job j + getline(inputFile, buffer, '\n'); + d[j] = atoi(buffer.data()); + // processing times of the job j on each machine + getline(inputFile, buffer, '\n'); + start = buffer.find_first_not_of(" "); + for (unsigned int i=0 ; i +#include + +/** + * Class to handle parameters of a flow-shop instance from a benchmark file + */ +class FlowShopBenchmarkParser +{ +public: + + /** + * Ctor + * @param _benchmarkFileName the name of the benchmark file + */ + FlowShopBenchmarkParser(const std::string _benchmarkFileName); + + + /** + * the number of machines + */ + const unsigned int getM(); + + + /** + * the number of jobs + */ + const unsigned int getN(); + + + /** + * the processing times + */ + const std::vector < std::vector < unsigned int > > getP(); + + + /** + * the due-dates + */ + const std::vector < unsigned int > getD(); + + + /** + * printing... + */ + void printOn(std::ostream & _os) const; + + +private: + + /** number of machines */ + unsigned int M; + /** number of jobs */ + unsigned int N; + /** p[i][j] = processing time of job j on machine i */ + std::vector < std::vector < unsigned int > > p; + /** d[j] = due-date of the job j */ + std::vector < unsigned int > d; + + + /** + * Initialisation of the parameters with the data contained in the benchmark file + * @param _benchmarkFileName the name of the benchmark file + */ + void init(const std::string _benchmarkFileName); + +}; + +#endif /*FLOWSHOPBENCHMARKPARSER_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopEval.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopEval.cpp new file mode 100644 index 000000000..579d0bfc8 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopEval.cpp @@ -0,0 +1,64 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopEval.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + + +FlowShopEval::FlowShopEval(unsigned int _M, unsigned int _N, const std::vector< std::vector > & _p, const std::vector & _d) : + M(_M), N (_N), p(_p), d(_d) +{} + + +void FlowShopEval::operator()(FlowShop & _flowshop) +{ + FlowShopObjectiveVector objVector; + objVector[0] = makespan(_flowshop); + objVector[1] = tardiness(_flowshop); + _flowshop.objectiveVector(objVector); +} + + + +double FlowShopEval::makespan(const FlowShop & _flowshop) +{ + // completion times computation for each job on each machine + // C[i][j] = completion of the jth job of the scheduling on the ith machine + std::vector< std::vector > C = completionTime(_flowshop); + return C[M-1][_flowshop[N-1]]; +} + + +double FlowShopEval::tardiness(const FlowShop & _flowshop) +{ + // completion times computation for each job on each machine + // C[i][j] = completion of the jth job of the scheduling on the ith machine + std::vector< std::vector > C = completionTime(_flowshop); + // tardiness computation + unsigned int long sum = 0; + for (unsigned int j=0 ; j > FlowShopEval::completionTime(const FlowShop & _flowshop) { + std::vector< std::vector > C(M,N); + C[0][_flowshop[0]] = p[0][_flowshop[0]]; + for (unsigned int j=1; j +#include +#include + +/** + * Evaluation of the objective vector a (multi-objective) FlowShop object + */ +class FlowShopEval : public moeoEvalFunc +{ +public: + + /** + * Ctor + * @param _M the number of machines + * @param _N the number of jobs to schedule + * @param _p the processing times + * @param _d the due dates + */ + FlowShopEval(unsigned int _M, unsigned int _N, const std::vector< std::vector > & _p, const std::vector & _d); + + + /** + * computation of the multi-objective evaluation of a FlowShop object + * @param _flowshop the FlowShop object to evaluate + */ + void operator()(FlowShop & _flowshop); + + +private: + + /** number of machines */ + unsigned int M; + /** number of jobs */ + unsigned int N; + /** p[i][j] = processing time of job j on machine i */ + std::vector< std::vector < unsigned int > > p; + /** d[j] = due-date of the job j */ + std::vector < unsigned int > d; + + + /** + * computation of the makespan + * @param _flowshop the genotype to evaluate + */ + double makespan(const FlowShop & _flowshop); + + + /** + * computation of the tardiness + * @param _flowshop the genotype to evaluate + */ + double tardiness(const FlowShop & _flowshop); + + + /** + * computation of the completion times of a scheduling (for each job on each machine) + * C[i][j] = completion of the jth job of the scheduling on the ith machine + * @param _flowshop the genotype to evaluate + */ + std::vector< std::vector > completionTime (const FlowShop & _flowshop); + +}; + +#endif /*FLOWSHOPEVAL_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopInit.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopInit.cpp new file mode 100644 index 000000000..d3877fb64 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopInit.cpp @@ -0,0 +1,39 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopInit.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + + +FlowShopInit::FlowShopInit(unsigned int _N) : N(_N) +{} + + +void FlowShopInit::operator()(FlowShop & _flowshop) +{ + // scheduling vector + std::vector scheduling(N); + // initialisation of possible values + std::vector possibles(N); + for (unsigned int i=0 ; i +#include + +/** + * Initialization of a random genotype built by the default constructor of the FlowShop class + */ +class FlowShopInit : public eoInit +{ +public: + + /** + * Ctor + * @param _N the number of jobs to schedule + */ + FlowShopInit(unsigned int _N); + + + /** + * builds a random genotype + * @param _flowshop a genotype that has been default-constructed + */ + void operator()(FlowShop & _flowshop); + + +private: + + /** the number of jobs (size of a scheduling vector) */ + unsigned int N; + +}; + +#endif /*FLOWSHOPINIT_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVector.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVector.h new file mode 100644 index 000000000..53006f43e --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVector.h @@ -0,0 +1,24 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopObjectiveVector.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef FLOWSHOPOBJECTIVEVECTOR_H_ +#define FLOWSHOPOBJECTIVEVECTOR_H_ + +#include +#include + +/** + * Definition of the objective vector for multi-objective flow-shop problems: a vector of doubles + */ +typedef moeoObjectiveVectorDouble < FlowShopObjectiveVectorTraits > FlowShopObjectiveVector; + +#endif /*FLOWSHOPOBJECTIVEVECTOR_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.cpp new file mode 100644 index 000000000..b12d33aae --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.cpp @@ -0,0 +1,27 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopObjectiveVectorTraits.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + + +bool FlowShopObjectiveVectorTraits::minimizing (int _i) +{ + // minimizing both + return true; +} + + +unsigned int FlowShopObjectiveVectorTraits::nObjectives () +{ + // 2 objectives + return 2; +} diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.h new file mode 100644 index 000000000..dac46aab0 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopObjectiveVectorTraits.h @@ -0,0 +1,39 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopObjectiveVectorTraits.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef FLOWSHOPOBJECTIVEVECTORTRAITS_H_ +#define FLOWSHOPOBJECTIVEVECTORTRAITS_H_ + +#include + +/** + * Definition of the objective vector traits for multi-objective flow-shop problems + */ +class FlowShopObjectiveVectorTraits : public moeoObjectiveVectorTraits +{ +public: + + /** + * Returns true if the _ith objective have to be minimzed + * @param _i index of the objective + */ + static bool minimizing (int _i); + + + /** + * Returns the number of objectives + */ + static unsigned int nObjectives (); + +}; + +#endif /*FLOWSHOPOBJECTIVEVECTORTRAITS_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpCrossoverQuad.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpCrossoverQuad.cpp new file mode 100644 index 000000000..d1aee2351 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpCrossoverQuad.cpp @@ -0,0 +1,84 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopOpCrossoverQuad.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + + +std::string FlowShopOpCrossoverQuad::className() const +{ + return "FlowShopOpCrossoverQuad"; +} + + +bool FlowShopOpCrossoverQuad::operator()(FlowShop & _flowshop1, FlowShop & _flowshop2) +{ + bool oneAtLeastIsModified; + // computation of the 2 random points + unsigned int point1, point2; + do + { + point1 = rng.random(std::min(_flowshop1.size(), _flowshop2.size())); + point2 = rng.random(std::min(_flowshop1.size(), _flowshop2.size())); + } while (fabs((double) point1-point2) <= 2); + // computation of the offspring + FlowShop offspring1 = generateOffspring(_flowshop1, _flowshop2, point1, point2); + FlowShop offspring2 = generateOffspring(_flowshop2, _flowshop1, point1, point2); + // does at least one genotype has been modified ? + if ((_flowshop1 != offspring1) || (_flowshop2 != offspring2)) + { + // update + _flowshop1.value(offspring1); + _flowshop2.value(offspring2); + // at least one genotype has been modified + oneAtLeastIsModified = true; + } + else + { + // no genotype has been modified + oneAtLeastIsModified = false; + } + // return 'true' if at least one genotype has been modified + return oneAtLeastIsModified; +} + + +FlowShop FlowShopOpCrossoverQuad::generateOffspring(const FlowShop & _parent1, const FlowShop & _parent2, unsigned int _point1, unsigned int _point2) +{ + FlowShop result = _parent1; + std::vector taken_values(result.size(), false); + if (_point1 > _point2) + std::swap(_point1, _point2); + /* first parent */ + for (unsigned int i=0 ; i<=_point1 ; i++) + { + // result[i] == _parent1[i] + taken_values[_parent1[i]] = true; + } + for (unsigned int i=_point2 ; i +#include + +/** + * Quadratic crossover operator for flow-shop (modify the both genotypes) + */ +class FlowShopOpCrossoverQuad : public eoQuadOp < FlowShop > +{ +public: + + /** + * the class name (used to display statistics) + */ + std::string className() const; + + + /** + * eoQuad crossover - _flowshop1 and _flowshop2 are the (future) offspring, i.e. _copies_ of the parents + * @param _flowshop1 the first parent + * @param _flowshop2 the second parent + */ + bool operator()(FlowShop & _flowshop1, FlowShop & _flowshop2); + + +private: + + /** + * generation of an offspring by a 2 points crossover + * @param _parent1 the first parent + * @param _parent2 the second parent + * @param _point1 the first point + * @param _point2 the second point + */ + FlowShop generateOffspring(const FlowShop & _parent1, const FlowShop & _parent2, unsigned int _point1, unsigned int _point2); + +}; + +#endif /*FLOWSHOPOPCROSSOVERQUAD_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.cpp new file mode 100644 index 000000000..b99535c53 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.cpp @@ -0,0 +1,50 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopOpCrossoverQuad.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + + +std::string FlowShopOpMutationExchange::className() const +{ + return "FlowShopOpMutationExchange"; +} + + +bool FlowShopOpMutationExchange::operator()(FlowShop & _flowshop) +{ + bool isModified; + FlowShop result = _flowshop; + // computation of the 2 random points + unsigned int point1, point2; + do + { + point1 = rng.random(result.size()); + point2 = rng.random(result.size()); + } while (point1 == point2); + // swap + std::swap (result[point1], result[point2]); + // update (if necessary) + if (result != _flowshop) + { + // update + _flowshop.value(result); + // the genotype has been modified + isModified = true; + } + else + { + // the genotype has not been modified + isModified = false; + } + // return 'true' if the genotype has been modified + return isModified; +} diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.h new file mode 100644 index 000000000..e63a3884b --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationExchange.h @@ -0,0 +1,40 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopOpCrossoverQuad.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef FLOWSHOPOPMUTATIONEXCHANGE_H_ +#define FLOWSHOPOPMUTATIONEXCHANGE_H_ + +#include +#include + +/** + * Exchange mutation operator for the flow-shop + */ +class FlowShopOpMutationExchange : public eoMonOp +{ +public: + + /** + * the class name (used to display statistics) + */ + std::string className() const; + + + /** + * modifies the parent with an exchange mutation + * @param _flowshop the parent genotype (will be modified) + */ + bool operator()(FlowShop & _flowshop); + +}; + +#endif /*FLOWSHOPOPMUTATIONEXCHANGE_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.cpp b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.cpp new file mode 100644 index 000000000..4da8d0b09 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.cpp @@ -0,0 +1,60 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopOpMutationShift.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include + + +std::string FlowShopOpMutationShift::className() const +{ + return "FlowShopOpMutationShift"; +} + + +bool FlowShopOpMutationShift::operator()(FlowShop & _flowshop) +{ + bool isModified; + int direction; + unsigned int tmp; + FlowShop result = _flowshop; + // computation of the 2 random points + unsigned int point1, point2; + do + { + point1 = rng.random(result.size()); + point2 = rng.random(result.size()); + } while (point1 == point2); + // direction + if (point1 < point2) + direction = 1; + else + direction = -1; + // mutation + tmp = result[point1]; + for (unsigned int i=point1 ; i!=point2 ; i+=direction) + result[i] = result[i+direction]; + result[point2] = tmp; + // update (if necessary) + if (result != _flowshop) + { + // update + _flowshop.value(result); + // the genotype has been modified + isModified = true; + } + else + { + // the genotype has not been modified + isModified = false; + } + // return 'true' if the genotype has been modified + return isModified; +} diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.h new file mode 100644 index 000000000..cc6ecdeee --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/FlowShopOpMutationShift.h @@ -0,0 +1,40 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// FlowShopOpMutationShift.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef FLOWSHOPOPMUTATIONSHIFT_H_ +#define FLOWSHOPOPMUTATIONSHIFT_H_ + +#include +#include + +/** + * Shift mutation operator for flow-shop + */ +class FlowShopOpMutationShift : public eoMonOp < FlowShop > +{ +public: + + /** + * the class name (used to display statistics) + */ + std::string className() const; + + + /** + * modifies the parent with a shift mutation + * @param _flowshop the parent genotype (will be modified) + */ + bool operator()(FlowShop & _flowshop); + +}; + +#endif /*FLOWSHOPOPMUTATIONSHIFT_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/Makefile.am b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/Makefile.am new file mode 100644 index 000000000..6845a342d --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/Makefile.am @@ -0,0 +1,26 @@ +lib_LIBRARIES = libflowshop.a + +libflowshop_a_SOURCES = \ + FlowShop.cpp \ + FlowShopBenchmarkParser.cpp \ + FlowShopEval.cpp \ + FlowShopInit.cpp \ + FlowShopObjectiveVectorTraits.cpp \ + FlowShopOpCrossoverQuad.cpp \ + FlowShopOpMutationExchange.cpp \ + FlowShopOpMutationShift.cpp + +pkginclude_HEADERS = \ + FlowShop.h \ + FlowShopBenchmarkParser.h \ + FlowShopEval.h \ + FlowShopInit.h \ + FlowShopObjectiveVector.h \ + FlowShopObjectiveVectorTraits.h \ + FlowShopOpCrossoverQuad.h \ + FlowShopOpMutationExchange.h \ + FlowShopOpMutationShift.h + +INCLUDES = -I$(EO_DIR)/src/ -I$(top_srcdir)/src/ + +AM_CXXFLAGS = -Wall -ansi -pedantic diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_eval_FlowShop.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_eval_FlowShop.h new file mode 100644 index 000000000..3ab516109 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_eval_FlowShop.h @@ -0,0 +1,55 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// make_eval_FlowShop.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MAKE_EVAL_FLOWSHOP_H_ +#define MAKE_EVAL_FLOWSHOP_H_ + + +#include +#include +#include +#include +#include +#include + +/* + * This function creates an eoEvalFuncCounter that can later be used to evaluate an individual. + * @param eoParser& _parser to get user parameters + * @param eoState& _state to store the memory + */ +eoEvalFuncCounter & do_make_eval(eoParser& _parser, eoState& _state) +{ + // benchmark file name + std::string benchmarkFileName = _parser.getORcreateParam(std::string(), "BenchmarkFile", "Benchmark file name (benchmarks are available at www.lifl.fr/~liefooga/benchmarks)", 'B',"Representation", true).value(); + if (benchmarkFileName == "") { + std::string stmp = "*** Missing name of the benchmark file\n"; + stmp += " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; + stmp += " Benchmarks files are available at www.lifl.fr/~liefooga/benchmarks"; + throw std::runtime_error(stmp.c_str()); + } + // reading of the parameters contained in the benchmark file + FlowShopBenchmarkParser fParser(benchmarkFileName); + unsigned int M = fParser.getM(); + unsigned int N = fParser.getN(); + std::vector< std::vector > p = fParser.getP(); + std::vector d = fParser.getD(); + // build of the initializer (a pointer, stored in the eoState) + FlowShopEval* plainEval = new FlowShopEval(M, N, p, d); + // turn that object into an evaluation counter + eoEvalFuncCounter* eval = new eoEvalFuncCounter (* plainEval); + // store in state + _state.storeFunctor(eval); + // and return a reference + return *eval; +} + +#endif /*MAKE_EVAL_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_genotype_FlowShop.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_genotype_FlowShop.h new file mode 100644 index 000000000..e59cb2206 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_genotype_FlowShop.h @@ -0,0 +1,48 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// make_genotype_FlowShop.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MAKE_GENOTYPE_FLOWSHOP_H_ +#define MAKE_GENOTYPE_FLOWSHOP_H_ + +#include +#include +#include +#include +#include + +/* + * This function creates an eoInit that can later be used to initialize the population (see make_pop.h). + * @param eoParser& _parser to get user parameters + * @param eoState& _state to store the memory + */ +eoInit & do_make_genotype(eoParser& _parser, eoState& _state) +{ + // benchmark file name + std::string benchmarkFileName = _parser.getORcreateParam(std::string(), "BenchmarkFile", "Benchmark file name (benchmarks are available at www.lifl.fr/~liefooga/benchmarks/)", 'B',"Representation", true).value(); + if (benchmarkFileName == "") { + std::string stmp = "*** Missing name of the benchmark file\n"; + stmp += " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; + stmp += " Benchmarks files are available at www.lifl.fr/~liefooga/benchmarks"; + throw std::runtime_error(stmp.c_str()); + } + // reading of number of jobs to schedule contained in the benchmark file + FlowShopBenchmarkParser fParser(benchmarkFileName); + unsigned int N = fParser.getN(); + // build of the initializer (a pointer, stored in the eoState) + eoInit* init = new FlowShopInit(N); + // store in state + _state.storeFunctor(init); + // and return a reference + return *init; +} + +#endif /*MAKE_GENOTYPE_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_op_FlowShop.h b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_op_FlowShop.h new file mode 100644 index 000000000..7abadd9e4 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson1/flowshop/make_op_FlowShop.h @@ -0,0 +1,107 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// make_op_FlowShop.h +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#ifndef MAKE_OP_FLOWSHOP_H_ +#define MAKE_OP_FLOWSHOP_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * This function builds the operators that will be applied to the eoFlowShop + * @param eoParameterLoader& _parser to get user parameters + * @param eoState& _state to store the memory + */ +eoGenOp & do_make_op(eoParameterLoader& _parser, eoState& _state) +{ + + ///////////////////////////// + // Variation operators + //////////////////////////// + + // the crossover + //////////////// + + // a first crossover + eoQuadOp *cross = new FlowShopOpCrossoverQuad; + // store in the state + _state.storeFunctor(cross); + + // relative rate in the combination + double cross1Rate = _parser.createParam(1.0, "crossRate", "Relative rate for the only crossover", 0, "Variation Operators").value(); + // creation of the combined operator with this one + eoPropCombinedQuadOp *propXover = new eoPropCombinedQuadOp(*cross, cross1Rate); + // store in the state + _state.storeFunctor(propXover); + + + // the mutation + /////////////// + + // a first mutation : the shift mutation + eoMonOp *mut = new FlowShopOpMutationShift; + _state.storeFunctor(mut); + // its relative rate in the combination + double mut1Rate = _parser.createParam(0.5, "shiftMutRate", "Relative rate for shift mutation", 0, "Variation Operators").value(); + // creation of the combined operator with this one + eoPropCombinedMonOp *propMutation = new eoPropCombinedMonOp(*mut, mut1Rate); + _state.storeFunctor(propMutation); + + // a second mutation : the exchange mutation + mut = new FlowShopOpMutationExchange; + _state.storeFunctor(mut); + // its relative rate in the combination + double mut2Rate = _parser.createParam(0.5, "exchangeMutRate", "Relative rate for exchange mutation", 0, "Variation Operators").value(); + // addition of this one to the combined operator + propMutation -> add(*mut, mut2Rate); + + // end of crossover and mutation definitions + //////////////////////////////////////////// + + // First read the individual level parameters + eoValueParam& pCrossParam = _parser.createParam(0.25, "pCross", "Probability of Crossover", 'c', "Variation Operators" ); + // minimum check + if ( (pCrossParam.value() < 0) || (pCrossParam.value() > 1) ) + throw std::runtime_error("Invalid pCross"); + + eoValueParam& pMutParam = _parser.createParam(0.35, "pMut", "Probability of Mutation", 'm', "Variation Operators" ); + // minimum check + if ( (pMutParam.value() < 0) || (pMutParam.value() > 1) ) + throw std::runtime_error("Invalid pMut"); + + // the crossover - with probability pCross + eoProportionalOp * propOp = new eoProportionalOp ; + _state.storeFunctor(propOp); + eoQuadOp *ptQuad = new eoQuadCloneOp; + _state.storeFunctor(ptQuad); + propOp -> add(*propXover, pCrossParam.value()); // crossover, with proba pcross + propOp -> add(*ptQuad, 1-pCrossParam.value()); // nothing, with proba 1-pcross + + // now the sequential + eoSequentialOp *op = new eoSequentialOp; + _state.storeFunctor(op); + op -> add(*propOp, 1.0); // always do combined crossover + op -> add(*propMutation, pMutParam.value()); // then mutation, with proba pmut + + // return a reference + return *op; +} + +#endif /*MAKE_OP_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorial/Lesson2/Makefile.am b/trunk/paradiseo-moeo/tutorial/Lesson2/Makefile.am new file mode 100644 index 000000000..7500ec3ab --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson2/Makefile.am @@ -0,0 +1,9 @@ +noinst_PROGRAMS = Sch1 + +Sch1_SOURCES = Sch1.cpp + +LDADD = ${EO_DIR}/src/libeo.a ${EO_DIR}/src/utils/libeoutils.a + +INCLUDES = -I${EO_DIR}/src/ -I$(top_srcdir)/src/ + +AM_CXXFLAGS = -Wall -ansi -pedantic diff --git a/trunk/paradiseo-moeo/tutorial/Lesson2/Sch1.cpp b/trunk/paradiseo-moeo/tutorial/Lesson2/Sch1.cpp new file mode 100644 index 000000000..562df7bc5 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Lesson2/Sch1.cpp @@ -0,0 +1,103 @@ +// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- + +//----------------------------------------------------------------------------- +// Sch1.cpp +// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 +/* + This library... + + Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr + */ +//----------------------------------------------------------------------------- + +#include +#include +#include +#include + +using namespace std; + +// the moeoObjectiveVectorTraits : minimizing 2 objectives +class Sch1ObjectiveVectorTraits : public moeoObjectiveVectorTraits +{ +public: + static bool minimizing (int i) + { + return true; + } + static unsigned int nObjectives () + { + return 2; + } +}; + + +// objective vector of doubles +typedef moeoObjectiveVectorDouble < Sch1ObjectiveVectorTraits > Sch1ObjectiveVector; + + +// multi-objective evolving object for the Sch1 problem +class Sch1 : public moeoRealVector < Sch1ObjectiveVector, double, double > +{ +public: + Sch1() : moeoRealVector < Sch1ObjectiveVector, double, double > (1) {} +}; + + +// evaluation of objective functions +class Sch1Eval : public moeoEvalFunc < Sch1 > +{ +public: + void operator () (Sch1 & _sch1) + { + if (_sch1.invalidObjectiveVector()) + { + Sch1ObjectiveVector objVec; + double x = _sch1[0]; + objVec[0] = x * x; + objVec[1] = (x - 2.0) * (x - 2.0); + _sch1.objectiveVector(objVec); + } + } +}; + + +// main +int main (int argc, char *argv[]) +{ + // parameters + unsigned int POP_SIZE = 20; + unsigned int MAX_GEN = 100; + double M_EPSILON = 0.01; + double P_CROSS = 0.25; + double P_MUT = 0.35; + + // objective functions evaluation + Sch1Eval eval; + + // crossover and mutation + eoQuadCloneOp < Sch1 > xover; + eoUniformMutation < Sch1 > mutation (M_EPSILON); + + // generate initial population + eoRealVectorBounds bounds (1, 0.0, 2.0); // [0, 2] + eoRealInitBounded < Sch1 > init (bounds); + eoPop < Sch1 > pop (POP_SIZE, init); + + // build NSGA-II + moeoNSGAII < Sch1 > nsgaII (MAX_GEN, eval, xover, P_CROSS, mutation, P_MUT); + + // run the algo + nsgaII (pop); + + // extract first front of the final population using an moeoArchive (this is the output of nsgaII) + moeoArchive < Sch1 > arch; + arch.update (pop); + + // printing of the final archive + cout << "Final Archive" << endl; + arch.sortedPrintOn (cout); + cout << endl; + + return EXIT_SUCCESS; +} diff --git a/trunk/paradiseo-moeo/tutorial/Makefile.am b/trunk/paradiseo-moeo/tutorial/Makefile.am new file mode 100644 index 000000000..7a7ae0422 --- /dev/null +++ b/trunk/paradiseo-moeo/tutorial/Makefile.am @@ -0,0 +1 @@ +SUBDIRS=Lesson1 Lesson2 diff --git a/trunk/paradiseo-moeo/tutorials/Makefile.am b/trunk/paradiseo-moeo/tutorials/Makefile.am deleted file mode 100755 index 845f8f563..000000000 --- a/trunk/paradiseo-moeo/tutorials/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS=lesson1 lesson2 diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h deleted file mode 100644 index fbddadacd..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShop.h +++ /dev/null @@ -1,114 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef FLOWSHOP_H_ -#define FLOWSHOP_H_ - -#include -#include -#include - - -/** - * definition of the objective vector for multi-objective flow-shop problems - */ -typedef moeoObjectiveVectorDouble FlowShopObjectiveVector; - - -/** - * Structure of the genotype for the flow-shop scheduling problem - */ -class FlowShop: public MOEO { - -public: - - /** - * default constructor - */ - FlowShop() {} - - /** - * destructor - */ - virtual ~FlowShop() {} - - /** - * class name - */ - virtual string className() const { - return "FlowShop"; - } - - /** - * set scheduling vector - * @param vector & _scheduling the new scheduling to set - */ - void setScheduling(vector & _scheduling) { - scheduling = _scheduling; - } - - /** - * get scheduling vector - */ - const vector & getScheduling() const { - return scheduling; - } - - /** - * printing... - */ - void printOn(ostream& _os) const { - // fitness - MOEO::printOn(_os); - // size - _os << scheduling.size() << "\t" ; - // scheduling - for (unsigned i=0; i::readFrom(_is); - // size - unsigned size; - _is >> size; - // scheduling - scheduling.resize(size); - bool tmp; - for (unsigned i=0; i> tmp; - scheduling[i] = tmp; - } - } - - - bool operator==(const FlowShop& _other) const { return scheduling == _other.getScheduling(); } - bool operator!=(const FlowShop& _other) const { return scheduling != _other.getScheduling(); } - bool operator< (const FlowShop& _other) const { return scheduling < _other.getScheduling(); } - bool operator> (const FlowShop& _other) const { return scheduling > _other.getScheduling(); } - bool operator<=(const FlowShop& _other) const { return scheduling <= _other.getScheduling(); } - bool operator>=(const FlowShop& _other) const { return scheduling >= _other.getScheduling(); } - - -private: - - /** scheduling (order of operations) */ - std::vector scheduling; - -}; - - -#endif /*FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h deleted file mode 100644 index 7cc808409..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopBenchmarkParser.h +++ /dev/null @@ -1,140 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// FlowShopBenchmarkParser.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef FLOWSHOPBENCHMARKPARSER_H_ -#define FLOWSHOPBENCHMARKPARSER_H_ -#include -#include - -/** Web site to download benchmarks */ -const static std::string BENCHMARKS_WEB_SITE = "www.lifl.fr/~basseur/BenchsUncertain/"; - - -/** - * Class to handle parameters of a flow-shop instance from a benchmark file - * benchmark files are available at www.lifl.fr/~basseur/BenchsUncertain/ - */ -class FlowShopBenchmarkParser { - -public: - - /** - * constructor - * @param const string _benchmarkFileName the name of the benchmark file - */ - FlowShopBenchmarkParser(const string _benchmarkFileName) { - init(_benchmarkFileName); - } - - /** - * the number of machines - */ - const unsigned getM() { - return M; - } - - /** - * the number of jobs - */ - const unsigned getN() { - return N; - } - - /** - * the processing times - */ - const std::vector< std::vector > getP() { - return p; - } - - /** - * the due-dates - */ - const std::vector getD() { - return d; - } - - /** - * printing... - */ - void printOn(ostream& _os) const { - _os << "M=" << M << " N=" << N << endl; - _os << "*** processing times" << endl; - for (unsigned i=0; i > p; - /** d[j] = due-date of the job j */ - std::vector d; - - - /** - * Initialisation of the parameters with the data contained in the benchmark file - * @param const string _benchmarkFileName the name of the benchmark file - */ - void init(const string _benchmarkFileName) { - string buffer; - string::size_type start, end; - ifstream inputFile(_benchmarkFileName.data(), ios::in); - // opening of the benchmark file - if (! inputFile) - cerr << "*** ERROR : Unable to open the benchmark file '" << _benchmarkFileName << "'" << endl; - // number of jobs (N) - getline(inputFile, buffer, '\n'); - N = atoi(buffer.data()); - // number of machines M - getline(inputFile, buffer, '\n'); - M = atoi(buffer.data()); - // initial and current seeds (not used) - getline(inputFile, buffer, '\n'); - // processing times and due-dates - p = std::vector< std::vector > (M,N); - d = std::vector (N); - // for each job... - for (unsigned j=0 ; j j) - getline(inputFile, buffer, '\n'); - // due-date of the job j - getline(inputFile, buffer, '\n'); - d[j] = atoi(buffer.data()); - // processing times of the job j on each machine - getline(inputFile, buffer, '\n'); - start = buffer.find_first_not_of(" "); - for (unsigned i=0 ; iba->#y=Oo7 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≷OghNls7qSYr5C$N+|!z0Hz^?J@`t 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�m#FJqP-2H)R%zNe zZnd06+AX)G^J1m7Gg%6{E$^JDCATD%wsMlJO;mVdYN%4YB*kqO^C=J{f=AVB@ZTQH zGDMX;S%6Q%q??)eQAGWbMEy}jRhI+b2oqJWF2O5H)Fs5XH=g4}RYAg3v_zeSO@B{R zp9S|Bd$L669~HpH0y?SuzSYRj|UgfYN?+;5Qung!jN+tM+kCG~QyA zph@LnSmXR;QU5=XhY;tQWRo&n3{7mhG{ZM7u3BL4FRFaXBH5+cE{Wx_Ta2JRoM=3X z!yO;>f4=$T#PgF1&r2pIebi^tXZ^>0)aQ9*>ZOp&!TBgnWGQnsM^234OcK8Z&e?d$ zNjQd+FkEnyYL7MW0TBAsL9<sLlSjDqKuUeQYmKAs21@)>6xTQsLS_1ZCLFlx^6OTXsI8yzq zw&rU=R74i`Ok$x=6cm;viVFSVh($0xU5-TinTb{48}0wtVt@@xo7Zp>k3O`~(Fge} zBd`$oZ`+LHS39&mVYqwwP|vq*QdE*_;p>FV|F_0)3k#Ess`dDQgngkX+ZO9?BOqrI z{Y6huVI|IB22xV{s{>9v38`%kwcJF~P9Q|^JY*DuJ-OtXP1jKJ-D{6G{dG#~V{nX+uTD+lb_HpT4$g1+_^X15moAow0TxR{ePjU0YVGk zW(F*tloDha))~%w28$@kXVnz>?15Z+3Y30F*= zPSwxP8EUj^@Ycey#M@NgamX|tqhDp3%L@$QfA$!k>@l|Td2q-Lpssc|1K2zI7Y*|r zr+mlD*l|a8oLB}7KvW_Ekrl%_FE<6K^TnI|skbwJ6gjgFaBkbrEPnM@+B<{lPUW3h_s`%mINDR=ni1~&w1aX#}q0oP-U4sE0K0l>hw zfUFzF0Ksw`&djYZuDy;t7bd^{AWXn@tk05yZ~Pno&A$2eRc%a%7&HaKYdCKj27NE z=FgW8E^j`9>VKWg^|z2}h18ayVbRb(j6Y~jjwYugAg$8?AyIxrizC+*_f?QEUd;#9 zuN8~nuZmNvqZMZ$Bf>N)%VcZChf!LWRy=m|uvUB-_Keet7X?~z{LV1a{Bii!$kE8w ziuc_Z(~6_06-ODZi0K>Git_CRm9{a|r;JRY-zFfWTyDi9z=~?cmV&HatvJ|l zB}J_`Cb)x6=r-jrxOMt;d~qkxic8@Zk_dofPY;LY-gI?^ReF)GNJr4?UAB20jyTD3J0Kr4tL1PePp{3M=NiQ_C{A(iON+=~U12r?ZPH=t32_2Je4(CWhu z1_zAj^x@|Ijn{|G?5nswG$a-XhX90t#4~`|pVEhmf3cVZ`Xa6mpDQrD&V4fd7_Sdu z&v%8%+X72uX8W5+bofTrc3nhH-U9PJh1)3-i_7{iZq#?%s-0nhrAp@W9g1HqBSv`A zg&yB03E1MY@*>zc)B_99FRUY^AkYpfo8Hl+$;&vwbvxuoS$RixbPfQf9hfQWpJ~KX z!kMxRdRf9=mY80alvQ*!*1Nu_BB4JTJ83zz_>>_8#A)%PZv3Cn;>)lENxlNEz~`#R zwmp8SYm`ficS31hTKtL@VJ&_TYUj}63y{|zXz}e(DO-y#7_fR;d{H$;C1%^^)Z&+; zW<-lmdj(AcEj|*Db}HK|m%E@v1GM;|Ic(d_(V11yT{&(}E&h+se5IWPoCIlS50;c+ zV*^%Hi$79D$m-SNj~cGz)Z%?#=6s23@ze2^M8G_FkQGE8X^d;|7}er?0f;)ZcndRt zJrC9hl5aac(syihEj!L-+wOwRM61PTzr;Gy;y-;Wa%O4q8Q5rxY4O|9iYOLj-n{|8 zj27RV3f*h**YT94#V2A21<(V-)@kv(u(xNe+K%X5v#fz$@OA*u;;@&&A*98(@o&5q zFSM`f(BenedmTo&7H@YzQ9ZTbNH?I?Pq5|c?`v*@YCYDVTF7i|z=$Ocs8&qqz2Gv@xLA5?NSt0ev*Nc%_?aTTX$`H_% zC5dVp0@cP4sLmzB{r^(yL;h0h#($~xjQ@|f_m8uB+WyBU6+^ibx`Zf%BELg^TtbKZ zh+GC&#_wODd;KWCV={A?aXN&eOA&H~5JJ*rs*&l++n`dE2FV#S7>b6X@ALWGYrlS+ zb0)d>`}q7bb6$I|z4qE`t-bczYyW~b7WSAw+V154RQj0zsr1JGQ|WiG4Ex`=I~^+x zyPMatU9w(KN5r6fgy0Zt-p%7%o^=cDw)ZW+z3KmjZ`rLWXRP>r-*VMjUnrk%xd^%I z@-5f4kNTFM0XmOwS+i}_x10^2T;KBMYyX&US<0%`%eUMTkTKtK82q`2Z@G)PcXFo` zAz1bs8~wX+(|0$`jSxIT=g$ShGQg7Gx4aqa)CTkpft*jb97P>jE<%7$V8b`<30Ua(vfX}#ZIseyn`j!)cicXw!d?rBi4RPB5v5OD@ zF0XI7Ev`^7-|{TM$hZ6_YRwlRc=?JP-*Oj60es7Ahk_R8TfTmyBg;hy29vDp2*Ih= zusjihJFpSge9IcHbpC+|K}Qg1zUBNiYD2`goE4-5zU5>~T8D2*k1u5LqiETGHZ29()#Y+M(V zms<8S6-N1enNM5p0tTp08yy(=UInkK;aI;&CFm^yjYX=4tz0VV1)#NMS!eyt?fqU$A&SdCUm^K0N&_fpTVe)fy}(lXpOUxobQ%Aojl3YIJ_ zza#SP2Jy59?dUEq5$Gs@Hf-&gCX}Bo7t`vm)22KTc!jY1NLs)2Sh}VYKl%!%#jvQz zL4X5?>$ejY6|EMQpNQozUd%nyiJv@{x)>G}xyP`~f@eoa6zzCw?BkgZ3(NzCg}Ju0i}$+RP0i0D>X zRad6H9Z&1XwEi!~;G~9oJr_wM(2f^J^>Q-D%Ia>}QLZ8!jLPGQd;lAWX4+cCh1dKy zo=68QeUu-ypES7e_g~7K~;w1y@;%7W-uKb1|{Q4n`vSz7Mbpx=v zkZtRzgOPEur(m?JVXMzX5#q(|y0>o*1+vcY_#y_yxC9IPQsWhiyE@d4 zDOg$SKiO84u?PiQrbaOUy?Hxx4G^4MjM3BG+zT`g0%qziKWU%D1-iMcgbP{3fi~Tb zXk7h=yr9^YJVk9UP#Z3kJv~IU6Z{@#h$El#^HjB}L*>lfi(y;HlXT*9>+e?ee!{q+SerWVSL6{EM}ub5bNqcA)WXdWPuV}EvGI?X(-E|+M32; zEf`xFg|Q7VT3!DL>e5xk`!c5(%M`pq84K?`c4PXd-Hc~rL4@Oh6P=K~$~_S!qw3en z1`EpsB%$BfHEwFDO5dq9Iq`l~u+!&zws9Ih@r(h90yu~3=@@3%Ml4SE9}`w7{C%xT zy*Y;GtomdB-S;R67ECAIS)Fc08)E?$6u|;j*h(adlq&*KG`{WSa%^!KT{E_$W_K)} z#I^(o+e_S(gSB_3Vsowx*xMn%tvi=L1YB^ZGf9Q!N(auyZ6M45D=ra?QWs(mNIuv0 zuJfI1>!hGk`#1{V+CFp{XmMKt>i*%#a$5rK1z9%iw+1wLz21vi+o3`q8Fw^6P|y-d zb>AR`Zifi(VoBMqsv}rzF4YDh&$6FDsa#civDs-J6fn=mx|@FvcUku`HC}-A9}aO3 za2fsv-A^27($(1Fqu!F?zH9h~xS(xWMANSK`ODCY)5Uec-ED#E_zU*S2t!@Ecrl{N z>R=HJ+qaT}HS{xT`hgmnlJ=FedVGkdQzM{XdQ^IIfvwAaB5O6HgBB6y#=*T&n!_J0 z0b;&>3xQJ}4GQ0*M4A>o7(|}%wX6)cnm4fod)Atdtu;-RvmNeqaih;{_ladTf{8`1 z^#8Qtgl-+w*fKr<(sWq4#08?2~ij<9P4;RA=q5Qcn;AnZ!IrW{6{wiiVMggr!I?+C)C7=;B8@!HyeG`XP)$g+a!2+;{T(Q`_Un?{n^ERWi=&Im zZRuYk=vtQAZ#W+rv>-sYYmU?oj!>7yY02#CC?{rkvK*eM%zlBE_*Q1&k;J-2wP;4s zDakAKCwO zF(eqSoEHFydJ%sP%2r9rQxaLyo zDEjSDVm+dp>DJ~=MRtW={t=C{hW;H{FC4MlU7^1$3V;~#BM55!7m7L}6x|$zPvivi zy$oT>G2dH{mGc!&DtTAV=PW=qInm9RkZN>nAJC!b=4Z%>M>mT=gdEbyuF%N-r%PQ0 z7TuhEae(+OW{B^KZdMR+zLoRWa1Vt=H#-YPlZ+1;RLrygY2d(|=;m@xf3&Q+EC=$;9N#2$*+vCNJ)a| z=GT^#?J`F8KecrYG#1Z7%ez#Cc;54;-rVwar#te5PUQdvB%4zu2w19@9=sa|3w$X&*$)&4r$4v{ z40WZ8f1#Gs!8~to+dU@t>H=Keg#CNWMsbG!<~PD0*1v-XR*ln7tBklOTo-T5`{(OqqXH%vc3*Xb%!x1 zzLTMaIIm_WU;e~MZ*g@*1e@{JXiV{8B`{;CisZb*n|zp470$Lae=!y#T#9-y;}OHZ z3@#Y>nAI-8{R`9@w>umj`^V%QgJ_J0biao@72pj9m}}AoRp~q!c9KK+r~oH~lb;>1 z6+|ptsn>DXf0}~68}y(0i}-Y_-Jz}8+M%}awvD#nuaSQw*g!VjrvpM?GK^BJP>?C% zZeXLBF`aCh8evl{?)p*ARNm<@C6aTe&zZvOP&i|aOyAn>Y$Nz&Dzf9@qd1=LH18Ag z@Lpb3P&|p5M#VBOEX5^1@hr8inZX(tZn^7UK_P5}0gAlc z+iE`?@>UO>7-_@op4PgF=;OF+I*6492UK|1k=j3joEaY}d#5iuUJbXS)OU8{dW&@C z1>6YW+Us^NqxmEVp=;cBTRb*`>T-_?(W8-8`fgN=6#zUG5dqxN1L8CfX3wMeR3a45 z-7GJ|SneT4(dOt_Det#rzwSTMpTS6CXQCZiS!fqBxI0@!=v$;axGnI_vmGDv>L9vL zp-rwMci6C%;kk*T@^7GTuI1?g>`=LAn+S~(_We{G$6uj24 zb}m)vA@Ir-FUxd_9$uQq++oO7aC0t-06WiSnRyb+KHMqlY5$q62kUg2hC|KGUCAu@ z6nESSy?a=}U&k+{UWL?9OA6rndEw?F}Nz4L<8vb^&V+(tA4x?Pa!KO*;y zzTQ&fteEeC&9qgEgE#sVGrJv{z+hzp-C6p$!;TL^s1~n;i_!BQ&vwNf$-AE!ElyVtpRv*DA^&|>1kAJ@UH0Pf?b_(+*Mn++#`BaXx%*y=b zOpdb^yf6)jzrz;~aP=Q4(-JgrSKq)f)PDD>o*ueZA9)WtZeg!~p)ufEp1|(9hO`qw ztOav#MNLjY5Z;x_3=UH0tEfh=6PS}5Bcm>n|TwH z9$+>o+h;!t&XSZMug|_3d$gjv4ca@&Dss2`Dh2>`IKTd0D9`M~DqK<1j9&!}ee6uW zd0Yh?#1Tc7-$V_D&>A_k*$DH~tGX0nL!fBYuyt9Y8Sb=zN>C72FDO7g^ce)UR=N1q z4srbBiAy>s%I3q*acBSK?{yNACLt+G7Q=L=>~k;u$5 zZ!_GWp>Pc&K6!2bzNpcFmReW{wJt|dM}$0&r|=1~0t25RWoL`B$aH!`y^tI3JXteEYXz&Zjt6o}XXpK;f;9us=@{OEbzNMvRrP=%YKdP4KbT_A27 zAXa3i25@;JGoP(=87Oj=U=-DOmSKcEmj8)kaw0RkI0~>h_uGk}#YJY0;vf*5Y4{Oe zIgy!5tzn7W$V`9HB!<*r54bvvZNK=v$V?j$XpxzE1eyYCFD3aXNC_e{)t0o5$V>tx zge>l%w)_`o8lLtoX?fq-uZRJ)Y~@=z(|`>?>x|4S#fkYmHgob{!Je$h%%QLg|3hTv z_=yyjjXu)C|1mOi`#og6kIXy=ildR4ZknlT72j&5*L*%k4(kI0SzMMz!Hn(kNnOI= zZy^ymiIK9M`_SVS@V`eo;Jgu}HVl(wbRmR*M*=vurEbZ|bPX~*+>eg+HVpdG)LSIFmn9>J0d>+P> z`hnPdF{KkdhIPf1-Z~u2kH(a)1@5ev(gjvs5L22wfXu>VU6ZDo0jS^mQHuVR6jpu= zA#wX6no1eJ!Vt+q=|beSTp#)o$bmS0!O_uTf_cRVD=sbFj}(Pm{7L8BLp^ajW1=R% zCr$;Ko{To&0YWyQ4SmFjW?YNxP!SqW@`~W^Ss~4eda+qYJ)xD{)wp~OeqdBNjZn-* zwYg}ec2kP>Yfd8bFx;=CKBR&QY*su0exA8^kKiDqYvp2sPTzxV&>Z6NG)3M%bq3qW z2{g3NZIXfO7fhm#MdemtJPIIai>+FmJPF+nhKx#A?$?X_}5DO9VIH2Q2!D` zYJ!Bbl)RaciQp+lQq~MMq((DCaV?}&KZ4SU(yS_tL2KFjm{o7&;Cu?y0)q-;jT}2i-gM_QXL5x9%~}+LnOz>%5paO?sSK080%{|4N$mSBdcs5D?0&BJzCCQZoRReiU-f7ZDoKH zvk$`9tmzyG>g}ffjw{RuH6!m-KFXl4( zy&3-6)WsTmx79aUja})feeiLzlh-J#vO$2ttzq$^r&>`2FnHrvq^)PE^i*GZca=s! zvpKE|TNr|>c-`Bpbd@jt%~+B$-G5$ri(^oAoS3%>1)vD^=y*_*C>&l*n=`P)UPh1HCl8oyZw9y3aaJf}Gh{ec zG;}cv7vJ#P+9gRAUZMwwv+s15P+kR4_MPtg9s4T^o=akE_ZH;p#uoW3N8RY1CT41QYML7atygjaRgk=Sws8BN~j*sR%o=ZyxsFzYiK9nb6sm_2OK~K3iO*K z7=X}DB6|&O9x}qku&<9MpXdibgYi$XAo?bs9gQ`#&PM>&t)ZOZ;K9sYDHpAzv*BaU>Y@)1=7OS=tEBs19_8QvLy4ys6ua&b^ ze>C9uY61a7vhWYCp&gIf!f@h@gzBc6{P2`xQ%h@T7kg&ptfBoK)<+D?Swk!JIr-Mm z?s!gpGKFikgEh1wQYRj2$?Jo%>_EjBPetA}wEw%7^Kuov07Y}x(E1~lt#={pS$!Sn z_cl%W4l~P~HMHpuTI*U|L!0d(a@NpFeNJo*tvwoUHFhCAYOexBpWkMxkh_Mqu}2kI zLpxmbX04&M_kb;~p>63Q*0qLq-oEVAqN)?93WL&0YKx>$i*7o~k&TfwcOAD4ni^R{ z3-@xofZafOA_lh{No4KQ9h0!Y1?e{P`L9PURkU><1`dM#&H49qjDew3bb+q|j7M2a zOnAg*&yDyq>}HW8HiN2O9sJ2FoX6>)&Bj`d*L=yY49{FmJ%lqIc%u_$n^xdufVp<| zga;}><=qNn()t8}K8-p*zr}{($W2qx?Y-nj%Gh?Jr!N)wkfooT;&|zf++0cSX+5z+ z4nzLa0}B}+qNv;cJj6{}ANYaBTBx=$RJ;T-r?_8cXCC^W9^9S>WH3~dNDi&>uLw=5 zW8;;Kbbm}nn3H`p;JF_KL_bMmjCl>BV9ZNsn-c2pR*O*;LIxGV(H}Wwtf~W;qpB*n zJTsYu&=ukc0j8XrL1#WN-)kx!RcO%Q+aGW!myF(Bh+oMcT)n%yKF{NRcU3z?F zgqoH~vDP>-c-ADo%B@Bub`Gn-ecO|znSHUoy9?&iajKMe4e}gSDUnS0#}5~i`15>3 zFe@=vat^|7h^n%?OzdHOCVtSTU2pQ4kp-}4B8#uS3Ya>efDZZ~jxZ4?&w_(Kp9uL% z8_rDmwp>G(q|RMB4LlQw=jEBC2n)00jgsXUVO%}SnLp?ScGPla8k+l1LW)&R9WG5L zmLmt0Ou#?P4&{Kz>4tvHhkgjQl$SmN5*X)C4tQ{5P?v1rugu{=AKQgMgJDW5U+m>3 zNG7XS2<2@kXuV=5=(JhcD^w9WNG9;vg{B7KT5IgjFx+fcI`IujyBQ_YieNq#-16>&E6-q6KFBT-`9}~y@tX`FS-UPG(u|A zrc9zs*pf9XtN7^^(zi57WOI8Ve;ggS2lNoz{< zJW=Ss9Pv_K|K*K?AcU+HkK+(0UhfqT|C$kKq2DsP<)gv2A;E0$Z8h$IuRx#+R|-q=N6sPR7t5-dNwMpEGe!3d&EH*lk1?g1s7C<_K$FpHtL`p1Jw0fhs?R0 zNW~lt`5o1;ybel$i5BB#@j^x3z9!&>c{TwfBMgym@*6;1Wg7UOw31oAiFjqc$#1BK zC-@y3RNv`DQc~J*nYkp#g!Sih>fHu1*qSKXBXEc>L@Qzn4DA-SIKJVHa6x8jiJrqYfm=EG-3~c&E79je6&HCo0U1@?oi7%a zONBq?ZK(8Z_XqVp$x>>gM&kka)Wgn!ExFy=$bEd}VU@yPXjQuN#pUV#@cGTFpmU$? zRh$Ba6uTsT815z|#SxyTsMFUmLT{-SlOxUgiwot_e^$KuTF+P(6p!dJcgEcR>ccRv-O=8yo1wjviugkgEKrt z3*NzDzewEz?_d{D(}H*Ks7Lh&y@P!ePRlu|GJYS5)$bwO7Z&UH{DRy)WO55GXxS~0 z8^aqzo{BmIicMVAlbsj~PC+Lg1PiO4H#O((klST^F2S z-SgcWvi4G6hc+935EN+f-jFU&IJ4whuWI^G_wf<}j&uvl-T@X&BqDc}kRGf1}9D zKw*OK7Lc-nVqN8O!Vy1qqsTLlL&c(xjEMY896@%Y$aS!MhP&n>-%M>Pe+Y2Fc6D=S z<&{>w>@raQwt`XWrI5Uh_*}LM0teG^8a?a^!u%ztNP1-C*j@0;-6(R`?n<;rM*7eo zyE_?PwHZ|Ih|l*pa-##sqeAnl=TWxMdPN5`X`30OaI6>M&s$RVCPZfo#O7X(U}MFNv(RUh<8#CTIAIy+7)6T*%E{FR+vUc=MM2^WR z=alG%B6gnbsJpfYvDf9C61~@BSl5oes~**AW_U{UX-s;ucJw{Kc@Q@61v~nN;8b6@ zqwlBg5p9)>um>gFK6KqqBoDiu5L>|3i8gFK7anj~gBG_UCw1F*V?|yF4+C$oA5_tw zDB6*JwW)=-XQF4r)=>UAFLHH#5KTu${6#J&9JyQn-ce!$fZpb+jh_vx2UlEi-NLXi zc-U$l?dChkmA^L^2;rS8Zerd!Tfg&560hy`FQ#F{@=J|p&IV|^y#clgRMg+2iM!hv zF4{grYPf6p8Vtv#U>i_a!TEsQpaZ$*1D16`F=&xXkh zn1}gd?0mrdb3l&tT|UZ0OyEeUQkIcXkD-Ll2iV!LYR513Y0PGp5t96RYn+W*?tFld zt;Nj9Oza61hB`Yewq`;;&VBG0H%2?&sT^l`;GLZflZif><(=oVQ$VqN0Nw5sal{)* z^f#P`@;L-vHHK;#OM;La9nrE!T3ho(Pu8SMh!zvtTT=EA?V2g^ z+%s6*widNwi)^pdA36>8^ynO`lYJWOB+r$+r@?shxL=D$50STi(Ac~Y@kugZe$IPX z*XW!V2DwY+%o$&|1q$rs)YD$-Gf?l~b_Tqhtsq^X(Qj~t1noWoZgJN=))&F~e?;f8nNV$I@jUM41!~}~CDOG=141wN zcEY}iYbSyzj4BPlzmiq6(ST}a_{U`7Z|m`oNnxiauBIqn9O7Tdl8*?#-qhviVyHaF zDP2JJP%6=>tg2PGm$H61S?wO~VIR1Tv-}YcI+lJsSbsvLEoePIEsCQ0?u95YtL}G;~Oe%5Wx?emkY{RfQ*m}qI^~!SY3T$krIX zPA%yV^9WuVj70YEmrE>*m&a#rO6UEUdt+zWtS z*$Y!xw?}u!JUb9t7ELxA zZ741W@igaPel~d<*kHK0wTwI7$WE#japg*-_kwFpp>SLKje>3DxYJ8vrsk5BxU= zSv66s)1@3LL#gq&a-Musp4h%yYA+-?Tk8dG@mQ4~lXV_{{3+Kc$FwJ2&pba$N8kh(WYbmsli1Xdx z_sm3>0b0famx(cnTJy~UFG2t)oCON=#f}0jvM%TVTHGvf+btbg?tPMX@s)EAG=YQcjaSSe;6>-V}rx@opoK8=}d|+DUVgIg1 z;Un(X0N7m3*B`?~79KFp=(*s#czq!1wEVHiw`q6s1Ox5lX6FL^_AE@4u#mSnRf6b` zP!7`EcyWEHJPA#guV+z=F52dyx-@a1T<0+IhZurGAn4-&U0JfY!QF(5+JX*0_j9P) zF%B3FEUW6o{?hw&`p`t6Gz~x}Tpmdy&=);jf;<0tQb!oO>RtogDQ(ScG1cNm3~{fq z!d{nfm8;HcGAiz*d<3 zsCC{Gc}J}cw-Bf7_QWyhJ%4;<`j3uUds7EA0HqZjch5uo&Zu>WqU|k>TH7IaU8B~{ zIMpqmTf*8I(0N9!!jVW0My*W%lsjte((aFqTGd!PTfb53OhCp)tyWi{sLZkkn(E8N zHJ74Mt2;`p$EdZ!wOu=zs%)RvUO;98Qcu>Kchsr~fr><&My<<`>WI*&wTB}sK5E^C z)w1=tclK{aS-w##eHp6B8MUrMDpZFZ>~jKyqt+AnjE`Ddg9tjEEsR<{T?H0WI}w_1 zh${oc8e2{v;(Vjl5s$eH&{BtGe;c)yTqkzsyx2N)kDO8KX>JzKy|Z06!7n#zT~wq* zyLWagl9he$>=;xbZ#s9>diGHgq9Nl1U{^1L^U43==HvWP%Xu(Z)`qQJ8^C8jYHbvx z1f$kUET2(t)-h_$xzx4A&Hax@%l@mVWr1%=%cIsFAVw_t??$bAPvq-aGg)-KN3BtS&Od5xxj5gb zb(>;5@lk8S#aW})C%W_$y}Uc@TgV)NZwIvKznh@My<~`{(muQ zWvByxbky1yI^qiDyDhx|Yq#qfwN8IAI%oIEW{8H{*D*V zB;qt$l%i;4)av2LijP`niL&3FYo(l2^4`hy_=Tt@XVgj~62tV58O;XuctSBtWcDi#JW@9ku3+bs3=LrwjN~Q|A59bg(mL)LM;;^Rnhz zRVd{~t;<^Dmm9U7FI1w9TIZ3h>{07mYgnGS*8ZYNqt^Mrt`4)Fqt=-q(Aw}1218{fx z5God8+Mi(gdmz7T@S0X-!`2ks`i>SdI#QWAuNwH4tIXY*#MookR7oLkgsl9O#ijF& z>;n4$(rrd-&nZwOkkPAK=C7==u}$Sd7kP8oPA9sa49cyFqgq}~R9bVmiG3Yot{nWo z%Q{#k{#Z}tp}1k)&^M(oS~>9Sb9j*mZc7TO{i#(xif>gljUY7-#b@PE%oUTShF0O) zp<+5{`Bor{j39^c`Sk|wrlU}_-&2r znVq3-f0E*Lu1xj@mWIu&L6sbel$6q63`=$$Xg%M$;S99{C+W#UQHnUbw`IGyYT|kF z$~#EGgtiUSLclFvZl&T^JljUZya&}z7dIJzG33m(Yg~8oO?do3>T@L8dwl`*rHNH< zho4+`=><|!wNCkuv4-8nJVsFkyuz!JP%8X^Kf9S=naHd@kW&I#ToGrwVTU( zB!%HNP*B8F7Pyva!K91PzN~SFT6)9Y|o(lnEsjL?NFv*}&BkI8}hO$AhW&r$C zD>xYSaU`lqmDE_$nMkTEscArY)plGAL`er4$Vo=(t5N_ppfj?jb$ZZzetGwxCop~c z?MDqm5V{aFslOeCNDTPR{b`N}1&=PGx|FyC;jKmsnSlLNXzyvz3rfx@IlJx6y~wR* zX8sePd|B6(R?_XRG}mXDs_v*Y=S{byt8Qs5e1@J+@b!EP`D&Olt20D$>{^kisR*79 zV3ZsM|F$m)fJCPRq7mW8uc1UUI(QYe*ZV2G5gT@~AlnUko4JZyO;kZWs*B#h9Z`@Z z1|1mN#)KG^KCQ8Ae#s<+E#?r(WMZj=v(TDY6Re0{s1 zzTooa=L}T>rO zyxy4c^eWe!jRDN&{pV-Wvxe7_@sqdS9Fkb$ws}DJ;TUnGUgJjU@Pu#Kp;~GFGdVNU zhGG<-3v3Ns8)XzY=K`6z`;`IJ`o;V#6WjJgq-`Wcvs`W>}JmcU*ESV60qU97I@I^jgSZLhCHYNHsgWJ zqH(qumXS33N>2uu?VW0Aq}!9@K%)JUJ{>8*aGYBHqsE8$NH-jUjg53wXk|+y-2~)i zk94(AbZ|U2(p`vQF4ey)o4~ORvG{ov#d9nA*TAgR(7L^WF^Wf0ByD^9ZC6m@<7>ca zYesCl8}+2k_oDg1U@2##=_j?yE#G03;rb%%8ND@(dhE~`A(|*gD)yOp2gjU|>rfw! z-Skum_P7Ywg-EI_nI71~Q)3_^;0Oab%1E679kK@Of~;w0RQORZQMe>gyX1_HdIeJ= zB>|C<&Q+|b*-gNLibcsXYVOBq6%*Xu_E*SyMn~^^_n_r+_79-kiR4NvX{;+vYtK}O zhd6K3(+M7DC*t(`888PJBAIo|m07@U5jGr3#P;%GV3VHsGDztd;i@o_bw&@#JV{Pr z6obeylF=vWgpmvq;ySAz(8wZL8BLYZGay}TD8Pm!Vf_$TIg(9DmB6Y9rt3;_W(wQJ zR0Dh(fK0_OB{CnxH#Z9<8vQUu|3@mY`d{&3sw*>00Uif(oZWN^lQT@Y`h@>rSD&3^ zrTsDtJNSyH(hj>4(yhW+i3d>vgSi`~=vQ#v3L4X={gRR<{b;kKq?yXUAT$wAfVw4# zW-^TO-0}x!&K8Ic!xYy zi2)#y`E&;0g7+|G>=#tJIGFbIy~Vzd!Hdt3@_|*a=y*@Fu?^{89Mb>g3J3{vhF}e_ z7xa`coRzUf)c~+veT(qZU;p?yXoRnvDw%7U(}}2LEL%_uyk)VpluUS ze>!LJ(99A%ysE{~2+)a~`{^}Kdqvev|3$kqAsGME<~t!hQd(z}ZUYKTcS%C3$z?ZM z_G*a6G_eC9$v>)tYl0N$XF!BaNTIKQcep{8*oIbw3@%FUz#+}gByk7z??`U>UM)+G zkv&eC{;=eBC$&+@-3VohN^TQ1xQ^6!!Os>Yw?VAgqagnr$?fbK(6)J9k~{9~^_5&L z6)7UQbI~m#l6(K#xa5vNwn^?Z{LCY{!;u_H?tS%lFS#8M>+=lGlAIf@O`Wy{4(_;v z%xCx6yj89#3Bcx8)IOcWJv@)A(D6ZAf$Vm?~c5*4qJYgtr`M%$uPxU)cPC+cG3M*%%< zY#D{=P*u3*E)E&Q)ed5G0D)6OHviAxl6_ie$)IndEorxomVAdQvs>~Gutrs!|K)!*`VQw%;l`jU6@~h zlGMIKC$$kx6SdDlNM9Bak%EPpeNoU=Y{h4g8?IsqY!-A)?GEM`Ww&l@@& zd4$;%C4ku=odNi1;@E?r2Z-YHGn{w<8&&geAci9xgD94?6_UbW%~Q}5jbafFlm$Gvc*aK{4Z{?=dQ(V{!)h9Be+y4l#aV8wn zRj?<#X`A!c=7SPzuAUj2t3@QU0r12nGZ`tNWM;w-&ymcgU>1j*h-9|MM(@DjcWh-+ z>DZD~l0ds2QfULdkyN5HM$GWNR7N2`ODe;W6iQ_abmxd~0q5NLVOz0!NL!X?0luac z-r!g8yV)cp%!85W?&bi=T57+-q*a$ep$_(So1%@SaZGa!cXT-I3uE7`rYJU!uQKIZo$p< zaXIB*AqjoFp(`qcJvxIvIRAT-)fRGS=7q4MFDT}@x z;@h+h+cfby-==E&#Z@$&96qi)crVR$1BF`A{}7r^<@ZH?)-xviAc>YLAmw1aa0bFM zWYL}hDeQaU>d6pZB^esUk2nIlu-kE*tyWsj6M9x|j4h=;3rnCT!NdgSbLw&IjHwOa^YVs0Z~5SR%ZTDS%jT>96V8vq zJKT8Un6>YGCcEBB6t#qoOu(-D4))y!-|053-SQqAN}JLDeUQ(KXMKg4Rg-L`aFj3X zP9F*UQc#KBp2Ds3Fyh3F!zdotL&sVsUgxZ^jr4y0lWB5~L_#^RifA(=_YqwNT>HM# z{1nQ4rITl%81v`y(K`r=Mm|jKxD(_mm(!${PF`pQKEak#`;sEdxE%HfND=&! zP9f;#pr>Ky%48oDO^xH!Mm!x9Bu>nQa;Z$~a)i29WB zNyfn#r2>c4#TN=Q7yRf?n3`8+*87O(%-nZm(f#l>JJC>3e*}0?^h!wsn~d~5UI7ox z8SMdnEGbx2(ny~n(S+$9`Bgt1e_RPEjukvNQm|#k5qV=h>m2-qmY-Lz5*#IER>w$a-lhF^mtK)hV9DESmV!ku4~gn#Gp z1L~d&$<#lE-`4+(jayFz)!L(E8nUJf642SByk7Zg7SKlkLLkS2AL!CSDD>YhCsF(9 zXTEJ1|AXv@t)OdKv|zb%77wmlJZ#~TZCz|geA^U!4f%E$_{Ni_nOk62_*?+RQIy=4 z$&nR^sl9K+Scpv+U|?s)isgcO>%8`Ts7J5NQ$L_krWHCS7rE&G!at3ITJIb7DCQM) zh@3U-of(?14Dq5ZEDEEp9(ydxpacSIL0r9D%=iA!^i#l74K!?AnVZf%$u2SBOAeV& z5+`j&KY8Ngne+8$$SE1`r*o+6`7#(N#$$gywKLJ&aH6k7Bgh@du-2iH zyHyEZ;A9Yy%Q@PN6Zi=ukEA~&fnoe!`=N6WaD1u#)pLedQ&I?FnBUkJ{Js>k?#x$R zsfmR}_fzG{oy0VW`~f_0GfheCdPyup?)0WW5E5!3(A!a_wvf-4Rrz^9xLWrlELAM> zqW*FZ?N<{F8$vQRvRF@=kFFiU_nVzq4RfaHS^X9~92r|;T#i$fG)y(xIu)GBcu&cT z2iGhqslrkLju#I99B6NKY{=Zc1xh7qL;GG-K1H2%4O>E!1AEawUenE16YMvpvq4Q4 zx#Yw`H(UgR5zc+DZq;xet{DL0f`)5Z1h_YMxQ~tF?rOMke?b)Y#)dl+5<0};<@E)^ zyFI6$ne&@z8{NWbQSxIk9DcqcKZhBW>DwP6+f4nRRf;O;1B!y5Wmf3Jez^9HV^$s2ng+8YwU`F{v;r;+aSlLuo23t+{ zID+Kz0Mu8ucv#iq!IR-_)qkS)MXQ_-^JW7=7M`5~JYkhJtkSLMMXPMSKev6gY#)q& zl$n=WWpz13zY<^wE30E=F!5P*r2^2feVN6B7e>9wvc}#R+}oqIuu^$?Zx#Y981R1&jD}hB{$UuN@(LvJDd$j3=dEh2zQ4mzE@&f)(FhrkMp>bNh*R ziWE{>@-dwezO5^dVX~Z}mDI+aK0;2oDp9?V&W8pOv!(aWXHmiKy1+R_i*JSL#c0JIXdi?J23Y)> z-Ko=E+6JH@5L=byK@M*mLO+Ee8}IzTdCad|f*LJHvL9}1LvGP4eY(N$Lr99O*KdvF zbYcM+cKss^)GcuGsbR`x|8gn#IZm0nA$NfNlpJ-j%8`I$AZ08}ZE76<8p=xmTB(GT zGKq8`cwjgC_CvNG8}ES%#WAR|odXQ@$La!Owom6nWy#2mO^ybY#lggO4m8bz+@eq| zS$qp=l4JTjZ@uFBk+(XGzoj z2au*^-u~_HX;O;awc1ZKIiDsEP0H9Hq-lH6q}z#bu$P=%s-0`j`6zO)+cM7Em3dFR z@05@|QxZ*1gjkrfT1t#|Wk>c%7SuMp@o(+>OU7YXfXV~9d*zJu0IWISPOa{hCvch9 zBRqJXstUGwUG@Q1sgo?|w{vu_br61=c6WA`p!{wqAAU{$5M41Yo&a(@@|=Wt_u@amCEB(OGk%-Bps95?djyL&{@{BOGozWyZG|~oFwH>b(K=4 zj6=v$=B5q5_?jDbPq?C5<78x35%qNNK1|(h>|HAT4K*3^=#HvVq)MPqCmvwg%;x;5h{fNO${-4cv@y&)2hl~U zZ-fwspkF{={cXCf-M4FNv+vM_B8AFiaTG_C#Q8)ij z0nO)w=8%>DI)bd+o2)!2PO4fp4&`F3bnV_AI9zi5U2XG4nqR`Ia%wcuYQY8E*x@i3 z$>ac}P?q&S!-Bt^Ji&h+?hU$GBG~`l$V&+VJ`aK^- zaVz840JeUwHU$Nx|7HaRL-uhble)0`+{CQ_=woDzr~8s4@rF#1AJIbwDTtn@**jy; zSh~2%7q9-w7(|?L2Cd$UkaIocg9aHeh&aF?53qJLtE@;Kj=y#{+2G%D88nyNI29Qo zgQ}Qx1Yxrnq>SzXZ2h0$gOvW86%-8V5@nEID(Q_*mFiG7vlT8-7MFMvpVN}SJbZ8% zm5_xF@sU~f$e4@J>*0%&7l;j%nG~Tt|FCb0jbL|&wD$OA>#TOlDan!zx)N*Z3QVqWKtb(8Tz2^ z)M#y&vg3cx9ZXD3>Tmso$$8wta?GY8*QTNDTOT93h6z=o(Z}z(XVGn_h$!iTUD(Qq zi}ScEmOPbh(_crL7g`zeHM7gKs@xzS!1+Sp#c%~TzxK}4qm>e$>(4@cL~i`R_~_)0W@s=5+;eE5IacJ%YSTZOl1v=l(UKgRmE z4E$w*`y~R#v&taI9Ps-Myw`n*W%A0$qU2V94b^Bqm&xKiC6L)`S|-!rxn(#!4bSac z!Rq2gLHC055De5;u?{T7MMkF}uQ;e96%3QlzY9kq+`oA$+&}X@pWT8(<0s-9PN(rF zx#M=Vo{Jf3sP4TF!55d~;U~?-$WTZ~9yMI`&%mUtDFR{eeGtj5G9>j#sw}C(X**ZV z>!`+SXeAWe1B-@-kqKZsG1NSl{*UiLQx8VotQ;5pRuGB(5`5gvCWI?+@3=phxRJWf zN=8%4SFt~E0v+}6`=B`cgCaN7s~&BUptmXl*BUg|IO7|E8+Z`y?_x0l#kTq0S!z4T z8_Xbj2~0Xi>?@iaSYW1!0A|_)tSzp=CUdUaW+;>YG{fu${8ZAbNFqORz+f>!o+Jpo zNXK#|jdCEy#TVbfHW0Tf%yuRG9W?p)Qc)6)uyrKQ=@XUjd(Mr>k9x|~9z6g9*SO9% ze_PisioiBVf7aT^Qe0d495ggXot2!Z|IRouk2q|@+ay;gQR9Qwh~+~VmOFiwQL~6T`mh*pb$=qMpb( zp2#62&s|=sKARpbi)?NE0VZ5+Q6f5={A0V}(qMksE;_u{VD60t*SOcy7PX~u@2{1Z z@Qs?E#*KnVF>-HB(WZ?h<#+z*+?Gp0TWTEtTEM2e*kP= zdu>6Qh$@0DNJZLpAs6w`UvukF#!kqvIx003dl_lB5zq6xD@_>{vIa#3<)L65MzHEQ zlvmWp_K%Ko1KC%DjWPF^1|l535=3Io9A$)Ldnqy;ktt=8Yo%{vRu$VLQx5vQ(f&?~ zfVOmW>!q-cBV|_GM7)X;43iN@e@%m_DQt#!*)w1HMB>Wl(-)7dNZf7SeANoq_bXB* z6_)fYlJH(R`@Z-+4&SB2?k*U*L&F7?2?wZ*atD}7RIqiA&1T=n0H}%a_Ti`!rGH#E z;I{Fk^>i1ea|KFJpq|UQIc*+CmY{C&E6R6;O?4Fr=XVKV%EdeW)5^ptg~y-imss2-!>Qdw_~a_+_qv z2^Up^zB@XCkHoDl9#fHcz@jNnd>>_);wbkb$r!efGQSPqrNbT|!*=!zQ^p_%Xbiif zdJWsts-deJFujueW#8z4$?cO^Osgw5#xS#kEEvluW5 z;_P$6IQ#2wA}5TqpEZN=>}8SN|GT}xqKdP>iJw`!|4$%%R-And!015diL(!8ZEiQ| z1}ND=oc&c15sS0;Lcv&^eO6UaF?jgaOsV{mKHX#cn=Z`Uya=NcmNkbpwi=4tR3t28 z)8IP1Ex9wS8ZtM?&Ma@l*jH$o*JhQxgqdz@hoanDp?1c^p{r<7n>ul~ma;7&^Ga&{ z){fuQiYYw1XGUi3bQTrtdH;6Y<&ktkp!m0hcSq9c4GHXEfXUUF#H}5ZDvKwV4V&z? zb`(ieB549j=5kj^|3=P53*vrN;PhwVRs5o`VvunOL6qzZKR1 zn<+4B1-l9w4)OXP#83Mf;AsNHW&zE}Evma@nE8vgGHv#GCMNGbT0itzAE`fONdmhw zurlbb%?Z5i<=Z<_aH?nR;=xn3D=rIU7D1xt$o9Soeuj*k?{+7uPTLJIx~%%b=sA8Z zSM3SbMY>V1i-JQmLnz0v8~quQhqg%IXRI6DOv$^7AdvDQ^W8@ckROBD^{)$>FsEwu595;rWF? zdd66~Gr+{Fh3pi39HMO4V%I5t5#z#xj!pgyRYn-}aLAxtNph%6H4<9XCf`3bV9@U1RhCVj zO86{gY6GwqlxdN;trq?rC0k(7PHcR9?Q=W|#*}HVuwt-cAG8m8vZPP1h)o{eSPdhQ z`SL@WWt;+Tq%~>SA2a!JoagwS-RQ^4_SnwE;HoA;Fg~0@o_#HQZX<#;zUPiY==zXE zqdQ&tl8>Lw)|#ozP#8nm4o1knfX-GobnB(fUK9YcnwD*2vlk`0P?mw63u--)n|d%M z!pLx{R~QD(Nc5aW&Q40%r+%0L#|5FH0c`L%{C6im59O8?RVYLkjY9oC|BcPo#11nS2qkPpnW>r0k1$oMv zRl~&VyLFzbmGSjgLDfIQV%UJ(X()z*lJU7C%|@u3wtKv<{j4FJ?yLKKfuG!N66it& zXV=;D$G18;44lkKhqgg6j4B+l>i;4VRw8`q)X&3=L?PUF>p%Be8t3+8$r303(ByH9 z=wcp}Q}GGHG2P>6_%x0~Yn{(I910g=yGLT-;)`lO{TYLpEs{=O4hdpKBdRYd_&740 z1i45mdPWj9OShD9T>x8uI~wgfS}=q@z7=pmh6yZoE>6^GcVyNOT1pUzp~kmn{?+V= zoG18>*p5+wOsjCJfR{micLVa~H&_6>^AN<0v?d5*E=0a-kOlrx=4;qG?Y_zs-L@yj z_aG*vH?n-i_wEAB%^PUj?T~@q_wH><@&*Xy?FQyI1fKYFTe=nnu1agQNSDi)BXSTB z2fp~^hRxAdHs28U0JrAYUexZ)0>S@SNq?x0`)KfW9={TGF0h5;#1GBfp%%*)Jq>sP zHeHc22VBFiL{lsZ*4VI{!EPzU%?4X2#LaP7#Qp8GvZrRKD)7`?q6%81X3B~vHUHvQ zi_~-$Vo%MVgt!H2;7^?o5Ty6jg2(e64~buoC#Fb+$)dmw1)F!ckJM%hGS1tO2%> zLYe&{2iQjMmR~Z316eJ1P@7x6{|hWC*#F=s2iWRVNi`u*{B*+OtABN6|9J-XIKcQO zW1^ZKNOfg#P1&#-=Yd?$+T6Rao1$dS0NcNo;q;jzB2ut0b2tjRimmwnz2qu(_mR}T zj4F%S^2!-K-mmOGw}Gen!5&`skeFLmeX8G|KD?2U8~~b9Ux;b9=C8rz^)&QTZNc=X zt4{vAOf0=TtZP%}!dR3oW}k{(8&pnIsZ(Sfc$yCJElk)M<)fWl`@X@BA53%}`7*2s zG7`;WDMR0|lY1w_4pkV1<)-D&@B%@ zrzk)tTI#tGp-CEfThbC-=P16;E#UJiwHaE=37bwDmA6Lcz!FHJm zC>W*2kn9mqQ-8edlV{HlP$NH|Eh;Y%d%hw4pUBdDz>Vy~$OG683*iboNpvvipap2^1`xw~Hpo*3-@SX$pm+7L^NmOU3~kox1iox}tU zv^q7l(|y?XV85Th9R`&%MFQT-a@${BuuXH+r@_0(wE1RKYC(V|;Ezn3?}41-afNf9 zV$qf4&`SKwnl=w7d`W!E@VfwOVcPr{YjdH@15q-!Zzu-SC?aApm_aBQn>IH~?y4A+ z{erHOFM?3I6p@(g|CJMoVMwM!<&n0}F|r4K)47hi)`_ecKZN?%Q!uFW&!9K4d zCk_R>-3=CcOB9x=z?Qqsh`x6xRZphz!1P-AyC@sqdfwbz|zE=wzwjd=#Wu>GWFCOeDeSrHyGMA76}t zDCrRc>1(8RQGe3_RgSD_*ZZ41KoeTKu;R$gikpDseA}E3KrTpKuL<@-Y<_iOpI1K2-@{)%+StoZ-%y z3!yNQ7Ovjq70QrSz-UqQxizEX$K+k_GJhgcN5|= z=KhR^+fBO^6MXGz3WmG1?V7nc=w$pET(f%sn!w8m-4%;-NpacZY}IsjsmMNwP1V-v zyqr*U{t9~7bMxGxdp4#39Fy%ZZ0ru*4Oy(kJ9J%r!aojx;pLHgN&Zr(a$j*|gN8CL zkCph99WYT9#@>fFo=RUS$>V8k<|F{vmpPQ`0Ljjl-w1T+wKPNOrUQ zHw3+(eGL$_z6|tUR^EBo{#eYla1L!_RGQSOFbN7?itFg6W}d&zg-4D{oc)?d*hnySlhjnms2Sm z?aHU*KSxhCEFXP^>{;khWNc<@0=G^l4>2)S0?@vU|6faty)1tYh)gGsvaf-H)|WxA z7WAQ(|B#@Mx34_}tuKRacL^1$ujLO0bWBB5sj0{SP#fHB4;4`%Lqpp@6&Y{}RU{K) zJpR#K74fz0g}hKjJdIC5DZ(r6+p&C>ig?Id0~PZs;#)m`d=#_i)k(ta`S=20vN3ze zopUhzQa6Q|4-aMbqqxlNzZCVcI$5AE^d7p3NF0mx_sV1q`UuC~XpixNpA00XHKUnN zeokVaRVl0j+a7Ho+o~25{NyE8-{}CdFB8WWlB&Y_fPR22&8pPX`tExeH=L>ll^!U3 z|1j)7i);Ea>|KPNdve&YgMdA)=Z^XHj-an&oh2KpA)&TyOw5TpDC|$k82mKZN$cF?wi}z0rE*?fYampsFtCo*!sO1n z*iS>+hw9^&g5Co?b_(V~0rAX=MyRUGd;%>SH5T+^%_7oIUB*qwFb&z>XlX`UjlvQZJ0M={0pgn%h~E^$wP=qRHZ}ig zVN-;lC=WKl+@6C?@Jk;GXxrZ;bQU1F*&Zb9j^k?_&Dq2F{nax%%)fX29L%QTBultE zgp~xAVLNHnVj3r4c%cXnn7ZJ7(2<-M1D*}w z%H%?%k=?gJH8Iqm+Y!-+?H@$7qnYCa!#6`@gt`Y%q<+mm2|;`w;y5S)Ato8b$ATaU z9-_D5m~IeL0l^afykl?n2#QI3=uYZ9ANpfbEgs zlSg7`8zRC}U5(mv%J6xx=k%e6IV~H**41FXo87CF@jNHOvOYX7;PvRJ4y_6rj*qEk zkhd%HvW>{CYUnc7Gz5BqQzd8%ct4&O+bo_P<-(5bB3w8|z@`mDcCsez!&F4#v~oaR zgNH=D#j9*J_Sk8nWTX3~U8ujlD_G(wNF+Pi4=kyVgBxDWX#tiuVt0B12rmZ@VRZBU`HG z3UhS_hU~aYr=E9-S54I2iicQgmZ`%W;i5Y{<4C#;+*IxJFI* z-q6=b!nLG9T;t;yh&1+X1HsD+3P>CSow5n_BxFsy{+6t$99~|)!e}AcPbc&w7#j;~ zxQd0P6|lIse+<{Tt{Qt|=m+qc(h9>Go#wJy#W40KkqB!zbV}OMh(rK@sjMDaRmd$R z{Ho#C!^9am{d}r_Pl!Q{fW;YtZZXQW5y)Z@jn(%t9TAPWFbtdrXAZg_?LagG&q^Vp z5s7AS^{G8;hB0Gr1UGB}b%6pJh;}twFzF)H#(+i@4iFj4i}#W}RSak_)c_9#AX9xn zqbI&w2xz1eEeACAM=M$mXt?^shPeO?PbQr$!E2O#i5M73sb-+vl~Bfmu@XH|0s)=K zTCCQ>*ROZn4HlTnO+g>X-#dO0Af}7_6$4RHX9L;O z2p$XVnAZJCvrp3wwO_c$*tT+Z4sY~T^!{?GFDtdyPkfC$!k46Q7K9td*l~B4LEW+d z^-T13aN1n^71qP`3G(MiSOkov?a}u+5?&D*Df^IN;hO&o_!P*qZ3=0TUI1n6Yb#SF zE3MXj%Sju))bpyKGG)5J%k5$9sG9s{{>?$54dCsuu5=%^9`HIRoN42_N1IU*LSDTa ze6}Hbcca1&%MT&XyVV$$n{B0^bA^a~q0TL%4GefCs)fCuxvJs|H55&n<*3^HCf*dKdMWr)&W2WNqG-fSX zPZG+!+=+~!V@b!aXNn*FJFz_aSKtJ2Rm0!qZ=(*!;C9%cgptvD&W}JrOXot@!umOq z7(n;y8z00#M9P~Xh&sdb1c63I0^nmEh@CgwQ%0f2g|qFZ$aQdhi>Lnx#|L0FC5z*G z-j&PoouHxF9G8o~&xl-(t680p5pY}$-%u$U!Ht0{Q*jyagia^}N+euhYQmTNp!&lZ zO7b$e3P`hLa5j>nGB_~?B2o?sK}78CF_3_M!=i>35+o3ll70mF05LJ$fxd!qC0unV zYg~tv22cDWQmR3J$dXb8o3Ot9B6Vl3l*EXukr7Bq8hkEO{%F5gdT3N8OMoIvCjUWF zR3_76AR^_-5JUoafFJ?Gl~nFPjNx0tG6W0{`$Y?DY-W#s{8u*LtICE|$sY0c=PY|v z5$hdQv_~B%baYl+J;cif>ATf`=j;&|UV~>NMer7t;=40c(IvfKDzf>WK}yjpctnE_ zZPVKgZ4zBz8I;f_De8dzevf@YgM=kb$?if_N5)T0l}xpylaW+eGBq$rN5nwH_&q}q z5xqS@z<7s6N$ng6pYH?<#=$(v9gUoAG4@XXKY9wcdQYLB{Tk4w=#{pgVFJz*WuJpv zw&!6dV2W(Rn1|uh=2(MJV`Lk~CgS?C$ceIrcd)32?7?7N);5e^q$%-j7)Oiec~6vW z%i7#FjL9g;p(xLLG8c)6*fxyMfit!Z<0@BiLoasMrn5DJ=RS!{bJ95?mWERW1({_? zn=QWRd9B5|d9IKwe)uN(Bz`wXPxSTBUmD)XD`VeI)Zs4}smSKXAkEz#Bsk&UX=49-inPHs)r(x<7`>3_guXdwA z@q~Fgi5;MVIuEqlmv!b3D1>CWFX47c*1GSuM_sMmcJSTODCVPue6}` zWzYqeQKu(Z{=0&H$-d4Jw7v{_BSBBH{6_#C_{>SQ$HpP*S=!x+Oh?Dz2aa@7WyPvO zGNt9qwe7&b5&q;?W=Ba%jd<zV)^q~b4&+AOgDrzkES%}NemS}+#f6K2ZmpUy`A)A zy5(O7?CIn?_O-E~^<~gK1kJ55R0*~x)GARJ(<)(=R;h&HVE;A`dM3J%yxLuuJ>S!LFnh>WIhcK^ z(?iVtOse49`{3K`#BB7t4~>)TpY|1#`drIj%G$G}?lqm&jC39 zg6%yOiMPXz9=lwZs{p>@O^_Fg$&*_SwMc8<4OMdawYdu5A2=~60GV6^&*Vw<&jypk zpzzDM?DkA9v;3z}d3vque zXrv#t2X=H@XQ}O8lpcC$pd_il23{pWt{^F(V88IoxaRiAHd_8Qpdy`IZC`B#tuN1G z^@f#}&-SE~n3@XrN9sxXGUx{cy~d!o0(5jfm{g^)?jywNJ}P8r*nMcuf7zK{%-nR+ zWBd{9j*BA9TNH`{W2C3?6lz7%)BiHdXN|rdvPYo2p3A<}tuf4=S3ipvo{t0bVD^yj z0n&8aTt{DO=MeJ&>7e^-HEIHh6A`0ZN3bj=PEF25R_%(BtG_({mi z?#rKmyLK$5_Er2u@NUSTE#XZi;FfvlO~WQ{>pv%SxE!9ERJ<@fx)eWPh6|s7f*H9~ zkRn`2qBCC1cWo%NHf(}6q|^FJ?~UAaatq7pDwWWe>D!A^TTG9o*5`u!bW&f*UaYrG zx6U*qg%nm2p;c0%X-#T0^I5K_CXF~2PQGT}IT1tTco z%mRk+h)S`bcVeDFPn9S;8}w*F?`~ha3R+(V{e_^rS^gz}4##@c7&BJFDr2P*{~vqr zA7|CH|Bp{~%3yK^gAj#~Usni?LcdOh(x4$Sl^-R)yUbC3OeSYG9lNd25Q7;27q^8#g zH<=bbEr@iWmvaQOk>iVi31T*o9WpSRUQrJ-;+4_acaWPuUU7jhWa5?jj@G$Bi!gm( zLto8>JA=If2h_XCX1}Im#qQM>-a_wck=jlDz`Jp&;Onhh5e+lr+dH!};@k0B(cj*H zK_$MKnhGp&NqjRE_KlfVY}#%{o2J=~vAk+4N@x5dIf;pRrRZfDK`q&OZxfXF}16N|C6lriQGtNz*Fc7rL1qk8c)$5FKfj$ee}5hgq!N4X<9Gp=voimzL#k9JYAY4&{ERSJ0uMC z)$I)!&#^AjrCS7AN*cQT^;{YmsM}u!v=_8w#I&F#SS4sl4~@h3SbAy$bPYDkpVkj3 zt32culo^a)X5ec*MMI5-+|Pwo!%Bqx18OvoZ@Ok+)M$Ez(=Z#c#RanwY3kZc%m#8q z24>Uib@bAv*TFkWcp~6SOIGm#+pg^{!YLR}8rqLNAVGSeeiM z0fRJm<{AV0jVbp{QzKkb@DKG@YMGt;7dzBra?ZQ z@x*L&e7lF#4NFl3gUp%m?U@-f;SE|@n@52%nF&qJ0$k7~Goh)NI2s}g{p|4Mzu!+S=?EspF4Z#nF0Lu0BlU(!l$B2&N<`@7=-?lFiW$fwYP zwi1d-JFhCnV*4b!( z#S%7Nh!^&gSvL~Qrh57Lu^oXx0y%pmaI0J|{k@#(dL-qfnpMIkFUjfb?_(X)eP=G- z`VGFPtr^0gDR2_>R$&%xAD}H5m4?xz)XuGr`lsJd)y}QaAV=@q`c*veDdRYc#Ovw58RV?hPmptPEi(tnp02%ewce}s zD+C$zN*U=hPr_ys*9h2=K6zNhZrE_+w>2TXyJu_4CDlpAX=&J=A}MCWm&n3P^N+;1_%I5c1=g}9-TNL|WxTH=6qrboS!*QS zNdA(NQ=g-|ur6M>6-Vj$L%eY=Tdx@oQjYX1$94o3j&psHp(gneu=5f{>uS=Wo%T){ zZ45`F({8mLwx&BRTRBcI5Nel8iI>61*e`PIfYS;D#{TYdGj`w+PIVoNu4zsyyOij( z?HcH`Qq*Z|w=kVn_y!@TanL|2VcHIIv3kMpS(pM4nHzm#jYtZz$k}C~%c9Q2 z=v-iLNKR^UDQc4S0nl)Jt?zWqT#DB{9dnk9lO5wB6#Zpi-YnS#-&^FmM$eqs_Fd7l zvG=@-3uczXHoB#@k8{>Fwi zpF;iF#0nAO_T9wBWx%H|SteZ{KI?HDorSGG>9^>vN#K*?#1Kgk$v2mp?Z@0@A8YKa zk1m-DlJ8O<{SI;I2FSad09h}GW#k~F!enXrYT{Pz(vCFI+H(or52U1zokvu^D`{wv~U$`Mx#dU76hN-_Is7mysGHex@HFw!E~5{Xt1XCwqUOX zQnQhR{LC-eL^cwozNayTOX*pI#zQ;t=R!0hiRQ3Ky?u+DiQK{AQD+L)x-C)Aem}frfd2BYo>~&esdC|cnb~6 zoOofpNcXvBV5Q-KG+1$@JDY)(hATZ-j!6pBRBS!R=(b-@W_| z3~i7PlBMl@j5YS9lSdlp*wkVkuak_l6zxO08OP#P5O)88;O zM{ddl1I=o$qbOSyLU*dH7f&od~ba;YV;~xPXlXn9ZY*wY)OCHeR?gRd5ihOJuIjUioZDo&CT?C>rS$A;Q-&JCTEqYGB>{33TW62I&W%zbS$txYq*Q zC$mIfb6dDbTjJzOJpR3vZKV2ENBxUmu#*6B-FuQE#g;=#5`35?Rjw!P(tb7C@qJz- zH1erVbZek|j)8siu#>tpR3Og)B=7een&>tPj?V9mX7f9fzVD4*dkDj#Ab1Gm&JJn7#of`BnoPyQ{N!yE6v?m#_+HOvj+#$1=oQT>J(+=N7eSs={_J1K%=sWx0 zRgAKcICfq{qjc}Fe+mXAj#1C276ROOA-f7}OTf}7`Pq4WVd@mZvxMVs>owRq^x#|B zNF9x`E?&4QR+WsTz{yfD$=oK< z2P>Rj9)}mhph288Ax=83b&!(x3M9O~#uWtv;#vxSREGE$N^i|hS0YKl5lRTI!ak{tQyeF;q zEcOn5I?P^1ChHAp=LSd)v7CbM*tnfthMz|vya*%E5)dpi0Z%9L&`9;YX=r8(8fus* zt_E?QyCvXm8zS>IL>8`D0oT9>N)?%TVwH>}V1U^aKi!g;K7y`lKA2sNYX6-XL+nDt zIB%++RA^@CJ+MLYt;A!^%+NJGu3*gi z7Ti-dC2R4Wl(q7m6nr72eqGV3H8-xcd4o@OynqV7_7m-bJwxu(7l0xUA#*hECM-gjOGY2H`6uf`-R-pFqJMgVsqVPHP*5`I_VBAj^O z=eQ-3b}vD2J}<;*;-zr1UQrW`kMJKL+9P#HTvES`) z0%>}v9=MO)(~d~?7*u)M83i-+R?pgTk)z41A)Jq=^6rtG;@&b{OOhJ~;I2U!1CQge@YE=M}aW198yJpP7K=g6IsHc9c#h9Vbc9$;@LMF|SF-a$5T$|kfC(oX!J463x^Bf_pgP$@5k^v&>q83qYrlQK zGw%!Ie8PocggMd$D0hx+z#t@8i&}OTQp9sRQ%l>0*(N`;zP__nUxs#X%n!h<4)#?T z-g{(`Y2qKG2#+keI!Zj91|m`70S(d*qw=v48NHvUU2Nu+sWM^j-ERlJq`6gnLC5+D zld^u=8IXopK+%d5+1f5k!exl6^llV7uq-VRAMnrSkfR00npMK(n znZ^5~8&*B2PYf>xmVzRPh?ul%IaW7#6^H&7ji8BH47KFeAJvyHgMP{??ub^MPT&_l zGq$1iR9NB0pII6jN}Zu<*DO937{hN^{D8VP@mF^|935?`P@VC~4M7qwZwH{*V*cfGTtOlMNRkVTCBR5&r#;8H z~Xv@35-qLaQd zcd^=+sL~g!$wT-j1c47I5UHwE zAo_HEAqb4gRb$!*R>52|%(gEiPAQ)bp}>eTZu2_DK}2xxj^CS_hma^VdnW&SZ9js= z;B8(X0&CiBUcYxA=yVw#xqqJWngN=uPUpkLg7<-@AYKGf@7B;`n<2|!*o#IWq}r~o z&rr-V*!aJ8^6%YvI8&4>*JCcH>v&)9lQTMMB_kWEa98+6Iit}{W~G(j5TUIO{~$Cn z6~cmhBmTiWAqK+vpze9D#!JU<(2=&ll{#Iu7FAp@L;pr9@7**Isd__$oS~O9P8S1| z*>?t--fB0^JmqjIlIJ0WD-LZPg5cW4j3<2lB8H_15EPdx>^!`K;ZqQC`fZ|nV`fm( zoHlVH-Z4&DJbD~Rg3mW&NXTxZ3HBBNX$*jU?-54!;OgMN@S!?yb?{nHU~)fPnOkgb zjH{hgSY;x#N;aNDWaBe&WWK8&;i%?p5{K)1kfKl=;V?~D_b4XAhINFF; z^i{Y^w3gb$Vh3`{MO39ag=`)W^wycj`2;Fg%xQ%k*c1F8uRdq4VMd=tozCSVD8H_* z0h=&9YsFF^j0Tix3<^Xje_w;(x>0#Hf1;ezC2o#Fk_pu!IdOB!L%(NJ^WRUY#`wQ~ z-KZK*@OKA({lRw-^c_q?TV-DmA_LE3Tv9#6f{#-a+Uk}1VsVXmv8rPC&VVx9SA=~_ zkP;Ps15v7yo~_glb?U<8}K4fxb_das^sS8hW!pVAyy4Rnv7NDz=>oP2=$OEWBN@XY#Mtwia!1spIZXL+ub4l^zED7qCBelKJ}^$YTMi z`WwuK|I#$fMryx^RE$I~Zw9l0tOH~^X4C7aG|WbOvjnrzY|Caa8_3%-Fq>X0dzdj( zeLXAcCzv1Anra89bu1}qO)8t3s@sQhWK3*+X&HOmLC+Lv+tN;TZ5LTTrF*~Sl{EIy zO|-%3y8RbW=vdF`(qw^_l7>D@pl9iJ^5a;q=+bb3mXd}ZAkcGk`;&l9vq51=+u*fg zgF=SbpbP;tjwRi-4gUD8vcYd|0i%%_x)EI7(mm4#&A1n%&9gy6Z5`z3Sca36**{=| z2J%_g9*hl|UOUe4V>VK|O)wjY)&nMp*+34=z-)T`Ee*5LUVFi8EMY=3m<{9>*U}8l zrq=)uGi=aU-Ez_78(LG-U`LK6C9O$igY$IzDvlhmL4#?$H?nJk#e#3C?tPk9(%1{c zP8RC++koA%YIG@EprxdtCkS+fZYMv=s(2g_aZHFroI|Y3laFjzf|xmsC7obj8(KI0 z6)%zXYHVe16;gQ)j%&fQG$8Eip!`g`G9&No=GVTVcRVb~QA48tTEGOgZy?Wi?b7JT zNMLpvW+S&l1+&pXX)~A&%Fhl!B-_;`Vue3y`i!De=OZ-)lc!O@Q z=g0x=8%%e3BfHukFZiT4f;hh)47WHMYnhWQtk*(V2JtJWW(wQ1J&ZOjk`9h#NNtPZ zN*5CgHm;@yrq786DB_UyOgv% zRA!aX?X@7yv83ej*Z&dnhm%F72|Rz$HIqMs0)A`fDUe*&V*wb zxXrHlcuX`vXpXf@6Zto0)AOUdslqLo-Yq46rAQ(<6%Q}zS|&8% z9`0hq>j`KngzH$l;rW;l6TOlaP>pCgOSdlrZ;mA;Pe45%rht};fDB;mNtpsNZFAA) zY1s^Y6bz_zF|klU4`#T5f!pcYh{wb)5E=y3k)FPh;21%4JvDu8-$*Pmzz^oDp8LpWAg%i&V5q~)|q@jF2Xio-LiL13#H;;m!L=y+-@m7fUaXeys;x80I6*voqa6|u_ zu8n#ezAiWfBY3iMK9{oT8VKtMCQOa zv(2G6sUwDON*S>UfhD14Y*bnRS95&kNI!rp$LgT9^}1KmHo9GGw4HAM5wtqi7_rgm z%0{J0+i3ebZKE#y37Ix(+SZ^=yEJUnP;ilG7+~isy&yVW-RAT$Qp0Q^)>=7j(+zNHh^0vYN=j}c3sl8q#hMJ>-OhGmZ$4dcY&6YhVFPX zmmj+5_B#cdS4z+l+6uIkH1s6`-A%U-66pTAvg5Ms z0;3O#jJq0b+5Ge($c^qh_RwRf_bp!Yd?uUQqr2dLi9dBw-=J9z$1vk^fRM}-y!V>MtTTmG8) z=toe1@8Ifw_ZyLG8Vprxdt*9-J`-M(0$@6)Bh0xcyC{gptM z>h>vsPMeQ}L_HtL)$HbEDqhLR5J00Z^wO+`h4dj^_m`$&T z(=Z$DwH3@pvo|+`*+72oS(2vN^vd@zV?Hug^qOdLiq@1Rz96MEO-|D7?{MV6d}J_P z>y0cq7u7XN@JVlp*Rt0;uZ;2fOE?kUo@vB04$oAhX)8sWR$~XeS<^j!f#OOR6H7Dk z+5mm*T7dVA_aS6y;`Qs4iNxz+m*ZDam7b3t)q_Mu?o!h7*ddlZRkyzm(i}@l9)De9 zy%jS)QA(qGL-v-BvtK#4PxB{Lt* zBp#~~BiZuT%txa-5SQuq6H3APhhfifSNzHg&1ZZachfAV}Zk<_^o*%x>- z=OZ)fJ3{v?(hyh+*fWt&d8a-77%4CH3@$Jq8OgT=wL0>-zWf+8CG%00nU4;Bn)A^s zTB_%WCZ(ipNzF%dbbDN6`GzhXEYMQY&|Spx=IQof0=-n1z5$<(B_$0#N}w0&_7enp zwJt3cXenvvn+3W~x9@^o;nf98@LIeA)Aa|ghW`Cq2ZVGzPhBL>O+ubLH_6aIueGt=+9R;(%~1E?A(=j8+M;OFJuvSWe!mm$jVvx;|Gy1QUDwlT9A%m#Ar z49uq2H6G>*Jv;mq+SQw&Znz3V^ZwpVdepy*Z%Ij8#vNiA^}78F(h->7jD5!$jYMi* ztg(R4F2n$WK-)mq62|`@;FP)^qFZ!urc%wIv(TmmgvD}0>OmN;bTP4TEqF2ZG^RVV zf!pFL&Litvhzw^`^r@XYuG_H-pQ_>^`f%B&Fk{4%P#O3}^pmq3yAF~VKos2EWJ#Tt#%SC^tZN{L`4}qb4hF+?v}rlO z9n84<(3~$x=iRhza}B`beT%4{ypv6^kj3!a1v22jW$o0zlPU8EPe96hqnB8;wnEtI ztavt0zoEM=b?g|Oz%@xi;Ot-WA8pdr;lZ840RmPs0wm#Gmlo7vUP%k`4H0BQw_gD< zh)qd_mSV#lw5eakrVQYi12bi5+6JP{vnexlHP|d&Of0miw=-FX(gN(z=5DP zXceZdi^mD#tr_|S2&r^2u{8g3(!ky0+LUJ@6JRwamAn!p#;p+W*z%XEo`$zlx&&1h zXS{SHG~u@Gn<=2fft%+It!!Zs_ZbQ3I>-`l!dTLh+Fc}-t=kU+i>y;V1lW)fjpNQ zRn{(l9XUHh+0IJCY@~LOU^WuHs~OA&vI!DN$837_OT%omS0VB?nmxQ3%m(t249uoi zW3CyK`+GZR-HaB@XX{coda5O*G);EX?c+IeAldGq+uD00yAPm@Px|~16v-PMnNl-tzwKqn;C>!6^f+)^x|mp+mzsea zOsNC{{dpkUNbN-G#OnC_QezXPHs)eVO-hj3fIy<5TLAZRPUe7Xp*pm9*3> zk=g*=z8(zgvrL}UhTTl59W7EbfS*G_L0dCzHLmh_1*{pm7q~55Of1bT>=~f;6iGm2 z?Lf1c^L9`nvaol@C~7muUJILF9P1rL-=m3#SQx1-g9)NOP>A6nWt)wXi2m zdSUN~S9EUR!b74#HceZDD{bZmhJwprPI&F4$2(r=;ds>J&ONB`&L{=_-}G*e-WmK0 z4#7y5lK!-5@S#UJid@ZP$;hdSaNzcAFuiU{!)zp<5Xl;?oZAd$1Gxl{>6lHgJP-4Eo&`JrcwX)VksNXX zy3*;?UD5}g1)IiCs|y?ePA5COMu>ZNLru`VjY*y95#Ubm`7mA_2Ng%^iobSYoh@iF z9Olt>_(xv`%~sNqEMN~Q;p-rZpdTU>L>n**McxpQ7xcfL(6dI) zJL+=m!p-Id%LSmF-(|4oAQ?#)rbkXiYcr(xMA}G=NiX;GzPgJPSG-si(GzjvP)@mL z--1)_D`bnPI!AwNNE|Mdg$DBaIrvE($peZ#^$iws+Lhj94lsZt@yNg%jU=b0>cAl(mNzvV66~4C5(1vX=y3-h*zE$UUR|Grx+FnZQ zRG=>;!blY(10(s`W~0p;sT*%FQolIGf&~G z`%wzMhe<~od0R17cLkt{*8%Zf6gdmK_ZHE%T+_Rq8oO}stgO_nN+f@X`o|_=754Cl z1Iz;jpi`NRH%tm7u^P_^7&IStEtjI=f{Q(2L#+Fv1@8+O;=9e@t?Xxv6?fLZ3J{^- zP@UMJegT<82~rX!QMdL=rQk-ps4>{K1Z}veU)vw<-!d|};@m(dUt0ui?6g0r#DyQ~ zevemrOg49BnQIZ~v)h%=;!ef4COvJKouhvVv&7Sg z#m$9G3w+{Q06Z%y|9u>Dhyy76IBpRf>dvZ8WDsMW3@N>pJ=@UIS^p}?b|Sy9eLyc5 z5D#{DV+B~?ymQ_VPL0yu8|_ZySArg5K>M;ngLVX{ceR9c2?LH-OPs3v?dl1TzUFEP zLDh&V-XYG5m7(!&M1S>Zl(nv71(rIbLb<}nm?~oG{t2Iya5}$Jv+N1pzC@D)ym}PZ zM7E!*Or*)i-ARf9w{1Pz;zdmX6OohvCZcWqfBm0Pejz9c zQg_xLP=0u`luzLN+Z^SixSH=$9z_%j8q{HbK=~i~a?Wd+zP#6nfLr?fe9Lg z`D=Ng3;yqB1P(54k<`)l6!hButqk%7S!P1P%bi0Fw_nIBzA%zOfRvju6m}#jrBG!S4CvRmCtI{>!ide>FZ#= z8Na-WuF>GR z#yl9TgmGX{cGPpobpWNW_+o#5(Gz5l;6Q8G1z}o$WP zuZXjOo1^Z5QArb;yn)~Q2?MJ%d=~Jqe=XU=0FW`?^*7(|VXxm9-EXSfFZXx5T`t}J z#bLhdp>!a(G258({{_mZh-^F~;yGAy{6}8ahJ$u_&r546!WI_Y{;dkZvQ^NYITg~> z4IeZ9N=0e_QDeZl7|@A)E@O9N>be;MVOED5R$0&W3^+A7rZqTf9eh_KVi@)r5w#gW zunh+`H9&GOUObAW=CPC3%6y!y)i{p+i$u;e9Fpztg$7OJA)2zAg|e-rELjC3N*`H> z9|#aV^2dy8zo(+6AOAq_|3agpS>JL=!5(@(Fk90^in68Dp{+r5uhW^z*${8}yW^GW z@kl#>LVSkRrWJ+ZBVOpQT_o24LT?BO0M4K->DzqZg>C?O_99RQo0K?8Qg0nZQm0cZ z__9@`>6kk8y^|b`R~tG(hk|%sp{3mQEtJU8XLQSQB8a!tO*g|h;p%C65*NQ14O&m5 z)hr=Pzdi=13EhqSlm-ndi&yI1hfh7qO~9<_8R89*_c1_v&bMT%@p@8J$KlgW&5aN9 zJqqxp0MX5|Z2-qb{(j4phB;_Z)Y{TW++E?D?urHTQhh(%b@^~Y23cr|7v@QZ{V3Ld zbo+R;>zi}mK2?Ll%6X-)fG!!}MMvEwf-X#zmAK!A1!)A+h(Lucef8T}uoy2tmkV}p z1`zY}fqM2}7y|vz$_Hp?InD5!%f@uH+|mjt?Cqg z2ZO$t%G{^w{}92krV~rFC~m!?(zz{bBF4_jivECEvFw07vlH3S8l9l?NSQhDj!BY> zF7vaq6YYQa6;Dde{G(XuEIOM16u!m&@h>FxE=tV;{+dWOQ57W@0hf#iV>kDxQ?`jC zpm6#IgEl$23V^t8)hRwI3-Fg*3>~(&qdEAdP)LjDd#K&HIAmWII&OFfUvXRZYfEcg zbRV?Fs@e}5KBCBwMYLO=Qx9Fhd?_%;er-`)5?>qpx<$OOvG}Z|2rF49ZPRSng-!9M zSWSyqb*NQK5~l|&#el>$`gt|)yVcuWNg(YS5+Ee#B5xrtnx$&l9!y(MuT>XkZPFhEe zlw{k3L(aHR&2IHr081T6ec5@BSs!8Pp(TRRF3fg=L$S&h;P;r?W!qckSKhM8Zevvx z3tfZ02NNYmVac;ttn`}y!ZLUr4deLV9zPs+4JBFKL`Id-_{V=4^&J08n%e&||Nim& z{m%G*(c_P9X8c&=@pcI&@b8==W|(PqGkS~ITD%%2T&>dt;REy_ zY(k(pi}Q>RqK`0)2}dTkD9jjJQ>S!6*@&_lAmgq~b16 zk;Jv%yGC;zS>oB{@b=OPcVtBma_;2=q;a%ve%-Aur?}R_l zt*_D!`oMP#fn7~9zezWrrJHX?Gr@bItTXb=1;q-T(CI)^B3gvop(f64sst_*E2QB%LiD*OY z+nk9zl|j~n=U8PZe-qX-!&Z01A!?WSCQl@Z` zdf)Z+KSAkGs#C;=2XT#2KD+3i`M(4_XTV!R&}|g3-O)DR4?1v z(%LrRWNe90UI$yGWGzTGpxu3dEcR`S=qGmJJo^rK=sde+eob+E%pa$y5x&jIZ;Boy z)*MYqJO0Fbhs=0RzqAcU>|8Mci)ElYC1JFk(=$Fh5qkt|T^o#)9udoFw z@fOj_w}$dgfK3iZUA!_m8vmqzN=*;+T&8>CbuFyv8`JaauhA3FEDQ|sN|&8*SqF}g zF0u(4MTkvu&#pw7=ZJ!Pw^I|Dk0kl3Jz#r%b!v+yFVi`2&}~N&^%g8Vq}tT!7G4;iVIMr;W2E$g!bP?mg+o)tUZuP z$7(|PCG+AXbHmm*40e+d|MH9Ggsmg^jE&gp6Sco<^Suh%P+YYcJbTpPB|BdJCBAfK5`!`ALnl@_OJBzosy!7Gtt zXSaCQ?w!+VaICgtyf+?UF>zGY^v%xh3>wUAwl_=&@>3l^Sxc@W35CN+A;_5m%EJr# zF?BgPyaaCtMJgu{2c&WsT7_`@-cRuux>8H55M|(Y`niir&p`8~6ZXz3Ho_gPL623S zCX{g8ny=8isLB`KtiO}HqFTQUu3{BT1H(TH9Qn8*H!?3=_JXQ*hUPlBU|0+GNMgkI zU>KNZ^Le*$P8`!iVXXw_IhYI?m=~$QJX;6mRkTx_5i3+C2f~Jf30R<0q*i61#FbwP zqh_23f1m7l`U z3b;E5jUxE*sI!Y!dcumD1hg{1(l*E)q5D%`Bsl^YQgui)i)uXtVQVgo6FA-cF?u=^ z(|f76^w36oq)^u(5;~DDOi)?*1qiEQUAj<<6$P)F;0}R44barn_}ZF3U5y3$_0Yp` zN03?!RP#B98Il<`+iLK90hiYY3>Bvl{7BTrtCNS~pVUwIaRh$I^Lr|Zm=Uk``^Nnu z27Ihihm5t+i;&iM#c)|wrmm(U%uyuIi>?}tCA_&AgJTmqlYG$fIEtxflA`}~85KzX zyB~2PUz@%q1hxV)>8!^YCQPd3dmz4mf~VIRX@)pPbSOB_%^-%k!%BE;ALqn zm;I1wt4k3U$WXnQ_LqjJ#OD~O3U!Dv={R1=#Bry_F->r&`4_~_CXQ0nC2!}SV*K&w zyO;vR#AxWfn0?BBJV|C$X^?Mc4A2bEh>5lVyS*s ztaJyjiL8XxWu?{vFQYk_+@+VuPD7}I|E|#f%YhNKM}7w5cwOU+S7PxAf?Wr{M#6;c z4M8N|qXkITY8TW<4knW7seybV);J&@-Olx_k{!q@;ze6I_e9U-qf#;E+q*E|f`WaT zWU}U$$%@1H8jHQZ*htq-yDrSZjO#{`u$2&p+G+!7$&PqqQKh|`n+z~zcowOEZ=v8m zPHy1l#V^F|p(-;|KGDEge=`ImZ*3^38G5>%1usuuK6n$OI#0>7YoAc}KH1^2DX78X zP8cZ6Jbn%^#`=Upfd_)UA^w2ly@CPg58K4S-Pm0Z1j)}>H(xC?rn~j+y4P>g>j&dS ze`BvC>x2|}kw}(jEZVs%$*q-v!B5s`j%O3TCj`a`K8$GEp)Qzv=dtyD!~|Lcm9-4N z13`Qvs$dcy`;zEAfiG2skFTrOsg0W;(`drY3X7i)pm;)|c*u#kxpgi2q$UQ_;~PnL z`W!Ms`i7@mC@iT}5zID|&_8(=>Ogr6>ml+xDIs0fBa?qY+tlECSFACIt9>InIpf;r z|4@90-6t>JgJB?)zz33LnQSQ#=QqJqK95!9$Rm|+{dQs_gGEiGDhD1~ZQYGAT4=98 zm_r_f&_Xf3yAcxMI_9>%xp}R_)=u0}ibom$Le-Bf@3xGjCOO`y&%C zJ?jLBA#7cS4zUSaTR8o;hVQjOkUc)z+7*tEMh0Ixp~VSd>sNHFj(mHjJ$whoi9d`6 z`}`gDgss+!@q0R85XRDkP=Ju`Rh}ve|xy>XV7T(&bBJX@1@6>%rT->t!~@uT+%`o z2bl`;Aw(_afsC2QQlJ&a;g5wulDaE5peObk_Jl-0G7^6zlxGrMVHH;di{=X=JPpK_ zw-iC6(*?lAb-BX%v5JCtq}0K8GQpKyR0>scgv8w^5@JR?G6`^CBUUk_dt_4aWp?4D zc;V#uhc>z{%SD}(bJAF2pHy1eu9 z@RH?NAkVffc0Q)ws<{0I2TL0zv$5TdvIET_m}#O4c@)0q>qO@W>9C$xQG+;(I6BF} z70bLovQVfV0;-QW4UcB{lvmMo8e0GL00ok>@vr_SR##RPP3GrG0dGep>kpc&hoMna zkj>tNE~?YB+vBAAmsOgqCN9%gR|$4!4CrC+x6?Z?$&80M#Ii=;MQ`oY0|8;SYRZ#i!O| z%lKAC-kMVc@8hKt3{dPDCVLs|nAH!hRkYI~T^GEO=&Rg6Ah z>{ri}m#L~$9BUwqMNup&>aer`y-j|Hr6UK=INF>3t`nQ9DO8Lz^>Z~fm7xdlV6^Jq zceG&3Ej}D^Ik%xnxs;&pL5>tPp-SjH-8#1!EF2tSk8G9)Ujz_JuoG@du`Z)$n! zRn;;z^@jS9dPjo-=QQ>{4!x5dN#91Vq6j>08f^uCzA`LQ(J4P*9U zw+7#Q9%~$ke85=V#2R@N0N`2xA_M#@l3V)gU6MxOJrvy`vG47Y(2ALZp_id0JR2@C zkAXjgt(LMpl1tI3uGDN|9i)tRPQE<#R_V$VIDccl>~~^CuT||*19=8((2?fM7BW_#Y4won4*=6UbX%OlGk%^ zJnxW{Xfe`UO;kDRT`Nt`S>Hi$Vx~I)GByjBpy^u-pX|!Ibnr(s_~&#O@9A|Z!9QSK zI`}mj{I7!D&7-FhyeJcUHw|7O;BEqa1;Kk{g72=ucNcK?iSuNF|HxnwUFl!9wYbsF zj;?Z3+_3eS)NJ~E7)@S6-477t)E}B9W0>3< zt6-ZISp4>lTRbn23}2}FJ?2|pznlFg(NtQ?xJg)NFo!-^x`n3<6mHdu2Q0TQx+c42 zf;Ym^sn|UQTs=hqd_RKA-5{08mYKa6&)5qWl0d(1qQ2>0==BBal5!o3yS{KPG5DU> zd#9JNmaiX_^nMI^-#D@HawfN!*RZ5ql4B2oRflSNBBMlB-c#0A(OA=4Dq_pJ)U@O| zmzv(WJmgZ-JC6rkVioPN&k-xO@!tGA9crbw>QmEOki^UD5X13OS!Mx;D|%SImIZ@Q z;(c(0k+GXHwybO1S&2saCf_k1{t^8#8>{O=TDO{>f;_gYAf3p##dS~eQO+MVy%Y_- z6x|g)6m?{!m!ikv@(R+QWb_<>M{uNjVsTZ>3P0tKTW0cc7y@ZnCH@;=~)$>SdQmx*|^-i*6mk6R%v$gJ0! zmY?;w&r%k0BGDaJ&~x17cg4#qeB&Zsa{FkalOFf+57oF2;a^G#(gvndKBV(MIhr(a z8H=%9E#eMWVQZA|jKJjkA~p9gpfl6C?Kpc-?pqwj?iDKS)-#%y>`zM?lxv3`L^)j6 z4aL~<7WuzKzjn&yAQtF3`~!^NwoBfg*^c@`<9_^I9a)%VpV|$-Y9jN2GAowMVan_9 zrHkFRD;wl9oouuB>mgm<#AD+kR>UW_&K2+3itGH?q2E>{xNO05rTV9q|HP-Y<|F&l z$D_NwUr#~Gc~C&CPWqQKU@KDLxYI-t$Sn%0ohtwu3rDMwYaLV*%Qx&x8p-A~`Nfe+ zsZ&&8r2WYW8=37HDU4N#cWwmJ@9 z-o?u|lj!{>2_V;i0GI`y30Px=^e;umG` zm1t026_&G}awmgf2u)D|1*lEV#Y$?{`x4O03ZOn)K7wLG1eP|P(7t4|7qBu=Bq5${ z)(qfnU3@3DjWG4m5h@2UmmrV)69bj3gmC3y_9qC4p=AWB5sO&I9*JEVkX(aiBqiD3QY#If&H-_ zz}iPNMpq9Zm$h^~^q`_0-jO(NAvpq;$e;$Pe04MSKW#}PG;8Z2 zJ$Yo)U~6frf-FsVuM=#E+eT~p8>>EW$L4e56jY@?SKSHHfpG)%;|Mz21x=;&VDGtA zguVb!j56mC`YLxU7rMZ$BJ>d&`d~tjb(>shKI`jYa2DPC#QhNZCvj}5r3uS~1(6;` zJ9}e?0Z4tJx~n^Ayh)VOe-<584TB9)4MAtSoHM)Kmh(SWy~>#}=nTSc%gh3Ksm!c) zIkOKmNz%YHMP(wm42))u_{3*n&JZR6k?CJ00VY1(0_#cQ=&fPxH-sw9@I3rXp5`h% zozfSel;j0yoH|v{?`nVG{}cK8ArLGx$Y%2OTdL9Yevz<+pW)yCoB8@Jl^Fm3&(}L8;!wnY zp0Brp3H)36`dY}@pReD6^6%yA%Qs{Gk6>kWGxIz4GD&wCmUElU*GDuebAA|To6pzJ zVb|vJ^-j9$Pg`j^Wwke9Fb2X=;*S5WQG*9U`6V*Cp2CSM;0>|VZp0$ZBN*Y{(v@bdM? zKV#0!to+aO^%q1qCIwzkT{n}j=K<=!%h#_2=0DEYdxF(J$=81qUo^y?=n|WruU`YG z|Bl$#p&2hG6a-Fy|&b=wkhRnP3q%h#Vcu$g?l(^Yt2n z{%OAcG@uw|9wYRh=Igg==<5mnKg`!pL|-po|10h6-^kVBlGi@#|syQ%g$q+EWqPlo!IjB@d$SL z&c?Mp`g{gAkK<{k-P@2w;T$_M+rBV|T`QvdrH1LdqlQ6r`H|T;<5Ap09cIC%fq3Cu zY?z7TbODZX@Nl;}&@m6Y@VIGil`RK4=E}~A=z{#BdC`B^g|qVuvD!d#u>!63txJlL zqj!o=St{@9oRT`T?sWHCYBo9@eVB|K&*drD=Y90=^w)SZxI$c%J+aciIc!f2L!+a4RXc>2dKT*PIRk&sJ1-jhafGN=Y~9Yr~|FW%AP!-DzM z#TQ{hL=|38;57v|P(yx^IpGDvbM1nh?uE0X`=^G=`%B`=6I`?7%Zqu2r`yonXc8dB zvKx0h$jXl_j8{jO0;QZ{ExiNBwDz&@nFh|g-$S0l6Kvv-;l_po? z(k;a^X(8N1-e-z@57+WNafy;I)W>x_5Y^#L07h1F!cP-1MAeD0uBc(Dc~kmp*cwA? zN*8hQ)etZC-mT<52Ab0Q7+Oh~GR@x<9f|$G@+(}{%m%!_U=+TGQXBBxH-VRcF0}zq z_J=9_?uNSau=iGNY0lqNJS*@jay>!>-qyu^$KiG-HlBoo8MsK=2oh}uWj|wP2q1b` z5QV2~WRpH2gVbpe7)-vK34XN(Unb!0o^*%cFJ*$Cs=?0@aCejWaDw9=pCB=9GDfjYP;X?Ty@1MlcdP6uedFPm@Gj4e)J|<63lo`ap0SD$q%VY z_1ZM`aO%P23ST*v@^xlb^H*lhPCrURuy?MO`O1s#VlU;a8D|}mqCGO9_3BLHhoI8GtRtROW?JbMX zk8Q^_O82vomo7bwA86y#R!dGVRoR+R)|`=E!;1hi!NA`h!e8+oxK%)YMPEY4csFcX zkh?!JF|+v~|5!k>8}Q`U7QX`|saNbmqD}n+GRAr#l!pTpxY#Az8GxOl#fO37@Pe#V zTW%A;Cd&)6QJK@NH??Z4fzzqw~_0VCi&c5i_obkpBd}Gl96JzMVK`4z|=| zF1)%r@~>_6Z<{X-Z;hNSyq*zf`z3`FY~ z^uvI${&_9p2f=CMb?!EM$Zzyi^z0tVE1pJ`ENF8^@7(Z=$PcNw(2C$f-yMY|;KWq? ziB~7qzy~R=2hk?<<9@U3CfqaXTmR*aCD5n3+E20uvrW`~6}{_Y`tl`?agM=bgs9e! zc{>A6&ncJY9^v9%;RPMy%Tv3{j^W~csKxWBcv_e%w%j2Vm%-`_P=?fn=;bd0MV|l>8GjI`@SjpW#V7Q8rIN z>V1_%5JYiC1Sng?+u()`98q*JtDa52)AJzdNn$d4YWp3d&r=|#7UhZwlDgvv<2rc%+t=xu~vl3qJo&&nY#B0 zg5dx}e7YcBDTYnNd(eN{iNE2Of2x4Z+5PgE=-C&;$*HUGWNx6s4rz*-SrswR&I zq%Oo`fxrD@X~*rwnw9D5R-g=)XX2d(F1ImoNxsD5)>Sg07%;k)VQ&)f&4v*+0pIW)v5v&VxLCls;kj7?kn#eY zn~p@I$p-*#JW2hl;t{MqKNug22Z3%x){*hw35jjtt!_xFNh3)#zMY)2aftOiD*5~5{RiyE@ z*P*7=Yxb}lT+D-GSM^HERUPAXdJYu<3qRekp9nD<5eAM7|Fu>WUt1kn=LYYKAgp)| zjxyHd7PsRq-g;h1y~yC)&h8zG_eVH)V>moO$MAK~d}21bWAs=b#PE|dVmSISf=>Zn zdr%(kY`}?xTQC7O#G_4iG|%ow=7gv9U~61gO6d2_BDfL)^;zL~4|q%R6mglx)Vm-B z@!@m^P0Rp;U%;$z2mauMN+p94g3_JTaQc5Ho@0u0^@qy>8=%7LMTIt28lXNb1FTAQ z#e4+g7yYel=BNb7t3NKX3JUBTFKSQhSsoj(l!1ibhdkO3Vn%}X$-<7*ue0lCO;pqZ7)RRcPfe=>I z6kZVJ!v*lE>wWNyvBfSzN`wP};RVZag;V-A;hyjb^^BpeH-q)v_&lF6=rBLLmGC(vOia0uXRYSc zL6$i5cA%pA>8o7=GoQpK<*gIxt;+K2hsmr@YOE#)uZXFg$YOjlLE{$59?cVmA^jqEd2Fd{INTr5u#RdF0Ky<_A9_c zu*-Z8UU}d+H4nWKYZG*rI7)iV#!B6TMAz?pqc5PwbN4L0?DD2v6c8mpJ;WYV0)@XZNh# z9)!a@p*Wleo;#?%`?)#A9q})>*Hr!;GRM4xCojxTRY|p%y)k8D_anV)pqFC8Za||X zBiQGd7^J;RKZ#ZM4lz^n4N3$&NQ6%HKHt>diiS{PcfqkGgXoY5-^Wk9s;Ct$vr8s5ul(tvo%mxMbP%7) z^Lv5hk4Z9;0yyCjhy-3yS-bBC;^dCD`endR}wEW2keCC;2? z8pMLfNCb+Z@C=kDNfd>g-XR{DC!3)-T=oc>A?x_b#9uf|KN?Js5(utS1m`wG@JgK5 zG8rY~nBVwRe$|-VN1kY=Dw&*wLh=~K9ksq1NhHr=J1hqoBma2Ti{}kHGVPf9B)_!c z!85~<^dJve!3E^MA{VDotH!H0>B zfaN&>#q<@$%rQ=q#wS9t6RCxavVESpuXLz&HOU(yU}JnPF;7I8B7LgA2S>h`Hk#ag z3#Gyi{M3~DhzYX%od!v#Rc5v&a{(_mfI6t; zAZEgae8X^R%Sp_~R%+gIU>(Nu4^)S<0*gBCGfV1C`?1?q< zK4)CWp3WcG$-4LGsZ3itJ&gw)y_a=2OieP8-~5zJ3J77bhe&^PO-|n7+|){ zk_Ait{7Qbx3ybymNwU~wjM@WQ9IG5dsAXP<1zv|2*?||j79gj?WX&uiQSd8X0<*H4 zukwwzPzlsSyZUb;`3ESH+AdygbgXp7Lxqd+>$jyd4yDL8(4J}=D5$#mB`Q_eEqxL) zs5+jBY%taOc(z)KUI3MwRc=UaCj^xI8|%_Dvu8Cp-;(%}hz|&U1?$qm$7ygmIp*Cv zIE&ys_JC)F3~4<7W^>Ybq8Vv~tzTG6arz}vuf&-tk)pYjNCQ>&G6OO`sf5Qel(J|J zK~??z=NmkR~d+3+?5PwEbOp&@uBpbuV*UH*%bXg)fSN8cdA0;-Gh463`h9Fct5gw_`>;l9O1Zsl|DzME&FHHF@B^>qYo678z7c>k9mG5T$EcSK-&DdD)L)kgDA= z$S@2NuY86WozQ8q+7>mfiHX?bt?af$5&OACar=`#iY4`Z9M@L7-?jx-^&bxLP}jTB z?>LhMm>ElEI)E8Z7K#B0kHVB}l!x0t54TUh|K=@jrZ)FOCuc%k>Fsh~G(}mIoD5lt z{Ij1X3(bkk%r^fJaZ-rsG?>=}?v%;-a7X%jyUd5UUs_&K^=ofcOz3#hIw!f#~OS#%e#ZUQoM z@32dr*k5z>$^9$Q9Q%^?)<+YLKWUxaKidvX=Pd^MDA;$(@IoD_Tu7e!$sf`F?oV)8 z;c@->js_Pn3t5pz#YA1mA3>MhAFIhD^49ckx2CAcpllxiTnRudhD$u3M_Yz0&2aP3 zwkFcF21|Hc(UBWqlHDNyk2U!PeP+Jj=nKQA6TS$f>F+nLgDDR-;h#^qafC1Qh{@76T z8LekTLjQeXkRPso#@#B}cnAsH&(ofsk&`%?bZp-hUsimK-HK~AAC5aVUUy7wejUik zfdyxc<84>&H6I_rx?)v%_%KVnF7+kC+b&R?I3A>cf8L+o5$?;bh#YSzJsoM9Va=edj^|0DD}6EyLn|8|R|kyBBO7H_++zlLMzfH$DrVmFflgG^T4gU28z};Y8kf1qQv{bdGZt{ zGZaC-tRh@?A8#ze^K3a!*04RVQ%$6vqv<_xe8x=dahO2a0u`&sgLmgI510MG)q)H2 zY9g!HAzse;Fe&fn+u&KBWMJS+FoL;p8Ut^_!x9Fzo`bq&D?Rsth&2zO!Xe>&twoaA z3(%}9oCa}Xrv+I>@!p4($7-9AOP*Q(05tC4yT`Brt`nZf*oEo?(A!8ALL7h-pLV!I;rE2b6wEsY~Ip|y?pV(CR_{xL7 zxQy2WEaS`2>LDhlM$TTVqt84FO(>WQd@4k(=nrLs@gHGswk5Y?%p@u5s1;qBuFG!t zS0yp9UdsGmQ=keZIBEkp{>q`{ysz!hQtVuHsskhOWHYYNbILh_I*!$x07xkH+8>tg zl#8TcuEGOlllYEQwiWe=2I3AyX}6^wcxudu7^lYApvY5FHmAlYA6gJb`4q}luV@pW zQ1AOEU*3UEw~sG_~xl7AyVu{2=oe`Ivz~sakZFt zHNt)x=ihxe&q>31FmN`9tCiqdPsLB?usv}15B}8)XO(d|3GNJ9MWYncP?x+Ff7DR2ClBelDupdx*_oI^4ulfYdJ?)( z`f+%Mx^zU$T?2r%v236Rczu3@+}Wp)O`8$3RTEEf3WMU3f8sFE!2WbbaTuR4Fya!Z zQaOxv6&1Mt6NlLo6ehcZGUdFAE-$W7Wz%7?=9DOdhnxuoRXs7f-s(F>$7J5?7{gHmkyO*&8EfcN!07B@YilfG7g(;PNm4%sOm^P z0`n@yE?$Oe)e#V{Rn*M|ku_-KMMC(ef&bv#HBr?>HnUU{NytA|J?hjiwyLWNIJ{g{ z0GsE0;#jPaxeHuh2VKx%=$|rC0qRSThR6D{!^wd~OuUp^0u7Nnp*HlRSum$MM^YtLk-#-c>! zngNjfgD}Q(xFqdJ8kpP%fsz80h+G6HbrdaLPK-Dn!oMxe!FD4)EnOw48j+WY$S=@( z)V`!j{k~0zi*JF9S|OYDUpY_$I+8?+$MHX9p-UPISBjNxXWujy9;bBFX*$e|iVLxk z8dv#$Kz*a59Jnh(0ci4za31O$Im%2Ceg;S-LQj6IKgb@B0l{`}6yLe>}WC-}jvJI)7j1&pr2?bN#CS z#`EIB8gYJ|i2AymUh-_9F6V7rIl7!Q>=1D9#o}Wd|B$^#x7|} zq`j8XQeDowq}ME=z%EA$#@kd&<{nj9Y;q9b`` zXYN=1f?hC4(B)EYO8w2uJ-dM(L462P4b_X$p+z!aEd3YuH^^VFf@1ckf zmylnttNfC7r$;LI;x^xl1J;s>fPdbHSbptLetA2a8^o_o%CGjB5(BfFX@5u=N$;oD zpQ)jw^n(4B=~;9_)p@fsZGWLC5GDRr0_<5O$VJXahZdth) zp%yZ;)0R34$!9gGBCoVzj-&RS_-4N2q~6P$eZ5RQ2}{i9UF=DM)lD3Y>yc&QRFu%pUr)@ zJS#CBRWeolcqK;SP7_#AOfX#c+Q#ZVxHqbnh3n^64BrC#6<4 zorC9U#n?K=?kMNl@ke!+P^~$dqbdqL>ZCUbCzPj&qpG?|%i%j!=IF+7Y?W{7S;PG0 z@|unD{)(`E$&=+@*4vfW^iyUl%&D1BJTT9oQ}bk^A*3)B4N*%I50|eSQucW@GZ(}( zh&m0KmRLnra*%>)i+;>%R>`(1387^RPf4VX#x+U^EIE0!OwE1V za%|M&>YOz7p%%)&S?2Qs%Kvx%hzXBjw(?;_}92fbU?KJZ6@f-t&c@f zU0c~Cwka(q5^QAugL~N$_NN+-HRWp8<<Wqc$d>WHR6B-RKa|k{m!KC0(CWetAEJ z^EMu}^JbiMDFvkzUVj9?|4S5g2~Au5RxXysfy@!gnb7^3 zo-{Yo$HP1Ez^{q@@I@A>N@yZE@z^M0R- zY@l8-+s}G!`4+co#owcl)u$p&eO9Vv#&rYUwWo>F`YY(e%9Bw~sLwe0o_ltQM;ny- ztI2KzmHNk9&ZWUAkNb-qZlO4rI%0k(^Mcg=Bcxn?k*6$N>gB1zyUW!)mgL-1=%-Yh zUz<6ooT+ycx191c2E_1>xFMN8Dvx{14lab?&Q|j+Isdf$&~(X0l(%h{r`O{0@%CI5 zHM>9cn0MaT3=6DwB{xg*{5_wiJRkLhOs+Y`OAix3yP6*M|6osHg5Q^$JWmFA_ZiDO zwUyTQxsXWlPKt?f%0WB6YU;>8His!rGUXY^+J*NYCaGIEGww+H4S3LgrShdrHEb$_ zef5V20L}$a^B;wGl|Lo*-q)|l+|vS4zH-%5sXlD;v(hb<4YBM0Ff|CJQ#c?6-$0Ae zeisfn>ciPqe%XxVbLDaB+eBsMYPN#npD9s&+|D4Y;764#$De>~I!)0?`!-jsd`pvp z@u2-y3AR}*9_~^JyyfG~M@E&XB^~~a_S2RxmnmP&50Vl2pRd6e+2+)Kj{ki7gXP@C zvS;Phgr%5{oKu>-qlVx@>$38=H*B>ImYB<;8vCnP-aH)OlV(*)e$*2WN_F-vS9x_ce%vDo zXDHb}IrAho>M%_;o{{mlJj&S9n>UK}=P+oWC%I*P=FA%nP5K`HWPIL=#@npol>J{; zlQl`A@mtK=kBNn>4|>)5VSiuhN8CH#507u~eF1mG#tR-7N;iUhQ;%+StP>O^JOCwE zPvJjd$>Jv&PFjP=h<~WTrZnbqelkOWw^rd!-8RYX@4UB-n+w%}@2_G~7S~+PH&10Z zA4>)K))WgBtZ$>9451fU+-RP#z-j_MH?rV>G<+9J`4&nXuMm$)KVu)Cuu-=Aap;A( zc+-3YDSqUz=DCr+Wy7lxWp@YNdbjR*l%WwTX&W{VEoXz$RMsf8SOUWkx1auK?;MA| zHd-qozEi}rto4)|hrUSSXr9s3KcH~t=bt2K+4@I@>Bn~msf-JkIcqZRePqfB8Y^pP z-EXNLT+UAC_!YC5tW7cUp*hOH zy5mb>>ca~`_=3x`Z^=8AxVpkqZPSQeKv1JpP>-_V!h7odWP&;SvjBI0Bj>5`&JWFn ziMx$bcssB}&j`d9i(yM+ECW@n4l2l(v% z?#CE8R_vJbcd{SZTwk>~v}|F}tqXO}?W%T6>ru61!@EJ7e|z0WuYNRi<1aVQ3@W?v z(aX+;nfuL8l}+oB)oJ(Pvhe-QH``05HaC4egcVJofv@qBUfAr&554}*9d9>QKM zcBkC(hr)B4j}g|6mZ9c^NS!Fkb?W?b{U@qvEU*Ud1XW5)H z`19E^8cGV?oiA-q+vX6K%}CI;6|JTG8NY9--L-H+n-=3EL=NkagFFB7xHvilE)7U?H!GHhg7d(`=wLi_d zfAk0B^QYK9nvS@vUH<>Y{?QMqchbU-%0ovc@gMs~H;5TE{8seZQTODhUH{^liRD!U zO>xOt>Vn#ebjkf?_saeoC+%C4bB5$-0j3h< zppkz2*1V;v^j+2?dxC%Y8tsp@{`do$jwT+A+mdt4N$`LryREm-tYokFwCfAStHtdj z$R1OF9_x^S2HQZ&HztuBY1MAWGjmGfNL(W`4To{SJlQYhfd0)-$^4aR8?f}qdv72}KQou* zfA!Erw5F3yj~y13x?k;=F((Y|B)7`+ik;*U{z+bqB%>8af=c8$CSdThjCjeQQ?`sb zCJeV`Gh|UC%Z=)(oSYs1M>HyjrP~40^T{}&x;?T0_Kh{2Hy7bu?oy_ zFW;`FQu{|X7sG&bKWYV(Bv!tOfjwCS6x-i+BBd$97p zN*)aC_?^d+Cr|J9r@kikW?R6lg0pDW^6SZEdG{lKkae{mc>U z*0|-hM?ULpUCb_PiCU(;Im50T|2KNA!E4Ds(`8Aeem~RhwS4V>-G9ZS`2+V_4^p~p zK>7NTP)Dz|PW4)~SlPYSnRNeN>kOG>uLUT@UB6zd$gkJ>$k%IG{gv60+fDfFpHkqD zn7!8IF>U+ANB>@{T6(Ru^jb4juhsH~Q~|$U%k?kxT3__`TK;-^6YcB2(rcAd22Q=Q z_G`<5k-TwGy_SE%6YKpF{tEH|eb+E)wEP>87tmyBKx8h`(RVeusa$H6h}n0MpVD`c zpBZ?oju#H_Xo=;~FO)~#zUy)E=tpAaAMOp7b2ZE2dzX+b&ehIUf9IOzJWl!U?YpiM z=i@QEbl)X!ZG45|9pbg^5Z(A!`mXmyW$C+a5w#BNyZ-u5_g$kl7W>E09{jX*liSYz zOV*LndsUy^9FU)H;!w)*zf`~EowU)ZYwgnJBlK-Y7FaE+%uYNd1*%SA_0MwAKk?D6 zeDrQU-M0+qcZ-?7^Cgz^p~|^;f9K=k{2V1j$GBPwDzIbxxs<5CS6{Ha+9g)Lj&ZVh zCCl-stp5F#oTC-s$8R1mV_%^B@OF&dY51`evv$!W_P_p6>>d5jxPbd70`5n0-><(^ zUy}7t!(1zTc|YLjFN-AnGTVs)&flvw*DkevmIV9nPx~c$=Y2M_p11qU zAGhRxMPUB&(jNuN+w&RfJVtr%E=OZ62|pU5zsMJrWKz2DnzAKf^6SmQ=|@BI)|!*$ zy-THi8T?q$IfTWCiVu2w8-q2ejHrGbP*T^J?shvyu=B*-Qv}MsS~J`$cv`iBrh7U> zwa4o0y8&LE!ki#~=NQBd6R!?=)9jePxkP%u0B=Eo*g`$r>MOHrSm-I0qOj*cy-9!4`|L$^-EtHYH^A3yne~0%kvR4P-l7W zMFskm=K|B6vpm;}yGxYkc~SHM%5!-CblxmpeY*1WrT3pI&!>nCnd>aiLu5_A@?2rM zbC%~0ad(OG96m@ouQt7M>g`W~%X-PM z@vlKL(QrmqQSpXI+-8bfI-dxVX}*Hj%i|7I{l4{FKSLN1B;qL_)M9))jeQj7ff)_rDFZ5{MgI}mHTRNrW%av;}-^@BfN8rOG;G-KQeQLcZp?p9aQ@*hk6LEiysN2TF=AG$K z9;ezCRZTvmj3kz~lUk(67p?8DqSbZRN->lzuJ@@$ z;a!g%mWqA9%z_1EU*K+&QKZ^B&a_!7t^Hc}Zy~+R7RjK-f4sAlFljYezu{e?x|OJ% zEe~*avvN1;iF`FK@{Y?=aNEA5zqh*O{7cHY_l@g#aV`g^1^E6)Vl89VAFp|V85HwRKE&d>3p zaP!70(Hj(Q9!3GxJW4d&zncF=m8V}dFHuGfjv}7pU*cDkJ*5Iczsk`Z(UgraAlshD zC}2GCn|q}H32?W@bhpzn)OkVNl?Aw)r`(NtBGvy{;9=ah&%vzSBQ1&@9W1Ipo;YAzo=>3A#u;R3w1Vj$k$oP<`Og1^CBdb6WYdPEfF z06*K^)Fd+!XIq#?Yv1p?Z?e)c&1dwBz=qXy;-ANr#LAb)N2Dmf=}klXR`1V&a;1$D zu@~t}*0&eSe|&w_X#ar!D%yARzw>$SI|29N-nl-=w>n5?q%&&YVs%ErH>7o)JVr(U zZ6734!g2MoCY_?cW4=1sVN{8{NZQc-sCni$YPM0n!c+36Q6<;G^0+r;QK&W8`L6gz z9^Wc?%h9+-tkSP4vp$l z5HhI$VAMt#XwZtt-5aAeo>q6(S57v{(LE$W)&F^-NcE24*%67cyGtGYp!x=eeG*CO zXWFc=-@C`V2ujo@B|sZTZJdWEbU?E8vu!B0Y8<1sW;YX{Bqwl7_5obUxXcRahgL`% zd?Cr2Zt|nR^1$A$Q)ju9_QcK)(O;H!J5rTEgaU?aatehV$0Z2(;uu8`?F3BuyivaR zuw8OHt&kq0L}a+;D7iXTJgSm22XW*{yoy4Dvq(0nI2<;Mq~u|AFQA4-kOXO?QpC!) z6!mV2PJDmoACYC^{2R)-cS-Hl;{4J6&W~BnzpR{lJLV7W#`$OaJAcM<{zv89`!su4 zoU3U)|MoT8axRtE@hapgalWCy@3&db3#CT--XLU%^HeeO_kE=0e5`WrozS{joL|x3 z`I}_EU7Y`;f8ShdIhU!Ra^IThKPKW_-jB(op6}G%Q5#=T9j&v{ti?nc z%!#Vh8`Ww?YoXUlYnM<)X!P z;CkjaX~!k~SxSe!vvs;8Xn~mdN21npu3nk?`o=%b#d#RcnXUV>i4bu1LwX)Z3P+Vl z-y7iNV#~|lt1NA`8?#N~r7Y&+tqyg0n5gQ@+@AfeG}C9FJ^Kv17#w~V-p!+ouNs%g z9;bkiKA<*AS|3y)ov}k2Eg{{bLgHcF9RI3Q-U7tyl=!18{q`;r|4RZ{`uN!+6>140 z?T8~n=Bh{MO1@Dg@Ap^0C03+PDt+}1Y#+zx_CuKYd+PaNK%~Cxjg)tg8?PeOUPOvy z5#JF{5Qy0$&_LhzIPSgFbO{!v-T+bsc4tA`_A`kV<=w7TQu{%oWHJ=SU#Jp z9=(I=7w6#f+jx5Rhrah~XTR&6YEwVV^&Gza!9nG#f{qRgeQD7B&Ow9jcP_t+2HUq? zcAeZhw#(+oJqos)8t;qGeX0$De6Br&aO|aY&hXFOX@-C8|Ht8PBAkK3&#}Va zO^x@J0qJ+1k7W%zIFCl=h2?-N`$I6k{poz~VZil1E%Jb#Nhs2n2dwvLTFiXY+S#9W zzDc}V+&-F|94vnNKOeu-62C^`FhKnBmJq+wvp#M7#H+>aYe_5d8!SKGlJJrT4zE?h z%l_2iiC3(DvcppYFGdbBR*^AaTN*yeV9YXO21sj5u*{;VOSns6C3f4p#72gA6R7k@ zf?M%*NWh7Nq=#4CzV{v6vtP4q2|hmd+K+xTL}Te}+plI)g*Kd#mXs57)Q{^pa`2JP zp=Ap?nacY5c$yIFyoxxsZw`^+5(`G9AvWhYj4L?R?UqM63*WR=wQTelIkQg6`)6Z9 zS?bdf^c}@+!!u&T*&w5->@%F0R@k*c&dPgD+~K5+cxm@P_F6bGYYU})zxV!Mz9we& zpJc@lO)_cVKUz2b{{E=gx_|xaspaqeZ}o>qYNyy-wQAM4?5vFJaT)nHtV>HRC~z0% z-!RRcvn;b3x8h8fb&iu@*3<+;eZcaZT)2zQtT+y=3)SL(0nuI{4@g_A} zNlP%(vvYIY+|74CR7fJTEUVc$Ssu#io~iQ^W+&X?n&c`}37@ulhCAC$CO_cH$@RFh zR^(-?ym6%atrfwQY8>qLDm|#s~|JCFgx9q=5|fF%{5{8)b!olC3?P?J)SYs!sBt&>337kar<0xR8t*4LUXD^U|5|U~@h$oL%k7$}D^e~6 zT0*WX-CeLOKPyk}wUzE==-s4AOXn=j$|;}@EKMyea++pjWoKJfUgLZ>E?2tkkSxXy z*JdXyoEkrS#%0=N_D`2~zZR)2)@J9pG}o#uPo_(yUUOYz$MoJzO3hWRyEy2CYDw`Fl+1dE$K|Ni$l#(hj z^e8VkZ(M3#o;xR9!oDXz7j?_ZNp~07N;Yr^W<>4(W3zIo_*v<`*t*Qz)NG3kQ!iZ+ z(uiCq)gujUHnYK#>2~D|l;D3#%{AI6Q9r3Gg#~VxJ9nNtHG6grEeLU&G%4Smnm#i> zcSZlO&Ez`s+M9N&tDV8L7kR0a7)_I%sC2u2kk1d$W~_9((1*foDr*km&&pjjCpBla zMk897t(p{6JwGewL2A!eoTd*@-;|jhZd_`?>bR+Piy->%Z5sy7tkitBOEo_Dq!h|0 zGbi;yYFQx;Py&~`D62rVDyC``xI~hQ;K|Qj?M@%A4XAsmIq5E1nj2Q67MZG(o}2SE zk84G$XIZ8lYj0LLb#c<90=K6yPn(Aixhw2)E}*H_)PHd+bF&Mj{<-3E9-wb<=F5Cq z6%7SdOq8aG_Jr<9o9Ze^C9|oJZfRY}bWdu&$CV+)8=p&CKhM34;wq$Zk^HiiFEs;Y z!1eXnxFMUArBs01wR~H^YC!EAk96hcWUr>eq9j=>v(gJwvkUMcRkgt?d~J9VLC|f{ zWs09tx5;H%!F-iuq|@_LSLOJ8lo*Il#(!JWT9~6JEfZ|uBm}DX3xLNm8%>SppFGNL5&MEhBmZjqG|^QGFD7Bij6QaPbCoy@0*s81eu zq$@S8K+;d9ip+JI)Vi7ZYV@*fwRVFqUkb!Z^wH;klB<9^m6KlJ!gES`Ait8bR=DjJ zTD!r+9e$X@KBe}l`O7k;RZaD{M5E2bn4_bqSP`DeI;kO+)2|iu>w{1&r?|>(C4Ga) zIQ@|7n4gtqHb+zzhrj-QI2~#?_}w}EBkvdnu9j|mP_HaE+70%PYYN6)Q>dx`<%i#2 z?800+S=yBcPyng*RP^j=)YkL@O`EkkkFJi^6zyP?ol4=aaFd>8s!Lq$_8&q@{F)MJ@9)b5(7Z zT*!1pb6INkGP`SB!C+Cvl$Nu=Ia(R7IY*M?H5oNczJ9!!0ahRT6|%`1Urusa9oVW= zT58D~bF}2^k6jVhMdIGqXUibeZqvQa93uw14DOA!dIy&|3^Rwmw6rVSlUy?jSFBha z>6)2Z;2B_CE;V2_UC1&SK*)1Tx@PrC+8`2|ndv0cl2SS7@5dxpTwXyIPZg0aM`>wZ z5zVruJ@GFPDgD60@JUfzBzZoiBdu>nsE=Upr94{r(l^PadEIz>Z0~anO_CJ+1FOXu?Wgr*GH6LihWnmlXwPKa;2W^@v+{-Q zb>!!_FLd8P&{bfSy`>gOneH54%!q*ZMr|&UWM?+)i2p}ka^ju z%hY4BH|24t6$8ac29ztac%G43N|#2u>4WJnC7bB!^L?V4C8GIBIGz>Nz`!m7hoE0% z9OLGUi~{L$A8r_Bt+$)EO}A&LzmvC*9Xr+) zH*enDdCayf$VsK!lYv++kHM;0Op}?g6{-0Tn#1(3Xa|}g1H+{v`ZZCouU&t=H(CW3Qw>@Bo5&y!eYa;jCmW^_zCXZg)(GHl*V-S@;D@mS?$(|-ObENimBH#eu&K0=3u?` zcfoqi-XL{3?Nd0tWyv3d^^aSE^|wlc^<6Ix)7QN)Oh3>tOz(6D>z&L1i<^bGIggu_ z*wtYtepC^!Qtafn%q8#S_s}3slapa&R#{Gl8On;#o75EW>=-+>5@(TZv}9#w{*3io z($c|iN%IA$uewa1@0n;$1o^y}pE`Sf)Y7;(m39|yV#szi$)ZUPc^~st9Tq>QFH8Vm->@3EVjav^7bot^kBlj z5xO0=q;pAYuzu>zV0|z7Gv&ZAJ;KT#v0I4U>)5$4n}}Utd?i1s{uHbqKNYNx+!Cy} zkcW}AX8wv@1$KwA8-rOBcD8)t>dW+a^8OTgpZA3j{aC%3_lqzepdQXIup(TF{Tk}; zEUv4E=z63jS2?g;nw?HN+(7mq_uSABed}Kbub<-PY21|H#;%{D5BeJP0lgbPUNpdJ z$b3rf7xZM@ZrKs6AK)7OD>JPrm^E+(#>u|FQE3)Uj@uKcU%uh(z&iFR^e;~7bSvS< zK0I(7CfqWBX8%V*Hd842onnP8`n`wW!di>b?%ZiJXV1IqU#(&DqnE1km-eY1KZUJu z{EgmDL%p1`^E;5VUpJZ0K}$2Fk6}phABc?^ij=$SnPB}K`rvG@q%2A>pU34im%KTR z**-33JX_iD^zxZtJ)CRC=XE`wI{5tm=z18xkI}!J;gYsa-0j6pDAx$=cHpMlGJhU3 zoy+bIZU3cwv`0+ckaBVHTPS_#P+}qZ$e4Dz^^&ol=8Jr+Lq5flSN#_4*Z3&kYsr4X zgd_6B4tZNYc3S?R9}7f3`t^U5x|DT;C2OZAkd$w9p-jOzi+3Q;0tFrSF2d;A8LUs{ zlJYu9{+E#F+pT;T`wr})xwc@omP^D_FyD_^sU??8T9ele*!Hb(HYD-53H?K`{s!$| z(B-<`Ksh?1)9>eL++Xn=ZTPdam$;o&=8NA!D~{r3ByNu3#*U-Jrwwz7|9CQ526=-P zbiYu22FZ`ozT)?NTvdekoFjbEOR;|%yLnvBu+uSDVN)J{FQ^An6kl-tezo9F+B@Xe z+rfH5VX!`Qt1tZ$zS!S~{YmVd;cLZa`29R|7>s97L~}?J;d@yg7`#v2Vn#nd=tcTYR%mz)b3zG?TMen%XD+oFa@pT%zX^&bV@4TO|HWAs!>R zob6W9W0&d2-$T#2BKFYl5y$PwN#2XyVa$uUoMV6#%!|3kQ}*UM0v;P=T|q$dt4KpN z?xaYhT{^&Tp^PnLoGf|gTZiBimcfKdzsRm9oQY0%(k1xZI_sW<glo4? zvoMo;yM6MFuM_X`jwxk?eIp}m@>klb6w4p+%l;d%eflKNY+;L%k58YY-RF{Wapu3+ zZNpsWvh&{-m%NPmUa%g*Wy@Wl+-!Tvx1HE6x9n~6$PMJj?qK}{=I7godG$o{I~F_9 zBirrx7{|EDT1OI?^J|gW^!H#rjBD>*x}Sg50sh(k+PqPXU#xLizyO_hAUw_w5~%F~ z3@V}h_&#;>gbxkC~*)#l45iA*Oy#m>}tsR?~i8VNTBf8$&jwx5b3j z%5`Iu_-{U7Ei5o;&PV^7;aE>5qTkxa%XE2u6n!q{x3F3$^=qPp?-$~{yL|fjFAv+S znlb<8rI&t0lK3?c7s+gA{R`h@##5CIzolM^o4`MNeEFY_vef5T!X2;5$9f?X7&!L> zk1zkzu^Av>hmq**<$I{F=(5yvX_v)pIA%vMb2uIFr|98c+%Dv@<;CoI?i09dA<>zq zX&2JD#7uN4f;x1;lC#|fvgGm0^rrK{`W0Lub9EIzF>B<0B$t$NHTMJ6zwtMVe#V*a z_x{Z)VfOm7%037NAUmOR!r zGmhbM`ZGa2_g+%e>Ac@>slO?fpU(Qb7BjiG`pAKfzCtIgFn(UkujcYnTuFgQ;7snCWHyWh-tc+$iz) zcASnUfA1(pRSSu081k`P<5ijmbt>L^|5W)~;X2E|2s5kv)$_kMwD}X3-eo=872{^$ z_A}768JwiAmNc*9a+agSIgI>xE5KaJF#V-qeFB$LAH0#benf1&Oi%bISRc+c=JjDL zLN~{@Vm=eIpp1~DgH%!ldZ1?Jl^m-uT>_HVx?sPUC!`N)5yxiCjsd4xBkmwBrm#*9mK zy=alH;!%vb-M^ai)tC*`Z`bDn0I3y_P_Lxn6G&Nduv?j`i3u`#N9xD6V&s)8ee|8MB+(0{uUA5 zOs?&ei{xc7W&@?u>_4m$mvuPaPzE1=9LBHH_`R3Qb-^0{T+)B9r;e3AgZm#*Ngrnf z>*Kh>GIV{L+tk}w%w_!U%qM9J9PgTC8cMxiR{zQSZTq1Epdl$@$DDrknM$ z8uLajr@!`ZbNptl0Fu=QIUaKfQb6HL9yjAhC)ap2<};n4Iesq1T@P+tPvMRiw*$EH zK95Kos-zy^R(?DCzZA@@@!i1l_sk-UUuw>a6pHdF^wL8yO9xlx7@-TZ^?+U6*lz{DP ze^%q)Ni9TAEKWoX4bzJ9&qr_9<6a7u%|FdAdXg_`Lt7d(R#Vno6oFB86bvYJ^ zIh9W0kcZm}uJP)9=pYUWOWf|nU4yt~@_KNW5;IdjTX8GDo%*R&dG%ACKl(i~GH;^f%!6Yf#@zA0%H+lUIAWq#d^XmGsAwk0ZI9=91Q3nB@nU*ATBs2Y5c^ zn)z2V-y1L!|7}0b_StVa-6v(4E$U_Lx9A6WH@|* zxK~KqcXYio-E7Z;c9`Qi-ksPxh*Yooake zaENl|8rRKObeq}EdoZu$l1{=*lf9MFSzF9HP>s6=F4ill?Uw#7?A)>RA9rHnr~l9R z>Hh#tDi7k;dkYtCeLnjC8c_cS_05z`$G;ZxdN)^nshRd-%ytbB&IH~co2?O#&(_Ma z+w0X)^oU==90fbKWBUzU_NFi<7D)u zvLRSc{K%|#QJBr*GUtQMZDY<@itZ+1pUI`B_7{ zp7`wGYNYKIKlfmEm`mD1vL`+_H&0&U`pJsBCfwLrvJ<90}GBqU-V7hN*Q4V*U>1FJV3dGl^#r zX4PC1ZnRgr1@0cUeKlEyOat!aPV~El-@;ZQro6s2_Z0`ERCGprj^{$;KM!qr`~6-7 zX5tTB;@mu^to1)K3-z2W;YYX4pU>`kQUVuexJA1OAdZcfybSyr~~zUW54}%*S9R z;Z|YRz~$5rd-buoPu$;cDc@Gyi>XsTv}#j7Xg}2!^1)&(@-E!k^0t0Ni#&#?gN$#z zB`S-NlrC5@1C3w(9OH+ir-wA|;Yz45^IXijxUc52%U9yOhWwbt_=mthW&cXBp+KblQ729J2}hml9?fyFu-5@cNjnZia2py z@g(i#wgY#r=gl^h*2dZj8qmoE#L2#`LOvE* zxp(SU3TD#&pkH+5{!NH2D-`)+hrF#{yF?y)OTPx|+Pq`b2Fnkp-|~AP{kx=RfgW%# z`B=19*SCD%%zx26$$z0*Uxs}i_Uo~i{15cPMcnrPn)x>_kqML+`!sV1t!93;! z?*zF-CeUB|{`hx!ZpKYM*Bj_Y0y-k`67!cZTh28TGb!s9%%t6t{?c(0guhbQ9$Spw z#rw%Ux_$+h=-;&MrvCMiYnbJQB(0R(lKmk?acFJ#P--+iI`t?dK z$=|fUnffjE6R|&!z3qQBW|D8RzK%M3NgeCL?GfbHbH$6_mj88@|6+d-yER<4|JwI_ z{xjuwN&k~@o6yAj5w4N=9d7v_-e$&M>}O&(l*{%%#rB^$1}TS21yF_Cw%_v1iTqVz z!}Q(czm(-J%eIqILc$+q81 zx-6N2>X)BmLXkMmBmOQf(PN3f1TOL0hgpebt|G*LCHP(Q*$_R1EA})EY*~|6<%q+9kgw456%nRPz@!pmtoX-SB>8DSd5&B`=IN`02XebX34b|9djolsiegO>=z}3$dIR zclUzX^WtW>yyuztAAVwouD^aj zQ)enN9EY{ALnLe2QZ|sXE{pRh3e)(hsa?SSHcRI(UB@ zr+|mYs;H_RSFX#fa|+nzW$qDMC7G)>k9o7h+yX|5NEn-ttb(w2gJV2C>>$9;X$DmgbKFbJ(0H?5(>kt>!f zZxsFQNXEo62Z~)2X2o17m^WbVjG@G@0XJgijTgV|_2*0v&C7W}_7oE^W$AL~=X17@ zbvA+btP5*Pp=@PmS0B4cW#i=|!!>`kRA)SBk7#k?hig?P`{2}eb=fqCvbxze#!*IA z#S_2ecoU_S+E)X$hic(=4P+=48ZfHt{U>jML+OmHSZ&Vbm4u>kN-7uCd+Zf0pCUW?YdqtjSHR+RcL6&jak{m_^+^ofL zr@NL}2SS(yAsbrd93*#sy{=!lXjH>p;TMet_|}&%8m(~Xbr+3J{CxWB7md(pO?wwc!3mKU zjYK%^`in*$d=yDF zM#JSW3GRU&*aR!#wXqkCI(P^+!=S0i!)O>biS)y0SPPTjJJ17XO+y}Lz&cn0o8j}Y z3!Z{uw=({jjyzlrlVIWu#g|2l6lvcERm1>^AZf#=r|O8Afy3V-ef}t6)8>hZUUo*a8p0ZrBOKr)b*MoFy3p z*TZDE8y3OSunJD#?9F<(9Jausc;w-B7|t&7GcX4B!DN`oVXsASIjn+}upTzR7I*=6 zLpifHJeIl$W8lj$84l&_#v-^KR>6ODVLTki_Y1ONJlqQR z!y1^tw;_(heAof^z!A({^}$G($agQ|;r6A-!#cPXo`f}GpNc$8haGSo95Iu64kKX$ zjE8T*Y?zXUJgkB>a6dc_<(q09&;v)@!Q3;9gpujU!+MwvJ#OUTHdrI(@Hkwbfjry^ zN6g~8FfbApJ%Bt6$wVHy;8u7itbuv(INS?6U_uu1vnhWV30J~+xD{r@Da(ng@9}7KX-?&oByZf{Ac1%!BEL$ir4x3%g(wykaHtFb0Osp`C?M zaO^7N;c1u$`(Ooh6(J8hU=y6V8hN-Ah9;ozYmkR0VIn;8F!HbsRzQ6%@^CC{f=RFw z7Q@iF=oyTH@4!Sj`4Qyd5?BFG!dln^o8ZKC$itXNkxwMQVHDg26X8La2SbaIhht$a zTnn4v)36h^!O**DCmur{M#4l`5A)!R^~l3+SPL)TfIOTGJ7Ee8okzGZ3Wk;-568hg zIAbI7Fay@YQrHCd!%nzk6Y}#l?F|?OgC0j7&VqR`2Ufr)SO;g6(r&}`unX>jVM(MH zM#Gmk)9%BMp$EFQ(C))@SO>SjX4nC{;i59y%?0=eW8f~B3{Su!IC?AXCY%QAVLEJq z+h8}m0K*rOALYoye3%TMgGKOlSOtT&ArI4G3)}>|VJ!^52YrJvF!TxJ;WStTpNCcO zFsz5?U<!frU?Ddg`b zo-hU`z+{*Mi(mz;g8N}Td23i@u3G^uQwcG^~R4upVAfg*==F zyWvV0zL@yI7?|)aJS>JSum*O+Rv5m7da)CEm=BX-B`ksmVHJEA z*2AlwMII)?ZdeP$m!c;y2KK;Y81WqPa1pG6+h9FB2U}q1w~>dFV0a4o4P)RAm<*4@ zA{beXJWPP~@C0muov<4Y{|@r0#0SQ}b1)f>dmedsAFP5UupV~678v7kPL9 zo`$X;AP--Mu5?X{s<~*y!Z9yiG*aL~SPb)EHJtbo;}+QT!;8il7*c!D2y!C_$G~}T z23!x*VGS&SC*UsV`Vr$6cqcpqvtdvM<8U|zw!j(iW0(#zUPd17g}Y$XkCBH9;Tc#D z^#>^DI>tRP0nUPXFca>8rEuu~UNrW=X|NIIz&2O~^-S6YI13Klha8NBrO*TSz#Xs= zo`P*~=TDH!qCKi7T$ll8!E1ktJiGu);gtQz!%El)55YFL=>YP}X+K~DY=N_2^()B3 zH()88a1eRufsJtD&yk0_p#C7?Hy{u5;4D}PGvVP^8E?ROhZwKG_3*gxHTnw}beR4k zn|=pI!2>W6h99B7fV*G?{2124=Z@0fz=%fV;XxR>g8uiH$iuxb5gs~*JaqjEdDsAJ zVZ?Fz3pfpS!E6|oL;k~PcmgKDNx!DQ5p!4xn_wMuoj@Me!!8*98{~7zUlLrYZ`(YA%1A1WC>&U}3unz8q&F~cLf+K#1{6nMz zM#Bo21dl)uoYIUuEQNLOdDsjO!7g|PhUHT~e~&zz1e0LUN#x-~SP8X1AP?Vy%`p9s z$itbZkT2jKM#F8e5}t>3aN(bD5BI|^c-3j#dnkVx4c~!D@XkLI9()N_!pq-49|h`ypR0Dj5lC39C{vk7zsUaAFPC}unsQ& z0C`vmyWmw_$gicpfYGoMCc&%!fjmrtm2eZRgQG7X4~tMv4g1*9NxaLFTVGZ=a z-QCE;^RNz1{0Mot26n-NFl-(1{up_<5GKKq7m9rZ8Xkd3up4^d*bwC5 zB3K8v!DiS1yWn{kwt@b581ir-OoFA*15dz8*bVDoHM8E$@O9V)gDyk9gnWh3@Hk9@ zeb57=h9eKtU>&T4&F~29g55A|Bk}w!@^BGMf(_6E&%;VMW(4wZA#8@FunX>oVVkH2 zFdDA^9P+RZdf+>-5{8dN9^MI?;ab=Q=Z!-Caq2ychHWqjUKxr!jE9wQ{}+&lAH!yt z5QaS51j9<{pI|h+>c5bOInV=7z)E-l*1;>UKpt*`UGNPUwwdZhm)ru4_|^F7=1hPun5+{1F#uRi$xwbz_4#Jo|uX}+y#^1 zlxfJr7FY=nO-CNCoq;?Y7l%BY2E(ezCm0Pk!6aA>J#h3)Ctx%jz7%;l5qe-6tc0zw4(?7t z9*#{#9!8`gUyUBYXy{pnJRI#t9?pQ3F!TZBVSOg@FnT%iP|HUCJ3P;?KpsxaK_0#V zJ@C0)EFwVc(_R zd60)SFbST79@q^l;krWP;U3rwkHIcjv=aGU)GHVbyI~T1dKL1p0an7vMaaW6*bEQD zZa8gqj}iVo`T-aNkHJN7gz~^BrY=qhi`144QF$U(q8E`L5hv#64*stp`cEPJ2?J*9+Sa=35he3M? zAC7_h;0)LT)8XaC$ivBS7hD1l!%}z#4u1^!?^FCR0@lJ=aM$`CBNMj5QaENqkFf`? zhmEiXw!srn-%EbO2$)oYJX{AeVKpp;$KW2=0UP1v8D*wUu&*#ZY?*{edp1l~e9;226pcV6m8QqugN{JPcdm z85r^e`Tj%n4MxBkI19GHOc+@~y5aM14{U^uaO{($8|J_fwfMWe$B2Z_!Fc!<%!XHe zqsQ0^V_^+k4v)jFumkRcBYuRQz({y`CGv1G%!W(gR#*yaV9-;@!?CafZiS&Qqwg>Z zc0NtM!i5+&%s)#eT(`A*TF8h3x@reeAq$0!#iOz+ysl@F<1ptp6M~_ z#T>T4HrONgJ9~`Lb%X~e!;#OD?{F(DhA+cv81@|b4wK;-SP6svmvqB1Fz4IU7g!0? z;RRR8?Y8G`fiWW1lPk(cm{_3 zg!XzD?G#LhNpKJJz$xEDU&S2O!6UE*&e)BE@Xk8q;RSda-uJ)A!)`eGXFQMZLmtk6i{N><7Eb&L@-QDBfG6Q;IP|B; z!wfk30MAiyG7R01Je&a6!aZ;&d>tNuUGOyA{xjs^0XX^<$_Gw{=?9R9+u&MQ3wOdL zuOJVfho|8ium|owi2Om?qeIkpm=06mL0AkYyoTPvwXgv`4_jf-Vf60j%uB#Aa6Oy> zYhXIO088NLU(im&b+8d0f^F~}s5j8Q9ihE|3*jtS53^wp+zPvoQeWY;M(QifgdOl0 z41JYy{3Z1jE`*72EzE-leocLa(I?PbxV;&@h5KPA-1B?n57BV4Sd6;$@dAJ2u z!0bOG56{3R82Tpia2*VNjrIvf!Qxir;a->rkHZSs{TJk6@>|G5*I$u`)iCrh>3~tN z117?{Gswg4w~>ci-$5RR{0(_Hv<-PU1BU*B^uQ>11}4IgcI4qMSOHJKTG$Dj;L3NA zht)9j2;~8zVBT5eVI9naov;EXbs!JxVG|tp9`Z05h90Fqfl)C09P)4)%!BE$0&a!1 zaLV72hn=t!W^^LoNd1OU@MV|?*SwEByz(Ek8!!>p!5y#}Hoz`;^#$6EU*Zppf%kn# zdkc5LB6ti|!N_j(9_GQ*upainH{j@F^b=aIF&R#Ri{R)Xy~bLY0e8Z!@BlmqTj7ME zy@vKH^a8rz(=ZlJ4(T=0;TBi|PYvrecERPtdyPi8LizmbP} zIP&lmJPyxYiM-g4M*all^CjeA#Z}0|)-NLupT4@+sDMYl+H2Ipy<>WfCV1wWUZWG1 zUfXMg{)Tu&^cvA{+}C@JB-jW&a7SdXQ3+of*K5>?eN?Z}49AS`HM(Hb#9kw;iTVel z;W3y5$K8xP%z>4#0oKEym|mj=z6`tJ$Xj}i@ZZvp!WeiMCd24Sy+#o%zO~n=g2!${ zUhJnJ53_Ga9xjSS{&ngNjDbg{A`dgBQ|_<_?u6TCQ0_2oX0LG?UUf&W(E}^s=-<)b z%tCMAwRfR6&=rq7Y=k>u{T$@s6$!}0tLGvQ4<({E&D5W}(HnRUroe;qdyQhaCaKq` zh8?g0#w8j;X!x?CNJ$Zf=*H& zQhSXtuno?D_obn?@MTy6Ti`CZE**Jz%#A$kegOGDP`@*ghna8&JO(r2$gEzY6wZQs zU_NYwla{0Ru;@YbzJ+|xMepH+JoFwehna92EQQBB$ir!c$ir^f2BTIY|3}&*7y&ER zAP@D2k%!}8so29ka1CsP)vyg7f%+-(6-L0z*CG#NU?yAwOJNDz1NXv4*aX|)1*rdt z_Tdra;WRi4X2MLk4VJ<>xCfqsjWB#2@^B&4Pctrq5%6_53x+<5JWPP4a4XyckHJQ$ z7b6eHLH*C94@SVPa2BkEnXsb-d6>Qtc~}Y?;ml3Q!+NN{LAzIqJiKBv@^BK&gjG)< z4;$bf_v`m16^w-kU<&NMfIQ6m5P4V!8{pO5$cs4)YNsB;2srj5^aeJ=Y#4hH zy@M^V23Gf?cQDaF?_jppXN-6k_b?KU8`5XQ!xoqg#}4f?w!%ZO2CfY1GmgXV;69@R zriUPZmiAvq9=2SDJX|>(dDsKDiv4Gihq3TDJOVpl(+K1{DCf^158s9Huwx|huw)eS za7`%kaOmfehbLhN%)A`=_h?7HfIRF7>oXEz@)dnX9?XChu=BtBj9Pduyw7NY>;I?E z=!BEL*k^>E<9>9X5e2JYB77OeaP2k7!}Afy!>a3$hi{BWzLRz{8hLmgCc@B|KEng!Z|yTG;d8JK9)!)XX>y;@ z1;cOeGs50S&tv@z0AY`6%XhihT_3gqGNT;$=}Jmg{5 zL&(Fl0_6W8{TTAFZzu9_;j_rYY2WTMs^MF(0lr+_XSBi{yZQ|60{zGCKEnlrUg$Go zVI)j}QQz+~ieU$=hSO@0hhtts9!At6{~_Zv=z^g?LLMf-6!`9sk%trOkcT_>ArB}0 z1bNs1wQlsZ9(g!sKk~5oXUM}nA0Q7$b|DXU!3MbeL*!v{H}W6hFLc2c7z+=5ggjjP zG4gQYMdaa_9^~QhUgTkAAMzhFJ~NPm`(X;aFUT;8;o4xnOK_3&!y-63gfj_y&=Xh% zYlazy-b;Szn8O;FDEF6fb~5Z3ZWssP&QQ$z;D2KdJHj!S`!5>C8F(7%2J&CUAGqji zxQ8Qd#63JPh493F26Axi9flD~d`8SNj2Ji>R>}Qr!)SojnPxicRBVB{Rq zA@PR?;N(QYhokRCUg8N`Vb46`L%a?o5g(X+FZL4OCERO6w6!V75s%TSxZ}P9Cc@)s zhLHy+FEfk^xrZ%spKcg4h78fN-G-3~YqAYvD_omr7_~6|A-=%`N9P+xH|&6;hYrye ztul;Q*zuTQq{Gu24Wmx{E5#jLwAnCRxQ{F|j8g1(3O~dBcEhNFTdNFX59Y^VBOLK9 z!)Sv&FckaKJIFtH{29Kz1#5O1MiU(UtYLJ*5xWf|EQol&h&$K;7s>rg=!e|H1~~eM zhH)Bhh28J~3=1Y6wT2M|cfxoWP7^7AL)Ik5YeUxRA=-f#*|9z%D5!MEXv|$)3;z(L z%kLmAZR$vUhEk4i1?drk*t@WwaS8ia>~~;4SpKG9Uw;Yv zV(d>|!oC{&u1nZAV1M~v2M@m$`z4pK*FHo3UBcdl{f~h={ED%^ z`V#il*vDf3l|jm<0sA)WzaD5mW5Z{pezsyC_I8jSIf%VfilOfW>0ceh-i7_O*!R<4 z%l}yHvNk)>9 zQ6tGnl7x|wSv!&>BgyaeKKI-@-E-f^`hNHO`#pZY$Irt|=bq>L|NDL3=Y9UnjIRE8 z&u{f!fS2LA@)hB0@N7-`<#_qtfZ0*wH7dS`H{jdwKdAWC&$lpR=WzQNRllL8|97@; zbbAC}hU?~-Y$Iib9&%yIF^()8A@ILWw$FIRRd&F&`E#}KY7e>%SLfPReR;JZA0ES~w3K7KJi)Wa+Aau2V?*LZj%-iV*786Rdc>x6^) z_D#nJumAGzDU9T^r882mYcTqm}ql{7(t`P_@BEJS?PH8t;yIXb)jl6Gnw+ zY2><|OKHtKVMy~Bt{aYW<{=fQ7v9My&6#W;<%6cksex(MnsXRoDhZPwABN9ry)*&e zg6qzQbMd_%@mJtO{rrA>P5N8#aT*U3XCFQj_Zll5+HenyFd6ZA*z<8FegM}UPx*NF z0DrSML3~w)iTF7D^muplRViUA38NcttMNKb9;%&p;H@RUH!VI7J}Wo>UPi~TaBBo^~b>u{1n`^ZnekoL6v_S zX&$S|Kdmk6b`S55Z^m`)KN8=E>yFb&cxsA1ekpzyu8Y4KUxD|DFTY*C9e9&R`UmmW z$LP~fqhV&@y7udj*W!8c`SV#FUnB7jZS_70FT{1nUn!n^tln3v{Bd3T?7(+=_(7F^ zsy_X+RMup;F8%)a9uFUhcRWs?{v>=Ot~-88@e%Fx`LD(&c=!%{A+BrRgLn;oPJI8_ z<0tJn?j7J)#k<|V{qaTZ^~cXhe5Hp^!Z+aUH0hV(^_uu$;;hDJckn)k)Dz|aVRU^c z$UOCUy@&Ch_%v0I_z=y{> zpVcu~kKcBJ{umbRx%R_#$8Z=wfV;+koqra-D6DV4(RdAhdVKlp_=WgBTsOy*;Wu-uLjz5>@BgN68ZTz3vG z!w=!Q{;kHVy2^xWVypl0z7hQ~Dvsyg1FpNj8pdzNb?3M&dA=~U7BadJD*km6ym4!(3h_a?|6#7e${w?oPUlkzny+PFw!HwIDz)}h#$r) zaNYcrg>S)K$CuqcqjB?8{TihZ?}zK=pE7(FuIt}wd^xVIKYmJv{`ga!kcXcW-+rzc;T~Ry7vj44u?$b{rT1#Q#KY_H+}`@~iB6nfJUoog!gcd=7QO<%Fn)Z*#y{SS z>*`mC7xd9z#iZfc8s+ljme zpMdMyumP{q#D_$Hlm92UR~x1iChMF8dDv~3gD=B%WgLrd#rY>;9g2Zwyobgs@GkxI z@oVw%xGw)je4a;q)wxx;F8_3Vr$_u8eDJx_{GF!!WARzIu6)J#I$U?2t-$xk8>!4mdQI=&s(jqw~jaGt*WWAR?NuKdM#0j`^eD)4!@uKcz5 zeq2}nM!drSefiA@_nvWG`={f#;=1zZ;EQlw`N!g0a9#O}@xJHl%U^*H$93&rix+yt zZ^RdQ#8(4zBd)DK-i&MOk7s0g)E^&(YwM4%!FBytf!E{O`r|bh=&u7C@f|qRK*I5@ zPSA&NUH<8Kc%VN29K0W{JBN(LC*r#Fi}3{>=~v*ZJmS~lJ3Qhy;s-tAnGvmik z?EHr>#&zR+EPlu%elfo6clz;Lf!E@?@mq_3h3opK5lFMlIG0N3@Os`zcVuKekEIj$>z z4j#zWmwznY9oLn=7|+A`=ji#_?!O9P60R$MExrubmA?_+iR;R*5*~P|zWnKU0j?{5 z4n7mtm2WJt3fI-I7~hTS%3pzphv>^+ix=X$@zaPe!gb|0Ph)+3nLd6xo{j6`=isC8 z-^KTzeSD3@%W+P_NB6Jo#rVKHX`UbNvHr&=8J za(({kcpkG--h%0zX-Hm;d;+*9KL;+{yKLC-sQ@~ZJ_4(N_-@K zmP((`hp&_E`fbE#59e>JYP<;_kuS{`;@gMMD*fbMyyNwI8GTQX&(8G2e9XWn;LF)Q zDu2g23wea;KEl4AO}N8pu&MGGj~C(ZvVBw%;IOyt5|$1bi`0QI2i{KCATS z;#)n^UxABj_33ZHyWm4L>F>iQ;JWgsG6^sANWU*$jbETie;Do?txtafo`LJyXD&Vj z9~Ym#JqA|bt8m?Mz6C#opR0+#4==hd@o^R=PU;zqG5ost_>Q?IlQ79+^kvA$C*ivJ zej>gI*R??jUW4oUs0!ch5q}##{15v1ycwT|>*n(geYxJib@^xFO}MW7`S^rq17>P` z8}eC=@rk(ldyD*Y^f6%faS5RQ-lNW|0QL7Kb-oQye``7%pFW>e{>}Jq+;u%;dj}5w zp4aQw9&$vZjzY=^OuDhR5 zh4&dJ&0(7Kx8YOq3pC!0*Wxc}yaNv`)!!l3J@?AQ)!&S~OcOsJ&%af_UY&^7;M|rw zx_ub`VfK~ajri&D?e92GttL!|@d@6=w2z@3_+p&X{?U2xS>0efrh7`g`Z262uR) zuO3gmBSHT-`Z&;!Iub^=ri$S6JUkn(#$D$UdyEv|O*ofeM~_3>i|{UY>gS?zd?r3T zK0cq-7^+d}<8*bx^c(QVB>k}%V4*MppRb7@!IS^4kDrZ?!@0$nF#iI4Htw2>V)e(j z;8(@R=d-F`Ii7J>;<>`AKc0uX=1M#L27D&2YrjB$^7)6p{~~w}uIs;Sd=k#GDslbs zrFdSv+x08LTNmon$OO^2%m{>(0DnXU!;#;gHOkG@f+}A_vr7P2Ds^R)>OSm@TzJ0 zIXW9(P^@1I6{z_5DVq8f;l-?#yQ_13ru!UNjxSvn(7xkWgYP8$KdAKc-0>UmLHF7| z((QpPu6JTS*6k6z^>jP_1h;47x5d2B?FIPOn9p!~5#H}UJN**3m*Wd#Uhei9+&9CH zzs&6o_zf{%?e+i@^M;t$x;=vTyx&fLi`%pD*)gwodjY;b=1p!d!bi-s({FZrIld<5 zffro&m1^)V57_Zj+}?msjd_~e0|R+>67zJoNAMxD?DYG(JsV#h^DMU);O!o?aaY5qmUpX<)Q2A_fJ=HCW<89qV9FLTEa zWV1ecNPqr{;1lp`Rs2eK{A_#+uB|_Q5ZBeO2wyQ@@8$R>_?;^MDtG=h_^l=S_zido zZna;HJAQzh_FW#<$B*E-xD~(79X}i2>Jh&H&tITFe-+`=J-i%W?cp`}ZVzw3!;k3m z4-DcR#!_kKs`lk8{+?|F-{;}kc-Eu(_yu?wuI+z(GtM$CVgBWKyM=nM!AE#_1HRD1 z0~gVLxUPH=yu)L5|L;i9|M((Y7ry}C7>nQNj$eciFVn{_#|v?5{Oxncufbb9u8-e< z_rEpMC*89M_ev2w&pi<@lI?>eH{mm*YJ&^G5@|1Gml}5%>5DTtfYq z=-W4fulDe4e7A=e;NhqB=@;QEJ-i(6SgDU+gXem91Ado>2k4k(9v;C5J)_S*8=rye z+P?r_iCgX8%iaD(c%P;E^vm%A53j-Jd3Xc91J{)=a4E;{vv&FVyUQ2BSKuU*@cfjG z^Mlgb^H%|$?cqguv4@xA8*yF!HF)?ry*J>WEcdAY5PnAGdAt5O3F?m*;kxVhY<#7M z7vPN^UW9jCp-;aY&-L&c{4Nh~z?XS=fSdR`Jv@S^zMwB(Ha^J13-E~^UW704@N#^I zhu7d;R_gn=0nf#)^Y1Ws{|30Q*@x@;H-dM6QSaG!zK0j!(>=Th4_E2aFUN;^cnx0U z;SKmo4-Z_<`1J4y-ti@U`Lgj`4==#)^6(;jnTMC-sjKw)*WiOZyaAu+;enxyKM#-K zJ3KraZ~d~qd{u)gK=H?16R_%_ykqHiSG0x_)eT@B=Pwl z@AHOTz9M)00(>@ptR{XDK4zW%{9TT(#C6xlHTVIK_zn1w_4@P!JUH2n>(Y zmu!42{ufohSqbWor@X1pzX&hDb@`X$6&~?x@Pi)SfUnq~Pd~tex4>Ka`bF@bxK+PW zcm1;QN?cd|0(_5$7vWhO_4$|MH{(|R74H0N@V0O3+qVI~!NUXjyo=)D5&X7I`ub(# zD?PjbKj7g-_<(ox>6hb^J-h~A=iv=_i#mP!f!}j{cz6U~jrZ0ZzuEY14==#O@9N_h z;X^&V9B=gS8oc9XefkY}u7?Lkus-qd2)@k2v+w^i>2c#ek`;dgj=IbP}E zHTWkU-hiikpf6uwB+pMgJc3W~@N9fB&SS=e=f?tkmxmYO-M8t>SB~f7R{sZHbltzK z!4Kg4lQ91VVAO|t4_w3i=iw2&-F7?w0bsp&#;d?#O zFUONV(bumA591k{{2TCG+!{ZZy4x?n!g7~K`Vss9u4}(+Jnd6``xW2=a9#Tq;raLg zP5I05c^>K4;8h;!H{jdxNh8a(4$`~9V1Zg0Tb?Um+ps(o&7d!T^%Ip%k|J%UgEPCx%< z99L!8`t?x`Ac{F0(@)Ce{g#dKFrXkUyjelt@J}LyT)e?-oa;kd$%{>3vp}wo$U6&O|+js z7;WFP-5$Yj#dYiZYe!RY{(I%V)voaqxP|AxErZedy{+3LcxB8_ zc6&BHBH12){oP)G*T+29?M3*gRzdCcOF2H>!)x%BxOIGtbf@2d_iY`F{!Hvxw+F^? zeS;UN_L=B#KC9z9g5T99sQ#=R_jes`|9n9Ka(w);3HsNLUxSz68&&)hUUBtr172{Po&F7O5B!nq%l1L@P8I)Y zw@2{e4tDx=ZqLStbqt!9S^2MVod0m^ z{2X}I)qfGZT^D`&*?1PNOTPdggInv5GwG;fN%Cl zKQNx>Cm!iX@J^ASxm2}Zt~>o~d?S9La=s3?uiZZdcuKdR_UEyS@Lb$#pRw-r%ki)9 z9`Wh(Sht)n7Ml12_;@$D{-syztaI(IRIruzWm&aIqHSU$i z48n9u*XL1*kHOE4FQ?tk8}Wr6@tg3S9`TcJ<33ameH}9JyKt{M+7 zH2Z1lFbf}r>-u^bUX1IGg*tqRNBlkb7LWKTe`c+Q>-w=5o_4Bt8w?}NU4+rK!32CQ zuItCS_#uz@EAW9C`uJN^{`fxC#)aZwBYr9;f*qRpVcN7WKI(MuF_2G~YQpHoz(hRI z%kHDu?mjBPn{nM3slxmA)~CM>pNQ+?H{)AzT^n||or?C+_faO^1=q#T$8$a6PsA%c z;+No?J>pm4`#j=r!#ka!FMl(hg(o`B)j6fZUm0V#ZVYDPWw^Hf_y&*sC*n;W@k{V_ zeG`{ojln8B6Ze{ncMxU)VRU2gpi1M+#BHGRNSnww$G!5%B1|=5ba{+cX`H3cqYy8` zz49n0%r3&{@~FWJ&erGAfKSK0@=(8MqlqxOJks%Anfl`?2Oo#);*Z6bdBiWq2c4s@ zLxoBo_o~B2!fYapt_)3hZa;k<$#-yGz`gS5MVKvw(dChccQ{wyPUG=mxGw%Iyu>5^ zGQ4MheI4pl`nXpe_7P?!VRU6ky_321JbfO0@e#OJ9{Ge>O&DDs6LB#>-%cfXe_R*8 z3NQ4CzYX7yCz{{XvE7WPo$p%C?XL+Q*8ei@ae+Rz9BmO}=|3dv3N#lmnUAWgc&mv4cVRU^s8joZL z&9D*I26i76;@Q6onycg6$o4W^3<{bo+mCKT+pF=7xNe-+<9l(hIt2c~oN0*8SMtlXXtAo0^vK{xTLk3~` z57yTqSEYgL@)(DUOT6=#MVK*!(T%5Ncs;JmqYe+|dgrl^Fk=a$%Omw}?)T!lzUYfL zdc+@wXI!d}KLKBh>*_F9rH@}H;>Nt=enb^v1`pBKVH;kH>+)#EcjI1pq)q0z&Sm;M z`r~tPT|14$>pbF5!c+6~@k{X~xULSXRr(HRm$Gz&HZvJ;1rmsUfUV`h|DF-ERaMtnN1JARt*b@(4t{vBR(jj!Zl z`u_&I{UdJAz=z*x#~vHJFzffwMq_Nm0D;@r9tfpPBiH{u69 z(r?1M-=t4J`Ci`B#;yJ>a;Kkx@4|KK^;|sVW_|kO@IE-hPy|Zd>CeEca9#S9_)d@X zH{yX??D4b0oqiL(9KTTI&)4DWC42r!p3d=u>&8z8-e+9UtX1*rj!r+!zFhnO{+J)% z<8a6C8XQlU1>=L-zx_Q6ufj*DJoq|XMmE(Py$o;rC;M4v09ShE8ZhM4?e3p&c(%_^>tW*55{$M*n*G8 zz3R|Rn9YRIjfD;~xc@joKi6mC{cv47=i^1Vu8b4$CAe1^O9_+w7kwF5<9YZ&)s7w4 zy5_STc<$}`G9JX|;kq)W-OoK7+^dXPgz5BGeHlmNWAKYq8TpDI&xQCBJW(0cSSZ8m z@GK$+G8}cZ*BsS&$|U`oqaH8DuL%-=ygR;_$(%Mh!MhdYt@01!t)~Rd-E1FKetXWy z!Vlt^@ovW-jrT3mkE237AGgX^>n>jzzH++0eAW0T_|EwJ?ef**)%V%$6Mo$_M#KZG z-DlY6ybQO8@q+t<<{wr1L)@N)Z^o^2>L|C5#?P8*pHs%Uy%67m>*j(o{1DzbzJ7N5 zR^#CZ?D7}6)33*KXW8$T5hs59iCJ9h;?|sA;f^21Cp>7M(`((Hh3~_4`PaMCFT>3_9AAbSe>JZDtHyKZ2F^38rx4G?b^Tk0kHD=pNq=|x)p)Z<`t^915`Fq& zHuv9fYfUoDoqibKfb04<3*YCF{%E}2!}gkFoICwOyav~uhstnsfqqR=jc4Q5@mK6l zzaFoM`CPY)Ih6-CdkJsbNmDjoR7aTaVAGP1j{LJlPJbR(tK6~7rg|EVO?K2v0z;)#>#DkC7$G`c; zQO9?fGMC|-aBEGO?r_JNvW76XJ`vRZy^aRF9KSfejrgq2ae;@p7ltP~2Z!+po?7m` z4#*+Q?S#>deNtb>3cMNDm9ZA@wAj0hO@t{VjINBy^Eei9 z-C89BPkt(K8B{yw;(hSGA?jG*sH44B8HeAnG{IOUu8KbcpNZ?v<(2sOXZ3Bg5nqMt z+NcSy$FEa;z}Mk(p<`{IGM{&Amg(E57d{o&t?l#hYCO^L5GKp<_*eLoe#%hiXd}mX zo=ccnD}v^wgg>gBd{*tW0{;ZJ-Z$m*;d(HZ!hGC<_gon?AMg?XfFqBbDS@fvtI}vD z%$llT^zRFtwC>1pXZKZy5{`+Ng67AB4GeU+Jzg{MjjLGK8F+!i?fCilo|l7Wxr#r{ z;dU7(;&WFA%^DT|5r;e4p_DNBYl7zgs5Cxugt5!88n4BBE9cAE4yukj@B?_qc;~b7 zgLvwzL9;I2?ex(KLtK z@%!UzHw4Z7D*xBrJ`%5b%U+u{xP21duu(sbOYy#&g62w9zEJIv@;kx_!SO!l(B#? zi?;^N9jYFUjxcr^i}1-G>ie-APup(yW3M-lw1eFbHTZ7a>c>2X+vzvpzK`vGyxZY+ z{6H!Be`5FJD{hbA6F&`_EhXizcetH?HeS@AzXmP958_=^AMkbfIAt@9uOhtD7eTXt z?L=OVPsY!Wce@X2@U{5Rcz4Vtjf6?vrJvW;0xchZCO!>5r}34J2fqxOS8F^6AA?^W z?{*uH#aH0EIu_#{8iVHe`1pKQ`B&h@_$6wb@%eBY+UeKgTmBU^2dgobx#7qdvHPeI z@6;4D4-hqQx!cW!+`AxF=|qDSy`Cj^n73Fsr@|nw-WHw!ua`Z*S0KnIi(Vjx_8#G~v7OcT^rb z9B$Vk`7!P_>xEA#ESk;hXS3iMTPs zXVr&$@GO5w+eaynvknb}%pvMH+ThN=7rs3hGJjI(fA01?d}}CVKBfF8huifVkKbj6 z%stAF+2|Srv+!G!LgqEf`HCN7%kYhOYXk4$h;R2%9lpIq$XulS0*5>LXdhuFC5N=f zQR*VvxK${+t{CA+!>&VLyb^y;<#DUS?LHcY7q$s$-|3lv_fH9F-|3l)FU9lY+rZ9$ z1s*&mqpN3t>ZFni3=sH9l2hI38+`8`;c>BmW zwBvUu=US{o$UINAQN-<;_{QTy=0FB%Ak*RY7|6$4cM55rg-^t%;+gT~=d&tb3BCr8 zXuJyFiCfR&C%Ni;Bt9MP9A6EDJb<;%w_aI1WEj`Z#J znTR)}>&sVykL(e0|4k{oeX8)u9==WG@8Qk(CJ*nhnEQGjo{4unMPI&rJj=r;;x~AB z2|mNatMKI>z75~z;m!CV5AVPP9ywKCzf63vhv(ztJ$xcQ&%;ab)gE4j@AU9(xS63Z ze>2__AD}tDI#h69(!(?HB_5uSH+uL)y!&bT{7dix53j-(dH6QG-ou;mPCfPcclamA zAKqQlKAHGr56{OdaNYbi5wFK}^G69DINhEZA9eoNhNlh)CA^my#+&i|_-?iXd>vkAIj$Mgo@S0dpS6^qFb5rFu-m9V zKJ`L<9Y^A8a9tfI;X85b91(uU)yJiHryPABug2%$x<1~4uflc5_(8lG*Of1=lD51! z6#cyd1&;E?>W?qLPgQG#@opc9uN!QyG3FlaVVZmrKJ${0`Mhf16%KdwK^b8NUKTPR zppydijxhE(sKz&6p>LyleDJW4xt08m>SwzSf(!oemHIvmhYEMU8??*9OaAEe<}Cat`0^24sNmA!}xC8 z>f;4&&%!%ili)bC(;tlw#8;^NSG(gE;`?!HExgI?WqAImkU2&5|0fQQ^*_F2Ovv1( z#^3?B*W)V+LgsMg-QRWfk9d}!;kdybqr)6d`NNbsjBm!RF*?EFjxm}|n5j31%-^Xx z@^yGFVN=aT1^7lhQ6GizB76^iNr?DmjyxRKY!!s*e_Mifw)3dP3-FzMKB^3MKQ!Wl z{;VHI<}%8G>&lppSK!Old@ME}X-7vHa|tuz4t*KN;gfM)8E4=Hcj}MDO1u+*zbEeqG@-|2Mb{ps7)wp%6G`M{n-c)2? z*9PA^(uQ{Y8F=uN_-SPnGOzgaKyLkw-K+uS3lP@;rY|`?VHR);#v49@ngsy zV;T4=e455{@qzb+%-PDvJIZI*Zyde_AMeBOcDP;s8F=o@kok-{A3S!nhe@*%Kky*; zX4J9F=flUD<5;XCOwJsA9rxgcxNZ!kJkPUY+?vmmw;bssyNtc?`uX}c&cpLdLgu-u zjCqdub{mYx=RO=VZ>IQ1)q&4y49~(3;ktF>GW@Is`tsM|BXFzy;~n|i<==zPTc|I8 z3KMnf$L#X2aKyLE-wPjHrZ0aUz5>^ke>~oV>)L-7p7OX|{wR;2jt^tszfocG2@`oL-ms^jtU#$N4hUFpiZsmjBp7tVRZ3XSGDPMoQ3SXt- z|J@ybB!1gU+soZP3D2ksnG03=Z#mp9e<{8JpQ^mx?W^&;mqOa-YCBZ^9)1v?i(BdM zbEltH#oBIF$ZVnNXMW&nzy5gS<&Zg1mG3mSkHkxH9>I#hIc}eX4_FSz3v}t4Dj7eIxO4ui5v>-*dQQ%~VL3tk>;hyvY&99s^}~WlhLzrSjk_ zz74AJRrtNCkDP9g@p?RaUC2BXAK!MdigWh*kU1yb`K;PFjBmwXROv^y9T@|5`Lght zZ-&eq<)a;Lr$1W7-w-m}Y0@vmoABc`UWNzX(#NmH({L+)(ui-Ldc0s`$h<+Nf3LfI zf`@$@@cHri+vN}AW8My#Lesuk$~T3~z47t+tlDohKJ1;4`F*_G=@;UI>q6#-@#)*~ z%kaqNkaC3rU#ztmm7dc5wvkogz2rh3iccK?ahTo-&0ivI4yP9GlW-&p1>wmmYJ1ztg_{_HREb{V;VXRQZ3-vm8~vh{GMnNI78& zcCjWQalT*g5qv3by$59OaMdpx@7WwOJFE8V?QqH$R`tj8ehit0#D_WD z(Z|Jv8G49kk}8cxM;N;gD)7c%c;2P_xQ|_BsKvV&rdg`$*w5j18#Ur<@TDsLWe&H~ zH(#X>{iZod`CPZBAKs^u7#diMV@J0BEP@>~-240O@>yfpN^kenM2X!>fKdJI< zb$G1)c-0A}xmbCy-d%ru)QNWdfo@NJjk&TDi~QSzRn>2@eX$!M|Fgm zcd2PUM);%J*lwde_*p|tb-U+i=d+rtQr2?5z05Ql)m)qH$ipsUFMRh<)BK|F41ihndm$BVKa*cs&0~Q+wZj7G8)4e5Aj{9e){Kbd?!>|D)BequNN7zYfpJH_aAO5FNgyiYsaPJcW;aV+Ccwf}y%&%)DhHqH0W#``uNsh^$y zGW_7%ec+!miuHN3ekHojV z7hbv8)c&oBJbaIbkH<5fGR@Ca`{%mTpM|%pFr&Y#dyLzc;dL?ptJ~}F>HoCLKf~>N z@QF)of6DDC>zE^-Hlx=QYu(-pZ>%(<_xKXDe;&S@zvcB*3iWGp#JBrzJbuSBX7uN^ z?%(5T-&uI;rOaOe;xBY~tpD+)%T4omHGU2`-0q(`eBNsTbBx5(zde$^9e)qrye?p# zr|z{k9qk#^CuKeJQ85TdS5&>Fld^eJ5$ke>`~?T!8FfM;l?_`(SBj}rPQ*P#&;{{>+tbq-`i4o z^(D-#X44$1j-jK%kk=GRcC07aKaz0cDf4!=j}A9QP7O@+tF#IUv*&X{?}LPS&Y9nl zFy$)D8)o!pKu7O)l<7#ATEbL^lFUx3ZZ|f&!bHfci7;8~P4h`LZi|0(ggJ7Is4}I# zMSgFZ?%#vpXzxtI^x9yWZ-q!}yCW?}-9{2dY&N6s5Bze#k>8PW7ZPUK`>e@ZlFpxh zIugc_PB~#le`bey@L<9)wS-Ce+BCmZ^?&x~BVinU+e8@gooT+tKYq5e0r6fh?BcEt# z#wJ;NJ}<+=$0Q}37sJG_#%JO8uzl1RbCk7#FunRFnFG|ACR}`dR5{GI$)|0S`~7>$ zp~g-+KI^Qc=-iRwC?~B(R)^=jJi;wIJ1Kh4JwaY!_DxV}kykHOp359*Ii4|;5T^Rr zB(t9yUlSZ*9OGg&VZ;eZ=33_4z&XZ|wsVB3Crn+Zr0CxseAE%fF;4|HG3TF@WYSC` z@KWM1>4X^{w$s^~I7}{KvN|W3f1r^AdmUjMnn7KADAB`ot?l}@iD^9xn4 z(SAEjb}MQ3sp_vP!W5p9cw8vohSv|W$JNKNG&p(Ne%qpQ>;t=);XAT(67m^!n<<%_3ZQu$|tJ#Noo^RYkZx z)W5HqH*a)=bF}pi!W3pDnWI#gFWg~NJBd2JE=k;uVJM7`$G*mCd}wz zN#;;BR&NO%3F9~h#}cOc>ZIuTvSredFphCJgD_bm?J(^Vhgqi5iG}Iv4%2}$tN)BU z@`N$Tlw$QW0h6^`F~^#+Fke~MBw0U?e0UyUOepKm*LZ9o{~k6rmF4qQuZcGSOBt0o z-Yl$8W0lw*>B(Df}t zJZqe5rC{&jJ(*{XoM@W;lude*M z{m!_W?NvjuKDW3F|+&;w5*J z=ZUi@)HTt9{^rjeWgnrAH2a86j{p2?>8lpJkofj!N{;*dn+xoU@ZZ?cwVTWm=g7Z^ zTjdf%JYmRB4YAFT5BkJ(A7y_|eWREE!(gs9I$54CGD+gvXfnya_Bp_O~)K-59=GnXktx^#fpygqj$Q>x&uKW}H0>(* zG5_&M_-{t-pxQG!DxWmOLPPSl&%O3xm7F3^6%l+$v?>4dQTJ<&YUaq_i$6zGZ80jd z%n+;8Ag05_aYpiqY@XR|q;WGVC)QnMPbHajWP4T8Zju$q@8n-O!7VVv-q^@L0Xn1O zXz_dgz1QB^_B1{Wl=m6pDtVizu=ifjlf75Sg+7)jwT75u$Y{0Me$7z3zfl3_`s5V9 zcvH2*M?U$rPwcXGJnCl$MY$-N$U}(}VYijYOrNaqi)xj~W}ke(FTV82AAMr4wY}C( z>c3K+&V3{|q_2{!*X}bUKesr~P}?mhQA!72J?@u2!$iJf zV=hgeV+?CCO5Dai#++k+ZzH$GaBI48>~9s3!;L?+xKli!GK_*XcDu`g#x*T&r0B8T zjOpWzHofE@j6$Qubn6&9OxAc$nAR_bb`9=cmB;p|-`hU%f-gm=F>M_Z{h~3p`b3`GWr#8IbwfO4$Y%_(*ibt@H6%9KN9@f$ zU$LKIN$f@TQDAnLL&dmgO3v+8>cGBAP7+Vq{n|-&e3uiZ8RD;Uzabu1yI(R+QJZ!_ zl727$cz77KR>3cj1h+y`Gcz_AqH|5cw)g5UM+&6&>&1!7FZutmadx6{tZIzQE7{=LcGHC;S$5SS#yXYwzf2gT27%n;HZnf(0r zv&Myo$J~QNsqo9q0sq>7d|vv?q%1W>VNkvh6ib6$>Vl#{#XlJA%I^2$$DFv*xMWC} z8!v{u$1h&?-9)B-xjrDO1M&$eJ_~$8@^^=NPd5EOh2;09{|hs3Y776tB>7UZc&~*l zZYl0=+2x6r;>DJa6O#X<_4+@RF5|#4W`BJgSToiIGKV9>YQwm3k#HRT>iAM^|115f z&Zh~-+^@v@#c0#@awZY$ocM2Js8#4>bvWkvhOr!HuCV62G^v>%yZ^@d@wCMA{|@Aq)}{RW_Y;J=sDC~{x7_)@U(EE&fBMzgitSB)wf}&hqErUtw*m2CfHT>A z87*4cNkl(K&Wdn!|&U%a4- zxkqI{xiV9`@d{|yS2+u_<5@!%`NW4RMHato{;W0^`XE-TANj-< zw*|zz*7nb8Ff92EgP{jSxKzGuh-))S4Dq0$Hdm-}ydNt}bTHiO7z}JrR)u-iu290k z(18HGWv=MYzc(-#-egVBve%H4ec~r;d!dT{su~Or_~qk%u|PHO%l2T%?!t$-j(;m4 zelYGfzVZu}{A>K;MZaYGbH4;02v8B0RWqdcR`vYy|M&Ggeb0IE;&Xd&Gu$}&fT0>o zh$nn%dU-IQmW^)*Bzh&gJIa0a&qTWWirb~Avv)UwtdJMDgNYfTdwTmh)N(y=RmRJB5X zDRvzr#20qx)DwQs!qt!!_L^?3wFDvC-s-)!hkbIpPdwx6#;bDbprAY{5fVC2j)PqMwwI{fV(IVp_@J>~a4anAQfGzi;`DhLO* zm8livELrXo7nB-58DgKIwyiVL8WoNK(d}$`7ncvu8LH4id|*uW?edFH{qo*`n5Lp*N}pyZCnsv~r;D4@i2Q1|Hls8v>o=z3tCkNI0p^NXK- z@=?Ed#2Uc==hpToo+Jly{d*uNMpC4|eXh3lsH>N`YKi38&%dcHxP~}Q1gGzxg3*KMx@CQ)>J&z_cwLXCo2N} z#{+U|(0EkJJ<|WNl>aux+MxVFwLzEJA+cDcu_n}&-H)o@Y)?Li?;ZSi#)z|BT1W2z zaC%s3kC$I*DMpZW-Tx=~fFb@F8)It8cc$!bJsl!M2enSilXr?+i$l+wqEemF_NZ@I zy0YGq-`g=*Udvr1HXb*w|H>ym_o;1bs;RZ-8#`>7x>KUUvN6}_-Drr<47Gi~nse5v zZ~yK7yT-WU+VH}lTJC=56aVtv#5UIr#ZufYyn|^?0s*Ne{zzX*}~tP zbp3NJ{ZF-&54RT6ljW<)qAK~+&y&TJR zy%(AOM@;!plK-Bhyu~g2r7h%#$>O^fvZAGUyk(cyTZ#{kx*4GI`d_+k&yZ(Wmj$X1 zf6H<6N#f&%-SgEO$j&z4`m`fe%Q*j!ho9$kRO{i>y57jW>(6}Ai!knod}d93zZf@0 zFEltPv)?pc4XX3(y?#;alOOxUR%?5*U$UQTo;g9W!7pD5s7t#017d1GZ7&a~{f&W9 zUrJFg)%J{_72Z0~ty?vZ#^#Fu%K7N{^I%bk0T3o3o$OGEx>J%wP~x?XzUUSb@h=B)S!685cr=H^6?9@uSNJeOII2dspg z&kJ7hlOm({tW0$u)$1PXqrT1w@3C@adLh?HKN!{{=Ue{5hPCW}(6h|_$o5)E;r=AI z7~(NQEt|M0#P-{)_^b;op3o#N^FQq}pPoS?+43nLlP^CA%F_aF(Je64j`!5<dGI!gTG%8uE_rgtl(bylV^-+;8rCfJRaw=K5JN&>H_?uwznAR}ac>v>unv zvd;*vM**bg-X}U6$M==>hEPu}N6WVjKaX4I8va`2Y&ECJMSD$RK=pViEIEA=O(<5C$r;%@62c!p}i z^>z>SJ(fT{!Yh0{LAzc2k7T3LIFau>rru+Se;I1eV?Oo$8P)zDTiqniG)_|yFOuIG ztmy9GiC(?oR~>8kKQg!yulC7pT+OS%dwsnQx0h-%(aktfEl@9zU#q7D>Z$m4!_On6 z#|{7c26rBhv~6;CUS#S^SoJa!|NWx+q@Q}Ia5cC3Z;$yH@AvA? z(N%J)L6dOJS*aT8XCw9QpgLBcr-nYs_7}b^zH`fEJxmxnA7X$UE-vF=_2B4XyD#oDddc?N_i9*kHTx*2+McTl_p+bcM`BkXmF}4*{r{ALr(0~lp^|Qr zm#87&HAapcw^q0wMwieCelXFH%YEuGQ}n&H$9#Tnvh89t`*O}E3z3_0#5 zjNmzPwc)>m$4mZ~9n*md{);%xIJu|fUh8%8er{r^IYYgFbinX)&+9eA|GlB`6*VMc ziF=IeBW0%9Zfe0#k1^C{nA}Xwo9PqNd}{kOUn<|f@X3Qdbpw#?r~EzmUhkJbaA(7> z_EZJ#Gx+B{+4rlUm>-mDg5t%XWc%}=;?mG1e7{>QgI`eJR6RIOc}V`MPu;8I4$G^C ztn~T0^#9KAKjk~BTqhk%+yA{6XG9)6M<=@I*-?l&(fMMAVcc~L>88nTN#Y{k3rS-5 zcgABO{|`P{74Vn%3&hC658pL z`?#lV?I@3(NxK6B)cx%|x!e#%hAg!nv$A88I+HH+`L_7D?akEB6hrlXG4>f}$Ob>d za57ge+&1%xIzvXUPuONAWdBb-736-kvg98B0#g)8`DBPYoARxo_)aypC<>}=+MfLj zLn=(OS{>eR$_J9f>t-5v{F3D4)}l(a@~$NLU@I}Vg?uqtZ~^dfOL0$2`DjZqucg}F z+EVRbmaM`|Z>1vr)Jj$!Bc4|0gSysoeTw+LwfwP-c&3e9+eWkCZi96c z&(tSMUL=?jd%VtG?t5C5PP#nuS9NdQ`ruy8{9sj?msa2)W43)|1d9y}0+Bbj@F_GtaBd1Z8`Y|j|7 zj+;HyjcLq~(|ux!Pi-&usr}X~IbW$vD4jZXhpW5%f0g|H66V-%3_sWVD-HiwRt2p( z#Aa6&zRoaejo#`}&Tz>K40o!>Mcjm9aqwE~(Gk13Tqndk{!YAl9gr^uxZ5;XhU6b}W}_Qs&vzaXT-JYf>^BU8>!68lYJ)+fnNlf^wPdGgVAJR^F2;Dvp&K zjuo$1+lP)-``4zj$}T%je$+v1I!=DmUK~75KGa^k(oVkLPHbwYwr93i`y1Pmm+yl8<#3l_$wJ!s6?be4~e0(?e|^>Y?^;J4J>0_|#*BxGzJ#njscvFq-C_ zCg12KYEF}TP8WMmlk-j&&-avDdy02@s_h3(SNs2Ux(c(q*I7Jm?k(T!E!OrX&%M1V z?7}|sxiiFDedO1D#I8Q)vc2RCY`gka+*dw!wpiI$Za7PP)K`9Yrg->F`O=wU`I&0F z=}fi%^|Mr%+OyA~4w-U6rkJB%y{*n9>88w+KkX-;I7iOtC*C&n1H|TY<(Bir59i9M=ZRjsd`l=EfD z`QpLziMi%{via(KId`BqbiRBdOO$4*?QL1|wF^Yi1@f^AM9Bqe&({~U=llHwiSvs3 z#_<*Zvf0VKIO&Q;BlSVfsJ`Q#^NA%s$#%W3GvBAH$#0cC174_Z;q;J8L*m>^e+-H; zLs}Pl=e`}}R2`kqb{LOy^Cl?S#SurKy+IY8b1c8@P<^xJxvs1>H0x8z(<{~r_Jlxr zQwPdhxRt)v5O*7$D($O$D;=)a)Oa5$-}0-g@E0h#Ay-?k*e&w;nJ@lj_#gF^8}N^+ z2KL-Znyp9k@h@^7cWmsFOXkTe-Y=1laTUhTiacaJzJJN!jm;kn9xHNRXSRB@&1SK6 zT~X;jSzT9LW|iYKBf?`oPBm+o>v#z* zeM>;x@9*)GU##=XZGQ2tU$VVVy)`Em2ae@C4?zjPM@^Ius(De3h3K_?cag zVf#a$+W)*?g<;W2@M%)cZXsCW^PHDg6_dmqu1&b4;R-k;ibAqHB)A#L_QxT$|3y=U zc`!*uy03+t)mpr)PCox?A?LLc^IOW*$zpr#w957i$!h-ttyI8!Tg#bk#Y^hs^JQx} z_Zaa|8@Vb)Y-=MAv=QG~+s~({{r4ZE0#0iy7ac2JRHvYgZRMA3MZLA-tz(&5=cmeh zjuVxsa($|(wziiZ$8OF*pB*QrtF>rVJGr>Mc)Oi!Y$ramw%<_`!q4sHzdMN89pp0| z#NrNWd+zZ>TyeZyf4tbEj?jf2<%|==^Bv`;j$*yF{lW=^*l~jV<^)lqo`SARlkc7= zzDSclr-}X6cFl=$T38%VC#TX*YI9vD`B5jarIY;kN&Zb5TGb}cTNvg23 zoYPsX?o8;fI?M07hT`#qHpqG50wMP$qOVnBCsyS!M=g$lBJLU@e;gtfsW;i`E|ah4i7zgbg?ZvfYr83r-3u<4 z#Y4rjm&*;8i`T8~=Z4Zu?+%p>L&g195TfP^xp|n_b%i{1h4{hReq)#{zDoQw41DxT zwYmOEx#LRl{*|(6xc|Z7vV6Gz%i(g#RpPy?Xt6o@a`#B_TE5(OwfH7qF1T7e`g>VD zLe&3W7LE`{`NO{jFG5;F!sJuq5zeZGFqjoGEMd3alCHIdK zk6nwseXV?XwAgvA{P|k3-`Z{%O^AoDla<$r_pc+wlreJm7*R4tK0iiOTHEvgpwjq* z++83h7sv$#VorhD{;WWj-zer^Pn?&oSDT+-FPpCy-(D|^Z}dNNgRH*6KjlWb?nd#= zjnwMdvGVP4;^VP$<1OO8o8;b`#Zx!QpbufO=n! zS)W_CesO?z-~HmH*o7|J+=^uXZodl114`C|0lA$!o-%`b#Mb5Elwg?XLHTYA-gzd# z60V_=#5OJwO~F&kS4@8YhuYq6s{M6IDqw{=jcsTlSGN=gT9DEUE#(Wz;)|A~v@}_M zlp;P!CcunV@})LnRV(>vYw>d{`B-aF(pqhAYpwP#Z=(YKGsVaHF-6Wv6-BCMmB+{x z$BO@py|aPysmlNOnTPxP-FYw`k|fzlvKC2_)$BB@Ns^VUWUZBH#*B;|Gt zBw0zak|xPYvXYe~Ns?5OtgNgiNhL{0693QVobUb3{XNX{4B9`h*Y*CLr|Z!lgv*y)PkJsbx59`tY*>f0iCHJ&vo@;&IK)rgd_5QhPZ^VRx>)<+H1R{i^d^XdPe^BL!3ZXLgJfi?R= zwdVrs=mqMV3#_phMl5J-z1%qB$Hsl}r!g+H<~30#FNB3Yj+yFb>fI(dAGYOZ))(<= zTs*c*@z3nK!hrPQ-R8+dxaFlSsz0~1FZkKlw(7b)Y_+Z44(HiS-=3M-SAREB-5Y5= z8mVxzi{JNQD;7~7_gb%d)e5hL--o@w!v8PY76k3(mgmFVze0x1n&Q#PjXcMh4UhZv z^7aM&cGPP98(SY#@T6K97Pd63CC?6B$43ZhG?a;9eC~lY@e|=NpvH&8xXXgyct#8V z_re(m288H%;((MVBdq75)pInXU6Iy3mO2sH`2lS4Th?w1PrEJre#CPD4&J@vv37aX zhaPL2H)4|4n&pjn-^hR2zT(&f15^ zE*|TMHv)G#|MW(Dga7r0Ed(6Kx#lP}CW^xT6J>3zrM``_9;>CsMqA&+swL6ZXVGdG zItVrvVyqJ}>eU!)M~wPFulcafL!2*S8Gm{$rhUB@m_S-~jZ+Jv1 z9^poyt1s4jNBE6%webEJw`X?5a}j^M&yH9cd2hseZ^Wx!3y!fi1J>ErxTvr~8p{V! z=YE65D614Ui!B-MEuX}`Ii3^n`PL(05u8M@=Z1T+Wi($CjoQ%C?8bP@t_{3(nr8Ts zXnh$LF%Um~)Mr>H(bNLcw2l~{Zxxungx_^8z*~~dtrWcO#HTDeFZf*#zuR%T1>ZR{ zem}p655qcI*uC2j_VYF2YHGOka=2Q~TzBgSWwWqh6rt~a;^Fr@>kd_5k~SS+y{k9E zztM+t@Dxx#zZ@UVd(uVWd@KkBbFac<9S)&iMe)_br=xL_WOvvUjD?ZS;kDX255GUQ ztQ9u5)Q&`{WghEL6fC46LYH_OV&}rP7Te~L1V+ngQEF}!g>8(okaB#q^+mLLGuql0 zt?rItMC7U8A#`bqeZtqm)M)Ed{XqG%Ftv*f0i9NctHN*#9!QjQ4g8)Dx9-9D7VL=Q z@OQYiz*6_2r&{Wn2|D}=NXEEN(mi4rUyJiUEGoOo1`+XM{@mp(Zctj2& z;t0@&aNZDqhj*9VO^F;Eu|l)>Xm^@^x`J&;{R#{ov>^1HUpC9qk8^QD2-|s%f$*-+ zJA@Y2uk?|W+wj=+&&Gd27!9t2^-MH|qL-sEX#L_Pn-kcSShX|EdL&jI!Tx^?+h9#J z4r4wZ_I<2+HL^M4|HC>DQ8!qeZ4RJFv3LY&!3X2bQ?Y#S=hIqhq1Sq&mimv^`kctff5i!`#1)VeZ@X9^kB6)|y%@MkC%{ z^s!Fpqf&nhSK7?6%Zr}~?ZYGf--TI6EZ(rMw-io9ti~%u;nsT|wNL-X2#P0HAFxI4 zk7VG?NCp<_-zy_6JbFB&U!i!73lu!PMQlhe3geTQ-&nh%@O)-R6n24k<9;)YPg8Ng zY<84+g9;)3_SM9bL`frXMPefDL$!P2481+Dm^;C>n z9s}=tQBypZg`eAFt%bGJ{k5pxky_Rc-0H?zA7f05qrfL?TZMJh=GrU=_D@le59?SD z*JUvSd%#0sH(T#})jfFP7@qH^C{@Hz@}ah4!zKkpw~BAujyK^{aUYiTCZ=kUY~2dUJ$+TLhXJ$ z(~q$JjxFj4>lsWvkvy07I$wQMpHr_%mW7n-Ee1~XSdfctd&qs+!$c2w`BdvZ+ggc7 zqqg<9eyonVd@YK4jEklZ$7*#)SVnW}Ij`c5;*bk)^y(vaNp$d?Rv0??Oe+G9>-I#3 zeG_5rj8u^{O{uIo^ok z!5$UV;}?i?Z3L`2`yzc9`#y^=+2X5gSXAJ-J)ToOZ1G|FyZUr2d>)Rl-jBeMFRZLS z$B8eC@2Skhi9np`*TeXn@Jp@2S{TUhi^G$o?=iWC@h2W5!}rVZ7GrDkwTE%F)l(4` zey@nQqzJDUS=NVfEXcnx%UjkfaTvI*`{P)t@PFUBa9VA3#Ig|cuO7;I%47W)$1Tk- zFp=xuUuypu-X?o$sTaLX5eJVDch^!c*)4X|QeWBDtF<`&H+iYH zdMKK|XGfn8{}s{aBJEev=OV8uG0f{pECOn&4`W))s?Dbkkn>Qih2Kxc(tnx$y)Kq9 z-(#QpR{#7Vma5%di{1}&g|L$Ut&d}&Q0=)FV#oLfc85H8W7+u$Ht@o*=ZPo9D?NO{ z8Fu|W>=nmrF}C9cE=(L=oavyAzZ+rw8>_eo#&J5vyOw$ZwP$fz$Ab!#f>$dJdenO! z3xUYMPklbt$8Q{ghCg0t+EictGs0S5Uws;3 zJ&QQ{H~J*}4@X*GH&9Ex*7|d?XLkAObMaKly5~GD6dylVt<}GG+7|r3(>^El?+2oO zj#R6otz!+;w&-iWsikJeSj%g3k%j*^p_b24dtDtvwzk#b{u+Mceq{AI>fyT93+Jd;>ROMUqc&l$?HqNa zu66f0>i&Ax5Bj0cxAoK~+;{u%u6tK9VozeuClJRx>SYUX*$hTd+3YGsJJ0Wl@ZJ4by%UU)tRq zqaMN||0uP_Yke4_uw35~gA=UCZoN%!tkxm&u_$<~jk2~!b20qiXxb5!!FKGMnBw>@ z#l==fEQKe9p-17r=^Q(qkE1zuV@;|JIT;X`v;!3z@@$oL7Tx5sK#Y#*saIr2{MCz}&wH(RZS@v^9`;)QvDF0I+F+~2HofOXS?@=w7xn+RIYF8^ z(blWcYLou$E7!@eiDB1TZ+g`o*eP2PR)4XVZ`r)=<(p}5czFixD-REajm7IB5q&WO zd=n85A3Q2RnwO~UyOEq2u=x1E=3@v17HOSvifW}-y-1z0%K*90cpG6G!fUOw)l+yn zYvWsujDee!gZc;zq+pDx-=hAX)j;cSVQNxXEqz;ppYX4J83e7=hccZPWqfxg6}mSm zVbvPn{CD~(367p%#i5Uojp6Z8=rBE;Z-Bx^R)>ZCE9{EvR>kl>0=EFT$$m4Mcg_FA zjca&)_~7~fi!oeA!)I4`5BL;fvn5(>v8_0Xt}ni0G7MpGH*6j87aSy7 z9i~RY@QZMs5kfKbKNcB*JC5fg>poFe zO}4DVaSHFH%!^Z4)jwOCOK|w$=sM!O{v|TH>Nhd5XZ)NEN@=s z*P^I<;ur(RGQN*f57oAws-u?Iv38xKeyC#=)m5+7wLYt>KH~&-vL0v2SI)6!*H`Q6 zTl=tvfUVyZcE_~{yv3Sf;bAS-qQfz4anEQhPMYFms+Xr{$9wVRnTCk*H$0Z~aJT3~ zulgFl@qifbh+BL_`Ir^)5UUxhZg}j%<1@UZL67J468AHV-(K}kFXI*4sIP0I5lZ^q zpdU|{VQq*Pv9R@peQ^B~DbDT1?^9d0TxB*v(P9_yZ1t~23tkd1y6 z%gHD;C(43EEF?E!do9}fAX?2p8|&NBhhwSm$RxzYAUq#S@9;~fVZR}Qj}~!zgYZxA zKQ>~S`!g`-Se}u=CM~M?(-o2=AuoySttEKbG&QAoud^pOkCwVy3?NPvWuSp4Q@MbbmY#|FbnGil5qg8|Qd% z7|7;Ps@H8CTHtFnSXeH{T0w6HOu-gMw0b3i$@RN+&*LWAQZLbru$x_o=?c377#2K~ zve{#OjqdNItarTDbGDjlGZc$RWcqv*bMq&MPuz)KPfp=!3fIEsQ8Jc<7AT3`e>4#Hz<)Er@wNmMY`P zGgN-77FB*A&N>jM-mYyuR!4nP#~QEi)pv(AMRD6&k4IxO=)qX*`QWV=tbZn92N(N7 zIJb*=xfb5|{}p2V3)ULV^LbxJeYLR74jN`uYjA)LW^P)L&Lc$lgS;M=DtV z58B*pLx+M=7)z1#yC^D*rxnMe)zTQ6_qQ?3>P>xnHKCTZHcq{XI|1CE#aZk0P1Vo1 z=X0fXFpMSAZ~mVQSI4+i!vKe$u#_%&*f`_cAxm*%r60cFI4<7xeIpzPNREeFpGUB~ z`yI4{75l7?90v73n(fFt?Z@@ElzhkSK7R$GvC053}6 z-dP`6$FPdPyYv2h*);$;?f zE-wDVEsSbhH^#2Wp1)ecuOu3os(aOL3|i)$*b zLR?F5t--Y!R}rp*xWfN|^thVhYKJQsS1(*?xbkp~#WfXIA+9C3*5KNVs|eRYT;U6l z9#>Ob?QkXI>V+!}S01jhxTfMN#I*$18eE%k72!IFEBqOx$JG>9J6y@Qdf`gLm4|CA zuBo^RaV^2M2G?d>MYs;)3SWryxSHZ>hbtLZFI;K3@^FpCH5FGOt|hqE;M$C<2-iVe z;rN7qJzPz3wZoN+s~4^`TzR<0;+l%95Z4l1YjADGRfOvxuJA=jkE~g zD-YLLTvKrs;#z`h4KCV7TiVI>*It_t-{SfnxBMc$eVfbMTpr)9ZQBl)x4r!G_!hk~ z(&M|P78w6auV{Ihy0_5-nHuBL&My8yfpTn{FJo~6Uj%Y?*#`~*`~2JJn+M``Rh9K&q&*t`Uw}7*N!ugsuHbkOy+|zvDR;GS z6UcHM5;pvg$)^Lz`bie{5cUI^f4VSRI6^oUWIhYQK4AEcNc+FgtLP(BpDlM9eeyuO z@u?PpY>%ZN%ePs00HmHct)lga6*dH!e^YU{0hzu%*aGYiQqD->43Ki>i+df&`rZfP zK3dh^W#YF3DW@aIa(5Q?6#qUTTLr;B?Qi03?NnQ#+m!@Uh;JM9Hq zf%QL)v~hw|bpk233rM;B#C@B%3xpHIe=BL3S!>U~HU zx7Va=3Nqi8Amz0c|IXs>Chh^^P6sJxv~UK<^m8P99!Pywh?IrG!Ak!}gX@_ftn}j=rdqJk#4>F$yUmJVx4l-R|@G@|M za5>2FWh=;ZJ3yw3JYdo#fOMyUOrH%hUV-?}0-1h=aGUT5*b)A1zA+pGGJPJ%^dmsZ zodYucDzGyce$cq%g-M_d|1QEF;-3Zn68>{Rw$m!%HgF)^iQgK|0cjtL!B*f7kmHYi z$jGe&QqQg+-j`D|#D5Oh4(`q3-}JBv&jXq70+9Kx748J7=N^#t+u(@Fw>e0=?*_8{ zCV(7Ic7nA3$nQ+LSdjT8fvlg-AnmlTxCe+kPdHvUQ^Mzf)Mtfo3&?Ws23g)ZM@{(? zLF(BVWPZazmU|t@_*+5hdko|_+4g&*?|6{ha(R9<_0vZ<52QXjLEYY-*J|u%asn&UM30`gO|X)6~v3LD$--v4y3(z1Zgkb#obHXgM=f+e+QQ? z*87Bn*RzegA;^4M3pTAbr2?ltmkeZ z_2>;!em}4Uh%-mp{&4C@ub0<=jF0DW+J7%dyNHXi>~Y{!kakoEvVW`t**}hh>>s^i zP5coc*P}B*<~tXh26n7v@=pR;552_QSKL{`G2%ZSWIN0e;&mmR?j4YNZUrfS7szt$ z0lDtC<4n4yAmglSq<^-!CxXmp3P}Cu z3YQBvN;nQvYdsEu)IY9{Nmn1FejPyi_Z0s=Amt4acdod{31u6F{b)0(eI1iZ|6?**C90g&~Cm)y0y=nIXz4oLaUgdN2{31t2B73N9!c#!fYgOoQ- z{O5~%k+|0gw~GG`kn)ZQ>ok#kLCR|lQeHdp?;`H*;=WB-ApRpk%9|!!B;jj7%G&@^ z9=Q0Xd4oaDXVZmig$F_Aa};F!*m&cv z2h!bKhz~+&cMl2g4O0JX;RIo!a3#om*MgUUhd|m%>x)eP83fW!R)Ob%TS3}icvEAy z2_WV77G{I&hoeE-fy{p%NPAxlvYwWS|0Xa8?oOAOb=YX|R=9V7ly?BU1Z>dUq-zY)zb(jo zdV$QR0AxOsLFO|Vph#1hPDdAmjBB|Ni1X zTKs2#Y{&T^$C)i4+a0I8boa_!;J;k**@smKd`v`H*2bs?*aqkDIPrEBk|LqIXJxkncz*M-Kbuj*eLFzFB zisYktETJ|B()6vq;L3)6fz+C`R?s9SO1Sz-ERmOiD$o{byWc;ll$Bm;P z_qm!T7jP51TnQg3;bSDcP{LP& z%x@#e{EmXmuURLPUu%&04FIYCB9Qto2bte0kooNbncp$-SJ%k630?yK1d#DNiGOeL zA1VH0#DALjuK=0PTJSt@2S~d(0W!b%WRqV4NP8Rs(toD-F9n(33i00|{zt_BxcE1@ z*2w7yGJX) z{7;B~hwCi63;aicEdO}0CAb)5J*)>=4_|=PGq#J-zd3jX-2Fi2KLliZP6wI)8j$&K z0NI|$LFV86dXrBdkmG$Gco|p-ay(iMeoS{))1Q`u4Brcm2eWUm>|4OKAoJY6-N3{uVt zkaG8cl(!$Gy!akQUM@)eMuL<#2Bf?~kn&c7tncmMHDKeLOuVKb<8=lZZvc25I2XJG z+yJuOPk`L#PVQ;x=fYz_>az&s__z(E-5djHU!8ty;*9|rZz0HdTS3M<3f=%F_cHkm z22)^!x zNDq1YZ#C=cW&$rwV6)T<@#`W55j{+hw=74}jg^P8ejudw{fuz98#m1vm=qaJ!|S!*v$+ z0@?r4K#q$e!Mngi5*|L-(&rSK3%h}A*O4IOPX&2@u@~h1VuMV}#<=qBS-eOSK7f8F^4N_jCu|{4l$oXI@*bUqPvc8Xi@nD0yjk_bre$^l3I6fKN z0QMbc+!H~%d*5T$B^|~aHoVv96)$W7vYy(3mw{;@>uH39j}cCg@Z})wXyydd@0Wuu z;VuFPf?e)2Tp)~_Xxw?it-^%+jsI+6_$1>VB-|iu^MLW6Dm)_WH`(~F5;lF%xW@~> z5cZg2{FewD{LQ#W3U>;VryBox!sv%gzi$H4-fjbR`-%Tr;Wm)tTKF`}9tMs8IbKWx z**=TG0@%9RjgOt;Jy0P=_Alr4caIvsR!tF;)yf(t#!jZx`AmuLw zDR(Exb9Mb@82@aL{xd-89rvj5Zwk`CJ4pXE;=fh=@mT=f51WJ3udi^TaHVj+F#hi* zUN7M|;WCi@d5183mWh`Lc8C82ajy^_68}z*nea&<%Qpw4zMH{Bu)%D@e!|(p?I7dt z2N}QN4P?8_23bE#K-R+!koMSjfr&R!xKg-Z z82^k3?nN->mnQhQm;uM^;!l}uXc+}ymaAo;d+qq zcYuuVdCtTi3$olxLDq*_Y|7nPI6=4(WO)2P4YNR|n=RZV3}0gW+Y1K?X9zcd)MF<| zJ?!U=9^*jDTPEBqY_!z)cNdNpE*2IE>%U;)brFsbE)ebz#w|1XHwBr0cTkTPAoD*Y zZ2m9f?kk)qTq)cyj9+fz^%9N~E)(t*HhR&->nuiNb8*9N}hRDi1af|D_qvHc6=Xj1K-$wbVe~rVP6S!M zX(0R4GLYlUF>&{J!}!kx8E>_4Kgf73*BkjsAnkWBNc-IhGQT=+n)K-)F# zNV&^|$An4m8vn7vb;9UP#=nPfBFOw!3ik`+-!uNbgyV$EgnNaJHk)|eg`p z@0)mCz(-k5a3MHpi($tP40nUnr@>akuELSRg~FY}I{!BDl7$7rc_8h0kFfbR6R$7G z{EvbC!2ur{t`IiZZo(IXY{!k@T5!gH4EygejQ_}lw+Ammcps4K_7Nc0>r+AAk8BeE zgW?~%)1-?BTO+(XNPYH*|1psA8vobGO9CmcFGzXQ#ecc@ZwE)gf50xo?ZN>ciyOQH z;oXZ2*MW?m{E1~JgOfnI8}7F3`@ki_#7~W0J3)r0?J?X5Qr{7u8P?ltxKP;TbK~9% z_6)=R*_Vb>_L=;{zq0gu6cfNi$k`~Yv)}kn7uNsU#2+s_3NqiR2Mk+(WA0}f9JK6z z!he%+?6;CkAYUDA6j>|_t zj>}ylJ$f9U2QqvG$a43$Ji7iHcnsHr^dI6i?q;^(R*?R=Q69TK>|$KBN1s<)2>u@a zo*0j=_l3fKu|~gL!U45By1z^mE(2MP_HiD)Z+Q$H2lwdO9{WddR2`2!1FT=yV?PhB z2l4rFm3xlKcLul-?(}nwf9!c4`%iFBXlVRm^teA7ya?_&Altb?Q{&$W zq<te!G=FK>HC9M!95*h_)3uBOAmdFD|0UwyA?_0(>!IUiMxOy7%d;A!K9OxrzDGgo)&6qhKLVtC zDai6|1(}a(XWUIey1R=z8>Bw-#ecK-9};(yD@?jhAnRoi$oO+W%Gn^{`^4R#y@}ru zq`osj>bnzUyLY@&$^+{1fVw;#O!xqh`HTY@z6WG@%U_!MNCz1{5oGv2kl}4RnsR4> zbT1b7K9Ko#xyq!=0-5d|kn!pz7`fd+%FP2Az6E4>!(SP>y+OKXhf*8UfIN`tHi9h2L6GTsUvJXQ09nq>Aj6M>4DZ*~gwFGp!mw_6XBZZb%@>p_O^2N~Y;CKEmlq})y7uHVzRdxDg^0A#vNAk($` ztw}c=q};_I!?%JA@7T+Pj{+%oxwwyuyW`D9?o^QJmV->!sJBTs0HoX*Aj4OI43EFX zgr|d)J4f8R#U05lPdy7EMGu_jT9S;XD zf_nzYd8tc=DbGZZV*J~IoF|uq^e+0-bp%WW`{o&Wv%mznw}Q-9<(v53K*rAn8Gkd#{2LUQdQSi;cO1xg3qZz; z9cJS71dqereYlA?9b~+fAmcT;)5J>y`JVLxkl~xaPOytQqfEO_0B`l6zQ&sMP~6=f zdq3hG2l+gv{WzmfUy$*ZO*HX#f<*{leZP^@agu4b^anilQ21{K*`6IHoA%fOviv8& zi@^8?P5kat%zAPm$oek$n`!SuAmcZgYT|bS8E!v>a)qJX(>(h8<1X+n`1gC*V}A?w zneNf|Gc!QiN8BSuPDhaW_5*1jN5#MC4CCJ!qSJbo+HJ*VAp5 zdF%(nF}^ML=;yWjU-Z}?A$;Qs*c-wRyyUUx!aZ%J$6gC}-&G!cu68|mIsA`-jllY^ zc#RN zV;@2I^0$nA?%rthZU2tPUWRyIY%=;b+U&7ELA(>-RY=!yi_v!nxB>2YTRrv;#2@>i z$*=Ktliz-j`GtRE@*BI;wg51Yg1NH*z?=kh= z7kn0O&u1R{4`3SjTW~4JbPe}<>|AgH_#5c8<#UhS4f!|O=dq75{3|nluLi${d+~mc zehwV>HS|IJMh86h9B{=q9(y{%dmi-I4}*Kacj3S6kjH)r?!3buegC-|WIk=bGx?1C z-sDqo%;eMf2a`|iag)ywkogS%(d5(Mq{(L?$b6EOSLahN+^h3>2jqQjrwFgkXHuls z?t$`b_jv6e;J?-DwVwt@+g|$sm>uQS=dU+{amZ(TwAU^KN5y(|dFs{jYI|4+;?K6L zF}1yVy_8tTtJh15z`l^kntMd;MMyVGr?A{gLU1+E`H;+pNHJ! zo4odek+8R$jht@1z4lh5i@(L>*B7LmQJ`M${ocfD+t1|J8)SY{LB?AKjt1NR!K=^N z><5`|qgze+lEI}2KLXNz`wsBh_*)WcN1E5(hImWUy>=fkdXUj`Ge|wh5Ao`Ab{j$F za{&Ae=8wcYBR3r^f`6BMqt7^y@#cg0OBbr&NE2@?$av|0GUb~EGTv(N&xn^a*2EhG zGG5oaO?g*?EXTfaroVQ+$E)Xu0pM8Zzw15|ukS=7cM8b!3M;^S!Q}hB_Ec~Sm- z+%4vN?LShVe|Yu&SL+2{`wh4cJ>%8u|GCe4?Z$AgUS!g@c+RWmjj>=M(zjl0+@rx6 za5wlT+8OaTEb-cZ1-mbWeE2U1@d0R+x6H8ha<4rb{u{vYV9yu5dLGLYP6O%RXoc5~ zM!IG%dF>H!&jL9wC$04Ad8yOOUV94M+d$68@2oQI)aMn9({Q(3?X@R@E5YZ$tXIwW z-RU(`?uBc;`uy7p@IK_zd7aljfq2Ppc$MMq-8Omc58>Zzv)8@{?gii_aBq6w zYY&4xb@{hf?{Dq{yVw|Sc47R7z2z2}e%<90%rl6Wz6b3O&iUN5!$B|}^6Guz)$f}( z`x1H~UDj77{{j1rp7Xvo;mZ%8|H0lO4}0wgkZvkC8H_(-xCrEWr_E8XeG%C6d#}xJ z?)Ex?c@gftCox}vO~Y*c-uo&Le}@Y1t=sk}hU2ySX0cd@)V0mIFmN^GN7l2oz03l+ z&)T`Zt?xTmoNL@^=OG>Z$2T-`o1Sm$_Adl4MEcbr?W0R0+r9(wmS14o^S}WY8uz9q zh!1zyc-zhfmtADrNvOv|zp(9Y7xCP)t@ovSfxm;C1t9)hmdd@+*7L-4@NxKe=waK7 z!9C#5K+jFKy%+Vpzn5(fMg0D~ZM~l8dyB2d{V`x9>U-SpY`qTY)YrCefqQyC+b%-< z5&cd0r~$VAZpv|RFyyAEKtHe${5#?&rP=mx;GPI(zI+)5ahn} zh{4bkY%#>P-~T1<%bu{c9i|nU_(#FlA!pT7w%(s!IL|iE7lo~#w(XCRUxWF!c|IbX z_zx3*!~(+s&)B-3>|JQ_RE%(4N+kOy!V}3Al7K49>yXSFR_nX`wZMz=zI$`VeKhqE7 zfB47oEcc|X?Aeub;A z-iwv?IS?CVzY2Xf;cK1jU%9p6me}t4qnF#=sZNxx_dx$C@b3iAUEoy=lz;ufa240A zmgF0cFN0baqrL*#rEU8toAsG{Wt4pmIHg0BZlA@!jMDQI#X0piQe+deaD}U{tvHcC z245W=P|HM+YVgxPFyCEWipxX$iod?t?JhSZy4|-S-e>UZ*)_`kFWB}5FnE zS-8U0iaQc_!%?;GWC@=px_T|`>(~ge4IOXTK%YQ{;@0*46Ym6&g4XjmL z>SOgEqU_-kzc~EatDW#p_&Vzx2FO2?e$zcp_^y!Q{oi)N$Kb23uQ`dqAFhZ*{`|+W z;PFgb<>Y4Mr55Dm#b;;SiETKSM|wt9MnQ)9`4C&>7o;a7WDgsfk(W6zB`b4iWp zdd{%4tc;|DgrTV;)K!S&NE)RIog^vAnFT3%8G|zNGO`C|BqaE|)s~XtIiljza&ofN ziL#RJF z;;99WRIRt;osyQC@07*QPwgl*{*5VV!-nRj49itvS)y%7xi_X{W)I9$oe{~YhfCGt zA(KdrI$Egx<%$(QG*tEp2~KV;Rkt!?v}&bt%8GKeda|r2s&TeklYu$e`31gKlCt@G zsyi#3Vos?kip#vAT=7uyS~<4L$hj$PNXEc|gaqf8`i=JPnFotXMaN)>&!NVdz>K{7 z%>06kY@M#B&!y(-;9l9cCnV5hQ`n{6DfY|E&Me4G&B`2^p{~ef<|bxFenv*R%JB0k zNX;uypSZjrPBpm0muOga=AfLsp{i@Km+2&GWU1i?v;_6m7FsyJ3XJl#V++}>A_aME)P=Qkd6L6JT(iW z5GrZtu%W7DsIb%#I_#zpVJQ9W8LA*eNM^p)4ORSTh|s~Q`8{%Uglh_}$;wizLd40; zzcDl05%Njs2&p5S2zEhmshs9Y4iT1_e}fU8uZD#P9+Z=nUL51S5HSk!(734>;x8Q* zoU>^Ur+(FF9i?l|oj0at-^JFFpXzBHa7%7F1mz_pWToa8T$_se_(J=4NgSS&nT|0P zrlT$%&TM>9eLvM89pJJp9lzM})PsmHG{@;`nZq;spzr16_0CJhOq7sNkduW`A2W=4 z0uj4p<=lDm;GEoqgxfO;ZXP%|BYjv_X7=rBohvLE^U>g;sd<0wnVOeRy%F_Bb)bwG zJ=9fq%78U2J2mgFltI)nGbcOI$+LOucqy=d1a&78qQG53#H6=+L5E)lQ)V^zV(FT5 zeATyz#A2B87BoctS$p4r(ZroHBZod}Edrfl&?6zi?NZ+&7=0`;AEQu8 zL6W-kE@px1OC6e!ke)H9Pioe%3^ftHdggVeBr^}^3@gYTRy?$u378dSs>}Vq-~6ld z(2{jViChjK0%{3)Z3ztZtw>CG(~%*KCb2|Ag5(fkDw%RpM9Rg{5w-~6NhEzXWpKT&zkFkze{f}1N{x# zXGq0)`$tfPi~<>Cd_!_^yej2hhHP~c zbSTAWbkJ};M^s9Upl%tWM#@o>@ku^QJd-r?jgx_+!~>{RJxUlGJ(F}k^EC3+q8>Hh zl1_1B1_u3srVE+hDr&UpFUfjLHl8wsoULJf7v&p0%z_THpYA!n8fNcv*Pgmws?;n4 z`{WzCqg1ln`(;_Obajs?aBWUD+BIi`?;3m1?u97wA92`ZRl;qdu<=mN$MOSCsX7h$1MBG4y%8^7}J;v0IR=ylE zONyud3PHLx1BPB14_r$!GvEbzl&~~;1#(>@cTln*5BEaiM=70a?snqKVxTxg{pzoN zhSGa*Mz*g)ilYTqvY15)vDIB7)F+7%B~8gfOOLHyhR~389o!RweWWu5G?V%PGIc!% zrwH~D8G3%W3V#xux74{=sRJ_t`;}jSx)V{^6-$U55TstvlCRIm=Ef(6q13Dr5@zI- z5J`Oi5$QQ8*bXReH#PijTcxDjo;@sO;D`~}{mr;DrT8|*ZzrfFti&%^EkRmc^`)fn z1*t<7%4xKJRvpHboz>{#yzWHw%9d(6;40ZiK(Dt!pgB%sP6L8H2oQQv^HI zrPnE!?kP8>U@Ie~cW!ZGsXWMbl{qCP8#{ohS-zcC8GOv#=j1Znte%Z$P|h+>nj6(1 zf$Hy0Y04=jAt5c}_RMUxy29x)u)P^J-miRq_EG$p!p~b>jWhwZ>6`nD+wd>tk{n=> zua+X(Wr-h`FIv-kD_*#Kq$#^_v&t1~zZ1*PFv~Iv7^2v5=FnX1&W?6FRosM7#$FDY zA&k2tWR+^%x+2PHhXKZ4k)%Ogq#}vgkJx*QpGKsWRV-6m0ScE@h5mW0sIfePM}$wD zCNF18I3t36pO{Ly({V(&6sbxziYnJ$D|LH?HFH|`54WmWPGYBD@R_37E3NY0VQ5RN zvRE1GLv+D)W!1Lp=Do^l1X#T8WmOhhgH`6=}FPm6K7ch-d<(yio-pHvU zgI)13hmLTclQ^YU8g|Ars<{*7re01DuvckyH)vN;F^*3F=g`3gHF_z*btTwdOdae^pUk|DYv9M&Q@dK8HCpH{!1O_CN|ntRj)uIg$N3yI*w$ zbv?gOy~_})0b?I5rMP}4K?2*aD^doOHXwd+^G&QkE&;8#vCM2-jkm8NkuRN6*`kj| z%JLTd=?cXC-ihni%d`2A=kCk4B7>fJ2AJe0k`w+ zpt8#7e`kH4f8KtJ471EF=MGZv3jcMdx_pLQVS&Ds$~)Dsj;f|-Kp(jQvIFcR%r{Wv)q2QrhcfpqQ&jg?4c^xVX?5`jxfKDR*^Od>I4-@T=ueO`Wc~Mh@oV) zqnOw(pH~Ofg?@<5{%ZCOzNk=|fvLHv198wm)t)9TUaqXTz1+S+DR@*={k}p;OnL6E zP#V|n@^U0BbsW}4ROP*}fU&!Jga$Qo^@w#AuTCwsR44o^$!|z;4jTJ;s)UDwh6XuC zQQYH4A&#r+{RB8t14ivtC5m+o#yb(|#+$CYsY>UXTF0C1Ui6sEY#fr#OgBfwedn)~ zJza`8C^siRF(qYa8qU!a@W6NRu5G+-5gcyLNFACpXpm}$G&P_avJKR3d@0&dVf7p$ zxN1Lm0pea?1emWoD98xifkDse4*Tco-{!iqWMpwmDNh!DlGNpo1esq|gcsXvJ_NgJ z%`aEKl}<(V4>0r>sO0)4K(}3C(v0 zZ^~7_*8#sBmYNh}oN8adAe z%#>H<+Y%XxYUW`u-*-I4PyJ1nzK8Qa*$4hkIrIdLk0Iz2pLYitf$MciR};E?t85^? zsx0NyM)l_B%TYHTWjn_=d@D6${54i$*$Q&1{n?;u*FCYyRa*Up+ZV zO;ou?*>EE3r`hwXr#hYe8$7!*1INGhkWwJ7pNXVbiN{TP2Rx4*w>M-Ex6SP4ppB?BJ6n|@d5X(&W3l7n9uJ*~ZCpuMQ_f@(r-Za z$#;JFsa_eSU0an*?#KU@J)6r7{a^39a`~AmGa%fIn0iDCSO%BWvyH#A zFy_~x{1d9b>8!CLF24jlOuVbpnPa0jWfzYVu7ac3`cx@`RjntCP568Qd$cb={RUC- z_L%sLq8(sq3F8d|$@baBm}unM(XWZBb&q2M_Kgywex+q+kCJP8aOsezWfelN?8v)BWo?nO^E& zI@r8I`ADX?eF?f zQ*qEX6XZK>Q@qQ6wMuwOYTR$5tP-!J_0g}ArI^h)M;Kk|{%XzwtE~+6u_IJA!z!+^ zNvK-SV@t>zcsJvN8v3JNZnx@Qc9fZjQo-#zGgZl|ulNo@X0Z6AQueLNN*W|o_bI8V zvJ(3iVS#TDs@G6Rwpqo?ayg^Mr84AJq>W** zW`3+-B6oE6?;5wM_#|~V%Iwb5{kz8VPe{Vp#;Fy9Z+xIT%d z*?i85R08U-{(S#BEK4UT_Ei;5<~z+X-bw0AG_+rN3pi+`G3takFXtrIv(&$6o(^$w(zI-^y@NCJ$uB1waqvm%L0p3A;- zDoJL=ib$=pO3qw%(SrY>I(BA`R_YHZmb*UPzsnjMs-bQjMeyR`l+&vT7Yi?x)y9<^ zbzwss)^|a?Q{YQw1VnGEq)>JBGkzB7cYdLop4@Oo@{_CXLZ;eAe4|e_X62KqUOF{p z3pfw+V@(#$bvow4g*8}-u6zbL`S{ILy7^#`Rr?@j=+0kdv77};KQ8h#3gw#Y{LHf& zZP8DzI_lJ<&qS*+E1yht(X%yZ7{%F)KsK%_EcF0Om0L8_dZNlgYtZ_%{RQ1mKjE~D zdku0X7Xwc>Fr&To(^K0#O*(MaL<6Q-{gB!$l6^Od7c6qGC|o!6Rklp@+G-Z(URj>; zQxNWy`=f4uQaa16`g72`)WN-aD*u0DSl{;3Yh*J%hCg?iR?{7jGm%us zlI17W*|Em>`Qo#qcv+)(D>c}^mi+F_jS;#|X;#nbCiqhufg53Sp_IIxE%btPPgy&u9hDt784t+)SrwX4W=%b4p(3?Sl){?PqP`tWC)CteaD^ zG6of>Wj>SWV~$|*uF8y4#p8+JAIz=s*~j-Xi*L3+-TFwCNezWKr0RX%neflnqC6D{ z9#{QqQQy7a>eQS28P-|5sT=jYQ&)bE&i&RLLC+xlLPI>qc0}njY>`Vt z8L^*;3S^+$x1S?Y+P9*@r0CB$VjO+-Amx6?DM&GQU|9t}UX9{)v2T1qYEp{rR;FxC zrO9P%YE%3tvUSSgoXQR`8S_*%z|*~N=?*H(e6fXiuu65McfHU1S5?~0chEQ8 z5#u**xQliQ4iq|hhgdc|P_lk#yfgVUREUGa|N5yG#{cAUe%ldVXJ)-Z~S6a22(SMUjrGZsszq-)k^)TN}4-z zFnuqsk|0jsA3%a5@S>~b^`>fTHq~H78TDJulXUS*oUK}^Um^31JBFoZ;cJe*Kjv8D z>&@2jr!qIJOU9#^P7_{zwcjTa%39T^HLkR1es{x{nf7~ETI5^JEvXV-vQ<{bh|GaG zx96qi4$d5iKifD^|AF_6|LyjC6a{zMGcmqmZL$ezoj3N2`$D3MT3IYJsbV5KA!)G4 zB=rRR^;G371UZ?R9j!{-rv+J?do^1Tv-IDM39&dm_*2kZFATcA>_5R(wo0nGZe{Yn z!_n@HZ2u4o`M;mZ3i~hC_e0fk%p#RFh=8S7WyMshU4`DLId9b&*#)?Ay5`JO&8%w& zLAn2j2INeet<)T+b^J!BicBP-|Dg1SYLM&S*DrjfjHaq=_x$Pf@-CuthQAt!OtStHKzL?vGaYbCmE~omdHonj^zy-SfCD~6v_q(3 z`q$2;@@86GJKtA4$!}hh>hPNZLo`Fss2L(oh)0e7f7kwx)t_64CH%w4rGiyo+z&n~ zEwOoE;@5AkSzBsm0iU-H?gW2E`k+n_B2{rKzf$2G1G+%i>*dSR)dMc7c#F-5SXGEr#qHG(DN4~cMA`sDo>k5)U531};z@q2u$umc++%%3E9TA$r+Cvz5ipDg z)?o-k4vbQ!A%9-od4(|KbKc~a1^qvZj~gO>sZPouyc<5l>+Ze9D2Lau{}N|FzsH=G_zS&QR##P&J)u=kPSt6bBCDEj)IyoHYs5bDs^PTWzkYDG$LPOKba{S3&;snt zGnKPF1{>e9l66)|$In{uSqm<}Upw|K1AYP>S&#YheS?eNk+qoLVkI zstF8J?U2BEe!~|hiZ^livs_>DP}z{7OX1i4_zQO#saZE<0jFwJ%9F*%?DFHmkHWVpSQnGGO)MwP@ zYFC+WQ#qC8bXw_aj(2I5>pxn&gZyYU75$T`#ZO4DzFPh2eLt)6e?%JCzXQ**-HF87 zKuR8XT+@hpv0`}z?6&?;p3Gc_9xm8Y4&_|&`y;+xZfD|Kd08U`f>>|i{?SPt9pY*8=2&sZV-4NAfPbiD6D^HnWeK& z&&V&x%egBhb=U~!Pv0b|cNo;!gcSQmYz_8x{!C7ix`v^py*cR~H_Q6sK)^^)k)%QO zP?5yW(jS{^87d1Uat1~Ds;-Po6;!{1(JP{GHI!C8`@ht3z6MjDp;+#!bpI}^MXFq_ z2?@TBSI7SQf2dp^-|Ee5hnznB0u-r%z4*XdQ9nABP~(~5qqfXLUHGA2H}Y$f8rzQw zEO$bJEEv^qwL0$QqxZ!K9l*|+=Gb6_9;5y=Dkc&J3h9WN~>Co4&H{Z9pR4Y;G7 zi1g*i)^(4%pu#B*IVn<-&2m14t9{dh0?Na&&lk&l9b&YfTh-s;SK#1#IJY$i%uw#2 zpvl-BD5EgdRKG@szNyvk+Z>SYPE@7L)EHeZckgx?Qw^399dQY>cE*iUmg{GyK3D(t zN>Z16bn0x$XF@6kx#}(__qJ{uD$6Qe%k6QeL3ym2R+W{l*(IrL0RuWwWyJ*5V`T+7 zi)%d;e2%jF+A+ivk&3h=3i`iTQ>x`of9tMn#aC+!;(hDX+|+@Y1$U{N&P@IE_eTq$ zTdCu3Wh?WH?p1G;Rcim2=L5>(9~fjc{=qV@2TiByK!8>FCo5a3`6ILE{Zhmg?8Y+if2HS(T>*zWuYzQ(g=`x=udj**dj{j}bm!F6`aXPxAJ&z^9ntlvN?t;#}w zCFtKZTySm9$7?tfr*>hy7kykA6EFsw?W7H;+o11cgsA4AIC}5O5ftL%ey`M6X1dDH zEefoMAPvi13bQy@SrA$3lpNw~96?>XvRdf7;h?YMKU|Ha00>qu#3&W=vnMi0t%txe2C2a0P9;@Q zh0r6^H`P`^j!z9fJ)Na9YfE+e1#P3Ql8TWPPyOs@IIHA35@B=1IKytcddv{zv~>^na|Xr{kK`f}L8P$*Gjj z#Y$Znx?T=In^*0dM9j+^JopQ8av5*wWv*To+y&lJni|d_*`UKJb-s{lDqerP;`%&Q zFT^XckggN~53Hw^D&F;+`XeWz-xTQx4jR*)fDqH6{}JUM9l5@uxL>MpDUkGK`3mUQ zyy`)u(qY_>o6b!ve*@%4Iw>IS~ zDpw>&DwWdABNyyH6{Yn}gz6ULSMgFh>9Ojb=&!I}$HhK``)|s-zwo@-KUr|A`Xvoo zj=IDKnVw%t3|(wqN8y(0cv%^Texsp+=A=8z&%X|SH11dtN>mLQslmvi;?1WYtUiFG zskymXcNO@Znc2f!uL=f#d37R01dP=gIiV9458N9olW)Kz823%N zGj>f#Z7P*22dP|RQf2CCb@?+cuBXo{ljv6mrDB{3g2sui8KO}_^raB7%3Kcop=NRn zG4nowoJwhklHPC)HrtOJm3@_s8Y(ThFP{3@x0Ti*z=TsFDX8z1ri9Co|5}B#Ybsv? zKhsy|9I9Xeifb{k@<}H>JB#fwueJC zR>*|K&6I~k70x%n%$JrwW0!$%sZ^?Sk5ocmf1@4*5y8E(jCy*oGKoHR5(OG^aAu)Q zI5<|B#vAsXl&yMm3}LX>Bd1af2agRh3v%*;t@Lh3L!S+rr&~^JpSOCw+&Ki;qxWct z26idrGQyviKk8satxSPmEF+8J0vDA#X8Z3$H?vd75Z2@bm1#n~t13H$vCM?bQtIxO z-1Jm@FCy4jwmQ1_DhbBoitY1O4Ud&KhX7;ghlD|+fh!A_v5YK#)R)Swj{n#c`$Os4 z6c_l)a>u;ai5V~^IE4&hEKX3F#`1JkWrr}9_aL(rV+pl@b>E4ef4tP>zM{F)q?Vqh ziB zzC59KEPiuRN-OzSL|irKVscdl(86V|!FxllO%%6=j(3nIP5>;0n?bs$k0TRjR|tPb z+KCdd)8u%UE>i7s3A@xS%Sm53u@|YR8m$PY{FkafAg78}B`XpSD#!RM>DPUHRe@S} z9vLmIR93k;xp+ek*@cCPrhc7fU`}>^L504%g;TI%`62epdsTZT+UDjvVx@akMr-LK zCn2iTJ`x~1zyJe6gUmZ1TslrrPgE_!PlFnc*|t(?$lh(X0cw|{SmxCCz11Mc?B6e} z21!o&u)F>-#5qokQlZNy*5r&eL8W#AbStW+5vQ}sTB++Rn7RUA+Rm`Y5>NCnJ zrBSP=YPpQ^Sw-(M^E-VXqM|&`!bbjfg;A}_1|f#!I-pZM zCZLCujJ*8J{DO?^f|kzT`8YLy+sl=&|DPPGp0fF52G~iBSEAgLmGIX~s;_X)A3*VS zOfG`e@UtdZu20zpn!e9mewv^74|QO|F$}fVv5BFnxz#oz`Q<1B)c;Q1p{A7O4L#GG zf)T{EA$59ZH`T_e1jm}H&4BbsSmSjmmU(tc!&m3a{hjaN!I6ta|6`7S4K$3DOgzsC z`Io1vXU+>&3g?O)tMp~Ao`7Ed_cuXtj0xAc>2V>T-k>@uK{rOHPbb{_SoWDyMNlW< zOj5@gFMP|lQ*G3+nGvjzl0LcS{uqz@4z94YM7jsc_Dfk0B>e6RH&m<$2KXGGYgOy+rqv$PV+Ft z8E=wQ-zZiX6Bchhq?9-Db4ct`RNhN>^mSI*T6nfh#^n`#1fnZZoLi$q>=*r(^y;U03l#gLyZ!6RZ|5X2RCo1@ zp{|SxTJeTTb z_MQYxuA=B(5+DRfKoJ4~370?)?n9SkG$#Z|7LpK*}iNs_Lrh^Px~& zM+sZlTv+!d*=&>|Sp|t)L)*>sNvP(JUfRdA67kDp58JIi8FB-K6H7vNkmtfc=;+M2 zZ6!lKJeoF9WdXJ&D)*Ye5a19B=5b(wI3omt($}kH$m>Wx;JZO)C3dDq>x(9s;YCdl z9t?~QL$=sR4OV8=XxPOqH6Kq6A3ge(2W(PQG}vc*cNGn$E;EejUj;@)@SGGx)s$b# z43Q^OlQ5p!dJjdc_6q%W2Iv(NH&%Lu1tJ#$L3@Q>Eko|1wfx4H=vkUGH^RInO~5pd zHsS+@M{5lmo-aNSScoi>^v|Yi0{L>dK$^gVCyl4$NCQ>X@W_k1yoT}6tkf{Dtv}c@ z14~C5ycM2C`k@7qecHUTbfDGvyo4SHD6TIdX9J3UXE z38M8pFG#qZzp>UZG-QuW?V|EMd|?roFKn3DKGQPdD8gq1Iah?foX2h@7w7oRe8g#< zDzuR>p~6IXVp9pC*d7-oJh7R4#%K)})wW~oq7p~uEEq*mm{4jdp~mJvD3H0$7i@%a z$Q!!F=Jtk)Gf@^aqA0APOH)FP4ZTMoa~mqy2;-19bj%i^LDk~3G1fBBJO;i)>wvP%5V!%pe1EXL0ytSnh z$i*y=TFA~cTgJQNKFn<`B@(E;Wdf<2rO7Ns;h5*4j{u?&Bb6~5b}1KzleMRu|JQJ1 zm@>z1-Ricuwn~l!+G_lWCmH5CPXR0f=j3tj=|N5E(Pnwb-C^PocoLzPCXptPKa1A) zRULXyip#k)*91o%Cyk>D>UZ*mT*(FDR%6tJy;P?ne875WN-dZ)iChDugyg3*dN}_j zs3#S!)n=>Z9o=c4cRQ76I5*6Y6^tOza*088Rax6e01A3h|`rKsRDWN3mPapmazS>TI=IfHMAb5GT&Zx zbC}@b;B0SO6c6{bsu89IjlVF}fJfVWJCO`z7Z-}f$@S`h13nV}4(z@O33?yKt^nm0 zka@ssAZ{g2u#XzNN@EASg<2X%lp#BBPaT1}SG#e%yr(se2x25Kh<%E4S%TXHa?G$M zj^pOVcY_BS7~*K0A>J~cmZpQ$?w1Zi;1#Sio*}*}+U+8t$xvuLqGb$U)sqI@FQu7IPDolo$&Q3CS*`7lwo+ zZv5~zZfPz#ooEd{Y}`lG>6~;BH!+cc`J*a5SyUB_XW0Nl90&|g{nKgU;PcaI<>Fv9 zKLX(o3A(%a-E*TI)j<#4@VGoz&5L8OXv?9;cC(Av%t~s>N#lqzqz{_LhjOA--YMb6 z38ZE1FoSuQj}pX@WIFg%hoFnHrQnP1)?6Pnl=axNp0#&kgHXJR6}$M5q%4ve8jbpm zMvGuT=vG)l1RhA5bA?~-#HxHS+M71L7pl{c9uB$1&eU-alnU@!i9)VeIKjzd3YIOQ z{|=$k2eoZ=!}z-)fNF4EuZ{l(96=(IB?I}L{8RmvA%~B5#U+D<)cQ8m3J_fkO#cQ< zRx!rF@$m`%+)R#)N0-bwfK^)3(eR-7`Rt%vWQ-W(LY#{tk0HAOi==WDEj^cu!bvF$ zB5wm($!O$W6&&Mbnhmj|OZec4QL^u*k$)V>2gW9+JZqrT3!j{s1_QP6K4(5<5JMv> z2EGVuEcKH2fD_rE)N0{a#X;SzCpC(P9?+cuSlS^M$dw&Z2jZgF(L=eicwG(nylzB< zFc`e0Vd>%F+uy3<(@)*Y4T6P4ck|isU8vOMEeJ7mpmj@CKH>I5r^m@Ylz~WddMf%f zXfJISZF+!N(Fpks>LI{8i>nq~YgEmS-NRs!IlrKR%G$P#pX{pl-Ed5z-|vv9F74|F zLd_66V{A0kTI|^;04cd=Yj{%-E4d?)9I)3urwT&vwOn~pe;v77%>K$y7`=tP4z?HQ zos%iKh`qBhO2@Z`676|hs^nReWniB(?*8yGNCVCySp&v5Ft4+_-YJc`5%G(zIw3`j zv;!Xk_(D3c!EzHshdumM;6?7?{)8=exunh%xhF+YqmOt=m9_38jONPWeWN{Mx(frF z;W-S5h^C0qej4Q`qCYVRrOV3l4q=6QB%`U27NX`{=cH@hxD-f=5r2%UbRC%?XdS?! zavcPn8$^(e_l&M_9Y>mc%<2R_sIK)!X2|y`Ye9Q*&D(B#+?IYRjzv#8h;I=39dM=Q zn0nP{*hL5;d!>bs2A~}PTf1e3(dRH=M2q^fd{7UhH!?%6psaZwNL4jDfo5NwrH~{q z06$39TOw`=7aBSDI`dLF&#!-Nt{fmZ zhiC_#o>4zVa4=XxG5&C?TunGBo- zX6%~`h~v%j5bPFOLCmzd0OWUwM;@7pGT5oN`A02v;Qd_d`-$#Xtuy3{6e9XEqDzx^ zcD|!QyykB`=OYTlq|!q&Ly}mGHE#FxxHgaz2tz5o-x^A?ET?=-m!ZAd=X{HnG}y=c>r$Sr3cdbkw(!9 z^lCT|GGtbUi>>!FS%KNU0&L|N5A=_v#h$jLlJk5@C?x@wA&*${V0I;TKwrJ{MC(>+q0zb2V&9p^M}QObrQ9v3)xxog8OMJ$jEBxN zZaJkra>3cfgMqj=yXd0^0qI6iba&${;`hVEr)oC^gF?YQs|e1ZVZ3Oh zr68;iXF`l5WrE%oyGi5-pxp@j(#p}vZEMDaDddNgxaS|`dvP-4S>#O4TQrGg$k>nj z)(7`^NI)rdgetkSDRhuC6bXc8ui~}gq(lLCdTyVdME({=igj;+z`h|+gE7c!<-V@> zgP%}sNvjtDuW-IoQouyr?;^kxs0oclcfCdK5*kc|X3z{A9m!XKzN;<$+8URbM!!0MAgUx*Gau+q3rLv$Bm3kOPl z18~v~4mT7FB_~(S7D_dzS`Xgyojy0l6ArK4<+t2Vi65TRxle_(Ga>+ra z=>XZ}2zXNd1wbMNRb{GLZHhdl^aHFV=U@^JbG)cDUUMu;S*XF#xoGkdr7qILRuUdN zvmJ!dPkCJ#CORk^K`E(q4#&p@OgCqHELyNY`MQMf0(+`mT53n8AzZ|hDPyHBydKk3@PYLKGXqAyY8>#=SH>PfH(-}Jl0 z^{E#k2ehv3=wx;Sf+F#!`HGN_D_P5{B;tWkeLRp#Qk7>X7pS7qU4&p<_6v7ol^A|O zATj!$C^28E_gt5# zI@3LuuXtovc0b~X;mUlm8otICGIo~(VZKB8jOhJ*2{)I;Ne6W{i`2*ZiY7yr0{d)X zVp@5il&^Vnk5kCyZrSV-T%^A&SCmViqzzXV#RHvpuXgJ^HwV7_s+AhHqLrgd2K!j| z;Hbja5NI}`l}05$xsBwFNyiL10oXy;!|&UZE|+QhlqhU10Peysq|-E!f}Sjb+G!3o zUH9CZIjxjF7hcbS`SFE7Us9BD4^SX)?&UpllwmIoyJfGjx2QLico**61ibJ|g<45= z_*|+2+x0kjLs2VPITTp2F%sNoQdYzH0rF@eBc5IS85l}zqfNTlMzvwMIiM$+?Y4-W z^MIYCHr*l?p92=-+j@(b+x`%L`33iZmN2MWUme)xJtV>BCDh#@5a+ZP8S)g0!~NWY zR&J><=}?6s|GO_kZoV`q$&p4aG$M{#%p*^rH&<(D0bebQLJhLQI>;gXV*x7ahUtdf zdYCdbXyxyqm10~B-{nb}0NHY0NRE^;K`%jqkL^uu8}adEG187PHkNmFHEc$p*sCc6 z5eL0#(|)F1v~_ouA)C$T-YoGBU3Lq3LEwpf3wg>GZZ`22U@d$|)O0pBUZ8Y!eMU*P zF?kYczo2T`2uiN!V7#K4|4U92H7+V^BzyW7|sg6f&F3 zA2(2|4+3_NIcz=BpIhp*iB-D{?*pc?*-E+6CayFq@Kg1Kh3k>_F=-cF6?m$_-mo@F z&d$`2sGxFHdb4mxZCsmhI0$Pwcoa?HkP*_7dY)cRSb&+#EJE?=G4DlSnyTSU#Syib zAmkR;fgskX2LAyXOvmJ6qbS;K9kyJyKI~`~QSm9^0c%I>Z>%PWhxhV}V0EBPr5eWXNeyQJ;-rbTyWt zD{GbY7a8(P3o=cSP|@OG-dFVJK-3O9>xzc zOE_?Kw61F2Raz_3U?%gxq^@}(&kmBNX$U{EFy5w4-b#H!BDDQ6x?Q!wg|xWMOQ6lV znYP72wX)r&(cc1Mkml{ZuldCKJ~Vu=%W#F-iwxP|SSoRpvGM^e4N&J1j*|95O&gQ` zllq|_v@(b`8kbwCM(DEFgGdxnw%E0{xVal=T?^nLPukA`TL!e@1Z1&lkkZOCWCl7j#@iZu73=WYp{!Kxl}D3Y{4SB z0g+x#u3Z_+u8gQu%Xye(fC(G2(jT(7n5)(1=K39S6#`8wl)|w6+!xS8_6EYh?Kok` zHtVI0umO6=rXmciF&qpNIx}H2rF`mJEadLAGdUaK<~v2Fx8757Tqt*I4(tPV>H`(> z00Pd-mGb3&2JXVba*KqK4D|P}oKaXt4+qv)POa4neWiY{3iTRHW{7>5eB)(zHy66wmB?Nx6Ud8B zO6q`_avi1bN_u;MSDRifFV90ao&i$Im3keQWqTJclopds3RLCOW@&lWM|3yuzF1T) z7eSr04*3*RrtD5H_rs*TZZc{K`5p%bhv+KBzoH$A{1%X;soTZO#gQ?`sWz<+v<%Bu zi_yM?I*vMq%mHMy@pH@7e)i?g`Q_pObpi`(;x7nqx$4R}PQ6;_wV7jNLj_&1SaLb1 zdcevGZ1e|${Z7L~XvbaR;Uh;cg_h-3@GpU8$am;(xt9efRCGiSguKyM^|8ftje&P` z9`?v506lFScE-S1D0IKm&g2(R37umZ)>fQcKQ2}(Jp+0c+?~u#ivF3cqwB#-qnRmb zRmo2MO+b1mAoX$fb*EUYkY)Y=HOE<6A=mo@I4hRqV7rBrCyye~yiy;8?D7Dl8FeSS ze2L=}T_ZZQgp5?n5X<@(K`6^Z7UmnHE&=E?Jpflaxd*wR(Vc#AZ#tZ$fmLQX97#%k z4`36<7uur)$?eOk(-HB~a5tiW1=3t4*9#dPSuU#6c`1Hxj%RM#!XLY+%7i1A0~QGZ zwArXhegQE3GggPzSc}1Ero_s&7xxMOnTn(tqqGO5mbjw7VFgO^ztbc-c9tAFa^qm)x!L%r_kP}53)8oli;q@C5Qs`zPzDG3 z$_@r@y5*Q$2(?gPB8l$QA>+NB$f)`aw2fAEqAZoMlF%{^m5%OYe(}Ppn*@h^o*+p= zZ}j&hNZ6QwaY2TkqVzO#{KN9%By=>lm;^;??WLn2qitjoG+y?wZDmp1?Ra=+F-0$o zJZa4_5|P1z<&7ag*<5rirLcZBq)`>S=KMXukqoZ>()xsj&C(yvY09>?yFKT3`lfzEysJ_@M z7B0U9d{)If=S?Zw4!vC!ansA*U+3nLE)gkDzJ2|Ywcyjs*C2|5Vwc7Vk zVHXp~4?0T+f-y*1UhXW;+%J2L`pg<&Aect&xhAw!SRCx`{cKo!VOG|h!MCnGS|N>T z0xJ}sU^Rp2cYr;48o*jRG7T|~e1hBC1(t!W z^bqnZ)_)2}10$HVf!aXM3KQA5?DJTEPr0@1D*zjv(Gksc{RlY_7)n#A0yD(Ko5I^F z*34XUR#_3n7FCKOUkCJ*(J)aZ7@Kf4b9qSmKQWe2DoV%7p(!)-^OaTpL3vZtSe zF|b=+B@;HeAhBd{9Q|^1(HPxav?^GI_744lGm|Qmb=`fTengcvz_-xh1af?0egzKb zgEvwn^qwxU6&23Azo#Jp4ORH+#${A$xuZ|eov%DP|VCfdlkA2_&0j|z<^6H~+n z%pDHsBvVUbx?1Q-g2M3WNszE@vgGT~q9oNlolPb$H;f}gw)zs=rbJJA!zoVd(b*cF z11E1IsCJ;&J6pc>+3OJz3+QQCaTW37~RG1+Xv~v{TtzCmkK^syTexkav8W3 zpijAa2>N8+;iowqvIy$pm@Yew?L=bdyYQ8JA-?Z}c5&g5T@2ZU>n_-5gVsNPD1^v&%dEk^VwFgy zNslm!eptQ0D3(G>p(OdMougd^q9SFGo9|>ev>)#O>L0I;8*db%7N>t`{zJ_lNnsAAtA1;umuhs`$STRnWi{@e5c({Gz}j{>{Fg z9Fscu*cUMQHiKWgqRc(it)#>6ZBgy#nS@wW=HCrsUbz}aX~I4i+N3AL8@iASE&8}P z1&nIb?f{IwdXYPm*2Ukka-vi)8mE+6T6fGvw9C+2xL_@08n_JXH_~r%8A7<17A9E; zaPKorSeajg2#yBsL3|PTvEcD;x=Vf)OdwjaJWZg@`9L;QmI85A* z3ZAR%ZF$Ln_&hgo*evoTgtjekftwJo$xX3vJ`xN1ACWlN@KV}t!H~Q5L}v=U*JKhv z1%w1iuv$zw4l0^?hvL!2YO*({(B zxcw=uHH*nDiE6#eYq7KGkSkKm><8KWn~V=z*~bFPPJ}XP3?my`lJSgTkx7uyMFe+X z)JYt<(__$MVbb9zT&~I`|Evpk64#x_ktauL9 z0W$py$aE-BhRtUha>PKn?ze_y7yjWZyX4*3stR zBlId|8SZqzkBO189GV1iYH6lE!|`$_vZxM(CtOE66O5J2xo~BqR|YsL+raN8VP;}L zkehkk@DDE`0y`M_bpsr{*+AV7ULQ?Ddq#wt4{%hH_GTJmJv$gVAE~)Zred+*9q1S@ zyp;_YYdphwke1U#1(DNwMP#cR7{_jh^~wx(EihyXuOCp&Dv6$)c5s}@|aKFK43U2xe$iB)Fn$hZML}4<|UINH;5-i#Q0R_gHP#X zR#mTgFR)7cFk4EevtD__?HMKz1WaB`9pkW@(&lkH!02nQ+9wnhBm5LpG()vo!!Rwi z80}iMm!GACRaNb}-&Pz-l6=B-J_##(;|9!k4+4%TCd-&MApti0Ojz0DPG^do!#Ncn z#ca;!F)>L9CPBW_F`PWwF`T?MXzXb8cLs~a?+Tns=|{pYl~R91Z_(3n9DNx%ng>Tn zr@>b^^EKR-;{7Dw3n_m*r2K>5r8=MpXVY(d!WTbX3gQLXGXl(ffbk7)a-zdLpb@aR zV>D8*a{;dz{o)`rNX4maOSRta1eVme`?2q_J|A}T44-nhgON|Bg5^?n>^3!$NYXb;)_s+bbX)6Dk*>4G+2KsuOER|BMXjDhnyk!8|d#}8L5#zfaIFg zFulw%@jQRQ5~t*H=8ayB<_3e4^=@XG3esGDx}QBm#I11}FVZ!TKe@8tir9 zlu6^4XGlZhhk&AwKW>J5?l}RgJ2o_%ZUC+VHiV6BXN@HPfNGw@nMRFVlo_T;srQkx$Wz6S9AZBa_d zc`;ybM%W~}_;uo%Z$eEfeN&8vf=m#y?~i!x(y{`4^@v)5@1>heTRwo~@YFC}445L_ z=Ls9Bd~W?Dccg&hcPZf5>UP?e1Io+i7#X7DDgC?VgA0sFXsjljd}F<|$;lgegl zv9GK#N?(zcP>SAbs#3~ckvm0cuC{Wf1p;4_X9bi6Vk-G>VChzO1#veeu=E%xMMeX; zI~j4)ymoe&qSsHM)KhHrx_7E8zV+O}pd>2Vkj;i?jvL3^b69?gq;} zQ)!8Uk3Cy(LseQFyZ2BH&bzJB69Yf(<=%=_Yp|EnOQX0sG^3Aw*XUysLFvv#>1_&Z zgxhzz^i=DlxWlhaOPd4TF#bFwd45MCcD|zgFGD+ASV8|lv0g~| z`cwHz&(*?4jRpnYoaJw?d%Z zUUNCr#w1NS8fdA;b5t+2v%pwR9<2SdwDGHZV)h68xF<%42Q1VxOW6Bz76KSwxB(l% zcjQqh7j=6o;sZDQt2&a2)TK)TpfI~f4%rntQC7+Ewe3d#8m)V&4j1_&Hhuw>7s z3H%Kok?6H70@pz-0zdrcc7f|vqhePDej#A@PRkAy@oOzY1IF!0&my!&8Q1*r9rW`{^n1%!fQ zQ8rxSHTirbs7DZrw%3NteNX-o5pLIqxupo}0AJ{BVE`9iLje5)Um#ifiu@2tMNRrb z3YA#?o50%t3M}317a^?e8wPMV00eP&F(UBUHy~blCmOzu z#kaP7evD0LtzyCL=t(+gxGe61Dsmqb{>kVJq5zWzVU*-?G)nn4Xl9({3KQYe|V(Hk((y^x)sPy;~{e5rMT?(Ryt0$-)=T}mn%Uvhe4(31#Z*HNwzAx4f0&QCv|{WZ+WYN`ooDv-6WFG*0t?G3C-nSy1E>=(7?FjjM>e>7-~3 zMJGk%y6bCX6|7lJ|Lq#ubk!7N_LuIb)+2LzX7<<;pBZ5{PKpDb;z|7+MMjQn3f2>v zg7wFMRg7|gfAJ?FztP5O*f$&A(1pQ389a__6`@Z6A<;a!r6<9A8fE!C>hc_q^qSo5 z4~7FNUY!honhFjk2B*U<&V|x|ci5N>a-|ZoeGJ&e04w`P?`u6C$0B%m>4+6d3CY(Z z4{*|dQK97IeVEpZ$wP^1ZSaiR2KBhM$-P#t@I6<<1yk*nd=941Of+7Rg5g{P1I#HG z;Jb4+45CQE@GApDgJ0+1WBN^gtI7$^#rb_7!-$~)unOi z3161r739rp(mAas`81G}ys9>7H9xnkQ0fc$l0{G*@=lZScmH1PnQb1PiAlgCHMXKp zAATKb(nicI!Rdv{O7;#WtVS+P6M8z2PgIORKAgCn6YB>BJ})5A5F zML)#sK=Gs^vi5+vApn&&{6=68g7SJ}zw5N%J?dgNRnBzJoG?>Gbcz^)bt5%Ve{ zxIWQ<957%-7Q|aEqqNU+s>tcJHQt?=h9K2qWgKw=V4~WdTdwx!iiH!XeG~`kg>tEh zH~K~;M(*X@P0i;Eb-1x)W~Eku^IdEa84r|^;O~U(>5E~vCM4>f2lcA;~sp9me8Ph?_mT_RwF;{?W{zZ!kr6rAK zaPFDi(Sr3gTaBwwkKY7g@GX3}0dE2LRGeYNU+ydNH-wYs4)scGlFb7kBmYD(doSoE zhV&?si_@qv6>3m_;CJ<+UPjIcses->#zwA*UE>eD1}qHFy`PXc`Cg(&`SSrI+y0rg z&8OV(aXxTlT1t2paXgk~6_z-$&(@L~01n*;b{00{pN>1>p08n_fz!`u%MSyu(%@U& z`O)c(pv@4wOx_nl7aNaLnyKd^?_gDO4u>wj8i)3(1;P$i92=91U6`eE-XVLv#9hab z6%T^D_ju16oCk!{iAW;Bbr0u%bI5}6&h_1E^&tz!@%JDQ1Li}*<&xKg38#6fKsw!R z$m76FEsL9Yh1KqVQHRu)1MFO6URq#*QKo+f04I#QVC`7!5n?wFDB}$q069N#&EFX9 z&`(!enxTUztr+`Py%icb8?j2Q#B#DKDruWfAmoU@vo?i(>4GA# z0+BBO3f&T9(z!~dxRPw}3WcKkm0(hb|3N0=OKD<8UVDR4XrEKZLUJDh;(QI79i6=) z`F~K9{ukYzpuj2n;TP_G^8csj~l+jD4*& z{9lN4ye)ICwQz5o%0!IVf=5k`{70f_*^?(=c@cT?pHvXcSLD%VVVRx!Fw0AF)9Vy? zL7^WOG^u&JpxP_4=NqiA@rkaW?P;z=z`SVBi%^A>0DT#jq3Ghw1o?7JdX-(aj;Hg2 zFS{e7-((!hYgoP;3@Bf|faE|xl?9W7!%73aJZEoMuj$zbIfe3<^*NiBUcc=X5+FYX zg6irx%(4ws$Y1cizZa_sA2|Lk%JD#{09%g>Yymyn3p??$^q^@v9E)V4VMW2Fvd;p$ zCbJ#L=tI78?KoyrwExZCHmzxKp;*k8(zPc!G^NOX4cJ$$i!q;`%9_OZ4+G@h+03V? zy>N>D{{Vj_QrJy;~g{)nuNs;uBf9ZaVrvO80Xr&sy3Tn`Y zC8AFZc{aOeYetVq(artIqSB%C4AVI;yVHWzkkhd^9SE5{@9187DBJ8FvZ81ck}L@a zD>@IXNDng1BMpTZdx#nGM;3pSVvKyw*CJsyHcbA8a#_;C3c)S$KQiQX zl~!V>q~Vu4K-eK@`eBB^c;#{(4=Y5fkNz);JL*i{F9Y5sD^NAFI9IH>$wWxJXs~&% zsl3z*VY<}jyzke;!~Aes?Y#&%i0d=cqWuTo)(88ybm$BJkRcPuNI9`_d!nnRPXmCj zmC6}!h>^OO@^-aVPEC_l&Hr?NPJL?A#CC}Et0uCivN)z*FtsdiDuEL zVFBiDf*%Fo7Mn5wFZ0DaSqJvS^9oe*^@Lh0o6{9JZyB=Z@TNL1m(E2%r^W8ZrTrJ6 zZBb^EB|BklzZN&COKbL)AuE6b$;{#n4&+t)4EYH*#vLNag)l@=erCv~>nL>9bTmew zSJ0}HTXK=%R^-AclUy>qHqj*)h0}py#4*tJ@MJ(n+YrT&pqd&TXxV*2tK6r{xWhyP zXGyAXgBICzUB5mNmZ{6s28+acp|x@S&R}fkwZ2*n_H=`;t*WPk9g@&+$-xRoXHQqO z)+#?UWWN#IZz%6og0R?dC4l*c(cr4DK~;-223Oj1JwJNN7bEo;pz;mtXMn~cD7NMj zC*je!MVtxz5uHa;P-Vyiz+y`sw?==Lk$#eHp=;E5IuUrXm`q^eq@ZXlXe+272l16q z%iN5@k!nI2vcdXPgKmz*=2rr0(9;P}C6#_*C6;3ExE>e{?;XwNV&e^x_K{|Db}Vof zx2H6lrz?G>72IE%%a`73UIQ+DyFiS=Lh4+%#>+usz0Zbi>02#p-=)w#S;I-UT*$5z zaxcJY+jb#C>1j!Z95l+#i%8vAMk1TtqOk238o@@KZp&2i6%YdkDpwb+A>G2^>bpLg zjx`IC#f?7Fm*L4FqwQt~E8rd&*q!TPQ-qK%vy&m) zZlc9>x!7iZE1`niBYby_hemack{Z_K!j3e$yFm`r=vHrA+wntw{y%I^ST(eUyLrod zSshv)KhDc$JNVjso3FN4V=JdIUshX&ti7q~;@l|;HaCNgD%uI1>Bb$95c`h?^tO2; zdfB0VW#o8t!M67qa ziL=H;OHM3pT`i6JCXh$ciHbEvM(=@);wL<7igYrY`&m#}YP3d3h$c~%hGxiFAUA2a z7%!ak(%XE;iF@oJb@~-*0pm73x~i3f>(bw3$j)0R3?vR7I%YK~(n^hhp_NBTgtRJ} zU)D+^5rpVo0cnJfS~cV;kPZop=@W#u{zhn?C$1Wi2qF`kMt2_T*ZIRn!5Ym$D#>Ng z{R3g4QHAm>uzcFrS{#XrU>*m88R0TqC3)y4C3JYZvkN6BrXbq zwYIXFag?gFpsJmAgdk)z1}@kFd{S6cqf(shs3!CBXhtiI;PU9cRIL_>{e7Te1e`4cwN`zsmp4)V6R0G|=-P!2!74Rr7hlGtY{KXte-Omhyg2CcZ*?|o}& z8XP+FR0E;(Ss1QL?L-hT&N@VMZUNMr$Y+QHY!6c)ycbmKjMbZ9zk;uI!Q9SvZeL`jJ|uP}#0n0e>m#v}wuFS5#{LpuU(QI9 z+J;j;3_pfk1+D)CaN6v{gTX{eRDc?r?r7(t0XtEM$+qGZ81~{7MH?r$E#R2kv5F`N zqX71E3^YAf(l2luNsA~5BN}2$o)8jKfM(sNYBX*-F4~eI>+j?m6U)9uk#0ka08qB% zGGTRG421%#0R%f}q2y%&^bga%2*>RGe zrG%v_tF2UMf@3re4!nY-Y>7myn1BnFbIK(x(RmoPphR7s=;*K*9E_K6q;wZMcm6>l z!U<)Aj-KV{0G1%3gG9@5^jd~*)&ZhYhL~OeQ7NJhvvi$SYRrU&%BE2UF+8SPOe`~o z6+)f04B2c~Ewj-<{A{-b73H3le5%4iQB7-ffT(8ER!!Xk@`*CFp*L>zu+uGf^NUbn zTMtbmT|FdH0ExuUVpdPWshs$mZ0LlHg`%3c=m1g8rmdRV zZ_j9ni{7}^!%nY+)+e2WSv@848b~C5;<9?mV$Z$&tRpOOSqH2h(72*Kt3sPXz}MjRanp}Ly65h|FP5s-#vM1i51(UTj%BN+vm3W$7L zz&A=s{I9aoWpD=fyt-~xFD1nx^F4oxYF6PaF#997Caw5isMue2$~}vYgHBag<}h|< zlm`|SoynGx1=U=kUIXo0%2+KjJ2R5Z?6Fl2MN6eRvxl4y80PdO#34S(CZ2$j;v#ne z((H74|3P)2x1NZ-iQ{}*ZNtZ91zqY*N;}aGWOlMF30W=AN`k^L{v=4~jzqdAF-cw6 zCeZWo_-Vx&FSPSOXm)!G&Og?0!6h?N=-6SlP*MhIFp510YIs{n5kx9AHK@vMp(o`9;6@D)a+5{9@cBGf<$;MAb56+5yz5xBkLQA|8uOZ&$&X=Se#t1SA5;3q2^nytcYu!BwiWD0NzT`R3d3c^Nq)~J4 zMyIZ{>_0o87stP#JBf*QmX#-V$!CKk*QCCYNYxqgwq|hR3`4x23uhw|(NC=1gAa5A zuHYD__FK!vRltQDb6r+^&+mmEIZfDrp}-rm7cbqw`!`TLW_v>8!DEIYrFQ%}IAl|Y z9+dKcM%^w-z6SUuZxPSK#$Be99YWY50IVv#3%p4Km{_&r4by?xAqOjhNIX<&fXg^l z4c8H;a-_jX9E4hW7N=?o4S{a*HPBvoVikw4_BJWxeAwV=2zgYFf?V1#ewRq<5X?f zK0@!@jl+$m?>JRcXb5z*nR8>MfN>aXZ`)QUe|RG(2_>J+(&cEDa=|P%{s^2O98CI( z!z)np zOtK8uo8JgBF3)2dLc(SH8-b(|F-a086BjhnG}a+V4UmWfsNLP-FLDXImbO-l_Y>Vu zC1=Rv6vS^wv}8o)5g4{gA#iFTP`oxYEegP1XnG-j!XR_fVexllq|L+ez=K^H!ShAw z^5KakLtX-oPO%3D{$l}D2k6)I&mIr^<8kC$Vwmr-VNN^ z^#U6nCFJg(8M5W!R&#P8JRyVaeF}i>_^sHzx*2j4R82{cE^is~fg_S&1s~;9mpSAH zsEukKDB@`~ff!u0^qP$SBn6xA6xn1Sd>qgQZiSU+uP+DP|+`CPf4+ zo(wFi+pW0|Oo}s2=I#lQU;CxUGkuoQD;FpkV*t&lK<*o7P1A_xQ`wNF0rkjL<-cVn z!&+dJCq*Py^^(?y9IGEhshV)OBOelCp|9lR#}!I-aB?8T@A=weaPl!ENJWqh`Go(0 z4n!=Q=9GGu^yjKe;d(Y0J9c;XIrSOj*iWgW&p2JyoqV_ukfahBW$GF7ONv&TuxduI zQ>l*6>776A_@&Y-0X@G~rWcZAnhlxMUBGTq*Q!h#$C_1=+1JLgh097 zqDETa9fi0K@QBXkO?ONo&j|d9jz|cM&`S5u4B4-j8i^au-4X@pD*%M5;gG&N9YZes zm9Wd27OxEUIz3UX54mRhyH}4nwz^*!`JRYw@XNbI?nRWgyv!g6zvR7V>-Dh zuX>uJu`R~ZdxNbK)iY%8#ZeZz1$@GOEUIV77lB+{i^6Dyv7fIhmim$);g#=ARGBYD zj##2}wRqi~pSlymP`mtbfLRJGEcv#B-lH<%zbh&vycjg%DkgNZlEi;}+z@0&6ru!~ z&TmH<+JOSFB?R$LEHxxnB~!Vzbpm#o&XBE+OVWS6gzsBW9~af!@CoySUh%U~oXz5P zk|j>A($w$(qij#0+DV=1<^Bp>DNgUM6pe?>jLcn1*~{gR8>rQ@oyg!*z+iuFsndMs zlrtYb;>r|Jo8?OL*%4ZbrpIf5u}Ul0iXx>~fSFpk+5&@$!p)xjAevmYUdR=*l&hw8 z!6*z}2@KVigD(&&&XB**SM@w37kI^N7K`CVZwGt{y>phmXyzJ7^KgTg*|Ic}tOm_E z6q-RNW%>qk)x49>qE*!k<&e}ysJX#>HJT&%7V-#@pjyT*SS-WtpXModBAwce#@X0% z2S~5vxZecuaq-m-U~^`%P%qT#^PEaC*X#5PBR0aiIipzr$F26IknrRHVDg?kAd+tJUY0OEb#-Ag;QTpAUIbq0~34P%k;P+SFPN zR-be?RF-@xxf&3)bC@IX;^WspRHGcWbEFf_xMkx{M-!uV9M3>VKfdh!Wnvx3aF(6pKzWE11wUsAw3Oe?)S)?m*2N78wh80&t+7O z9;>YmaN!(YfE;!nUmGu{l50;|5H7VNfVATN}`gDDbr*Ym_c(i#}^}55`L{&D=9dmg^v`GxwqtS=CjxAPF z`?4*{qtqhfIUev}jYg;G^_IlYCS6mB$MtQ%b<9PwcPu}2AeZ++@UauA>9lRFAi}J}^~hlxljsOM z?r~BpljsNxT?7n)T3eq)N8qjNZ+A+r) zfw=)>&dW^Ol|)Bi^%okeElyS=aJcI!Ow+J6m##CkX0|T^U)LjFZAqddaQ8ZJ*ODYU z0xusuwY@Pt>Jgpx*Js)m{iCv2M;1FE2Z+k>!y3b_&IF?Jxy$M8$OocwcO7!qo~$4$kN*T7 zTaz0^u{{GXL$)^vZPR%3`pgBdLafr2*3ftoHbDDh2xylay3Vh<~m=oOH+oo zh(InjB7y7H94BVv;z`f9`YJelrt9+fHQXFf;-L|dZ|{t6@u`)#I|OR%GT!0`^! zfP@!^SDm>mSG3msMtI%n^=fgtwenLDDwq2g!D*Ddwf?BDhPHY75~p|RA!XPlpfq__ zc+J_R-YOnCg0sT1=K`xBtHP_#hryYX2Vbv|-_hZ#S7B^pll&rqg<{6*DwOLA-y09QrJG0 ztFD~m)T@PFe^ft@f-2zj259oVC@5xte86SbSK5w%0FsFpM3A%3fsA~Vy6p1lo|4*c zFNspsdLRvWej=#7-U+W~+3g7x$6pvK8alY19? zDj0gv$_;J*Olb~c4L$>)w)Y2uxo^)>?gL>7;*4_0myhW&7I!537tuy#Y@7tGA%Y}G z=xnqy$w3ah!e(4aaHq*26E%Lrid-!?6d+y2veJjPJ$veTcHL` z_PA1YByHu$bN^Gwot?!P7>VS5`>*OKsd*mzN??qta3;M4r@{x*lanZwIy=a|Dg$-r zuo4V%$bnY}ID4nehy6MEMt-iN8C{6;RxDP&EjZ=6 zNh*Vsg~_-fM_j9#ZD( z$G19I_8PDKz^l*%ofKhCyy(z*Dmqt8_PkC9sKb?RFx_6OksFONItT}ul*s>}NVYlo zZ`n~9)-M-=4>QV>A~IY}to!qmQq}Ueq-au=0_JhO*LS3T#1Zl-h0-<;f9(Axq2-Ygsz1$YwD0+o~DFXHo!%>TA?>vgVnxL-(=WzTIC|3e`f2|T%lgW*Jj9|5PCwq)pvYN zvtdGZ-878WH0MJ_BV==Km`=0Vm%G58-?ems&TawkHlG`Oob#^sAHlg2BGLJDw&Z1g z$-?gqI?Lfhvzr9xm0Y39zEG8x+y{#vpjiTKJ$Vmg0gFCx-F`p*vtVTf_9W?V$adc! zbjnsI0Dm?38sJS|t$TAoY%Z2deadIYQ0GHmIg+Y;!v{$TSV?0xE4 zytr1O83@_umH==ujDd4AV{eVai>Nq-90v7#6C!gzh%%4*6+u(>n6SA|-$Wutr=BV- zFotIC7udOGEOiV;SzrWSX|DBzAF8sl)QXJRGvB`h*5GYJ=y8l~MP#en!Yk4(3uS-{ zP?fe@NYT`dP?dF%h2GR6XiBeRX|@g` zMXlk~RfNT4-|%WwL7xY(00n7x%qa@GAFA3Eq}Q>CQU@^<^q#=&DoC#q1FNKY8Zd?9XNENStjCtXteZNX##$Z)*74Tym z?Gp_XUa}DaPpS=85A4N1x}&qk4M@B;%tjP|3A$6NjWlP=JENbM5wwLETg~fdfLCK* z5sl&Xo)Wne3w`!sdln0EeBZk$nuWRIfP%cVT!Q~w6pM}|X{PcoOfn3F)%hFy~wmAy6kMpJsyL%)NJ#6yiakfR=1vpER zAwLJuIXyFbY%rmFZYGWsGiB^aQ+dw9e*mvgxA%6=JtIj%S~yPN$WH?_vIHl)XZVZa*kO@Kaxppv0sl8eW- znT_pupVrEBhVE3>a5S9JI1XqCW12E0(R3TRLc+04LL5))ZFQCIvO4x>Yzu>SxPaMu zcX!EsUn4W@pfkd@nRR#j?ua0Hz$qk^$=G_7=yluOpKh-MPm!NhE%%ep0%EV*xv$@b z*A4VL7ti7c8p1QPhg=F6()2eJ7kL7ZdaV|Jk+6mv?-KagAfZoi``>{I z0ykS9l?vbG*jy7^h)H~a5vcaK{)1`mzNu6l_T^w$nkHALirT}w?n8{_17M=2x~yCr z=y&9EIJTyTb}u-7+&|AN&5UsEp48|gf5k14oduP%+yOinN`4&* zvHh?~2h~fh90sWLc3XP!JmWf9=_gKMNUS3!<^F_1H58!1`qPl3S9?(ab$pPMMC8kHjQ zJb;UC0yEOsAF|Y&OC6^7B?*R}Jgv}MCUmGH|Hfy-jjc@G-9@L=S6@O-0}!F=3CX5o zo&gk;J${#i=8&Q!O8ftv-l4jjtb!-SlupL$4D=QY`9cnSKMO+S-Bj@}VY9TeOLGfw z>tWAgGVsbsQY^#Ghwx0V8A3ZSfc@=1sI|?LcBoS8k$;ozUS+iBmaF}^mmIz$TExNB z!kYL?&SMh|uEb0&B(JocQE8E*IdjbzbD#zKk7dZ^oOast3zV)8PV!8PmBE7kF0U~Y zh>`rWimyXODS2`KB-{NnHb$1YPg^;|pJ_EHeU@04l+~_yu4O_8Zfh@weO-`Ymo4%#mL}B@xS^s?lq=-0|2CY6 z+zBYe_{KQ=MR#$LOaB)D;Zv2|50wO?eJ~SVhZ$;e>HFSG2l8!lJy{=a3MrJx#8L1E z1O+V*5(6{3Y(zd546}&B(El#jm5{Z_{s8^Wd%MVauMoavWZoj!nC>`ozJ_}~Azg$^ zM5OH!4e$SSSM{^(8mQfCb+*f{Y4lu*MK}rOv+*92{U&liXOH3b?>sr{9|ZPq&_5?j z`+Tx|n}xSmg^FD4Lr6vD6k&#Z>eV5Qh<` zW~WJSrq>Ro6ScDIK|3~oix7I2Bv^jwXiPW_zIiDfq{cR_bkNd0Uaogm6eL9)`e(#b zQ)Gv?X@@vGS1r*I!o>d@a(1nAcJ46(a?QWc)$ysg-eRs+n+to#$cykE4JSL4Zop3c zCZ`*Go9#fU05>a=;=4n#Z(UzdWk2^l><{ie*(~g#ruTd$b3Fs6fc(!fZbs*%>GhWm*ySP2{Jr(NxdyqyhaN- zy%=GO*9aI8bsEQR(8eKEI^4N9y)!TNg=Pl7rlSq;^mP z;E5|-#tt*kkB;o3Q&#%HAGR_g9|j_?tsfQg{SBf*_Kc#C(xMIDO9bS-m*g{%pyrO| zRK?~H#6V8mSbklo&91}Ntg1sse!yjt8a@mjuklz{!Tb;4tO%l zZ12K_vVPe_2i*dC+tK#-KV8h#G+1_9NVC-0+`tO5aanFy9=87X(Qo-y(XPqwkC#i? z4s3Tis79_Ekc-`&%jcdVzphlvy|C|&AtYzYMK~uw#rwiJ*4I~ED8C*6$hq+C#u`q# zTy;ek?4yIlZTBv{JnX6~7PBSVu9WVoguOKK>74ZPaPp5U{n_tq=2H|x?kayFfDQvU zX{9r=8jPEznq-kzUG1-oAyt&w-VqE@Y}Xo%UCmHMiv8<%*9^Mo#KQ1J-x_p`L;5P; z7XHf3JapL)_l&v2OHeZz+?l^^7u}ivkHDOoGMXtqn<+tPO@zC6U;%cO5@`e#V_v;$qF zkZnPG$<@Z2XAdHz3MKTv6W6Cw8nyj~av4#4Oq4Fl4Nh7-p@M&_z=ytg%1%f{Qs51Y7iH(Fo{ z`{m2QJn$|WxJ;oRz9CIMekB*8U^JzSio52f%bn9{!6phHeGl5DImLM04Gm{pGh`3- z2%jDC?fGzhyX!`xy+M~$B#}hK*5DLw&MuXFixmtZXq>7{m-_IH- z_4142a8w}uCjFrh^A6?x!N{9=c0`Bbk&cCFM;K{6NWIUWpB{dLMZmw;0xBE&UCKPF z4Q{Q$OS9d>P)8$xD?D#VbvhPIheM-vzq*eh$gIiB%7r}mFEEW+WY}Spp!)7`eCN^t zIQ}=e%(vu-g;vI)uGSdxm&2n%Uh+u_X=xH*HQtg5N5z4D>sTM?e0g?#F5CfhU)~46 zwbz&ZAf($mMmZFVCIaRDG}=M7!~Svm@=@fv^9k8FN9#ztztS0|(U9e?CViuq+c6(7 zihXvxmv|#LQ6O9lUpA(T0Pn)snisS2J8pNpv0!`qpQTM}lPoHd2md0(pD+rKt~QL~ z#$^QVU|8y8m(Y!#*PcvB-Ko`Q6sq&!`j?~5XqqV8{eiom*)$r^_dL@ikAI;>glIQ8 z0sg-h>D_QNIdC^ZK0Jw%=HX#Jgba2#UVcHg-6b4mQ@GnA3=gHg6;i)x%4o73OnANZ z3C~LSR2&0%?2OUmi~AF@Tmpd8cl1A)q5}Speq=QHIRHHV3Fv}_zEZB3U6L#1i?Ew9=FpxCqM3hT%En2wD;~ili}i)k(pC>>8(`Au1m`O&aQ9*IyaEt zb$PkE6h3m?>+D*AJ`Ep%cFL3JRU(s??Y_%yyX1kNOd(;N!^4@Nvw2_{hG9k45Ah09lqFaV~v0e?N~t z`rgIIk}+SUzY2Tca_I;^U;h;NxU+0j+n+X88E@-uU=T4?a#W;p4Ms;N#3I@bQIT;Nz@k@$tof z;p66S{)1xq!7uS~%Uk%kb(2@=%O6gqkCVIm@Uh=x|D?Yrzd;|TOyA&j`j{~mA2WBx z$NoFNL0=y5QGCq)Bt8yYiI0Q6hL3~q#K)W$@GJ3V{T@D^dmJAx{SzL;PaD~_>A&f7{jPoSxk1-4@ErE(!d3V8 zJNWp_=KrJBPu~?EXDqchuxzKD;fABV@<1=u%0uZCu`t>uAwWuWd(S!e6HzKJwn z)&9wluC=oWm8~t$RVKqdBMy7lTdu6cpA#`{s)8FW_h)mxbT@&5)&o~QR>Zzlgy<SLM;=aq49Jt!Q287&K2v#V;eMN=(O0t&vzU1^}-Lhe1oh{cDyyW3l zt7^Z?%nj@E7dkimb#76O&f60K2H%Ik7hPoS5`4Cy3SUz$!bc3?v&nh<01Aj@#E*cO zG4NuhVn~*~)`SQ5vUIKY*rpJ5r@TLMtG;1mt?fwH`Y`yekSW8uo`(!Ty8bHT+7btuP-j<`f6nOuzlBsl{I>F3$qO{E%=#tdcl_9 zkHv)*PM!>>e=c!WkP-9`xFE@a?4?LH+Gv+Cgp8x_%Dr`RH`xew50O(5L#?*}7E@SU z=q0BjrW#zH3XO5dsfdmK#2akMsfd*Qu8~tWqUdT%3zg;Y198K&UwzTQVsh%;gq97! z=R2ysh>4NP<&PVv)fX3>VxD{#iBmf4_d{3(`yYF8IxJUEJZrZlmZIIeiRu??9C`hE{QD0(fa$X+#DcM>e+;0*PG9f~d@TGcJ`Nv#5q^nD#4OMZZl!lUpQv1$VtvX)EEN+H@xu1-4?8UEF; zZMZ(OQuu4#^U%M66Jsube`Akb0BCnY=xP`=jALNCUw;_%=zBH>foh3?e;}Vo-NZ!b z|M197u1(lf9h2hNe%@Q zf3t)qO1oGHpv`2h3n7N!Zgio*UIcJQy3@cL!GvSih~JNbuDKA_9LjL#9K3|@{z-GL zys^FrFdQBL4tIkc=8gRNT`U}K`tJ6G>@fdW_H)x7h=n^WV84cMdLTsL9S&o^Mr_ta z>+Z0yYs0mELgVDWpb8C z&UK4I>7hKuR5I&5467zuPD)p*+x|q#Y=n}hGUWJ=1pj(!#CL`oWgbHLOQcenf~Hux$e7cX z3zPO(8As!^J+))V;I1d!I>9bp-$b*EI2d%j#Hq{rhHF^czM&Y_QGbvPi~SOY#eR(# z^IKruHLNc}{jO1`!M~ni;XA{y;xO5G0~1+h92Pa}iBr|E>^PNKs7f#pj63Jf#%(p%hOufr_0$c9=8(#D)6_f+;v^i=k1 z#F*2exo%JW8`SR_^+)*E>#6w8-cuW9znMZw-n$!amaS_vjMVNC8b;fguV|S3AQctv z_)XI>@Vp=;lzP^i4q9d^q)TM;I5{K*Hw?3d_{ z?3Xl8Re`!)qa65GnWw^o%9hD8_MSPrc-A0T_nDRA1a&7aYN2OLklc&xwteSs(3*JdrSJn#<|p}^hPhHlOL*SvU%HPQ(hYub8^*{*~N4}EL?Y;)?p+R zTf-R{PO{UP7F!Re};oeQM7rZ9*4l29 zEq4Ty>3SJvly^KI=9Iq1|kk5CvYo{gOkcn>t%#op%JK@v{Evzb8R;t?Gu5Y8d`4<+_!rKm9;#*ZQby{$`nmXOjeutz^i$IHB>a^7vGRSJ1ZOXlIyX){}h8U4Qz;Yn3G1o;eU3R0%Md&K(t zNqJUE93mPiQ%ebLYVkfa*XuNf;Zi?jX;6-%(h;Uu^71D0K60Cykw%-$d#hW{NY4cv zU8Bx`f3?XxEQphlrqjxFJGZy25E8IElKGHCwCNLO=?F#Gt+`^2_@jkhM57(kaD4x^GNz zmu<~n4Q8;FZro^k4yx1l(@L9+q&@kdRVXQDbqapg#6g*yDeb_GrRIcldrf)7hCPr7 zEtC$;x4C~YZELI3?UWJi@b1~rukNt6eB$g=>?hxE&3=jf*6i1aG5zVk8!zTtmJ4b>X`5?85C_lUB^4|8fO@DoYslG$8-`wU3ie%@}iGI4ZN z_e!MOHp_8Ht8mR7U8aVfX?`_<^;gW4JWEq!AuI@fet{Nw6bL;ID1|^(a>`FnQJnHE z>?e21?3ZxL?3Z*1W?F_iz(P&aDu^y&wN%yhUWX{Ue!B;Ma$U1uLf7ncKXW#Y}K{O<$!K9rKe@E*h{ZHcAWB@GTf?Hre8zo8ZjO&-B-pzUa@H; zZbc;yUH=8eROftNHdXdZm@4} zbVaena70mZqZJqoixmZtsLBfFUwc3WuYZi8U{P!;Sd^%~Xpc)31#f$atYG#_D46{k zG3KqKB?Vss^}9xW8UFPYjPEQ87951|7F)pruaAO7u|?FPD7k_K21CK3AQDws!8Gd3 zruU^T%N1!aeg{5=q4i=J#1y7nsw(^Xn-yh0{cTyAiTfC zxe#Au0zfvsLkDvCp2}o_C4)}p(>cTb3^-H428e2jy-zBZxcCX#64@_diR{;iF-w6D z*AgFr`dy=b3jcbRi0>?xXs{BM+n6@#lnqKg9?5{SSf>G#+(ZpjhMgJ^@febA2m+g7 zLihF>CZvOzI?*9i1N!O9iUIxnud)HLU&4UcuMuNz1TI_yn)o+rK-<8-o&n)Iivj7J zMC3KL`RH_ftVaj4=t>7kZaX?A!*q0jSlnpd35Igz%0Ll6IN&-V&+o}*w!dSV+4#kV zndxAr>U0Rz%r0MR9eHy64uU`V*qr?mX2yO&{tH~VW;SxzI$&n+0~XKB@SVlXbWS4j z8r#ftIzDEmgIN@-gCsXI9g|^ZIzTLLJi~FV3KFZCOEhy4g}UIyd(||~+DtKxW7tn_ z8tj)a4fboqm|cLPYZ`Aug|1P5gMU5Kz;}je2>OA1#WVw!Kncv6xW#Kj$f6*rqDB4W z^z@5YSUc$VkJu*-3(Fj~@;3v&DlyqovH(AuoB7DZM(T?6N%LSLF9kp5rBNSocN=(y zNI#MXA3G=wI366PTW=qyS)~)8%ncj2;!A4qR%Dv>TVdj|C0o|~a+QB(avHrd zUUWK^&gc3K`|^c1b><7I+S&^TD7JR|{<5vHU&7YduMuMo1ioBbJ9sv=wW;v0XKVP* zVr#xE#pOP>-T6}Xu|8jTi?V%TlUt%MO2Zy~A(Jtx*d}~>#A20yhi?{XlN|IDs~V(5 zqb87QiTfU_SmH~^$d<@{2}@+ZMvQp^cyTT93aH;T>H_%JvqXGnvqY1b=p4tlK9icC z-I~#zXFd zLR%>?F<54DOvWtvOK4_eNHGZ#y5KERBw12PaHYr)yLO+>f^o4Y;z!d>5*&PsN2lbY zo?Pr43DXuT)qls!XH{dS-}5mhC5^slyudGATWT`o2DtIUufAy7ME4KTxW1|bU(c#~ z9s;QQ_i-2^E?cIBCAHzkm7-d)8j7B{T?s{(v!8sx$bN}X#D0w!lLh*2D9YSHL(!h_ zuNR8&ofnFdte*=hjkiV*twlyp*2*L@hiEpSCL&89e)q$i)XEqa$)w^g0!KZ74N>Bp3x-1!F;E?1NF8YN63?Ge|Siq%Vobr$6&ukj9CFqaXZGgJB@&j zu^Ig9bqsvhSjR}xGR<(4pfI{v5+u@gwRk=u39$}rH2?IScNd`WaudCaXy{+rI!*?O zeSf6u!*8DmmLJw2xeSl9?#06X) zE~rm%|Nnl!bMC$8oO|v%cP0hOhtFx|p6z$OzvcYS-bv43S`R%A<`_PWnMz|w0Xwnt z68JC=-u-U;4Ca~`-Mj(v_0VH<)~OEKMl#r*WB3MlDm@o=hfu(pCNMWV>bj~tdNI8d zyWq1}N+*2kAM4w^VM}hX1OI2gok4lWkOJ29e#)7jSq1Oxt!4}Eb>CNH?FX&Z(p7h zZwuSf**~yhY_PJ7_jdhbgLwcC{u^AL>l*?HdvaUaa{NKdbi-ALGACf!`w>n{Tzh+0 z$xR4Cg`M>NIY?vSBCF0J6j+OnEm&>e;4-V~EIf>m#(-tFyiBS!8@1LiP_4y6)LOr@ z4{9AR%#03~woTCyTGJp)S& z>X=I7);%7eO=Zn%Ujg~{G{Mu-FPtmXY8cFayVTG05BGs`5BK$XHGM1Oijc?;-ea-oYlX1l_VAz2apn_hlO=HM1ck=Wj@Y?rOX?HF^JtLmh zhINJ0UyFI63xju>?dbl25z!=gh8KFmY3Ox!PZpqQ_(&uV9)VZjS?0+7NXnT!t5oXM zSZa?I;glyA!7@2h?j;#($a?yx^inLc04p>>a%pLN>XK!?Ohw9#QG~<0#n3Ae6ZID3 zdx~iac#9ifDYsa*s#vz(ZmU$F)Gml+hP}&JqHQ&GVK8PD>0n@&oW^$|S!VUCNIoQn z`Wr!xx7M%mkFK6V@P@mQ9?}!kr;RvW$q2M!1iLgse|b(vf8QZ+$eaR>{y(T`mb}?r z=gO6?uG11m(E>4G4A&}+i&eA-_-;1=6!F!v?9_sKZ{>;82(E6+bB?IljS=d0^J}7s znxZc%Yvd@G*vXOBDBf(kg4${Fr#yu3%h!TSMFAJSOJ5tBeKNh8V#!hA+8I$CeOd_O zXg7*wre9b8_5|6tIPBvVQ5I9Xk=!C?7hDQ0g%Mq`ytOnn;cpGKIU`j_?a`t>(_}@2 zA5&O47HjfhuHSn$5=}83OOtmNtX#Rduyr+Ca}~KdE9|BR`-43eU5=5)(Ph3LLbTHx zVc^z3FxZtF?9TP$KM>Q!W4dX2iV}80^?iNNM?;@_R&H>84xAbG{zq`0^0J3Pt0=(V z>8?{?+A{M-WRT@9By?RqjI~Z5Q$2{ma^KE@E$E}+8<{M#_zhUC;w{j8-%!3hI-ING zxl!~5b{Rb@B!N2`9WZa0A1~X!6_P}BrBe)v`ydf#^>xY7rJ0ifn<4>=z~*IdOr9l{ zs8@|I^7d0IZ=oG_OPmhN0Tmxm1()+OSF2|4ytGL|D=-aU-N|fC4fVs+30{uUzhSUE z(B1)RW}iw#&xuPkp226C!sTX(c9mJT3#fclAx2w4b$W8`y6Rxt(-d&kIroYKh|8vN z0Svh!vzeL>I%+qTW&Z2R1F4;&tDHSiGg^hnNW;VyndlzL@3k>c3Q7PKZ(m_3fX3!>ZqccB(u6M_Axx$B zdFAp#cXB<%O&9e&wJy!C5+uh(Jz;4$F z5KnoeDd0}{yQyxgSG3A;R&E!Y)XlF#0MM?3Wfop7Ym}*Y^tD{aA`IP;vChFxE?eD_ zY}vJ^@$d`FTuUS(yuO9s2(5Q@fUI2u%j~{J zMb=d~0;_*C;cBSR1gl+j8jpmq%%7-!4OV^kxIe6vIv7^m@SmoD!#eP0wdJNtb*F3q zTIo?8z-rgPGT#X*9AVXK^ng{b&;+YpbsCRAu%_p~g>1n@VPrI4wAE19J=eYpu+VFE zbH6Revp8@LR+fwO{V;>s$5*I8QRsi1SuN7Wcns4{aMevXe)uYykpvK$b zxWRT^Y20kW7XAS%Ja?Wpl^rzrHci}Fb41qUw=+ZZ5uA|C-t{(;54ESP+W${%AOTpK zdSe_+fDG~hEDV2P^ok=1K5pcLG#Wu>r>=$OVdMNK6%rb~sgn`O6e`MeCK!?_md_9e ztga?gl_d;fjyIV?YYGdPLB%%)#W)hwHGH?FmwWz zdFs1J17+LjJN29leveD0nCEO_a>trg)(5K&fB0ba>USf5ERXgeYli8Vr?_y--mj!D ztyRYqSxs1G{5=Ob0CUKs_)b5da6rUX-EkX+=rK7dCi~=Re@C-uvTxyi$k)M4L@&q7 z*z$>6n6?qi{7!9rS^k^vB|A%=j!1@fZh{4!pvSlzb}CX7xJc!tp<&#i=G#zemp=`R!X>neXBqC|$rWLb z%Gd~Qo@vM3ZJ^`e^5bq7vFBwSY|2d2h$eIX^`z(1#ZkCXYcxL&n=(ge2Y9Y1@2yc+ zI-Q02^|S@FV_7ceRRSjkhHw@k`mPAtg=15c=7ZAjAz7v(ot+Ts(zDpg!Pei41M-eG zQ(hM-Zai8>|I-H#|H>s)x=0c_y1ZZ^N@%cYp@O4Z80xwx;#(7%KZIm`_(V6K$6yPM z%4gg_BR1#|st>_$mO1zT`Lqk>d}TDj+m(N+zgDv_JV&y8cut#qZ0anYBZ(%yMIz3Z z{~B3toLcsL&f&&aYVfq^X!|A0J zu4%HD-US0s3b;kO`@@JrsDX`AYcc?6b8takX0)b*8rZF6nIC>+wi=3)yRzuGX9g2$ zw>1^KLRz@65lFxF7BrZ*e>AGp^J{apsRCHurrUH4k}j^N0PVh74e`YoS`AOWuCBn(Pa zk&g}sh`)^h%iMJ10n&KX4;Q#G%z6YsP)x8#KSQ$ZHZ)>U`rDt3sy6yku1i4l1O}zi zlT@iQU_PisXU(xMn#x@F6HplnxXS$3ry@v=-k3xIiK;J=p#XKUThB5-{q%v*aMTqY z)flQ09t)GE*rA6Bsl_Pg1?6xHbbgD^MXimlY3!rcl5&ijHbLO$mvGNmFc8_|}ok*$On)?gk)B+qEri z&){2K@!CX|xq-4P8+xoVaEF9>`?XXS^mrZat)y6XngYH$_n47LtUwc_0ljFD1G_Mm zIsfyr9N2^|v3GU2+2NFkdl9gQrj7V8|AmuYcG+pXaFS)#-yF^ENF>k#g;+heKD%s; z6=7QzBfvo}ybY4n@yf>wsF{WxzB_LOwot&?a_kpmIDHpQEy6V`Vto#7sK)4ong}ek z8^tpJu2Xyb z8gKPvnZFYyij6FkJa6&y1AUpEFBp2f!7)t%hknPGR9JlJ(3EaqpgjZyzy`ZgmO1Rp zVe3O?cv539%>Klf7-N%_#w##c=Cwqd&KUQ_cYZ7ZJ+SUV3}yyiVwk3YGvi?$9CO`n zHu%;G46rL=nVq+43^3F|(7V4IK{r=zg4-q{jrTmV%uk3C4Q?1Z(33bm7_XoK2BsqO z(&?H+!N+aV6mVEiy-jVhT!#xwSLpzsT_DT6$*U~H%qrLflv6IOW(vY_ZG<}xb`5EK z#0P8yRij~Jy;9uf*is+SR4;X&Tn_RjN~L z8DFLCxW+n_d$m`tTstx8-f1rFk=|&XRRxvkgv4UEIe0GgKWGZO2{uZn(ilp?9z3nu za?IC>lheg*)A^|pSp6R#Ef(O;D1Kd=|0WoXcFif(VqLze7EivoYkRmS9$%;HM>@K3 zjonCk;LZyPLdk*eqP0PO3K+J}+u*|LJO`JrYvYy*xF{S?{SMyM^~FfF88R`|XR3p|z71kf`=H+Ux9^CX}n{0O?t#&5VRitk7WT4o;{buY3? zaW1)2a@r$6qk|qaiqH_;g>=14JB2p0OkR#qzNG= zSRXhXG=T!H2`~P31R*iBsRrmo){r>3fU4L~u*~c3JfKiO6*6EQN0lOBW14-nQ4&)F zd+&;>Qp8*W;;&~)gMfRcty1EBr@Nwc z75B~uC7^&S!F&EYg0OhDug0iF)tf5t0#&jhVwvCEeSo8b+ULoY80r`YIa3E?V<@IL ze|Jwb4IM5O%N2V$Odp?Uu`W&2;;Ym?=`^*|-^jyUn({i`H62KUGYYt>-E(hfVbU6) zsh1WTy7^JnC~U()XY97Z2H5Y%@@ygoplHrp_vZ!^HVU(?ZYPwPxOmxEbTKVEOY-4kma6d zSp27L_|X$h#DnkVRF4Qqhev{s)Wk%BPh8PyApH;yU36drA`WESdmo@;Jdoi#H<2_R zekVGrN5U-)Ef4?DM;huV3zAF(9v_JZgvSviO&aJj;^y3s0F{l$M^;PYkrO(!B&j8y zIT6=++Q)+6BE=v3Fai!O`HG=@gh^9QIm*@f$dT0X>WZo)2y+@Lh&LVx`KT)$(XoLN z>iW+6W2vj$oLb^kjT#3dP$A0W)= z1S?(zr>=j2cxWFyE}U_#iowb)EJMLMAHV7iSHz@cI9iZn*^mDeD#xn*nWK>)6jhg(MK^Md2ZUK=kS}>+ZUenAi%KxnGuIFkqNNIGfwqy#O40Xj)zF=Ca25WbK48~ zNq_66jg2*>(_&o~M~fE*4jxQ$jVqBurhNuyy^n75gr_oWf)iK@9`#vCAMC>mwc+$T z2rrEV@u3fT?L%H!|I9B5#r(+Fbh+|)!0{My8$>QA(R@HadFQVH%8C4r!Ysk)A$Tt* zz*g9VC4g0=9SAK){e~-QX>yi;(X`i7MHg|=f*W@y1+58S<)xvpVT144kaoN{Q#R7x zm*)Qk_$-3zZ{$3rY7Jr4W6_lWP|<|yIS&IWW!U>OOETpF%dK45Y{Ke}%g}F8TJlqP z>CAz(H|kxqH>$luCa#9?7&b(adhuORA3~Vu4MNR0z{pE_hESS!Sv9W?a3OzWDf_^v{5f1F)~HrWYCfzissxL7u_$bJb(*$cY<4+JSVbWQG+rSq4`aIg=OYVNtm#8*vEg`~$%K8DU-F*)8hl3>zIF-oU+jAzrIU3}+cyOEY>hYckAP3pSjR3{dUoJt;R zdD{Q^KpKrY1GRw@tVWVGh*2>3O>HXiVsrndzZhCz>8`(}cFBu;lvRy%4gA$;G45AC z!ikJP+Y;mq=<+9d1j=+IT&*QdM;a}XGfhG`($rkjDu;C1#Bx|bORsj@tyWwvJ6eYV|UttTdu)&=| zLQsy0sZ`Idgs{}RlGeYw6jpR42Na5a{Zx(cgWgR=jJ3S-A3lOtX9e~XJA*a{cAW{L zs0pIe;i`Cw4ma~J1E{mq;nq{;VI{F{-MPBDsCDPa6@9Hy3^3mLZrGT=5natkBSwz-Kxngn-j!T4m?Z3S z_Oap{SmM;1xY^JZ#pz@Mu>z)f#-2g2fbmud{a}qkCKKs__c+C=+CzM>)KBdPk>*-{2WSIbDxF|Yzet0XUPWs@@lc@u z(W7006=d%uc1ojrdA@%P1Q9QtKiv^WY0BDWFUyP`<^y5S{!KUY<>?SD)-@lZ#Tz$r z>S@AAdqU_*qNi`gro|r{M4=*C8I6OyFuEeCagQ#^C5t+_K%}D1Pj`GI#ykgFUpi%={ zP=oHj19xb?_Gp4m-WTmztPg$OS6&%O2}LG({n~^JC!1&&3wozM1shNewn)2nymFvQ zss+3P`BNwL#S9cVr5a&Tl<5h1#j!Iksb9zJ02?*_{A>bIZz6O4D|6G=)fbaibIbRmV zCjoOb#hx9ufH|-k!7_6eJc)RanBl53=TNU;hyVk9$K2UGOmlO$M`5Hqyj16ED8_k@ zRgR>=xvOh;lza?oAH#>b2B^J--{yC_R8-YG<#OdQ+bU*fS zk5FC8CCgDN4AZaK^_u%Nq$5oMHwJ~KxUDx0FdcPK$pG!JD`uHvPmEosDqmq30)UO>BDMACYgB3{tG{EwtSXB2pXrMUe-WXhzALSbyZ;7_L9Mq5}O91zZF_nU%%i z3509xz9s-s&?Xy0mT7H%0>W3do`>%{yudc~9X9OTE*vtHFOLrAN^lHiw73nzLVjY^ z@b>)F5>iC`D_5bZPWrlB0($v?jlxjrs{HV7SDYwXRth2R?guZhwZ^eF#$HLAyf%=(;rVlV2lSzU=2GN zm@KPaHBQjY2JQ+R0N7ye5@mv3;cC|h0f=HMO;|bsS>L7yo(*8An>A=h-vJ1N_clB? z0L;{6)^yq_o~%FM7@we~1)ZKE`2o$7BnT&n@VJx-$Mn7eW04?qB#JjzMUFYh1BY}`Oi>#=G&AH5h}Ikz0hz-uWtcnAb6ZipTqwnw}6 zQSx=LFYbnESPG@UbR9fB414UL>U@zrttt@N~aHt-f9ySdb9Mk*V|g$o`N z2hf%F1a=M%Vvf%szvK*W@yMM7d+2T)2x902Ec*!rGG}*5cs}05yG~9bT>Ec#UIPvR z_Nt&C%YJ#bVAVS+;R9j_V$Jfij;i6If+&WFIjLjtbe;wb_Cwmq3vTehrfGwgwYWe63+YZL%_ zr#SmZ4u@@cZ3|_~tI_0+Xj|e1*jQ284p{an&ktop>`EVx#@1wOwe>Ce9d&vwnoMld z_W$q{#UNvJpdnVZQ44{hYSa)y@ie^+sW58qeL)PPcEBMT-#CWA(nBI2JKs|x{f*-R zgzaWGZ-I7I@6qmWVrAxbi%Scgu|jAepvoynQ6vAZ6?W1$#20n4t-LrqwZKfp?j>H>fqvYC>jg6oMoMKR`V8?Y{{!fRT^!~{20U%nQn|1op|)^yvDr_ctOD!EBjwKiay zC$V~P3tqL;&LNOijiU*6VH`6ffPK{Ig2d3MC+gnLN>FDM0&ix5m^EEj@RaN)n6*$% zYSq1f2jpY2HL)h4P0*+3{1hjM|B3jMZPr9q`KkNt;S7J%)muH83ua5HK}848Mh4k{ z0i6g{qfK3r(CDMKnKe3qAaC_>kz(!$n?8sYd-(Exm8;+ciVl%u34-F?8$scMaOHMO z5PZEpjm-F+r`jf9c%<2Wqx5TDKX0tlmEv#K^vO|A9@McbRbUJu?6C~6iib%(RB(iP z+%#rZk6Dt7Dn<$MrR4q{o>Ee`Zb^|5Rb2v2KumeDjD|9XFzJ!#JvNRLO!gRpuNU|b zj(Tof&Kw)C>gLOtywZDcBtZcwZ+6uL)E7LGFp@D_rfP#p3hmbNg*)EbhO5Bqr+`}9 zG*a{w!XQ&sYXky&=O6(Lfr`mssSpW+RV)EcQ9bmUBjoKaB!G=@FjP2L(>o?TCC1-u z)fSC}jhBb)SO!E{1~h4wFkZjCXm*TAefrU;lM_Zz`TmJ9_x=e!qHx3yf3xi96p0^o z2g+8{fF9unzHM=Z*tRHV?GNc&XKyJBZsx4){t~Z|R88+tKZeHJf@b8rpj=29y}5xHV{j{p_BJz=|FpjT!6lp_|v_Iz#JHcPQbD^O-Ey}TmzCQb6AOU zP4p?TVP+JS3{_TzdK-_;I;x>|T(bR*_%<(wPQbG5I~~U3O;CCZ)!!aYolcNF9^o#Y zna!8(5^VNYUzLEz6?dcT`qCk+f~QR(`T-R$Z z2A;S%@LKWYQhr|dD;o>^v_k#9)#wF$EIkbLi`W(_bmG*&KkE1 zStzZWF5)9_XXMKT?s6y}f_;uor3l^Wc=0W`bcvx8ux#gE(Hn*IDwQhSUWZJv!R?Tv z!}%R@4wvI0M~11b8rMSuH(WpU(z|f66GJCp*&7gZ=L8e@9&$sVmD&eS??aX;(WmLmETBW=IvzjWJ|&SrS8<2qaYF+jy|U=>@xS z`z)}8?p{9K;?mmO;2Amgz~MN*f}sndT&Fzxa^fv{NjUdCj89r+){U2T4Q?+@qUWZ6@#=9m*zTF*PJ%bkm1Ea^9=$UR zod8_OE1+hq*I$P8>Q%d~#kwrE79Yk1)3Rt*T8j-;VdO~$2}-BWgq0%jtoY;YaD|%S zGe5)s{znjD44r^A9rY$py$zaQ(3+V52mw80@)ZK=)%S-{IiYreCboz!@Y1V*H&MI5 zTi6r|r8lT>%>C88KN<_$BG0@of5T%+8Q-3MU#yh z=AJJIvuNrqZbJR+TjM=bM%L4S=|~^wYim5JADJe=WOcA=vMFM)dd7!F!Th-~JdW ztD8ZE((@)q@|D6AA5_>s0>=<5?3~W@H$OkP@LD`3ilGy*?Cl?q#xlEjBur+T6X9Z= z6BW+;w_6*xhWM-;knnT7D!&J4K6o_x?HD=%%l6#hFqR((l^W&Xfr@9k-$N!tJBMLr z<0YREYz(sT5*Y_F_vD4Tz^T?`c-Hi{8;NIbrzngk{P@7NdLK0^)~Z8lQWoKmzVK6k zz8m`|hCEl}Dn><|nLuVuKl-$%bUy(wMvu)>!Rj5fFpxVN*pv%YOyH+G-ic>5Fa8X1 zz|`4qn$C}$C(WnxUf=ySu>0>Rlz1+mnZvDjqa%Q!6R_+tp9Sg^+JeNwO`hIgyHXfj z16P`GK7uQo%N=p02wiyA3$C2=x0Q~z8a6%VDCx8tu$QES+(A6$zxy5yP`qs;} zFp{Xv^O;2?`*|TEPio1C)^`I0n1L`D*Dlo z(_}`9RlBWIZ!p_>l5l>Op3CKC=?TKtT!oWm0zO=ydfiXxlnI1s{F4Hf{TK2>@v-zq zk&ET}=;dLV=+hi5vtaD`iV%z-W8)%4?@ILqVYw36i|Yj^Di4udD-+69NI_G_*F0^1 z(AL){s)APUQ^jVI>Qb5XR=8B({4ZczbeF1Tay+XVRE;wgn^nxj9oBT&?VkGdBs6d6 zMd>nEy%QCQXC6M3iF@hWevLlVqHhojO+M86g29J!eGKD6Q6?WB>Sl(0Hik~XvY)#H zNK*(45-JyQdY`E$F!Y&vl5jqhp3Bu|>IuTuT%8X^waUPU>pfRIi2T6N30U@wZ#tsF z7rgXFkq_ni=;K4V=+k^CvtWGbTS73Nr1B8ehjO7@g%mXHypyEB-5rOSopQ;>6GA}~ z@uA`|N%f&jdMkXWqrU@eb2IJ9sX0- zhca<5eO&|W!ODF4d&t7IcxA@a^l)X>M5$0ZZ)mJATp8V2cs~47nmV&IJv3f0#cY|% zk5Mw>kCqcXWG}Wsc)C^x<}*oda8Pn>X+iH}~HGlUl!r01l1b z?J1=}BWHdl%#$J?Of)AdP7y9QD^4M}Aq}^r#mS53SqJD4P?!0cv+0?@gD)FmGt}wm z2L;_eS}s2;7D6);*4+w5>+so==Yn;3 z(Wq?CAcv(2rp#1-u_S z`u-UG*yEpt0Tb7c{|2Ir#_w!vE1k?FkF4pJ4|p0)|E~7&&#foCIL?+kkh~x}&VX`l zmr114;aA+VvR;ABG+YwJkd9yXe)@4%bYV#d{ApH0I+-6J{b^z;I!2`s1$*=+H88 z;G=yJ^*~N8{~cu21#tQCad8+qN@i=aF-o2=-AK?(le?Gc$l*Q1zzyvD;Xh|$oQ}g7 zyPYd4ux3mF^*y}XdDU-RdW!t=cW)!LUlr9TS!ab;-W_7%ToN6q$`{u3;)gwz=t;^J zRfK|6y!t7-Q2OS$-O33x?h2?p6|TUEzcVn_vcEyIa8VRT^K_$RO+@Fa>$8KMl7f#Kszjql+;neufFGj)t@y$9vcPn|Offu5(iM4$25g!$M;#kl4 z3Krdz20D((FjiAY$I(<-EF8_h{K>%QC!VAE1TiZ~EKh{!lY6WeH%vY-ijlAvBvBM_ zAGqZ&F0=l`@`0Z~VpLQ2TooW@5*gO?md89z&l9JEd4fnx^xm$zwf;~>%46VQk~ZGk zWv}=viJaZPRkf2N*4mWEKJnOFUtyz z_RiyA;~Fu=Da4vt^3}UI1#9DpI7KAbKyU<qlkC_lVo zSAJ@QmSAGFIo|p)Lgo7mMC|2Zb=^@wK-)v@fMthL4Uvv*#YE{2GlG#y#DE*IH09?yyVMc=4 zzoA43S+=w;&YFId76*19?#6|Z?h_A-)-yz+SsjK&$(n$41ngvsLe1=pc|1$+mWfyb zzwm7+Bx@TOThP{k8!NhS^&_yK2~j&=jDa4+I^N_=(a|oj%%8DlX~&xN`tcI`9c1Ha zE9brAHud<_g~!5Lco72Dbo}9@#p)Ijd#LR@Amigsixy2ftj{hHwj#vICF^Gr8wHHd zICanf2zG72f6};{HVbMS1rU~0`m%=s90~{~K1teq1i<75$-gs99H98qf03bKCNNmj zIrBWlrJh*Gf*-JvEpU+SXo=(5=|bbo*C?AzO&FywCB6EEH&C$FZA-n=kT41`;LzG` z&Gy6f;2rv|G)@qYRWu8xtgG)Rjjo0tgIVwReadLlXT~-w8Te zeMcKDR^MCFF2;$~cZ&?Lz@GH^Elqn<2G®|&Pe$$o?V)w@Mh!WTm-!$H`rsg13Pa7A)kog3L^?vZjwd!&8K7s_?Z#RWTYh?w?^302mBDYEk-U z6WF4EzUY~V_*(mFAK6n?%^<}%i!E{_T^QN(F0&-Oh`9783WT3mAsw6( zY}X+GTdX#kwcPkDANDJ!$z+*z4Zq|_z8WKc5y{0{u!fl0XvX?LKf?@}r{|!8m%gg0 z5hhixJ<)(*IM0DkPF5jUa#s287!W%wh+B}ggD7tPFtcw#j^PHE831Og2i2s#8f$Zd zXXxW~p3!5e!ug{<4GOkHGURui{`cg`p6iT>a;J8ccgoi&a8^YRPv3oJtq?;wl^eAw%LDr?2&RN9@J$v<0=x% z7Eghif_r1TRuwwyv-s-xLRN%WDX-m77tCR#9jp#K9*YuTrVO&bLDWq9hpcwP;KlwE zDD>Sp>W~zQW1Wiy$3i}WWYcjVvM%1P7zeQ`n7Hu62;_aoMcfk;ST~_0tJ+}RK@;H((atu{i*hjHnZ0$ep?*}@VbGGTl)yY>T7 zUZQLkbYOA@H!!LJ(~ARD_)nZEfKQT)mW}baJ}9J-5A(pY#_Uo7#9n1A`pLU~2pG*On$G^HX`a?%Q6XhhBx9 z^*-FkhBx)wBnIwh3)0npTY1Kc4okRI@T=xeQ$(Ilqfjq+i(!- zf~{}_rR7Jh1Yv$;Y`R=IFhM*<>_5-tBq|Ry93N`~94GQS3bn`3gZHZBy_`T>VN+B! zUcoXqcsgEqVM!bHC|t(6I=GsaCTkClrQ{(MbP<=WHqcN(UDZH^(oevO!v!j;AV#oB z`njdk9?*iXvis z`9j3_*wwR)F)dGTn=0g?7j`7JE;eAWvRqUgUgNL231)0s^3T;!8y_te@>5{)%Y_#_Ht>aRL zZ@U@jn@!l}p9!!X7~|28lWX0D#LOZhnG5?!knH*4nyQ;=3ft(kDt%|oX0Zdk=8zNF z=r^}~cpU*LO%Wf6P#(kQ8#`+-mz^k@-(C-B+LOmMMbdldq)K7(GumMgGfW;`K=O8U zKUdsYnA8rTvNf954v82CP4dxbzKsIztr3E)X9I%PO!5ICVu{aghs4XZY(n^K+5q^_ zj8x6nHpA**@^jo(A@quKP=e|@%^j?JHJa%T36#NJk=}8mb?dogwA9JOnyMbT93jQ4 zmeZXf;S=*n@>DUO@g$8r<~)MWnbB4Tzcs~C8>xp7!}<)?!{DldD)j)*AJFiu_ed%P zjP)3@hXK)`*j%Syvq|W*JT|VWEQVF*+6~;R0_>}s2{6;x_<(?|*2DLz!28i4fLEUp zdE*|si_vD zwilxm)pM>U1WdJ=s|gR4!ETZEak086N5*S5W^2M=SG&z=;Q>^q76?0x zLUzdrK{hM1HerCP@vKd?@V&VJ@YQABCJb0f&f8RpOy;*+Nw8*bgzvEfvyS8ZuscD+ zjrM6TXiNWgf^{}W`=NoY<(R(~*zO($Z0k7k4-I4u#{UuUGjz9H7QZpZReTm^0YXDp ztGR$^_yx@fa6BK~0eIGLMj$kX$T&^wkHU+8C9Es zFxU$k^Kp^5buSr>dXJsGk*VD{*$j_5RC7kd9G*vBM)1t;XxJO9x{Q1cxT&Dg_?F|f z;N==#bsXP%!&HZ{tN|p0;&G5peudDvx{X-9p{d#EGzuVR?k7O%J_hxMrN-mUDB!Gm zC4f`&QKdH&Nsb^Rv^%@tRU{Pl`GQ2>s*o?wcU_Y%NAg!b7IgAG(r|00MNj{L`^5(7 z5?_84fj`U8fe$iKfWKMx6|aGo1s_F7w86yR_)iu&cgV*r$a+u5_tN>eg=^2p#x2Gr z32_VJjg5K>zFVN+fQS0rkGLGW3!mn-kG=5I9DA?F3;&#_e(*QTw!iL4ENgMu2k-hs zdcGh8hxoVO#uq@TPWl>vQqcm2<~E{$|+?mqrjjs})u=g}Jgm zyR_4apoWQ9opyUqQ5a~V9LJI&^Ei)XLbAgT$v!-pC6IJ(ekUZG--$@>X=1E*if)H0 zT-0yi2^S={(bXzL&hpE{%_~=^YrIBH`y6 z(E3#oKeKgef=!ot@Mrp`kcub5->miLB2lHZgH7L#u~Hh=#xCb|0FtFCHqBBz1=ht{ zTQG8>FfqIxqSn%{^t0g`f0TgAZ*N@OxCB0REV5g};hf7Mx4#nNhb=1e7t1WjIS?4v zaL5w6G`F(@klVck3E(9V=PeZ?K{lV{{i z=TXbLFzuBe=4pq=OK{p3K3t8dAw^|$0y((*t@L|c|2chZ*V6e{G_cNV-UOo2e_oEh zT|IMTYF=*Zcz#=%%^a0Nq8pmoJdB4P4sLp`OtG1#5~dB!jn4N%afHo0O?;p0dSo|qL-QIa zZh8s^H{;V2Q08eV)Ut-=Gw0=YR`Q_oc7~;?LCUahUXDZ$0AVw&sjm?U>*wWA4%kd* z>K^)V7StwcT9vw&GM+OJULMGgw6mGM6e>hR^A`REh+HSWynuh{WHal^DPAVJ`T7j&zsb>(k9X_o1U-|3F zY{^z=2H?2s1=!g6PrVup-|#qG>WV$guJ1Rb()bB7&xImeJ1}}H7!Au z-7J-t#wZ{Z8`$=sl?)QiZ;*^X*20_AI_DZ}3^-Cnw(GCdaH)@JTSBpD%-F8s2HwS> z+^6wR9uP8Zn?*ui5KCz#@ygnEQmS&Hu!HS-y-YRQS?-~=p@H(((aLib<{hwk$-bgSqi_V~NL%)hs>H}j+b(g_ksZ2qwr0UjoH zjl2FAga9R(wRO|yY2?Z;M9~tS=V9zrVWPAXgyZd;os_S&$YYB635dDYiQ&c0e-)1g zjRvf*wnT3Jd+;+@JCyictts9<>gHM7w?y1ditLiw$^8H#i~8x_RApik4J_OBVPZ|| zqnH;y0y!XEj%={DW8VTXux3DV_acG6)53=9e`|S1!!t8%=R2APF++Z+%wF-4+zX{= z6guHs-weYJIhDo`-g?EPBcnUnD{fSi!nZys?XQ2g(((+46brj@&h!oX4Xat|kX)`< znwr3?T&=4)FlO-*a=E!L4vy1kaa*im0nB_DtH8JAX^5I=MQRHRrFGNAVR)G84CwJ; zByS=_O(TdA!%a2LHSkfR`ItJmiVRKWB~X#tR_<_{+sNb8D)~28n?x}LIw#aF#tU_&_JmnMb#k#fB4z8Kj5?LZn*J!xs2eZSjP!W~k7= z?2G&!81;aXJ6+OTD)Me^}rtC5(_1LOp2vC zIz*9sfKAoS9#v{LG0Vibx{+C?C!C{kka?v22Q2f{-cVIb<6u=uqAG|I+4ZD zw#vh;auS5AMQtRX&H!?J97Q#a+DtXhMS&Xa-B2~1sikU)kQJ$IEtEDF^5bW~TFXe; z(Oyxtz`yP--e%C9|E8gqNB*bs&5 z?LpD(FG7oU=845_7lBKUl}2xuoZnEr9PQmcOAqDL2~?!FbrWnRI8VCi+mnf|ggP;< z1cs)&(s;MOP;wz=xNPJ=&2%9s^hS}5Do`D zosNSZZy-re;)jEt){KLmDng|y4)(@Hqf=tVs%^Hux+=9IyxYfB-bxp);H+?zFJC!e7?&Kaoxf4dKT?I$eY4bv= zmPiFei*ymA#e0LGB{Vf(OA@v&waN4d&(K(5xH7u4@O=2EG<7EJM_pxz*+To?foP+N zHDm}ZN<}YD39e?xDI{>FB2J+PSlhB+xEVIFSXVNy&Lyd7p4luVc3zod$Q06Tg=bMZQigEw!!zqNnSXo+SkWUhMifd^s4`y z%P3&kw|&9D1CE1@uKhDwbD6QJBlw(6#X3tNnj5EaE2weHc;oP#lxWE`WO?zHE=4?%k{VA-?3q_jtp{i;`*Y-STANfakzn@pi* z^{bjzU&Smd;yPHymzc`&w9!jopZ+mmFa|8!bgRPPWMH!nT2&2{Rgf^W$xv5+rUDaX zm92`WUP}AG$APC9uX8`v=B*kQYMa7fO(-^54dppz7b z<|Oj3{EEc0-WrhqQa!#zk3VgR;5`jgr~N zW;;S)`BHF>x_V#gbn2d$^X_?t(>-s!7la-Imi>bYyDZXxllD_?tsLcoMUM2=?lHxt z+2Zdl`(8eymqlCgBWNcEEc^biE8-=&AwtMxl7re~Tfew~_=sQ>I$U(drN>7!4JXKJ z>gWIb$G|fTSoWIR4Loxu3&l7}`XD#o`s~8Uitv_8=>Rp1Wo*A6r4>9W5W-jk8!u(d z{vH~P0n48I4XMG<16ibM;$nRcYMPiz zdGM+o$emGBFyOX3CJl=|`E5_YY? z{Oe8?(YPRJwkU2fF6$e&Agl8=VCl$Xd?;;e@arQFXK4&rcHwstscPDUMoVh@^9+sX}r=uU^h)_R`s3no4zaY7RG@V9h%r% zpM&T&jQVOr_toE%=(c9oEh-lS_1tHdzsP*hVqMMB;=N^WKm;QcWbsS zmPX)h_oy&&XfyzV@PgIEXB$`x3;nKDi(qD+ZgsxWH2&M~RjDLU4|GdPPE+i|p! zmgZhJe_usf_U|;QkfU5;FGmV%XONJ1^N%*&(hSSc|44MBPaz+6x19!$&$5oHNnGtx zqrL6;hJp4@B`vxPwmRUvGWZW2G5rUxRm$RNV9haL*})%Zc<_zT5)#@66@yTR+KhAN z=sQvFdNjDw3Ju19WiPo;Yp`pdqSSWpI28t0I)gm8()bBQkG0LR&YtDP?En-8EPLG# zHK6qEdlF8bQ7TM&G6PC_5gcFv5UkZ}^dd5%=EoO~@Q47^A3LhBGQQ za-;zlIob!4_Aa#=+~(j|6WMK#K7Z{sHMp)9@W6m&Klx(?50w_^7F-`{fPo8wI?TX* zA0fbiWpBG*fk1QUZJqJ@E(4;aaY=<1?;{qn^9=Lijzm;9T3Act(-nMtdWJJTeZv}n z0|S=5@+T4;Fh132)?5WGHe`zpgI2l0=GF!~nD*?BG+KDc15$JB<;!FTKZdbvt(vpr zr&4p!8RFt3!j zuV5Hgx_kwvuaJGE;J(6MTai40J06l61bu}LwLRy#da*4dwd22`SAnsoFaI4dsBI9usbQ z1Bf;Ta2@ZRa2;)`T%3gKUMp}#?ly4?F5YO%FDS;_cc07J{*38%ZY>Yzi;(Pn@@2W0 zB7F|rn9SPd{|-}$L?04~r1;Z$yj|T6V|AjiZ9K6k?c;K3PLbW;`9lL6A1)PlvYx%& zJtKwTQM}o95*{+Bu)RIl4!Bglr?R~?UCzVZ5xH_
  • l=zc==5n<`CD!cDhq?{oR5 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 Te>XxsXyqls z5agE$h3sF^q>9;XnaRt7T()0{f4_*k7zn{+34}NTi7pU=cc4|B;L;EXA!)gCm+VS?HAJb(-^|J|jb zJxf|{gis9|JcoSSo+ZP!=Tn)Ju04+tdXi}2;U+$(OHpwgfW+TiH#N$?>Ub+Q@hW*2 zc7piu5b<&$9{D?zNY(1c#T)Agbb<9F2z3N6kvvsLFfQ^~-!MnMU#7{ai0K=;p9gum zzF}PK$?ifPv}%5WgsHlVaq&fZkU2bv84udlcPXzt>6AUlxTr&&N{o}u^}o`oEP=&a zd0CW%VwMSo?9FJKIPQm;yu?vJxNLtFKmRtJ3X`Q%xe?M%#g6Fui@rYVOQ~f028dpCyy{MvZ}(7VggPkvl~|)&#i6jLzaj+G>-dYHDE5m!MLL=&UML@`P&Pypph0a_`2| zQ3JoH9w|b#s?;M*+!n19(d=+qsB_?-&@4sVR+XAn4&w4WwZBoP6hU0o>6DD<()D*> z$;+0uLPXbudG%&%+h%`9-W1_o)zOxT^)h8X>|d6lMpeAwF#4#Ozy2qUYGH5OA759(rv%C`=Jx}=LA*zZ5kCPhqHb=pJ% zY<#-V?dWuQgu0{%Fsn|NiqU4ec9>|h?$@j?V@I1!RF^UV6*Av~Vc0RKffuPviqNy_ zl&Ktt7O~7JuUlotjzgQUGO0{6^}o=@{|za44ND8>)oWAXn^LAV=?8TYwMh}7R-HDH z)>JWEZRQ)$B}KSeb-Ii{cI|skpRr@tYN1cLs-xetrd93xCJdA!kZmFgjVG$@cTS(N zquOerPbveQ_CFXXMTlE<3Z;m5Yo|{Flcv98{#<9KlA&)_>FHDRTUN`lGL$?%>aMkHH zc32!oBu*#3Xw>vRs^h}q^pJe|=`N9Bagr!|tkm?&T@J(IN;%qDJpERe&9FF~eJh+2 zYWlC4o$V1C7S}P;6}$;A$o3tq->XVuF;sEgo36BrK^t9>?#Wvv+;9|u|izkgeb#> z3^uAmAyWj|RmWJ`q4syNth5{zoa#s`MBGi3^<(>$o@ek9SyP1HRYz)fyG07xo3)e` zV(})%87b!P$(bfFuR6}y&NIxx<6XxclH8UNv_japIQ0z4Eh}Chs9l9vE z-k~eQDMNl4$)7;qP$4+6I_~&BUa#$EY-&}g5UE%*9g@%BYU+?8Y_VDuqI-h9W@y>W zs!$<@v1U3X&2SxcND8O3w5lP-xv3& zCpg%jbR$aNT8}MAg)D!uArc8ixo*E;#s=!%h1j-KihJZep}5EY(snlPacv|1p^k2N zk4;0|qonD$N7*8EbeqdX+@sDt4RR`fJ~NVWkFi3>HaL~mayr|v*QvuDG_{_(MDSlF zz9$NDd<4muNWGitJSltrkj+7ojENi{N6ay%&6>Z_K}RDbtHjn#QLEj!(H2nK6E8VF z?1-OBYu&iiA;+R8tAY+I9sH2co>IX-xa-NbhVE)4Zu@``G_k@)d1#C4904_-%ddhv5x8T?ozXO#q(N&&<+ zX3#fE0#97$_y|H#o{06+9xJK##<}sjV~Iw2R>x9iW;a`$LEzV8dd)BMJMmaG4ZRmd z^~8LRPl>VT{?Ng_-DFl7{MxZbBS5QSUEGOUqDSt!czQm4$op)`qVb?rag?{NKKCYM zS1DoBH_7ga4jmu6^|{IcYMO&X1=TcpI^aFAqT_=PMUD!%3XUVLFLHEzz{xc_)Ac+^ zd|w>t`0!&G(L@?AEoBa7VXv8<22z8;d_3A4hx^>$Ta>9aStEb;4Xp+s(_PSf1F_@lr)+rQTv) z>!@OpsuSi)7Hd;XaC~vA7$i9$XSK#_E@f8*tj#sBGo z>&Fp_|NA!;NEiP%UIn}{fLZ}6V`2dNw}k>JV*tmiL2~XP4_-AtPttU8faB#X6AKtB zw>HkH-U+c-hW5h$v)N!uqYeEJ{LA5(?R`pm`Rv>zT>Rf?T%0fPcSu06I7X z88cbp0q;PfiwEQ#X!gHxX+4>GNz45UNviate;12G5b1xTX|W?UUiUC?Hg{7 zuJ%BsHf}y}OGf=Qf0W5!&0jVXJlHd>n!Dr!;%&3K4)5zh`|n!XJ<^9xplzJS;uqI2 zE9hwB4$9?yqg{ut>gry(a;S%$O2-;SRWkJ(^H=5H*J9awz|I|v?=(HFm#KfZrvE(Y z>4|GzUTgYYSoCnY`7|tX!;K`~ZU%@~7+dJa+VG&u7_=GEugF7hc#657mgDn2zNY!Fq+U#=K3-#L#s>EGIr2rQS1WAY$(4G$ zy5=ir82q6X@MlxhY5ZZ;#vj%(Gzr}rvPdgr8}RsBdD;H!4{V_74`#!-Vk#5RBqlX1 zWbJsg2_5TAN(-UP!DLA4KW zlLE3hh*_{sEI50Ow7>~8KIeV@8?`rO5IvgCB-sJ1dIkMi^@+31?j9NGUq0Be0-Gu1 z=p$`2XBri}KvH_6n-8cJsq;<0!BLYgq6$9zeoJ(i`9Ax^i|3eb{u-H{qe)fcon)e? zy7`z|70I}*!v$)bxr3!yUb6xjo^Wx3&yt5e?B-RqDo)9vy}@EGGfAyb!5fb0q?(ne zM78}QQt4+D^z4X2(YxLJ@mdwiy1FApddTsdTeBirqDX;uYej+Rnr=S7c0?onC->pS ztlezJa#xXv1IXr!YDSbCIBK${Ep`Ig9@~QK+FCuP*~5KOtQCn4Nql(0$4U9@yFqz# z?aJ5Fy{fyXfApldF`p+HS1X!ts~K5r=|Wqw`NKQ2SXfBK#$$>OZ)r)@bgwYx!8lYa#<{D8R%yaDwkK5izS$@l z*DV(uU86q2u3;WDud8eM;OefPwQDig?;0E$9_U_KaszVKg=11XOzA^|(;TmJ+6)`b zG3qs+Un?_=SHIZoLzF8`LGqVUL#~D{7_5;2&B|z6`>D9;RDRA}tJBH0S7`lHcS0j)kpy4qRST}Kk+J2? zzN~-c%C6`H7_WC-x>EJ)oW)t=e&{C_%&FCIsYKsDh%wq|N7|ZbT8dLM)>K9_e`tiB zuh+^-bmM3ZySi7eO|7NwZKFy`X9EY$)^Mg2vya23t@@I`1xaYXWj@xHuG1?in|=^h zw<{@kAp{IIBxhvrPTN{LOJ| z4UR{2z!jEB$^$R#1oCYmWbS!U`9pUHONup+IB;x%L#wQw}!wwP~qR} z(y)dgX}LK_3aueXVrdQGcVH@J=i{DMUKX-*4#gV6r61Zry$Zh48UmBKhHwW7%C8~B z3eE)rZjmjwKtLWGsLEfJ-)c__?Oz}mCpOEC2n3BiMC>uV|K+d~u6-KGqBeYzsMfVF zrO?)H_=?MbYhPzbi;`#2@FV70*S_T1&ZmLemUr!!(=z6_*A2NutC~+FZh60bIoyO( zzD*jjMlLmCINn(#{GtB%b0|!YKddYG!{>@RrmNR}NW=bb+}Fy>_Spw+pw^>q(J9Xa zamqhIb*)pLcVvuR>-Mr4aLVfpu`64qxn;V$1x|T=%kDr>)8{b5IprnCn*9uBd7ScP z?4mvHI5vD=sum_``ZbY!9``a(VRt&>1T2^2i&{Aq9P3cx zzVb>iFAB_oEU9X|hA=)yco`JqeGaSA_^iW-d%4F32`dup+zv&2F6=TGC8u%6VRRbH z<5$622NU;CSH$@dDs84-+aozWj67dO} z0$o59uTQuPO7eBAk(!<)lF#8=2B_rCjkgEBCRMOw2k^Y!+%kZ36RuiQ#!(`9UA1M9 zVt!Z+(|o%ql=Q=v0f{(SOI?@>>J~s9pOdu=khnGVuI(_)LI)G~ppJ#Z4%F0U;~u@7 zI9~T?863awQ;cMMpHC6eHpj$ClrR_}&Y7rFaj#_=9Oozu zsicA*IFz_cvJy;4BNe<&7@xnf42t#fMRe)d&w|9Ai4{;Hs+>aUj@LO|fUf-wcii<>BXW8RLRJ&z(pV(_OVWG%YGv5dI?YVU z6NOg!;zCOpb(+-t-A|@LOX`z;7~O^LLi^Js|--cm!<35 z$W8|U!Q;y+15ol5g&b9Qrf{y5UK6@Hb>2#7pQEZGc3Ll#d9>B;a1?A^Oj|F)KUBk~TpCropL&VWu6(613Rjbo{V8S^P=MYUO^Bhfyk4E0arQ~H0zeF>NyMHOz{q%%O0 zxe17Hk-%hbGk_NuvO)q8CBvZCkcAAJKpZBSNtiI1NoFP_VP9p(1(8hw1(i)i1O!oJ zRRIM7K}1DFKtvHi5nRxB{!>dYRo%C4lK0-1FMWHey8i#v>FU$fe^pmUz$rOtDnE%z zV2~&|X&!*RE4MvS86yMWBmk!(my zLXtYL1dT3Sl8I0e`hnH-a|^kKe$XW72j`HQl59oSa$EW<9oLH8w!1$$O01?P1PKWV zEFpy*WT}>ra700QbAOXT5|YedZ{oUChjf}lNJ5f_+(!sv!g0tj5)$WVXa4|ME(ytU ziBykh@w1=6syKdm>_L>`RF5o_xNyXha;hpKoC`3gaAbiQ&1e`mI%$#!KWzXk%_tk; z7mV;EswSEr1AXYo8i!X ztnvxTC%R5W_$DBnl8=SKY7e@4I$|JbiE!Fs8o^R~+z<$Js%hiL_KVW& zO^#HwmRPgFym+3Dxrs?lFGe&Cf!U?gSj4^(jjFFzRnhbZ!$W_L1X12) z5!KJB&RC>cn4$ibj-2RsiSp6Fa0)XPMog2DEo$f<6n1GcR#~SUL#K{}i0Dor8%)P+ z^cb9SOb)EC5~I$bYB`2J)pXoSj7?v!2$Q&8lH`1`(8J-|)S<5iKO!Hr%3W+LoY3~A zu2JG6H%SrZU3f{0FnvArhbV2{snbY=;k4o)<%rTQ$j~ATXXp<58OZSxVeqc`LV7iA z_Q2}??xDC6L+25e(M#Geqj(f3o1QnowUn4lV7|By2Btz@%E+^hq7)xFCIy_*WTeT` zOB^($CUZH^eKeUAdP)k2;eAOh`1*JfE1w z>}@}ZCWRf-X*fJbpwMZqA&V=)^|T$p$(>K@90X$y;Pnu&rT~POW9(7Fg*u|ng?Sc5^V{TYh?nO+$gbEsW>^7Ny- zhUN`0#JzAv

    ALl-{Aaz5SLU4GD-t0C7J}avXz~o>TRh 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∓%dqcQg~5?e>jxO_Mc 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�Z?@?PZhC#A57W%=eB2gN^B&mg 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

    4crY3t$Lwev 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

    5uFxp5 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 diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.cpp b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.cpp deleted file mode 100644 index 7aa69a3c1..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// FlowShopEA.cpp -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -// Miscilaneous include and declaration -using namespace std; - - -/* EO + MOEO */ -// moeo general include -#include -// for the creation of an evaluator -#include "make_eval_FlowShop.h" -// for the creation of an initializer -#include "make_genotype_FlowShop.h" -// for the creation of the variation operators -#include "make_op_FlowShop.h" -// how to initialize the population -#include -// the stopping criterion -#include -// outputs (stats, population dumps, ...) -#include -// evolution engine (selection and replacement) -#include -// simple call to the algo -#include -// checks for help demand, and writes the status file and make_help; in libutils -void make_help(eoParser & _parser); -/* FLOW-SHOP */ -// definition of representation -#include "FlowShop.h" - - -int main(int argc, char* argv[]) { - try { - - eoParser parser(argc, argv); // for user-parameter reading - eoState state; // to keep all things allocated - - - - - - /*** the representation-dependent things ***/ - - // The fitness evaluation - eoEvalFuncCounter& eval = do_make_eval(parser, state); - // the genotype (through a genotype initializer) - eoInit& init = do_make_genotype(parser, state); - // the variation operators - eoGenOp& op = do_make_op(parser, state); - - - - - - /*** the representation-independent things ***/ - - // initialization of the population - eoPop& pop = do_make_pop(parser, state, init); - // definition of the archive - moeoArchive arch; - // stopping criteria - eoContinue& term = do_make_continue_moeo(parser, state, eval); - // output - eoCheckPoint& checkpoint = do_make_checkpoint_moeo(parser, state, eval, term, pop, arch); - // algorithm - eoAlgo& algo = do_make_ea_moeo(parser, state, eval, checkpoint, op, arch); - - - - - - /*** Go ! ***/ - - // help ? - make_help(parser); - - // first evalution - apply(eval, pop); - - pop.sort(); - arch.update(pop); - - // printing of the initial population - cout << "Initial Population\n"; - pop.sortedPrintOn(cout); - cout << endl; - - // run the algo - do_run(algo, pop); - - // printing of the final population - cout << "Final Population\n"; - pop.sortedPrintOn(cout); - cout << endl; - - // printing of the final archive - cout << "Final Archive\n"; - arch.sortedPrintOn(cout); - cout << endl; - - - - } catch(exception& e) { - cout << e.what() << endl; - } - return EXIT_SUCCESS; -} diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param deleted file mode 100644 index a8b185228..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEA.param +++ /dev/null @@ -1,48 +0,0 @@ - -###### General ###### -# --help=0 # -h : Prints this message -# --stopOnUnknownParam=1 # Stop if unkown param entered -# --seed=1176819700 # -S : Random number seed - -###### Evolution Engine ###### -# --popSize=20 # -P : Population Size -# --updateArch=1 # Update the archive at each gen. -# --fitness=FastNonDominatedSorting # -F : Fitness assignment scheme: Dummy, FastNonDominatedSorting or IndicatorBased -# --indicator=Epsilon # -i : Binary indicator for IndicatorBased: Epsilon, Hypervolume -# --rho=1.1 # -r : reference point for the hypervolume indicator -# --kappa=0.05 # -k : Scaling factor kappa for IndicatorBased -# --diversity=Dummy # -D : Diversity assignment scheme: Dummy or CrowdingDistance -# --comparator=FitnessThenDiversity # -C : Comparator scheme: FitnessThenDiversity or DiversityThenFitness -# --selection=DetTour(2) # -S : Selection scheme: DetTour(T), StochTour(t) or Random -# --replacement=Elitist # -R : Replacement scheme: Elitist, Environmental or Generational -# --nbOffspring=100% # -O : Number of offspring (percentage or absolute) - -###### Output ###### -# --resDir=Res # Directory to store DISK outputs -# --eraseDir=1 # erase files in dirName if any -# --printPop=0 # Print sorted pop. every gen. -# --storeArch=0 # Store the archive's objective vectors at each gen. -# --contribution=0 # Store the contribution of the archive at each gen. -# --entropy=0 # Store the entropy of the archive at each gen. - -###### Persistence ###### -# --Load= # -L : A save file to restart from -# --recomputeFitness=0 # -r : Recompute the fitness after re-loading the pop.? -# --saveFrequency=0 # Save every F generation (0 = only final state, absent = never) -# --saveTimeInterval=0 # Save every T seconds (0 or absent = never) -# --status=./FlowShopEA.status # Status file - -###### Representation ###### ---BenchmarkFile=benchmarks/020_10_01.txt # -B : Benchmark file name (benchmarks are available at www.lifl.fr/~basseur/BenchsUncertain/) REQUIRED - -###### Stopping criterion ###### -# --maxGen=100 # -G : Maximum number of generations (0 = none) -# --maxEval=0 # -E : Maximum number of evaluations (0 = none) -# --CtrlC=1 # -C : Terminate current generation upon Ctrl C - -###### Variation Operators ###### -# --crossRate=1 # Relative rate for the only crossover -# --shiftMutRate=0.5 # Relative rate for shift mutation -# --exchangeMutRate=0.5 # Relative rate for exchange mutation -# --pCross=0.25 # -c : Probability of Crossover -# --pMut=0.35 # -m : Probability of Mutation diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h deleted file mode 100644 index 049474001..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopEval.h +++ /dev/null @@ -1,129 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// FlowShopEval.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef FLOWSHOPEVAL_H_ -#define FLOWSHOPEVAL_H_ - -#include "FlowShop.h" -#include - -/** - * Functor - * Computation of the multi-objective evaluation of a FlowShop object - */ -class FlowShopEval : public moeoEvalFunc { - -public: - - /** - * constructor - * @param _M the number of machines - * @param _N the number of jobs to schedule - * @param _p the processing times - * @param _d the due dates - */ - FlowShopEval(const unsigned _M, const unsigned _N, const vector< vector > & _p, const vector & _d) : - M(_M), N (_N), p(_p), d(_d){ - - unsigned nObjs = 2; - std::vector bObjs(nObjs, true); - moeoObjectiveVectorTraits::setup(nObjs, bObjs); - } - - - - /** - * computation of the multi-objective evaluation of an eoFlowShop object - * @param FlowShop & _eo the FlowShop object to evaluate - */ - void operator()(FlowShop & _eo) { - FlowShopObjectiveVector objVector; - objVector[0] = tardiness(_eo); - objVector[1] = makespan(_eo); - _eo.objectiveVector(objVector); - } - - - - - -private: - - /** number of machines */ - unsigned M; - /** number of jobs */ - unsigned N; - /** p[i][j] = processing time of job j on machine i */ - std::vector< std::vector > p; - /** d[j] = due-date of the job j */ - std::vector d; - - - - /** - * computation of the makespan - * @param FlowShop _eo the FlowShop object to evaluate - */ - double makespan(FlowShop _eo) { - // the scheduling to evaluate - vector scheduling = _eo.getScheduling(); - // completion times computation for each job on each machine - // C[i][j] = completion of the jth job of the scheduling on the ith machine - std::vector< std::vector > C = completionTime(_eo); - // fitness == C[M-1][scheduling[N-1]]; - return C[M-1][scheduling[N-1]]; - } - - - - /** - * computation of the tardiness - * @param _eo the FlowShop object to evaluate - */ - double tardiness(FlowShop _eo) { - // the scheduling to evaluate - vector scheduling = _eo.getScheduling(); - // completion times computation for each job on each machine - // C[i][j] = completion of the jth job of the scheduling on the ith machine - std::vector< std::vector > C = completionTime(_eo); - // tardiness computation - unsigned long sum = 0; - for (unsigned j=0 ; j > completionTime(FlowShop _eo) { - vector scheduling = _eo.getScheduling(); - std::vector< std::vector > C(M,N); - C[0][scheduling[0]] = p[0][scheduling[0]]; - for (unsigned j=1; j -#include "FlowShop.h" - -/** - * Functor - * Initialisation of a random genotype built by the default constructor of the eoFlowShop class - */ -class FlowShopInit: public eoInit { - -public: - - /** - * constructor - * @param const unsigned _N the number of jobs to schedule - */ - FlowShopInit(const unsigned _N) { - N = _N; - } - - /** - * randomize a genotype - * @param FlowShop & _genotype a genotype that has been default-constructed - */ - void operator()(FlowShop & _genotype) { - // scheduling vector - vector scheduling(N); - // initialisation of possible values - vector possibles(N); - for(unsigned i=0 ; i -#include "FlowShop.h" - -/** - * Functor - * Quadratic crossover operator for flow-shop (modify the both genotypes) - */ -class FlowShopOpCrossoverQuad: public eoQuadOp { - -public: - - /** - * default constructor - */ - FlowShopOpCrossoverQuad() {} - - /** - * the class name (used to display statistics) - */ - string className() const { - return "FlowShopOpCrossoverQuad"; - } - - /** - * eoQuad crossover - _genotype1 and _genotype2 are the (future) offspring, i.e. _copies_ of the parents - * @param FlowShop & _genotype1 the first parent - * @param FlowShop & _genotype2 the second parent - */ - bool operator()(FlowShop & _genotype1, FlowShop & _genotype2) { - bool oneAtLeastIsModified; - - // parents - vector parent1 = _genotype1.getScheduling(); - vector parent2 = _genotype2.getScheduling(); - - // computation of the 2 random points - unsigned point1, point2; - do { - point1 = rng.random(min(parent1.size(), parent2.size())); - point2 = rng.random(min(parent1.size(), parent2.size())); - } while (fabs((double) point1-point2) <= 2); - - // computation of the offspring - vector offspring1 = generateOffspring(parent1, parent2, point1, point2); - vector offspring2 = generateOffspring(parent2, parent1, point1, point2); - - // does at least one genotype has been modified ? - if ((parent1 != offspring1) || (parent2 != offspring2)) { - // update - _genotype1.setScheduling(offspring1); - _genotype2.setScheduling(offspring2); - // at least one genotype has been modified - oneAtLeastIsModified = true; - } - else { - // no genotype has been modified - oneAtLeastIsModified = false; - } - - // return 'true' if at least one genotype has been modified - return oneAtLeastIsModified; - } - - -private: - - /** - * generation of an offspring by a 2 points crossover - * @param vector _parent1 the first parent - * @param vector _parent2 the second parent - * @param unsigned_point1 the first point - * @param unsigned_point2 the second point - */ - vector generateOffspring(vector _parent1, vector _parent2, unsigned _point1, unsigned _point2) { - vector result = _parent1; - vector taken_values(result.size(), false); - if (_point1 > _point2) swap(_point1, _point2); - - /* first parent */ - for (unsigned i=0 ; i<=_point1 ; i++) { - // result[i] == _parent1[i] - taken_values[_parent1[i]] = true; - } - for (unsigned i=_point2 ; i -#include "FlowShop.h" - -/** - * Functor - * Exchange mutation operator for flow-shop - */ -class FlowShopOpMutationExchange: public eoMonOp { - -public: - - /** - * default constructor - */ - FlowShopOpMutationExchange() {} - - /** - * the class name (used to display statistics) - */ - string className() const { - return "FlowShopOpMutationExchange"; - } - - /** - * modifies the parent with an exchange mutation - * @param FlowShop & _genotype the parent genotype (will be modified) - */ - bool operator()(FlowShop & _genotype) { - bool isModified; - - // schedulings - vector initScheduling = _genotype.getScheduling(); - vector resultScheduling = _genotype.getScheduling(); - - // computation of the 2 random points - unsigned point1, point2; - do { - point1 = rng.random(resultScheduling.size()); - point2 = rng.random(resultScheduling.size()); - } while (point1 == point2); - - // swap - swap (resultScheduling[point1], resultScheduling[point2]); - - // update (if necessary) - if (resultScheduling != initScheduling) { - // update - _genotype.setScheduling(resultScheduling); - // the genotype has been modified - isModified = true; - } - else { - // the genotype has not been modified - isModified = false; - } - - // return 'true' if the genotype has been modified - return isModified; - } - -}; - -#endif /*FLOWSHOPOPMUTATIONEXCHANGE_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h b/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h deleted file mode 100644 index 64949a549..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/FlowShopOpMutationShift.h +++ /dev/null @@ -1,86 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// FlowShopOpMutationShift.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef FLOWSHOPOPMUTATIONSHIFT_H_ -#define FLOWSHOPOPMUTATIONSHIFT_H_ - -#include -#include "FlowShop.h" - -/** - * Functor - * Shift mutation operator for flow-shop - */ -class FlowShopOpMutationShift: public eoMonOp { - -public: - - /** - * default constructor - */ - FlowShopOpMutationShift() {} - - /** - * the class name (used to display statistics) - */ - string className() const { - return "FlowShopOpMutationShift"; - } - - /** - * modifies the parent with a shift mutation - * @param FlowShop & _genotype the parent genotype (will be modified) - */ - bool operator()(FlowShop & _genotype) { - bool isModified; - int direction; - unsigned tmp; - - // schedulings - vector initScheduling = _genotype.getScheduling(); - vector resultScheduling = initScheduling; - - // computation of the 2 random points - unsigned point1, point2; - do { - point1 = rng.random(resultScheduling.size()); - point2 = rng.random(resultScheduling.size()); - } while (point1 == point2); - - // direction - if (point1 < point2) direction = 1; - else direction = -1; - // mutation - tmp = resultScheduling[point1]; - for(unsigned i=point1 ; i!=point2 ; i+=direction) - resultScheduling[i] = resultScheduling[i+direction]; - resultScheduling[point2] = tmp; - - // update (if necessary) - if (resultScheduling != initScheduling) { - // update - _genotype.setScheduling(resultScheduling); - // the genotype has been modified - isModified = true; - } - else { - // the genotype has not been modified - isModified = false; - } - - // return 'true' if the genotype has been modified - return isModified; - } - -}; - -#endif /*FLOWSHOPOPMUTATIONSHIFT_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/Makefile.am b/trunk/paradiseo-moeo/tutorials/lesson1/Makefile.am deleted file mode 100644 index 26370a030..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ - -noinst_PROGRAMS = FlowShopEA - -FlowShopEA_SOURCES = FlowShopEA.cpp - -LDADD = -L$(top_builddir)/src ${EO_DIR}/src/libeo.a ${EO_DIR}/src/utils/libeoutils.a - -INCLUDES = -I${EO_DIR}/src/ -I$(top_srcdir)/src - diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h deleted file mode 100644 index 7545b37b8..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/make_eval_FlowShop.h +++ /dev/null @@ -1,55 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// make_eval_FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MAKE_EVAL_FLOWSHOP_H_ -#define MAKE_EVAL_FLOWSHOP_H_ - - -#include -#include -#include "FlowShop.h" -#include "FlowShopBenchmarkParser.h" -#include "FlowShopEval.h" - -/* - * This function creates an eoEvalFuncCounter that can later be used to evaluate an individual. - * @param eoParser& _parser to get user parameters - * @param eoState& _state to store the memory - */ -eoEvalFuncCounter & do_make_eval(eoParser& _parser, eoState& _state) { - - // benchmark file name - string benchmarkFileName = _parser.getORcreateParam(string(), "BenchmarkFile", "Benchmark file name (benchmarks are available at " + BENCHMARKS_WEB_SITE + ")", 'B',"Representation", true).value(); - if (benchmarkFileName == "") { - std::string stmp = "*** Missing name of the benchmark file\n"; - stmp += " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; - stmp += " Benchmarks files are available at " + BENCHMARKS_WEB_SITE; - throw std::runtime_error(stmp.c_str()); - } - // reading of the parameters contained in the benchmark file - FlowShopBenchmarkParser fParser(benchmarkFileName); - unsigned M = fParser.getM(); - unsigned N = fParser.getN(); - std::vector< std::vector > p = fParser.getP(); - std::vector d = fParser.getD(); - - // build of the initializer (a pointer, stored in the eoState) - FlowShopEval* plainEval = new FlowShopEval(M, N, p, d); - // turn that object into an evaluation counter - eoEvalFuncCounter* eval = new eoEvalFuncCounter (* plainEval); - // store in state - _state.storeFunctor(eval); - // and return a reference - return *eval; -} - -#endif /*MAKE_EVAL_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h deleted file mode 100644 index 157481f36..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/make_genotype_FlowShop.h +++ /dev/null @@ -1,49 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// make_genotype_FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MAKE_GENOTYPE_FLOWSHOP_H_ -#define MAKE_GENOTYPE_FLOWSHOP_H_ - -#include -#include -#include "FlowShop.h" -#include "FlowShopInit.h" -#include "FlowShopBenchmarkParser.h" - -/* - * This function creates an eoInit that can later be used to initialize the population (see make_pop.h). - * @param eoParser& _parser to get user parameters - * @param eoState& _state to store the memory - */ -eoInit & do_make_genotype(eoParser& _parser, eoState& _state) { - - // benchmark file name - string benchmarkFileName = _parser.getORcreateParam(string(), "BenchmarkFile", "Benchmark file name (benchmarks are available at " + BENCHMARKS_WEB_SITE + ")", 'B',"Representation", true).value(); - if (benchmarkFileName == "") { - std::string stmp = "*** Missing name of the benchmark file\n"; - stmp += " Type '-B=the_benchmark_file_name' or '--BenchmarkFile=the_benchmark_file_name'\n"; - stmp += " Benchmarks files are available at " + BENCHMARKS_WEB_SITE; - throw std::runtime_error(stmp.c_str()); - } - // reading of number of jobs to schedule contained in the benchmark file - FlowShopBenchmarkParser fParser(benchmarkFileName); - unsigned N = fParser.getN(); - - // build of the initializer (a pointer, stored in the eoState) - eoInit* init = new FlowShopInit(N); - // store in state - _state.storeFunctor(init); - // and return a reference - return *init; -} - -#endif /*MAKE_GENOTYPE_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h b/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h deleted file mode 100644 index 23c05c72d..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson1/make_op_FlowShop.h +++ /dev/null @@ -1,106 +0,0 @@ -// -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*- - -//----------------------------------------------------------------------------- -// make_op_FlowShop.h -// (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2007 -/* - This library... - - Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr - */ -//----------------------------------------------------------------------------- - -#ifndef MAKE_OP_FLOWSHOP_H_ -#define MAKE_OP_FLOWSHOP_H_ - -#include -#include -#include -#include -#include -#include -#include -#include "FlowShopOpCrossoverQuad.h" -#include "FlowShopOpMutationShift.h" -#include "FlowShopOpMutationExchange.h" - -/* - * This function builds the operators that will be applied to the eoFlowShop - * @param eoParameterLoader& _parser to get user parameters - * @param eoState& _state to store the memory - */ -eoGenOp & do_make_op(eoParameterLoader& _parser, eoState& _state) { - - ///////////////////////////// - // Variation operators - //////////////////////////// - - // the crossover - //////////////// - - // a first crossover - eoQuadOp *cross = new FlowShopOpCrossoverQuad; - // store in the state - _state.storeFunctor(cross); - - // relative rate in the combination - double cross1Rate = _parser.createParam(1.0, "crossRate", "Relative rate for the only crossover", 0, "Variation Operators").value(); - // creation of the combined operator with this one - eoPropCombinedQuadOp *propXover = new eoPropCombinedQuadOp(*cross, cross1Rate); - // store in the state - _state.storeFunctor(propXover); - - - // the mutation - /////////////// - - // a first mutation : the shift mutation - eoMonOp *mut = new FlowShopOpMutationShift; - _state.storeFunctor(mut); - // its relative rate in the combination - double mut1Rate = _parser.createParam(0.5, "shiftMutRate", "Relative rate for shift mutation", 0, "Variation Operators").value(); - // creation of the combined operator with this one - eoPropCombinedMonOp *propMutation = new eoPropCombinedMonOp(*mut, mut1Rate); - _state.storeFunctor(propMutation); - - // a second mutation : the exchange mutation - mut = new FlowShopOpMutationExchange; - _state.storeFunctor(mut); - // its relative rate in the combination - double mut2Rate = _parser.createParam(0.5, "exchangeMutRate", "Relative rate for exchange mutation", 0, "Variation Operators").value(); - // addition of this one to the combined operator - propMutation -> add(*mut, mut2Rate); - - // end of crossover and mutation definitions - //////////////////////////////////////////// - - // First read the individual level parameters - eoValueParam& pCrossParam = _parser.createParam(0.25, "pCross", "Probability of Crossover", 'c', "Variation Operators" ); - // minimum check - if ( (pCrossParam.value() < 0) || (pCrossParam.value() > 1) ) - throw runtime_error("Invalid pCross"); - - eoValueParam& pMutParam = _parser.createParam(0.35, "pMut", "Probability of Mutation", 'm', "Variation Operators" ); - // minimum check - if ( (pMutParam.value() < 0) || (pMutParam.value() > 1) ) - throw runtime_error("Invalid pMut"); - - // the crossover - with probability pCross - eoProportionalOp * propOp = new eoProportionalOp ; - _state.storeFunctor(propOp); - eoQuadOp *ptQuad = new eoQuadCloneOp; - _state.storeFunctor(ptQuad); - propOp -> add(*propXover, pCrossParam.value()); // crossover, with proba pcross - propOp -> add(*ptQuad, 1-pCrossParam.value()); // nothing, with proba 1-pcross - - // now the sequential - eoSequentialOp *op = new eoSequentialOp; - _state.storeFunctor(op); - op -> add(*propOp, 1.0); // always do combined crossover - op -> add(*propMutation, pMutParam.value()); // then mutation, with proba pmut - - // return a reference - return *op; -} - -#endif /*MAKE_OP_FLOWSHOP_H_*/ diff --git a/trunk/paradiseo-moeo/tutorials/lesson2/Makefile.am b/trunk/paradiseo-moeo/tutorials/lesson2/Makefile.am deleted file mode 100644 index 086363914..000000000 --- a/trunk/paradiseo-moeo/tutorials/lesson2/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ - -noinst_PROGRAMS = Sch1 - -Sch1_SOURCES = Sch1.cpp - -LDADD = -L$(top_builddir)/src ${EO_DIR}/src/libeo.a ${EO_DIR}/src/utils/libeoutils.a - -INCLUDES = -I${EO_DIR}/src/ -I$(top_srcdir)/src - diff --git a/trunk/paradiseo-moeo/tutorials/lesson2/Sch1 b/trunk/paradiseo-moeo/tutorials/lesson2/Sch1 deleted file mode 100755 index da78a49858e3ecb5ffdecfab4b50655dbec764fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1110130 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%0DOqi6n%F~p$H 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 -#include -#include -#include -#include - -// the moeoObjectiveVectorTraits : minimizing 2 objectives -class Sch1ObjectiveVectorTraits : public moeoObjectiveVectorTraits -{ - public:static bool minimizing (int i) - { - return true; - } - static unsigned nObjectives () - { - return 2; - } -}; - - -// objective vector of doubles -typedef moeoObjectiveVectorDouble < Sch1ObjectiveVectorTraits > Sch1ObjectiveVector; - - -// multi-objective evolving object for the Sch1 problem -class Sch1 : public moeoRealVector < Sch1ObjectiveVector, double, double > -{ -public: - Sch1() : moeoRealVector < Sch1ObjectiveVector, double, double > (1) {} -}; - - -// evaluation of objective functions -class Sch1Eval : public moeoEvalFunc < Sch1 > -{ -public: - void operator () (Sch1 & _sch1) - { - if (_sch1.invalidObjectiveVector()) - { - Sch1ObjectiveVector objVec; - double x = _sch1[0]; - objVec[0] = x * x; - objVec[1] = (x - 2.0) * (x - 2.0); - _sch1.objectiveVector(objVec); - } - } -}; - - -// main -int main (int argc, char *argv[]) -{ - // parameters - unsigned POP_SIZE = 20; - unsigned MAX_GEN = 100; - double M_EPSILON = 0.01; - double P_CROSS = 0.25; - double P_MUT = 0.35; - - // objective functions evaluation - Sch1Eval eval; - - // crossover and mutation - eoQuadCloneOp < Sch1 > xover; - eoUniformMutation < Sch1 > mutation (M_EPSILON); - - // generate initial population - eoRealVectorBounds bounds (1, 0.0, 2.0); // [0, 2] - eoRealInitBounded < Sch1 > init (bounds); - eoPop < Sch1 > pop (POP_SIZE, init); - - // build NSGA-II - moeoNSGAII < Sch1 > nsgaII (MAX_GEN, eval, xover, P_CROSS, mutation, P_MUT); - - // run the algo - nsgaII (pop); - - // extract first front of the final population using an moeoArchive (this is the output of nsgaII) - moeoArchive < Sch1 > arch; - arch.update (pop); - - // printing of the final archive - cout << "Final Archive" << endl; - arch.sortedPrintOn (cout); - cout << endl; - - return EXIT_SUCCESS; -}

  • +
      +
    • Main Page
    • +
    • Classes
    • +
    • Files
    • +
    • +
      + + + + +1 document matching your query."; + } + else // $num>1 + { + return "Found $num documents matching your query. Showing best matches first."; + } +} + +function report_matches() +{ + return "Matches: "; +} +function end_form($value) +{ + echo " \n \n
      \n
      \n
    • \n
    \n