00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef MOEOARCHIVE_H_
00014 #define MOEOARCHIVE_H_
00015
00016 #include <eoPop.h>
00017
00021 template < class EOT > class moeoArchive:public eoPop < EOT >
00022 {
00023 public:
00024
00025 using std::vector < EOT >::size;
00026 using std::vector < EOT >::operator[];
00027 using std::vector < EOT >::back;
00028 using std::vector < EOT >::pop_back;
00029
00033 typedef typename EOT::Fitness EOFitness;
00034
00039 bool dominates (const EOFitness & _fit) const
00040 {
00041 for (unsigned i = 0; i < size; i++)
00042 if (operator[](i).fitness ().dominates (_fit))
00043 return true;
00044 return false;
00045 }
00046
00051 bool contains (const EOFitness & _fit) const
00052 {
00053 for (unsigned i = 0; i < size; i++)
00054 if (operator[](i).fitness () == _fit)
00055 return true;
00056 return false;
00057 }
00058
00063 void update (const EOT & _eo)
00064 {
00065
00066 for (unsigned j = 0; j < size ();)
00067 {
00068 if (_eo.fitness ().dominates (operator[](j).fitness ()))
00069 {
00070 operator[](j) = back ();
00071 pop_back ();
00072 }
00073 else if (_eo.fitness () == operator[](j).fitness ())
00074 {
00075 operator[](j) = back ();
00076 pop_back ();
00077 }
00078 else
00079 j++;
00080 }
00081
00082
00083 bool dom = false;
00084 for (unsigned j = 0; j < size (); j++)
00085 if (operator [](j).fitness ().dominates (_eo.fitness ()))
00086 {
00087 dom = true;
00088 break;
00089 }
00090 if (!dom)
00091 push_back (_eo);
00092 }
00093
00098 void update (const eoPop < EOT > &_pop)
00099 {
00100 for (unsigned i = 0; i < _pop.size (); i++)
00101 update (_pop[i]);
00102 }
00103
00104 };
00105
00106 #endif