00001 #include <algorithm>
00002 #include <NLstl_utils.h>
00003 #include "GLBaseOrganism.h"
00004 #include "GLRankerStandardSO.h"
00005 #include "GLUtils.h"
00006 using namespace std;
00007 using namespace std::rel_ops;
00008
00012 GLRankerStandardSO::GLRankerStandardSO()
00013 {
00014 }
00015
00019 GLRankerStandardSO::~GLRankerStandardSO()
00020 {
00021 }
00022
00032 void GLRankerStandardSO::getFittest(
00033 const vector<GLBaseOrganism*>& organisms,
00034 vector<const GLBaseOrganism*>& fittest)
00035 {
00036 vector<GLBaseOrganism*>::const_iterator it = organisms.begin();
00037 fittest.clear();
00038
00039
00040 if (organisms.empty()) return;
00041 fittest.push_back(organisms.front());
00042 while (it != organisms.end())
00043 {
00044
00045
00046 if ((*it)->getFitness()->isLess(fittest.front()->getFitness()))
00047 {
00048 fittest.clear();
00049 fittest.push_back((*it));
00050 }
00051
00052 else if (fittest.front()->getFitness()->isEqual((*it)->getFitness()))
00053 {
00054 fittest.push_back(*it);
00055 }
00056 ++it;
00057 }
00058 }
00059
00069 void GLRankerStandardSO::rankOrganisms(
00070 vector<GLBaseOrganism*>& organisms,
00071 vector<const GLBaseOrganism*>& fittest)
00072 {
00073 rankOrganisms(organisms);
00074
00075 fittest.clear();
00076 fittest.push_back(organisms.front());
00077 vector<GLBaseOrganism*>::const_iterator it = organisms.begin() + 1;
00078 while ((it != organisms.end()) &&
00079 ((*it)->getFitness()->isEqual(organisms.front()->getFitness())))
00080 {
00081 fittest.push_back(*it);
00082 ++it;
00083 }
00084 }
00085
00091 void GLRankerStandardSO::rankOrganisms(vector<GLBaseOrganism*>& organisms)
00092 {
00093 sort(organisms.begin(), organisms.end(),
00094 GLBaseOrganism::CompareFitnessLess());
00095 }
00096
00111 bool GLRankerStandardSO::updateFittest(
00112 const vector<const GLBaseOrganism*>& candidates,
00113 vector<const GLBaseOrganism*>& current_best)
00114 {
00115
00116 if (candidates.empty()) return false;
00117
00118
00119 if (current_best.empty() ||
00120 candidates[0]->getFitness()->isLess(current_best[0]->getFitness()))
00121 {
00122 for_each(current_best.begin(), current_best.end(),
00123 nlutils::DeleteObject());
00124 current_best.clear();
00125 current_best.reserve(candidates.size());
00126 transform (candidates.begin(), candidates.end(),
00127 back_inserter(current_best),
00128 GLBaseOrganism::Cloner(false));
00129 return true;
00130 }
00131
00132
00133 bool return_flag = false;
00134 if (candidates[0]->getFitness()->
00135 isEqual(current_best[0]->getFitness()))
00136 {
00137 for(vector<const GLBaseOrganism*>::
00138 const_iterator it = candidates.begin(); it != candidates.end();
00139 ++it)
00140 {
00141
00142 vector<const GLBaseOrganism*>::iterator it_cur =
00143 find_if(current_best.begin(), current_best.end(),
00144 bind2nd(GLBaseOrganism::CompareEqual(), (*it)));
00145
00146 if (it_cur == current_best.end())
00147 {
00148 current_best.push_back((*it)->makeClone(false));
00149 return_flag = true;
00150 }
00151 }
00152 }
00153 return return_flag;
00154 }