14 GA_params.maxpop = 100;
15 Ind.resize(GA_params.maxpop);
16 Ind_old.resize(GA_params.maxpop);
17 fitdist = CDistribution(GA_params.maxpop);
20 GA_params.cross_over_type = 1;
28 Ind.resize(GA_params.maxpop);
29 Ind_old.resize(GA_params.maxpop);
30 fitdist = CDistribution(GA_params.maxpop);
33 GA_params.cross_over_type = 1;
43 Ind.resize(GA_params.maxpop);
44 Ind_old.resize(GA_params.maxpop);
45 for (
int i=0; i<n; i++)
51 fitdist = CDistribution(GA_params.maxpop);
52 GA_params.cross_over_type = 1;
60 ifstream file(filename);
64 GA_params.fixedstd =
true;
65 GA_params.RCGA =
false;
68 while (file.eof() ==
false)
72 {
if (s[0] ==
"maxpop") GA_params.maxpop = atoi(s[1].c_str());
73 if (s[0] ==
"ngen") GA_params.nGen = atoi(s[1].c_str());
74 if (s[0] ==
"pcross") GA_params.pcross = atof(s[1].c_str());
75 if (s[0] ==
"pmute") GA_params.pmute = atof(s[1].c_str());
76 if (s[0] ==
"shakescale") GA_params.shakescale = atof(s[1].c_str());
77 if (s[0] ==
"shakescalered") GA_params.shakescalered = atof(s[1].c_str());
78 if (s[0] ==
"outputfile") filenames.outputfilename = s[1];
79 if (s[0] ==
"getfromfilename") filenames.getfromfilename = s[1].c_str();
80 if (s[0] ==
"initial_population") filenames.initialpopfilemame = s[1];
85 for (
int i=0; i<Model.Parameters().size(); i++)
89 if (Model.Parameters()[i]->GetPriorDistribution() ==
"lognormal")
90 { minval.push_back(log10(Model.Parameters()[i]->GetRange().low));
91 maxval.push_back(log10(Model.Parameters()[i]->GetRange().high));
96 minval.push_back(Model.Parameters()[i]->GetRange().low);
97 maxval.push_back(Model.Parameters()[i]->GetRange().high);
99 apply_to_all.push_back(
false);
100 if (Model.Parameters()[i]->GetPriorDistribution() ==
"lognormal")
105 paramname.push_back(Model.Parameters().getKeyAtIndex(i));
110 Ind.resize(GA_params.maxpop);
111 Ind_old.resize(GA_params.maxpop);
113 fitdist = CDistribution(GA_params.maxpop);
114 GA_params.cross_over_type = 1;
116 for (
int i=0; i<GA_params.maxpop; i++)
122 for (
int i = 0; i<GA_params.nParam; i++)
123 Setminmax(i, minval[i], maxval[i],4);
131 Ind.resize(GA_params.maxpop);
132 Ind_old.resize(GA_params.maxpop);
133 for (
int i=0; i<GA_params.maxpop; i++)
144 GA_params.maxpop = n;
148 Ind.resize(GA_params.maxpop);
149 Ind_old.resize(GA_params.maxpop);
150 for (
int i=0; i<n; i++)
154 for (
int j = 0; j<nParam; j++)
156 Ind[i].minrange[j] = TempInd.
minrange[j];
157 Ind[i].maxrange[j] = TempInd.
maxrange[j];
158 Ind[i].precision[j] = TempInd.
precision[j];
159 Ind_old[i].minrange[j] = TempInd.
minrange[j];
160 Ind_old[i].maxrange[j] = TempInd.
maxrange[j];
161 Ind_old[i].precision[j] = TempInd.
precision[j];
165 fitdist = CDistribution(GA_params.maxpop);
171 GA_params.maxpop = C.maxpop;
172 Ind.resize(GA_params.maxpop);
173 Ind_old.resize(GA_params.maxpop);
211 for (
int i=0; i<GA_params.maxpop; i++)
216 if (filenames.initialpopfilemame!=
"")
218 getinifromoutput(filenames.pathname+filenames.initialpopfilemame);
219 for (
int i=0; i<initial_pop.size(); i++)
220 for (
int j=0; j<max(
int(initial_pop[i].size()),GA_params.nParam); j++)
222 Ind[i].x[j] = log10(initial_pop[i][j]);
224 Ind[i].x[j] = initial_pop[i][j];
231 for (
int i=0; i<GA_params.maxpop; i++)
233 Ind[i].maxrange[a] = maxrange;
234 Ind[i].minrange[a] = minrange;
235 Ind[i].precision[a] = prec;
245 vector<vector<double>> inp;
247 inp.resize(GA_params.maxpop);
250 for (
int k=0; k<GA_params.maxpop; k++)
251 inp[k].resize(GA_params.nParam);
253 vector<double> time_(GA_params.maxpop);
254 vector<int> epochs(GA_params.maxpop);
257 for (
int k = 0; k < GA_params.maxpop; k++)
259 for (
int i = 0; i < GA_params.nParam; i++)
261 if (loged[get_act_paramno(i)] != 1)
263 inp[k][i] = Ind[k].x[i];
267 inp[k][i] = pow(10, Ind[k].
x[i]);
272 Ind[k].actual_fitness = 0;
276 for (
int i = 0; i < GA_params.nParam; i++)
277 Models[k].SetParams(params[i], inp[k][i]);
283omp_set_num_threads(numberOfThreads);
284#pragma omp parallel for
285 for (
int k=0; k<GA_params.maxpop; k++)
288 FileOut = fopen((filenames.pathname+
"detail_GA.txt").c_str(),
"a");
291 fprintf(FileOut,
"%i, ", k);
292 for (
int l=0; l<Ind[0].nParams; l++)
293 if (loged[get_act_paramno(l)]==1)
294 fprintf(FileOut,
"%le, ", pow(10,Ind[k].
x[l]));
296 fprintf(FileOut,
"%le, ", Ind[k].
x[l]);
300 fprintf(FileOut,
"\n");
303 clock_t t0 = clock();
305 Ind[k].actual_fitness -= Models[k].GetObjectiveFunctionValue();
306 epochs[k] += Models[k].EpochCount();
307 time_[k] = ((float)(clock() - t0))/CLOCKS_PER_SEC;
308 fprintf(FileOut,
"%i, fitness=%le, time=%e, epochs=%i\n", k, Ind[k].actual_fitness, time_[k], epochs[k]);
313 Model_out = Models[maxfitness()];
317 assignfitness_rank(GA_params.N);
325 for (
int i=0; i<GA_params.maxpop; i++)
327 int a = maxfitness();
330 for (
int i=2; i<GA_params.maxpop; i+=2)
333 int j1 = fitdist.GetRand();
334 int j2 = fitdist.GetRand();
335 double x = GetRndUniF(0,1);
336 if (
x<GA_params.pcross)
337 if (GA_params.cross_over_type == 1)
338 cross(Ind_old[j1], Ind_old[j2], Ind[i], Ind[min(i+1,GA_params.maxpop-1)]);
340 cross2p(Ind_old[j1], Ind_old[j2], Ind[i], Ind[min(i + 1, GA_params.maxpop - 1)]);
343 Ind[i] = Ind_old[j1];
344 Ind[i+1] = Ind_old[j2];
354 for (
int i=0; i<GA_params.maxpop; i++)
356 int a = maxfitness();
359 for (
int i=2; i<GA_params.maxpop; i+=2)
361 int j1 = fitdist.GetRand();
362 int j2 = fitdist.GetRand();
364 if (
x<GA_params.pcross)
365 cross_RC_L(Ind_old[j1], Ind_old[j2], Ind[i], Ind[i+1]);
368 Ind[i] = Ind_old[j1];
369 Ind[i+1] = Ind_old[j2];
377 for (
int i=0; i<GA_params.maxpop; i++)
378 sum += Ind[i].fitness;
379 return sum/GA_params.maxpop;
387 FileOut = fopen((filenames.pathname +
"detail_GA.txt").c_str(),
"a");
388 fprintf(FileOut,
"%s\n", s.c_str());
396 string RunFileName = filenames.pathname + filenames.outputfilename;
401 FileOut = fopen(RunFileName.c_str(),
"w");
403 FileOut1 = fopen((filenames.pathname +
"detail_GA.txt").c_str(),
"w");
406 double shakescaleini = GA_params.shakescale;
408 vector<double> X(Ind[0].nParams);
410 Models.resize(GA_params.maxpop);
413 double ininumenhancements = GA_params.numenhancements;
414 GA_params.numenhancements = 0;
416 CMatrix Fitness(GA_params.nGen, 3);
418 for (
int i=0; i<GA_params.nGen; i++)
421 write_to_detailed_GA(
"Assigning fitnesses ...");
424 write_to_detailed_GA(
"Assigning fitnesses done!");
425 FileOut = fopen(RunFileName.c_str(),
"a");
426 printf(
"Generation: %i\n", i);
427 fprintf(FileOut,
"Generation: %i\n", i);
428 fprintf(FileOut,
"ID, ");
429 for (
int k=0; k<Ind[0].nParams; k++)
430 fprintf(FileOut,
"%s, ", paramname[k].c_str());
431 fprintf(FileOut,
"%s, %s, %s",
"likelihood",
"Fitness",
"Rank");
432 fprintf(FileOut,
"\n");
434 for (
int j1=0; j1<GA_params.maxpop; j1++)
436 write_to_detailed_GA(
"Generation: " + numbertostring(i));
437 fprintf(FileOut,
"%i, ", j1);
439 for (
int k=0; k<Ind[0].nParams; k++)
440 if (loged[get_act_paramno(k)] == 1)
441 fprintf(FileOut,
"%le, ", pow(10, Ind[j1].
x[k]));
443 fprintf(FileOut,
"%le, ", Ind[j1].
x[k]);
445 fprintf(FileOut,
"%le, %le, %i", Ind[j1].actual_fitness, Ind[j1].fitness, Ind[j1].rank);
446 fprintf(FileOut,
"\n");
450 int j = maxfitness();
453 Fitness[i][0] = Ind[j].actual_fitness;
457 if ((Fitness[i][0] == Fitness[i - 3][0]) && GA_params.shakescale>pow(10.0, -Ind[0].precision[0]))
458 GA_params.shakescale *= GA_params.shakescalered;
461 if ((Fitness[i][0]>Fitness[i - 1][0]) && (GA_params.shakescale<shakescaleini))
462 GA_params.shakescale /= GA_params.shakescalered;
463 GA_params.numenhancements = 0;
468 if ((Fitness[i][0] == Fitness[i - 20][0]))
470 GA_params.numenhancements *= 1.05;
471 if (GA_params.numenhancements == 0) GA_params.numenhancements = ininumenhancements;
474 if ((Fitness[i][0] == Fitness[i - 50][0]))
475 GA_params.numenhancements = ininumenhancements * 10;
478 Fitness[i][1] = GA_params.shakescale;
479 Fitness[i][2] = GA_params.pmute;
483 if (GA_params.shakescale == Fitness[i - 20][1])
484 GA_params.shakescale = shakescaleini;
489 MaxFitness = Ind[j].actual_fitness;
491 Fitness[i][0] = Ind[j].actual_fitness;
496 write_to_detailed_GA(
"Cross-over ...");
498 if (GA_params.RCGA ==
true)
503 write_to_detailed_GA(
"Cross-over done! ");
505 write_to_detailed_GA(
"Mutation ...");
507 mutate(GA_params.pmute);
508 write_to_detailed_GA(
"Mutation done!");
509 write_to_detailed_GA(
"Shake...!");
511 write_to_detailed_GA(
"Shake done!");
516 FileOut = fopen(RunFileName.c_str(),
"a");
517 fprintf(FileOut,
"Final Enhancements\n");
518 double l_MaxFitness = 1;
519 int j = maxfitness();
522 MaxFitness = Ind[j].actual_fitness;
523 final_params.resize(GA_params.nParam);
526 for (
int k = 0; k<Ind[0].nParams; k++)
528 if (loged[get_act_paramno(k)] == 1) final_params[k] = pow(10, Ind[j].
x[k]);
else final_params[k] = Ind[j].x[k];
529 fprintf(FileOut,
"%s, ", paramname[k].c_str());
530 fprintf(FileOut,
"%le, ", final_params[k]);
531 fprintf(FileOut,
"%le, %le\n", Ind[j].actual_fitness, Ind[j].fitness);
535 assignfitnesses(final_params);
546 double likelihood = 0;
551 for (
int i = 0; i < GA_params.nParam; i++)
552 Models.SetParam(i, inp[i]);
554 Models.FinalizeSetParams();
556 likelihood -= Models.EvaluateObjectiveFunction();
600 ifstream file(filename);
602 final_params.resize(GA_params.nParam);
603 while (file.eof() ==
false)
608 if (s[0] ==
"Final Enhancements")
609 for (
int i = 0; i<GA_params.nParam; i++)
613 write_to_detailed_GA(
"The number of parameters in GA output file does not match the number of unknown parameters");
615 final_params[i] = atof(s[1].c_str());
619 double ret = assignfitnesses(final_params);
628 for (
int j = 0; j<i; j++)
629 if (apply_to_all[j]) l++;
else l += 1;
641 for (
int j = 0; j<GA_params.nParam; j++)
643 if (apply_to_all[j]) l += 1;
else l += 1;
646 if (apply_to_all[j]) l -= 1;
else l--;
656 for (
int i=1; i<GA_params.maxpop; i++)
657 Ind[i].shake(GA_params.shakescale);
664 for (
int i=2; i<GA_params.maxpop; i++)
672 double max_fitness = 1E+308 ;
674 for (
int i=0; i<GA_params.maxpop; i++)
675 if (max_fitness>Ind[i].actual_fitness)
677 max_fitness = Ind[i].actual_fitness;
688 double a = avgfitness();
689 for (
int i=0; i<GA_params.maxpop; i++)
690 sum += (a - Ind[i].fitness)*(a - Ind[i].fitness);
699 double a = avg_inv_actual_fitness();
700 for (
int i=0; i<GA_params.maxpop; i++)
701 sum += (a - 1/Ind[i].actual_fitness)*(a - 1/Ind[i].actual_fitness);
702 return sqrt(sum)/GA_params.maxpop/a;
710 for (
int i=0; i<GA_params.maxpop; i++)
711 sum += Ind[i].actual_fitness;
712 return sum/GA_params.maxpop;
720 for (
int i=0; i<GA_params.maxpop; i++)
721 sum += 1/Ind[i].actual_fitness;
722 return sum/GA_params.maxpop;
730 for (
int i=0; i<GA_params.maxpop; i++)
733 for (
int j=0; j<GA_params.maxpop; j++)
735 if (Ind[i].actual_fitness > Ind[j].actual_fitness) r++;
746 for (
int i=0; i<GA_params.maxpop; i++)
748 Ind[i].fitness = pow(1.0/
static_cast<double>(Ind[i].rank),GA_params.N);
757 for (
int i=0; i<GA_params.maxpop; i++)
763 fitdist.e[0] = Ind[0].fitness/sum;
764 for (
int i=1; i<GA_params.maxpop-1; i++)
766 fitdist.e[i] = fitdist.e[i-1] + Ind[i].fitness/sum;
767 fitdist.s[i] = fitdist.e[i-1];
769 fitdist.s[GA_params.maxpop-1] = fitdist.e[GA_params.maxpop-2];
770 fitdist.e[GA_params.maxpop-1] = 1;
780 int x_nParam = GA_params.nParam;
781 vector<int> x_params = params;
782 GA_params.nParam = 1;
785 out[0] = assignfitnesses(v);
787 out.writetofile(filenames.pathname +
"likelihood.txt");
789 GA_params.nParam = x_nParam;
796 ifstream file(filename);
798 initial_pop.resize(1);
799 initial_pop[0].resize(GA_params.nParam);
800 while (file.eof() ==
false)
804 {
if (s[0] ==
"Final Enhancements")
805 for (
int i=0; i<GA_params.nParam; i++)
808 if (loged[get_act_paramno(i)]==1)
809 initial_pop[0][i] = atof(s[1].c_str());
811 initial_pop[0][i] = atof(s[1].c_str());
822 ifstream file(filename);
825 while (file.eof() ==
false)
832 for (
int j=0; j<s.size(); j++)
833 initial_pop.push_back(ATOF(s));
void cross2p(CBinary &B1, CBinary &B2, int p1, int p2)
void cross(CBinary &B1, CBinary &B2, int p)
void cross_RC_L(const CIndividual &I1, const CIndividual &I2, CIndividual &IR1, CIndividual &IR2)
double GetRndUnif(double xmin, double xmax)
Genetic Algorithm optimizer for global parameter estimation.
double MaxFitness
Maximum fitness value in current population.
void fillfitdist()
Fill fitness distribution for roulette wheel selection.
std::vector< int > params
Parameter indices being optimized.
int maxfitness()
Find index of individual with maximum fitness.
void assignrank()
Assign ranks to individuals based on fitness.
int get_time_series(int i)
Get time series index for parameter.
double avg_actual_fitness()
Calculate average of actual (untransformed) fitness values.
GA_Tweaking_parameters GA_params
GA algorithm configuration parameters.
void shake()
Apply shake/perturbation to population.
virtual ~CGA()
Destructor.
std::vector< CIndividual > Ind
Current population of individuals.
GADistribution fitdist
Fitness distribution for parent selection.
CGA operator=(CGA &C)
Assignment operator.
void setnumpop(int n)
Set population size.
double evaluateforward()
Evaluate model forward (compute predictions)
std::vector< std::string > paramname
Names of parameters being optimized.
void Setminmax(int a, double minrange, double maxrange, int prec)
Set parameter bounds and precision.
double avg_inv_actual_fitness()
Calculate average of inverse actual fitness.
void crossoverRC()
Real-coded crossover operation.
CGA()
Default constructor.
void assignfitnesses()
Evaluate fitness for all individuals in population.
void setnparams(int n)
Set number of parameters.
int optimize()
Main optimization loop.
void getinifromoutput(std::string filename)
Initialize population from previous output file.
double stdfitness()
Calculate standard deviation of population fitness.
int getparamno(int i, int ts)
Get parameter index for variable and time series.
void mutate(double mu)
Apply mutation to population.
std::vector< CIndividual > Ind_old
Previous generation's population.
void initialize()
Initialize GA structures and allocate memory.
void crossover()
Perform crossover operation on population.
double variancefitness()
Calculate variance of population fitness.
std::vector< int > loged
Flags indicating if parameters are log-transformed.
double getfromoutput(std::string filename)
Read best solution from previous output file.
void write_to_detailed_GA(std::string s)
Write detailed GA information to file.
void assignfitness_rank(double N)
Assign fitness using rank-based scheme.
void getinitialpop(std::string filename)
Read initial population from file.
double avgfitness()
Calculate average fitness of population.
_filenames filenames
File paths for GA input/output.
std::vector< int > precision
std::vector< double > minrange
std::vector< double > maxrange