00001 #include "GLBaseRanker.h"
00002 #include "GLLogicError.h"
00003 #include "GLSelectionistMixer.h"
00004
00017 GLSelectionistMixer::GLSelectionistMixer(GLBaseRanker* ranker,
00018 const double& proportion_old):
00019 GLBaseSelectionist(ranker)
00020 {
00021 setProportionOld(proportion_old);
00022 }
00023
00024
00033 GLSelectionistMixer::GLSelectionistMixer(GLBaseRanker* ranker,
00034 const GLSelectionistMixer::TParameters* parameters):
00035 GLBaseSelectionist(ranker)
00036 {
00037 setProportionOld(parameters->t_proportion_old);
00038 }
00039
00043 GLSelectionistMixer::~GLSelectionistMixer()
00044 {
00045 }
00046
00074 int GLSelectionistMixer::doSelection(
00075 const vector<GLBaseOrganism*>& current_population,
00076 const vector<GLBaseOrganism*>& candidates,
00077 size_t new_size,
00078 vector<GLBaseOrganism*>& to_live,
00079 vector<GLBaseOrganism*>& to_die,
00080 vector<const GLBaseOrganism*>& best_survived)
00081 {
00082
00083 assertNewSize(new_size, current_population, candidates);
00084
00085
00086 vector<GLBaseOrganism*> current_sorted(current_population);
00087 getRanker()->rankOrganisms(current_sorted);
00088
00089
00090 vector<GLBaseOrganism*> candidates_sorted(candidates);
00091 getRanker()->rankOrganisms(candidates_sorted);
00092
00093
00094 size_t num_old = (size_t)(new_size * getProportionOld());
00095
00096
00097 if (num_old > current_sorted.size())
00098 {
00099 num_old = current_sorted.size();
00100 }
00101
00102 size_t num_new = new_size - num_old;
00103
00104
00105 if (num_new > candidates_sorted.size())
00106 {
00107 num_new = candidates_sorted.size();
00108 num_old = new_size - num_new;
00109 }
00110
00111 to_live.reserve(new_size);
00112 to_die.reserve(current_sorted.size() +
00113 candidates_sorted.size() -
00114 new_size);
00115
00116 to_live.assign(current_sorted.begin(),
00117 current_sorted.begin() + num_old);
00118 to_live.insert(to_live.end(),
00119 candidates_sorted.begin(),
00120 candidates_sorted.begin() + num_new);
00121
00122 to_die.assign(current_sorted.begin() + num_old, current_sorted.end());
00123 to_die.insert(to_die.end(),
00124 candidates_sorted.begin() + num_new,
00125 candidates_sorted.end());
00126
00127
00128 getRanker()->getFittest(to_live, best_survived);
00129
00130
00131 return num_new;
00132 }
00133
00134
00141 void GLSelectionistMixer::setProportionOld(const double& new_proportion_old)
00142 {
00143
00144 if ((new_proportion_old < 0) || (new_proportion_old > 1))
00145 {
00146 char errormsg[1000];
00147 sprintf(errormsg, "\nGLSelectionistMixer::setProportionOld\n"
00148 "Parameter new_proportion_old (=%e) must be between "
00149 "0.0 and 1.0 inclusive\n",
00150 new_proportion_old);
00151 throw GLLogicError(errormsg);
00152 }
00153 m_proportion_old = new_proportion_old;
00154 }