00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef MOEOARCHIVE_H_
00039 #define MOEOARCHIVE_H_
00040
00041 #include <eoPop.h>
00042 #include <comparator/moeoObjectiveVectorComparator.h>
00043 #include <comparator/moeoParetoObjectiveVectorComparator.h>
00044
00048 template < class MOEOT >
00049 class moeoArchive : public eoPop < MOEOT >
00050 {
00051 public:
00052
00053 using eoPop < MOEOT > :: size;
00054 using eoPop < MOEOT > :: operator[];
00055 using eoPop < MOEOT > :: back;
00056 using eoPop < MOEOT > :: pop_back;
00057
00058
00062 typedef typename MOEOT::ObjectiveVector ObjectiveVector;
00063
00064
00069 moeoArchive() : eoPop < MOEOT >(), comparator(paretoComparator)
00070 {}
00071
00072
00077 moeoArchive(moeoObjectiveVectorComparator < ObjectiveVector > & _comparator) : eoPop < MOEOT >(), comparator(_comparator)
00078 {}
00079
00080
00085 bool dominates (const ObjectiveVector & _objectiveVector) const
00086 {
00087 for (unsigned int i = 0; i<size(); i++)
00088 {
00089
00090 if ( comparator(_objectiveVector, operator[](i).objectiveVector()) )
00091 {
00092 return true;
00093 }
00094 }
00095 return false;
00096 }
00097
00098
00103 bool contains (const ObjectiveVector & _objectiveVector) const
00104 {
00105 for (unsigned int i = 0; i<size(); i++)
00106 {
00107 if (operator[](i).objectiveVector() == _objectiveVector)
00108 {
00109 return true;
00110 }
00111 }
00112 return false;
00113 }
00114
00115
00120 void update (const MOEOT & _moeo)
00121 {
00122
00123 for (unsigned int j=0; j<size();)
00124 {
00125
00126 if ( comparator(operator[](j).objectiveVector(), _moeo.objectiveVector()) )
00127 {
00128 operator[](j) = back();
00129 pop_back();
00130 }
00131 else if (_moeo.objectiveVector() == operator[](j).objectiveVector())
00132 {
00133 operator[](j) = back();
00134 pop_back();
00135 }
00136 else
00137 {
00138 j++;
00139 }
00140 }
00141
00142 bool dom = false;
00143 for (unsigned int j=0; j<size(); j++)
00144 {
00145
00146 if ( comparator(_moeo.objectiveVector(), operator[](j).objectiveVector()) )
00147 {
00148 dom = true;
00149 break;
00150 }
00151 }
00152 if (!dom)
00153 {
00154 push_back(_moeo);
00155 }
00156 }
00157
00158
00163 void update (const eoPop < MOEOT > & _pop)
00164 {
00165 for (unsigned int i=0; i<_pop.size(); i++)
00166 {
00167 update(_pop[i]);
00168 }
00169 }
00170
00171
00176 bool equals (const moeoArchive < MOEOT > & _arch)
00177 {
00178 for (unsigned int i=0; i<size(); i++)
00179 {
00180 if (! _arch.contains(operator[](i).objectiveVector()))
00181 {
00182 return false;
00183 }
00184 }
00185 for (unsigned int i=0; i<_arch.size() ; i++)
00186 {
00187 if (! contains(_arch[i].objectiveVector()))
00188 {
00189 return false;
00190 }
00191 }
00192 return true;
00193 }
00194
00195
00196 private:
00197
00199 moeoObjectiveVectorComparator < ObjectiveVector > & comparator;
00201 moeoParetoObjectiveVectorComparator < ObjectiveVector > paretoComparator;
00202
00203 };
00204
00205 #endif