00001 #include <iostream>
00002 #include <math.h>
00003
00004 #include <NLstl_utils.h>
00005
00006 #include "GLBaseOrganism.h"
00007 #include "GLInterfaceShuffleGenes.h"
00008 #include "GLMutatorShuffling.h"
00009 #include "GLRandomNumbersGenerator.h"
00010
00011 using namespace std;
00018 GLMutatorShuffling::GLMutatorShuffling(double mutation_rate,
00019 const GLMutatorShuffling::TParameters *const parameters):
00020 GLBaseMutator(mutation_rate, true)
00021 {
00022 m_parameters = *parameters;
00023 }
00024
00025
00034 bool GLMutatorShuffling::mutateOrganism(GLBaseOrganism* organism)
00035 {
00036
00037 GLInterfaceShuffleGenes* x_organism =
00038 nlutils::transform_pointer<GLInterfaceShuffleGenes,
00039 GLBaseOrganism>(organism,
00040 "GLMutatorShuffling::mutateOrganism\n"
00041 "Passed pointer is either NULL or does not point "
00042 "to the organism with GLInterfaceShuffleGenes");
00043
00044
00045 if (GLRandomNumbersGenerator::getRandomUniform(0, 1) >
00046 getMutationRate())
00047 {
00048 return false;
00049 }
00050
00051
00052
00053 int organism_size = organism->getSize();
00054 int min_genes_to_shuffle = m_parameters.t_min_genes_to_shuffle;
00055 int max_genes_to_shuffle = m_parameters.t_max_genes_to_shuffle;
00056 if ((min_genes_to_shuffle < 0) ||
00057 (min_genes_to_shuffle > organism_size))
00058 {
00059 min_genes_to_shuffle = organism_size;
00060 }
00061 if ((max_genes_to_shuffle < 0) ||
00062 (max_genes_to_shuffle > organism_size))
00063 {
00064 max_genes_to_shuffle = organism_size;
00065 }
00066
00067 if (max_genes_to_shuffle < 2)
00068 {
00070 return false;
00071 }
00072 int genes_to_shuffle;
00073
00074 if (min_genes_to_shuffle == max_genes_to_shuffle)
00075 {
00076 genes_to_shuffle = min_genes_to_shuffle;
00077 }
00078 if (m_parameters.t_uniform)
00079 genes_to_shuffle = GLRandomNumbersGenerator::getRandomInteger(
00080 min_genes_to_shuffle, max_genes_to_shuffle + 1);
00081 else
00082 {
00083
00084 double probability =
00085 GLRandomNumbersGenerator::getRandomUniform(0, 1);
00086 genes_to_shuffle = (int)(-log(1. - probability) / log(2.)) +
00087 min_genes_to_shuffle;
00088 if (genes_to_shuffle > max_genes_to_shuffle)
00089 genes_to_shuffle = max_genes_to_shuffle;
00090 }
00091
00092
00093
00094 vector<int> gene_numbers;
00095 GLRandomNumbersGenerator::shuffleIntegerVector(
00096 gene_numbers, 0, organism_size);
00097 gene_numbers.erase(gene_numbers.begin() + genes_to_shuffle,
00098 gene_numbers.end());
00099
00100 x_organism->shuffleGenes(gene_numbers);
00101
00102 return true;
00103 }
00104