00001 #include <math.h>
00002 #include <iomanip>
00003
00004 #include "GLBaseGaStatus.h"
00005 #include "GLFitnessSingleObjective.h"
00006 #include "GLStatisticsSingleObjective.h"
00007 #include "GLUtils.h"
00008
00009 typedef vector<GLBaseGaStatus*> TResultVector;
00021 GLStatisticsSingleObjective::GLStatisticsSingleObjective(
00022 const vector<GLBaseGaStatus*>& results):
00023 GLStatisticsSimple(results),
00024 m_minmax_fitness(NULL, NULL),
00025 m_stat_fitness(0.0, 0.0)
00026 {
00027
00028 if (results.empty())
00029 return;
00030 collectFitnessStatistics(results);
00031 }
00032
00036 GLStatisticsSingleObjective::~GLStatisticsSingleObjective()
00037 {
00038 }
00039
00044 void GLStatisticsSingleObjective::collectFitnessStatistics(
00045 const vector<GLBaseGaStatus*>& results)
00046 {
00047 if (results.empty()) return;
00048
00049 GLFitnessSingleObjective<double> best_current_fitness(0.0);
00050
00051 for(TResultVector::const_iterator vit(results.begin());
00052 vit != results.end(); ++vit)
00053 {
00054
00055
00056 if ((*vit)->m_best_ever_organisms.empty()) continue;
00057 (*vit)->m_best_ever_organisms.front()->
00058 getFitness()->assignTo(best_current_fitness);
00059
00060 m_stat_fitness.first += best_current_fitness.getValue();
00061
00062 m_stat_fitness.second += best_current_fitness.getValue() *
00063 best_current_fitness.getValue() /
00064 getNumberOfRuns();
00065
00066
00067 if ((m_minmax_fitness.first != NULL) &&
00068 (*vit)->m_best_ever_organisms.front()->getFitness()
00069 ->isEqual(m_minmax_fitness.first))
00070 {
00071 ++m_times_best_found;
00072 }
00073
00074 if ((m_minmax_fitness.first == NULL) ||
00075 (*vit)->m_best_ever_organisms.front()->getFitness()
00076 ->isLess(m_minmax_fitness.first))
00077 {
00078 m_minmax_fitness.first = (*vit)->m_best_ever_organisms.front()
00079 ->getFitness();
00080 m_times_best_found = 1;
00081 }
00082
00083 if ((m_minmax_fitness.second == NULL) ||
00084 m_minmax_fitness.second->isLess(
00085 (*vit)->m_best_ever_organisms.front()
00086 ->getFitness()))
00087 {
00088 m_minmax_fitness.second = (*vit)->m_best_ever_organisms.front()
00089 ->getFitness();
00090 }
00091 }
00092 m_stat_fitness.first /= getNumberOfRuns();
00093
00094 m_stat_fitness.second -= m_stat_fitness.first * m_stat_fitness.first;
00095
00096 m_stat_fitness.second = m_stat_fitness.second > 0 ?
00097 sqrt(m_stat_fitness.second) : 0;
00098
00099
00100 for(TResultVector::const_iterator vit(results.begin());
00101 vit != results.end(); ++vit)
00102 {
00103
00104
00105
00106 if ((*vit)->m_best_ever_organisms.empty()) continue;
00107 if ((*vit)->m_best_ever_organisms.front()
00108 ->getFitness()->isEqual(m_minmax_fitness.first))
00109 {
00110 ms_best_org.insert((*vit)->m_best_ever_organisms.begin(),
00111 (*vit)->m_best_ever_organisms.end());
00112 }
00113 }
00114 }
00115
00119 ostream& GLStatisticsSingleObjective::toStream(ostream& out) const
00120 {
00121 GLStatisticsSimple::toStream(out);
00122 out << setw(30) << left << "Best solution found "
00123 << m_times_best_found << " times\n";
00124 out << setw(30) << left << "Fitness value:"
00125 << setw(15) << right << m_stat_fitness.first
00126 << setw(15) << right << m_stat_fitness.second
00127 << setw(15) << right << (*m_minmax_fitness.first)
00128 << setw(15) << right << (*m_minmax_fitness.second)
00129 << endl;
00130
00131 TGLVectorOfOrganismsConst temp_vec(ms_best_org.begin(),
00132 ms_best_org.end());
00133 GLUtils::printVectorOfOrganisms(out, temp_vec);
00134 return out;
00135 }