moeoNDSorting.h

00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
00002 
00003 //-----------------------------------------------------------------------------
00004 // moeoNDSorting.h
00005 // (c) OPAC Team (LIFL), Dolphin Project (INRIA), 2006
00006 /*
00007     This library...
00008 
00009     Contact: paradiseo-help@lists.gforge.inria.fr, http://paradiseo.gforge.inria.fr
00010  */
00011 //-----------------------------------------------------------------------------
00012 
00013 #ifndef moeoNDSorting_h
00014 #define moeoNDSorting_h
00015 
00016 #include <cfloat>
00017 #include <eoNDSorting.h>
00018 
00019 # define INF 1.0e14             // DBL_MAX
00020 
00026 template < class EOT > class moeoNDSorting_II:public eoNDSorting < EOT >
00027 {
00028 public:
00029 
00033 moeoNDSorting_II (bool nasty_flag_ = false):eoNDSorting < EOT >
00034     (nasty_flag_)
00035   {
00036   }
00037 
00041   typedef std::pair < double, unsigned >double_index_pair;
00042 
00046   class compare_nodes
00047   {
00048     public:bool operator () (const double_index_pair & a,
00049                              const double_index_pair & b) const
00050     {
00051       return a.first < b.first;
00052     }
00053   };
00054 
00056   std::vector < double >niche_penalty (const std::vector < unsigned >&_cf,
00057                                        const eoPop < EOT > &_pop)
00058   {
00059     typedef typename EOT::Fitness::fitness_traits traits;
00060     unsigned i;
00061     std::vector < double >niche_count (_cf.size (), 0.);
00062 
00063 
00064     unsigned nObjectives = traits::nObjectives ();      //_pop[_cf[0]].fitness().size();
00065 
00066     for (unsigned o = 0; o < nObjectives; ++o)
00067       {
00068         std::vector < std::pair < double,
00069           unsigned > >performance (_cf.size ());
00070         for (i = 0; i < _cf.size (); ++i)
00071           {
00072             performance[i].first = _pop[_cf[i]].fitness ()[o];
00073             performance[i].second = i;
00074           }
00075 
00076         std::sort (performance.begin (), performance.end (), compare_nodes ()); // a lambda operator would've been nice here
00077 
00078         // set boundary at INF (so it will get chosen over all the others
00079         niche_count[performance[0].second] = INF;
00080         niche_count[performance.back ().second] = INF;
00081 
00082         if (performance[0].first != performance.back ().first)
00083           {
00084             for (i = 1; i < _cf.size () - 1; ++i)
00085               {
00086                 if (niche_count[performance[i].second] != INF)
00087                   {
00088                     niche_count[performance[i].second] +=
00089                       (performance[i + 1].first -
00090                        performance[i -
00091                                    1].first) / (performance.back ().first -
00092                                                 performance[0].first);
00093                   }
00094               }
00095           }
00096       }
00097 
00098     // transform niche_count into penality
00099     for (i = 0; i < niche_count.size (); ++i)
00100       {
00101         niche_count[i] = INF - niche_count[i];
00102       }
00103 
00104     return niche_count;
00105   }
00106 };
00107 
00108 #endif

Generated on Tue Jan 16 15:49:53 2007 for ParadisEO-MOEO by  doxygen 1.5.1