c90a3769081d2978751b1ca989bbe6db5287eb4b
[genetic.git] / src / generator / generation.h
1 #ifndef __GENERATOR_GENERATION_H
2 #define __GENERATOR_GENERATION_H
3
4 #include <vector>
5
6 #include "../gene.h"
7 #include "../chromosome.h"
8 #include "../generation.h"
9
10 using namespace std;
11
12 namespace genetic {
13     namespace generator {
14         /**
15          * Generator for generating entire Generation of Chromosomes (individuals)
16          */
17         template < typename _Chromosome >
18         class Generation {
19         public:
20             /**
21              * Type of used Genes in Chromosome
22              */
23             typedef typename _Chromosome::GeneType GeneType;
24         protected:
25             /**
26              * Size of the generation to generate
27              */
28             unsigned int generationSize;
29
30             /**
31              * Size of the chromosome to generate
32              */
33             unsigned int chromosomeSize;
34
35         public:
36             /**
37              * Constructor.
38              *
39              * @param generationSize Indicates size of the generation
40              * @param generationSize Indicates size of the chromosome
41              */
42             Generation(unsigned int generationSize, unsigned int chromosomeSize) {
43                 this->generationSize = generationSize;
44                 this->chromosomeSize = chromosomeSize;
45             }
46
47             /**
48              * Breeds new generation of chromosomes.
49              *
50              * @return ::genetic::Generation Generation of Chromosomes
51              */
52             ::genetic::Generation<_Chromosome> breed() {
53                 vector<_Chromosome> chromosomes;
54
55                 for (unsigned int i = 0; i < generationSize; i++) {
56                     vector<GeneType> genes;
57                     for (unsigned int j = 0; j < chromosomeSize; j++) {
58                         GeneType gene(rand() % 2);
59                         genes.push_back(gene);
60                     }
61                     chromosomes.push_back(genes);
62                 }
63
64                 return ::genetic::Generation<_Chromosome>(chromosomes);
65             }
66         };
67     }
68 }
69
70 #endif /* __GENERATOR_GENERATION_H */