search.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #ifndef SEARCH_H
  2. #define SEARCH_H
  3. #include "halton.h"
  4. #include "pointset.h"
  5. #include <string>
  6. #include <vector>
  7. #include <utility> // pair
  8. class search {
  9. public:
  10. search(int npoints, int dim, int *p);
  11. // return best discrepancy, write result in file filename
  12. double run(int iterations);
  13. virtual void _run(int iterations) = 0;
  14. protected:
  15. void compute(); // compute points set
  16. void check(); // compute discrepancy, fill current, if current < best write solution in filename
  17. int dim, npoints;
  18. double current, best;
  19. std::string filename;
  20. halton ha;
  21. pointset ps;
  22. };
  23. class random_search: public search {
  24. public:
  25. random_search(int dim, int npoints, int *p);
  26. virtual void _run(int iterations);
  27. };
  28. class local_search: public search {
  29. public:
  30. local_search(int dim, int npoints, int *p);
  31. virtual void _run(int iteartions);
  32. virtual bool accept(double previous, double current) = 0; // return true if we must accept this solution
  33. protected:
  34. void init(); // random initial configuration
  35. void random_neighbour();
  36. virtual void _random_neighbour();
  37. void undo(); // (no history : only one modification is remembered)
  38. virtual void _undo();
  39. private:
  40. double previous;
  41. // for undo :
  42. bool undoable;
  43. int i, t1, t2;
  44. };
  45. class random_local_search: public local_search {
  46. public:
  47. random_local_search(int dim, int npoints, int *p);
  48. virtual bool accept(double previous, double current);
  49. };
  50. // simulated annealing
  51. class sa_local_search: public local_search {
  52. public:
  53. sa_local_search(int dim, int npoints, int *p, double lambda, double temp);
  54. virtual bool accept(double previous, double current);
  55. protected:
  56. double lambda;
  57. double temp;
  58. };
  59. // mu+lambda genetic algorithm
  60. // c : proba of making a crossover
  61. class genetic_search: public search {
  62. public:
  63. genetic_search(int dim, int npoints, int *p, int mu, int lamda, double c);
  64. virtual void _run(int iteartions);
  65. protected:
  66. int mu, lambda;
  67. double c;
  68. std::vector<std::pair<double, std::vector<permutation>>> genes; // discrepancy / permutations
  69. };
  70. #endif // SEARCH_H