Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.67 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <math.h>
  4. #include <time.h>
  5. #include <memory>
  6. #include <array>
  7. #include <vector>
  8. #include <fstream>
  9. #include <string>
  10.  
  11. #include <ga/ga.h>
  12. #include <ga/GARealGenome.C>
  13. #include <ga/GARealGenome.h>
  14. #include <StaticLib/StaticLib.h>
  15.  
  16. enum SelectionMethod {
  17.     SELECTION_RANK,
  18.     //SELECTION_ROULETTE_WHEEL,
  19.     SELECTION_TOURNAMENT,
  20.     SELECTION_UNIFORM,
  21.     //SELECTION_SRS,
  22.     //SELECTION_DS
  23. };
  24.  
  25. enum ReproductionMethod {
  26.     REPRODUCTION_SIMPLE,
  27.     REPRODUCTION_STEADY_STATE,
  28.     //REPRODUCTION_INCREMETAL,
  29.     //REPRODUCTION_DEME
  30. };
  31.  
  32. enum CrossoverMethod {
  33.     CROSSOVER_UNIFORM,
  34.     //CROSSOVER_EVEN_ODD,
  35.     //CROSSOVER_ONE_POINT,
  36.     //CROSSOVER_TWO_POINT,
  37.     //CROSSOVER_PARTIAL_MATCH,
  38.     //CROSSOVER_ORDER,
  39.     //CROSSOVER_CYCLE,
  40.     CROSSOVER_REAL_BLEND,
  41.     CROSSOVER_REAL_ARITHMETIC
  42. };
  43.  
  44. enum MutationMethod {
  45.     MUTATION_FLIP,
  46.     //MUTATION_SWAP,
  47.     MUTATION_REAL_GAUSSIAN
  48. };
  49.  
  50. enum Dimension {
  51.     DIM_SELECTION,
  52.     DIM_REPRODUCTION,
  53.     DIM_CROSSOVER,
  54.     DIM_MUTATION
  55. };
  56.  
  57. constexpr std::array<int, 4> METHOD_SIZES = {{ 3, 2, 3, 2 }};
  58.  
  59. const int FUNCTION_NR = 6;
  60.  
  61. const int POPULATION_SIZE = 50;
  62. const int N_GENERATIONS = 200;
  63. const float P_MUTATION = 0.001f;
  64. const float P_CROSSOVER = 0.5f;
  65.  
  66. const int TOTAL_METHODS = METHOD_SIZES[DIM_SELECTION] * METHOD_SIZES[DIM_REPRODUCTION] * METHOD_SIZES[DIM_CROSSOVER] * METHOD_SIZES[DIM_MUTATION];
  67.  
  68. const int MAX_ITERATIONS = 10;
  69.  
  70. typedef std::array<std::array<std::array<std::array<std::array<float, MAX_ITERATIONS>, METHOD_SIZES[DIM_MUTATION]>, METHOD_SIZES[DIM_CROSSOVER]>, METHOD_SIZES[DIM_REPRODUCTION]>, METHOD_SIZES[DIM_SELECTION]> ScoresArr;
  71.  
  72. float Objective(GAGenome& g) {
  73.     GARealGenome& genome = (GARealGenome&)g;
  74.     return GA_TestFunction(FUNCTION_NR, genome.gene(0), genome.gene(1));
  75. }
  76.  
  77. std::unique_ptr<GAGeneticAlgorithm> getGeneticAlghoritm(ReproductionMethod reproductionMethod, const GAPopulation& population) {
  78.     switch (reproductionMethod) {
  79.         case REPRODUCTION_SIMPLE:
  80.             return std::unique_ptr<GAGeneticAlgorithm>(new GASimpleGA(population));
  81.         case REPRODUCTION_STEADY_STATE:
  82.             return std::unique_ptr<GAGeneticAlgorithm>(new GASteadyStateGA(population));
  83.         //case REPRODUCTION_INCREMETAL:
  84.             //return std::unique_ptr<GAGeneticAlgorithm>(new GAIncrementalGA(population));
  85.         //case REPRODUCTION_DEME:
  86.             //return std::unique_ptr<GAGeneticAlgorithm>(new GADemeGA(population));
  87.         default:
  88.             return nullptr;
  89.     }
  90. }
  91.  
  92. std::unique_ptr<GASelectionScheme> getSelectionScheme(SelectionMethod selectionMethod) {
  93.     switch (selectionMethod) {
  94.         case SELECTION_RANK:
  95.             return std::unique_ptr<GASelectionScheme>(new GARankSelector());
  96.         //case SELECTION_ROULETTE_WHEEL:
  97.             //return std::unique_ptr<GASelectionScheme>(new GARouletteWheelSelector());
  98.         case SELECTION_TOURNAMENT:
  99.             return std::unique_ptr<GASelectionScheme>(new GATournamentSelector());
  100.         case SELECTION_UNIFORM:
  101.             return std::unique_ptr<GASelectionScheme>(new GAUniformSelector());
  102.         //case SELECTION_SRS:
  103.             //return std::unique_ptr<GASelectionScheme>(new GASRSSelector());
  104.         //case SELECTION_DS:
  105.             //return std::unique_ptr<GASelectionScheme>(new GADSSelector());
  106.         default:
  107.             return nullptr;
  108.     }
  109. }
  110.  
  111. int (*getMutator(MutationMethod mutationMethod))(GAGenome &, float) {
  112.     switch (mutationMethod) {
  113.         case MUTATION_FLIP:
  114.             return GARealGenome::FlipMutator;
  115.         //case MUTATION_SWAP:
  116.             //return GARealGenome::SwapMutator;
  117.         case MUTATION_REAL_GAUSSIAN:
  118.             return GARealGaussianMutator;
  119.         default:
  120.             return NULL;
  121.     }
  122. }
  123.  
  124. int (*getSexualCrossover(CrossoverMethod crossoverMethod))(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*) {
  125.     switch (crossoverMethod) {
  126.         case CROSSOVER_UNIFORM:
  127.             return GARealGenome::UniformCrossover;
  128.         //case CROSSOVER_EVEN_ODD:
  129.             //return GARealGenome::EvenOddCrossover;
  130.         //case CROSSOVER_ONE_POINT:
  131.             //return GARealGenome::OnePointCrossover;
  132.         //case CROSSOVER_TWO_POINT:
  133.             //return GARealGenome::TwoPointCrossover;
  134.         //case CROSSOVER_PARTIAL_MATCH:
  135.             //return GARealGenome::PartialMatchCrossover;
  136.         //case CROSSOVER_ORDER:
  137.             //return GARealGenome::OrderCrossover;
  138.         //case CROSSOVER_CYCLE:
  139.             //return GARealGenome::CycleCrossover;
  140.         case CROSSOVER_REAL_BLEND:
  141.             return GARealBlendCrossover;
  142.         case CROSSOVER_REAL_ARITHMETIC:
  143.             return GARealArithmeticCrossover;
  144.         default:
  145.             return NULL;
  146.     }
  147. }
  148.  
  149. void generateStats(const ScoresArr &scores, Dimension dim, const std::string &filename, const std::vector<std::string> &categories) {
  150.     std::vector<float> means(METHOD_SIZES[dim], 0.0f);
  151.     std::vector<float> stds(METHOD_SIZES[dim], 0.0f);
  152.     int pointsToIter = TOTAL_METHODS * MAX_ITERATIONS / METHOD_SIZES[dim];
  153.     for (int i = 0; i < METHOD_SIZES[dim]; ++i) {
  154.         double sum = 0.0;
  155.         for (int selI = (dim == DIM_SELECTION ? i : 0); selI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_SELECTION]); ++selI) {
  156.             for (int repI = (dim == DIM_REPRODUCTION ? i : 0); repI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_REPRODUCTION]); ++repI) {
  157.                 for (int crossI = (dim == DIM_CROSSOVER ? i : 0); crossI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_CROSSOVER]); ++crossI) {
  158.                     for (int mutI = (dim == DIM_MUTATION ? i : 0); mutI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_MUTATION]); ++mutI) {
  159.                         for (int n = 0; n < MAX_ITERATIONS; ++n) {
  160.                             sum += scores[selI][repI][crossI][mutI][n];
  161.                         }
  162.                     }
  163.                 }
  164.             }
  165.         }
  166.         double avg = sum / pointsToIter;
  167.         double diffSqSum = 0.0;
  168.         for (int selI = (dim == DIM_SELECTION ? i : 0); selI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_SELECTION]); ++selI) {
  169.             for (int repI = (dim == DIM_REPRODUCTION ? i : 0); repI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_REPRODUCTION]); ++repI) {
  170.                 for (int crossI = (dim == DIM_CROSSOVER ? i : 0); crossI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_CROSSOVER]); ++crossI) {
  171.                     for (int mutI = (dim == DIM_MUTATION ? i : 0); mutI < (dim == DIM_MUTATION ? i + 1 : METHOD_SIZES[DIM_MUTATION]); ++mutI) {
  172.                         for (int n = 0; n < MAX_ITERATIONS; ++n) {
  173.                             double diff = scores[selI][repI][crossI][mutI][n] - avg;
  174.                             diffSqSum += diff * diff;
  175.                         }
  176.                     }
  177.                 }
  178.             }
  179.         }
  180.         means[i] = avg;
  181.         stds[i] = sqrt(diffSqSum / (pointsToIter - 1));
  182.     }
  183.     std::ofstream file(filename);
  184.     for (int i = 0; i < METHOD_SIZES[dim]; ++i) {
  185.         file << categories[i] << "\t" << means[i] << "\t" << stds[i] << std::endl;
  186.     }
  187.     file.close();
  188. }
  189.  
  190. int main(int argc, char **argv) {
  191.  
  192.     ScoresArr scores;
  193.  
  194.     GARealAlleleSetArray alleles;
  195.     alleles.add(GA_Get_Min_x(FUNCTION_NR), GA_Get_Max_x(FUNCTION_NR));
  196.     alleles.add(GA_Get_Min_y(FUNCTION_NR), GA_Get_Max_y(FUNCTION_NR));
  197.  
  198.     GARealGenome basicGenome(alleles, Objective);
  199.  
  200.     GASigmaTruncationScaling sigmaTruncationScaling;
  201.  
  202.     int count = 0;
  203.  
  204.     for (int selI = 0; selI < METHOD_SIZES[DIM_SELECTION]; ++selI) {
  205.         for (int repI = 0; repI < METHOD_SIZES[DIM_REPRODUCTION]; ++repI) {
  206.             for (int crossI = 0; crossI < METHOD_SIZES[DIM_CROSSOVER]; ++crossI) {
  207.                 for (int mutI = 0; mutI < METHOD_SIZES[DIM_MUTATION]; ++mutI) {
  208.  
  209.                     std::cout << "\rGenerating stats... " << (count * 100 / TOTAL_METHODS) << "%" << std::flush;
  210.                     ++count;
  211.  
  212.                     for (int i = 0; i < MAX_ITERATIONS; ++i) {
  213.  
  214.                         auto genome = std::unique_ptr<GAGenome>(basicGenome.clone());
  215.  
  216.                         auto mutator = getMutator(static_cast<MutationMethod>(mutI));
  217.                         genome->mutator(mutator);
  218.  
  219.                         auto crossover = getSexualCrossover(static_cast<CrossoverMethod>(crossI));
  220.                         genome->crossover(crossover);
  221.  
  222.                         auto selScheme = getSelectionScheme(static_cast<SelectionMethod>(selI));
  223.                         GAPopulation population(*genome);
  224.                         population.selector(*selScheme);
  225.  
  226.                         auto ga = getGeneticAlghoritm(static_cast<ReproductionMethod>(repI), population);
  227.                         ga->scaling(sigmaTruncationScaling);
  228.                         ga->minimize();
  229.                         ga->populationSize(POPULATION_SIZE);
  230.                         ga->nGenerations(N_GENERATIONS);
  231.                         ga->pMutation(P_MUTATION);
  232.                         ga->pCrossover(P_CROSSOVER);
  233.                        
  234.                         ga->initialize();
  235.                         ga->evolve();
  236.  
  237.                         scores[selI][repI][crossI][mutI][i] = ga->statistics().bestIndividual().score();
  238.                         // std::cout << ga->statistics().bestIndividual() << std::endl;
  239.  
  240.                     }
  241.  
  242.                 }
  243.             }
  244.         }
  245.     }
  246.  
  247.     std::cout << "\rStats generated!        " <<std::endl;
  248.  
  249.     generateStats(scores, DIM_CROSSOVER, "part1_crossover.dat", { "Uniform", "One Point", "Two Point", "Partial Match", /*"Order", */"Blend (Real)", "Arithmetic (Real)" });
  250.    
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement