00001 #include <math.h>
00002 #include <iomanip>
00003
00004 #include <NLstl_utils.h>
00005
00006 #include "GLBaseGaStatus.h"
00007 #include "GLStatisticsSimple.h"
00008
00009 typedef vector<GLBaseGaStatus*> TResultVector;
00018 GLStatisticsSimple::GLStatisticsSimple(
00019 const vector<GLBaseGaStatus*>& results):
00020 m_number_of_runs(results.size()),
00021 m_minmax_evaluator_calls(0, 0),
00022 m_minmax_generations_to_find_best(0, 0),
00023 m_minmax_generations_to_find_all_bests(0, 0),
00024 m_minmax_number_of_generations(0, 0),
00025 m_minmax_time(0.0, 0.0),
00026 m_stat_evaluator_calls(0.0, 0.0),
00027 m_stat_generations_to_find_best(0.0, 0.0),
00028 m_stat_generations_to_find_all_bests(0.0, 0.0),
00029 m_stat_number_of_generations(0.0, 0.0),
00030 m_stat_time(0.0, 0.0)
00031 {
00032
00033 if (results.empty()) return;
00034
00035 collectGaStatistics(results);
00036 }
00037
00041 GLStatisticsSimple::~GLStatisticsSimple()
00042 {
00043 }
00044
00049 void GLStatisticsSimple::collectGaStatistics(
00050 const vector<GLBaseGaStatus*>& results)
00051 {
00052
00053 if (results.empty()) return;
00054
00055
00056
00057
00058 m_minmax_evaluator_calls.first =
00059 results.front()->m_evaluator_calls;
00060 m_minmax_generations_to_find_best.first =
00061 results.front()->m_current_generation -
00062 results.front()->m_generations_since_solution_improvement;
00063 m_minmax_generations_to_find_all_bests.first =
00064 results.front()->m_current_generation -
00065 results.front()->m_generations_since_new_best_found;
00066 m_minmax_number_of_generations.first =
00067 results.front()->m_current_generation;
00068 m_minmax_time.first =
00069 results.front()->m_time_required;
00070 for(TResultVector::const_iterator vit(results.begin());
00071 vit != results.end(); ++vit)
00072 {
00073 int num_of_generations =
00074 (*vit)->m_current_generation;
00075 long evaluator_calls =
00076 (*vit)->m_evaluator_calls;
00077 int generations_to_find_best =
00078 num_of_generations -
00079 (*vit)->m_generations_since_solution_improvement;
00080 int generations_since_new_best_found =
00081 num_of_generations -
00082 (*vit)->m_generations_since_new_best_found;
00083 double time_required =
00084 (*vit)->m_time_required;
00085
00086 m_minmax_evaluator_calls.first =
00087 min(m_minmax_evaluator_calls.first,
00088 evaluator_calls);
00089 m_minmax_evaluator_calls.second =
00090 max(m_minmax_evaluator_calls.second,
00091 evaluator_calls);
00092 m_minmax_generations_to_find_best.first =
00093 min(m_minmax_generations_to_find_best.first,
00094 generations_to_find_best);
00095 m_minmax_generations_to_find_best.second =
00096 max(m_minmax_generations_to_find_best.second,
00097 generations_to_find_best);
00098 m_minmax_generations_to_find_all_bests.first =
00099 min(m_minmax_generations_to_find_all_bests.first,
00100 generations_since_new_best_found);
00101 m_minmax_generations_to_find_all_bests.second =
00102 max(m_minmax_generations_to_find_all_bests.second,
00103 generations_since_new_best_found);
00104 m_minmax_number_of_generations.first =
00105 min(m_minmax_number_of_generations.first,
00106 num_of_generations);
00107 m_minmax_number_of_generations.second =
00108 max(m_minmax_number_of_generations.second,
00109 num_of_generations);
00110 m_minmax_time.first =
00111 min(m_minmax_time.first,
00112 time_required);
00113 m_minmax_time.second =
00114 max(m_minmax_time.second,
00115 time_required);
00116
00117 m_stat_evaluator_calls.first +=
00118 (*vit)->m_evaluator_calls;
00119 m_stat_generations_to_find_best.first +=
00120 generations_to_find_best;
00121 m_stat_generations_to_find_all_bests.first +=
00122 generations_since_new_best_found;
00123 m_stat_number_of_generations.first +=
00124 num_of_generations;
00125 m_stat_time.first +=
00126 time_required;
00127
00128 m_stat_evaluator_calls.second +=
00129 evaluator_calls *
00130 evaluator_calls /
00131 (double)m_number_of_runs;
00132 m_stat_generations_to_find_best.second +=
00133 generations_to_find_best *
00134 generations_to_find_best /
00135 (double)m_number_of_runs;
00136 m_stat_generations_to_find_all_bests.second +=
00137 generations_since_new_best_found *
00138 generations_since_new_best_found /
00139 (double)m_number_of_runs;
00140 m_stat_number_of_generations.second +=
00141 num_of_generations *
00142 num_of_generations /
00143 (double)m_number_of_runs;
00144 m_stat_time.second +=
00145 time_required *
00146 time_required /
00147 (double)m_number_of_runs;
00148 }
00149 m_stat_evaluator_calls.first /= m_number_of_runs;
00150 m_stat_generations_to_find_best.first /= m_number_of_runs;
00151 m_stat_generations_to_find_all_bests.first /= m_number_of_runs;
00152 m_stat_number_of_generations.first /= m_number_of_runs;
00153 m_stat_time.first /= m_number_of_runs;
00154
00155 m_stat_evaluator_calls.second -=
00156 m_stat_evaluator_calls.first *
00157 m_stat_evaluator_calls.first;
00158 m_stat_generations_to_find_best.second -=
00159 m_stat_generations_to_find_best.first *
00160 m_stat_generations_to_find_best.first;
00161 m_stat_generations_to_find_all_bests.second -=
00162 m_stat_generations_to_find_all_bests.first *
00163 m_stat_generations_to_find_all_bests.first;
00164 m_stat_number_of_generations.second -=
00165 m_stat_number_of_generations.first *
00166 m_stat_number_of_generations.first;
00167 m_stat_time.second -=
00168 m_stat_time.first *
00169 m_stat_time.first;
00170
00171 m_stat_evaluator_calls.second =
00172 m_stat_evaluator_calls.second > 0 ?
00173 sqrt(m_stat_evaluator_calls.second) : 0;
00174 m_stat_generations_to_find_best.second =
00175 m_stat_generations_to_find_best.second > 0 ?
00176 sqrt(m_stat_generations_to_find_best.second) : 0;
00177 m_stat_generations_to_find_all_bests.second =
00178 m_stat_generations_to_find_all_bests.second > 0 ?
00179 sqrt(m_stat_generations_to_find_all_bests.second) : 0;
00180 m_stat_number_of_generations.second =
00181 m_stat_number_of_generations.second > 0 ?
00182 sqrt(m_stat_number_of_generations.second) : 0;
00183 m_stat_time.second =
00184 m_stat_time.second > 0 ?
00185 sqrt(m_stat_time.second) : 0;
00186 }
00187
00199 ostream& GLStatisticsSimple::toStream(ostream& out) const
00200 {
00201 out << "Statistics is collected over " << m_number_of_runs
00202 << " runs\n";
00203 out << setfill('-') << setw(90) << "-" << setfill(' ') << endl;
00204 out << setw(10) << left << "STATISTICS NAME"
00205 << setw(30) << right << "AVERAGE"
00206 << setw(15) << right << "ST. DEVIATION"
00207 << setw(15) << right << "MINIMUM"
00208 << setw(15) << right << "MAXIMUM"
00209 << endl;
00210 out << setfill('-') << setw(90) << "-" << setfill(' ') << endl;
00211 out << setw(30) << left << "Number of generations:"
00212 << setw(15) << right << m_stat_number_of_generations.first
00213 << setw(15) << right << m_stat_number_of_generations.second
00214 << setw(15) << right << m_minmax_number_of_generations.first
00215 << setw(15) << right << m_minmax_number_of_generations.second
00216 << endl;
00217 out << setw(30) << left << "Generations to find best:"
00218 << setw(15) << right << m_stat_generations_to_find_best.first
00219 << setw(15) << right << m_stat_generations_to_find_best.second
00220 << setw(15) << right << m_minmax_generations_to_find_best.first
00221 << setw(15) << right << m_minmax_generations_to_find_best.second
00222 << endl;
00223 out << setw(30) << left << "Generations to find all bests:"
00224 << setw(15) << right << m_stat_generations_to_find_all_bests.first
00225 << setw(15) << right << m_stat_generations_to_find_all_bests.second
00226 << setw(15) << right << m_minmax_generations_to_find_all_bests.first
00227 << setw(15) << right << m_minmax_generations_to_find_all_bests.second
00228 << endl;
00229 out << setw(30) << left << "Number of evaluator calls:"
00230 << setw(15) << right << m_stat_evaluator_calls.first
00231 << setw(15) << right << m_stat_evaluator_calls.second
00232 << setw(15) << right << m_minmax_evaluator_calls.first
00233 << setw(15) << right << m_minmax_evaluator_calls.second
00234 << endl;
00235 out << setw(30) << left << "Time taken:"
00236 << setw(15) << right << m_stat_time.first
00237 << setw(15) << right << m_stat_time.second
00238 << setw(15) << right << m_minmax_time.first
00239 << setw(15) << right << m_minmax_time.second
00240 << endl;
00241 return out;
00242 }