Projet du cours MPRI 2.24.2 "Résolution de problèmes d'optimisation avec heuristiques de recherche" : https://wikimpri.dptinfo.ens-cachan.fr/doku.php?id=cours:c-2-24-2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

scripts2.h 5.4KB

  1. #ifndef SCRIPTS2_H_INCLUDED
  2. #define SCRIPTS2_H_INCLUDED
  3. #include <vector>
  4. #include <fstream>
  5. #include "analysis.h"
  6. #include "ParameterOptimizer.h"
  7. void cmp_evolution(std::vector<SearchHeuristic*> algos, MasterMind& problem, int max_evolution, int nb_tests = 100) {
  8. int nb_algos = algos.size();
  9. Statistic** values = new Statistic*[nb_algos];
  10. for(int i=0; i<nb_algos; i++) {
  11. algos[i]->set_problem(&problem);
  12. values[i] = avg_evolution(algos[i], max_evolution, nb_tests);
  13. }
  14. std::ofstream statsfile("stats.csv");
  15. for(int i=0; i<max_evolution; i++) {
  16. statsfile << i << ";";
  17. for(int k=0; k<nb_algos; k++)
  18. statsfile << values[k][i].average << ";";
  19. statsfile << std::endl;
  20. }
  21. for(int i=0; i<nb_algos; i++)
  22. delete[] values[i];
  23. delete[] values;
  24. }
  25. /// Max Lambda
  26. class LambdaOptimizer : public ParameterOptimizer {
  27. public:
  28. LambdaOptimizer(std::default_random_engine& randomizer) : ParameterOptimizer(randomizer) {};
  29. SearchHeuristic* get_context(unsigned int i, double parameter, std::default_random_engine& randomizer) {
  30. unsigned int n=20;
  31. EA* algo = new EA(1+i, (int)parameter, PLUS, 1./n, randomizer);
  32. MasterMind* mm = new MasterMind(n, n, randomizer);
  33. algo->set_problem(mm);
  34. return algo;
  35. }
  36. virtual std::string display_context(unsigned int context) {
  37. std::stringstream ss;
  38. ss << "mu=" << context+1;
  39. return ss.str();
  40. }
  41. };
  42. void optimal_lambda(int n, int mu_initial, int mu_final, std::default_random_engine& randomizer, int lambda_init, int lambda_final, int lambda_step=1, int nb_tests=10, double student_law_quartile=-1, bool displaying=true) {
  43. LambdaOptimizer lo(randomizer);
  44. lo.set_nb_contexts(50);
  45. lo.set_study_interval(lambda_init, lambda_final, lambda_step);
  46. lo.add_test_wave(nb_tests, student_law_quartile);
  47. lo.run();
  48. }
  49. class MuLambdaOptimizer : public ParameterOptimizer {
  50. public:
  51. MuLambdaOptimizer(int n_init, std::default_random_engine& randomizer) : ParameterOptimizer(randomizer), n_initial{n_init} {};
  52. SearchHeuristic* get_context(unsigned int i, double parameter, std::default_random_engine& randomizer) {
  53. EA* algo = new EA((int)parameter, (int)parameter, PLUS, 1./(n_initial+i), randomizer);
  54. MasterMind* mm = new MasterMind(n_initial+i, n_initial+i, randomizer);
  55. algo->set_problem(mm);
  56. return algo;
  57. }
  58. virtual std::string display_context(unsigned int context) {
  59. std::stringstream ss;
  60. ss << "n=" << n_initial+context;
  61. return ss.str();
  62. }
  63. private:
  64. int n_initial;
  65. };
  66. void optimal_mulambda(int initial_n, int final_n, std::default_random_engine& randomizer, int par_init, int par_final, int par_step=1, int nb_tests=10, double student_law_quartile=-1, bool displaying=true) {
  67. MuLambdaOptimizer lo(initial_n, randomizer);
  68. lo.set_nb_contexts(final_n - initial_n);
  69. lo.set_study_interval(par_init, par_final, par_step);
  70. lo.add_test_wave(nb_tests, student_law_quartile);
  71. lo.run();
  72. }
  73. class CrossoverProbaOptimizer : public ParameterOptimizer {
  74. public:
  75. CrossoverProbaOptimizer(int n_init, double obj, std::default_random_engine& randomizer) : ParameterOptimizer(randomizer), n_initial{n_init}, objective{obj} {};
  76. SearchHeuristic* get_context(unsigned int i, double parameter, std::default_random_engine& randomizer) {
  77. GA* algo = new GA(5, 5, PLUS, 1./(n_initial+i), parameter, UNIFORM_CROSSOVER, GA_V1, randomizer);
  78. MasterMind* mm = new MasterMind(n_initial+i, n_initial+i, randomizer);
  79. algo->set_problem(mm);
  80. algo->set_objective(objective);
  81. return algo;
  82. }
  83. std::string display_context(unsigned int context) {
  84. std::stringstream ss;
  85. ss << "n=" << n_initial+context;
  86. return ss.str();
  87. }
  88. std::string get_context_for_csvfile(unsigned int num_context) {
  89. return std::to_string(n_initial+num_context);
  90. }
  91. private:
  92. int n_initial;
  93. double objective;
  94. };
  95. void script_crossover_proba_optim(std::default_random_engine& randomizer) {
  96. std::string namefile = "crossover-proba.csv";
  97. ofstream savefile(namefile);
  98. {
  99. int n_init=3, n_final=21;
  100. double p_init=0.01, p_final=0.99, p_step=0.02;
  101. CrossoverProbaOptimizer cpo(n_init, 1.00, randomizer);
  102. cpo.set_nb_contexts(n_final - n_init);
  103. cpo.set_study_interval(p_init, p_final, p_step);
  104. cpo.add_test_wave(40, 2.5419828669, 0);
  105. cpo.add_test_wave(400, 2.4429370465, 1);
  106. cpo.add_test_wave(2000, 2.4344837209, 2);
  107. cpo.save_run(namefile);
  108. cpo.run();
  109. }{
  110. int n_init=21, n_final=40;
  111. double p_init=0.01, p_final=0.3, p_step=0.02;
  112. CrossoverProbaOptimizer cpo(n_init, 1.00, randomizer);
  113. cpo.set_nb_contexts(n_final - n_init);
  114. cpo.set_study_interval(p_init, p_final, p_step);
  115. cpo.add_test_wave(80, 2.4860491262, 0);
  116. cpo.add_test_wave(200, 2.4535822177, 1);
  117. cpo.add_test_wave(400, 2.4429370465, 2);
  118. cpo.save_run(namefile);
  119. cpo.run();
  120. }
  121. }
  122. #endif // SCRIPTS2_H_INCLUDED