18 #include <numeric/random/random.hh>
19 #include <basic/Tracer.hh>
25 #include <utility/vector1.hh>
29 namespace optimization {
31 static basic::Tracer
TR(
"core.optimization.GA_Minimizer");
33 static numeric::random::RandomGenerator
RG(740);
40 if(
RG.uniform() < probability )
return true;
50 best_.
v.resize( v.size() );
51 for(
Size i=1; i<=v.size(); i++) {
56 TR <<
"Initial score (time=0): " <<
best_.
r << std::endl;
61 TR <<
"Randomizing..." << std::endl;
63 for(
Size i=1; i<=v.size(); i++) {
72 std::vector<EItem> pop;
73 for(
int i=0; i<20; i++) {
75 for(
Size j=1; j<=t.
v.size(); j++)
77 t.
v[j] = sit.
v[j] +
RG.uniform()*2. - 1.;
99 TR <<
"Shifting...(" <<
allowed_time_-time<<
") -> " << pop[0].r << std::endl;
100 std::vector<EItem> npop;
103 EItem t = pop[0]; fill(t.
v.begin(), t.
v.end(), 1.e-10);
107 for(
int i=0; i<10; i++) {
109 for(
Size j=1; j<=t.
v.size(); j++)
110 t.
v[j] =
RG.uniform()*2. - 1.;
117 for(
Size i=1; i<=shift.
v.size(); i++) shift.
v[i] += pop[0].v[i];
125 step(pop, time, mres, shift);
127 TR <<
" Best < MaxError... - stoping, time=" << time <<
"." << std::endl;
128 for(
Size i=1; i<=shift.
v.size(); i++) pop[0].v[i] += shift.
v[i];
136 for(
Size i=1; i<=shift.
v.size(); i++) pop[0].v[i] += shift.
v[i];
142 int i_ev = pop.size();
double best = pop[0].r;
144 for(
int i=pop.size()-1; i>=0; i--) {
148 int last_i = pop.size();
149 pop.push_back(pop[i]);
156 int last_i = pop.size();
157 pop.push_back(pop[i]);
159 int i2 =
RG.random_range(0, i_ev-1);
160 if( i2 != i )
cross_over(pop[last_i], pop[i], pop[i2]);
165 tmp.
v.resize( shift.
v.size() );
166 for(
Size i=i_ev; i<pop.size(); i++) {
167 for(
Size j=1; j<=pop[i].v.size(); j++)
168 tmp.
v[j] = pop[i].v[j] + shift.
v[j];
175 if( pop.size() > 10 ) pop.erase(pop.begin()+10, pop.end());
185 if(
best_.
r > pop[0].r ) {
198 for(
Size i=1; i<=V.
v.size(); i++) {
200 double r =
RG.gaussian() + .7;
210 for(
Size i=1; i<=V.
v.size(); i++) {
212 else V.
v[i] = B.
v[i];