From bd456919962b1b913b883d7686fd40818bb326a2 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 12 May 2017 11:12:44 +0000 Subject: [PATCH] Continue finishing to implement Chromosome and Gene --- src/Chromosome.cpp | 54 +++++++++++++++------------------------------- src/Chromosome.hpp | 3 +-- src/Genes.cpp | 43 +++++++++++++++++++++++++++++++++++- src/Genes.hpp | 11 +++++++--- 4 files changed, 68 insertions(+), 43 deletions(-) diff --git a/src/Chromosome.cpp b/src/Chromosome.cpp index 15ea253..1e40967 100644 --- a/src/Chromosome.cpp +++ b/src/Chromosome.cpp @@ -28,6 +28,16 @@ Chromosome::Chromosome() } +Chromosome::Chromosome(Chromosome& father) +{ + // reserve to father's size/capacity? + + for (auto& ptr : father.genes) { + this->genes.push_back(std::unique_ptr(Gene::copy(ptr.get()))); + } +} + + Chromosome::Chromosome(Chromosome& father, Chromosome& mother) { auto split_father = father.selectGene(); @@ -36,11 +46,11 @@ Chromosome::Chromosome(Chromosome& father, Chromosome& mother) // reserve to father's size/capacity, and shrink_to_fit afterwards? for (auto it=father.genes.begin(); it!=split_father; ++it) { - this->genes.push_back(std::unique_ptr(this->copyGene(it->get()))); + this->genes.push_back(std::unique_ptr(Gene::copy(it->get()))); } for (auto it=split_mother; it!=mother.genes.end(); ++it) { - this->genes.push_back(std::unique_ptr(this->copyGene(it->get()))); + this->genes.push_back(std::unique_ptr(Gene::copy(it->get()))); } } @@ -90,40 +100,6 @@ std::vector>::iterator Chromosome::selectGene() } -Gene* Chromosome::copyGene(Gene* gene) -{ - switch (gene->type) { - case Gene::Circle: - { - GeneCircle* newgene = new GeneCircle(); - *newgene = *static_cast(gene); - return newgene; - } - case Gene::Triangle: - { - GeneTriangle* newgene = new GeneTriangle(); - *newgene = *static_cast(gene); - return newgene; - } - } - - return nullptr; -} - - -Gene* Chromosome::createGene(Gene::GeneType type) -{ - switch (type) { - case Gene::Circle: - return new GeneCircle(); - case Gene::Triangle: - return new GeneTriangle(); - } - - return nullptr; -} - - void Chromosome::addGene() { std::uniform_int_distribution<> typedist(0, this->allowedGeneTypes.size()-1); @@ -132,7 +108,11 @@ void Chromosome::addGene() std::advance(it, typedist(*Gene::re)); const Gene::GeneType type = *it; - this->genes.push_back(std::unique_ptr(this->createGene(type))); + + Gene* gene = Gene::create(type); + gene->randomize(); + this->genes.push_back(std::unique_ptr(gene)); +// this->genes.push_back(std::unique_ptr(Gene::create(type))); } diff --git a/src/Chromosome.hpp b/src/Chromosome.hpp index 62adb0f..b35a4cb 100644 --- a/src/Chromosome.hpp +++ b/src/Chromosome.hpp @@ -18,6 +18,7 @@ public: static bool isGeneTypeAllowed(Gene::GeneType gt); Chromosome(); // create empty chromosome + Chromosome(Chromosome& father); // copy Chromosome(Chromosome& father, Chromosome& mother); // crossover virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; @@ -32,8 +33,6 @@ private: std::vector> genes; std::vector>::iterator selectGene(); - Gene* copyGene(Gene* gene); - Gene* createGene(Gene::GeneType type); void addGene(); void removeGene(); diff --git a/src/Genes.cpp b/src/Genes.cpp index 5deefcd..968fef6 100644 --- a/src/Genes.cpp +++ b/src/Genes.cpp @@ -19,6 +19,37 @@ std::minstd_rand* Gene::re; sf::Vector2f Gene::size; +Gene* Gene::create(GeneType type) +{ + Gene* gene = nullptr; + + switch (type) { + case Gene::Circle: + gene = new GeneCircle(); + break; + case Gene::Triangle: + gene = new GeneTriangle(); + break; + } + + gene->randomize(); + return gene; +} + + +Gene* Gene::copy(Gene* gene) +{ + switch (gene->type) { + case Gene::Circle: + return new GeneCircle(*static_cast(gene)); + case Gene::Triangle: + return new GeneTriangle(*static_cast(gene)); + } + + return nullptr; +} + + Gene::~Gene() { } @@ -31,7 +62,6 @@ float GeneCircle::stddev_position = .1; // in percent of min side length float GeneCircle::stddev_radius = .1; // in percent of max radius float GeneCircle::stddev_color = 20; // absolute value - GeneCircle::~GeneCircle() { } @@ -41,6 +71,7 @@ void GeneCircle::draw(sf::RenderTarget& target, sf::RenderStates states) const { this->circle.setPosition(this->position); this->circle.setRadius(this->radius); + this->circle.setOrigin(this->radius, this->radius); this->circle.setFillColor(this->color); target.draw(this->circle, states); } @@ -48,6 +79,16 @@ void GeneCircle::draw(sf::RenderTarget& target, sf::RenderStates states) const void GeneCircle::randomize() { + std::uniform_int_distribution<> colordist(0, 255); + this->color.r = colordist(*Gene::re); + this->color.g = colordist(*Gene::re); + this->color.b = colordist(*Gene::re); + this->color.a = colordist(*Gene::re); + + std::uniform_real_distribution<> floatdist(0, 1); + this->position.x = floatdist(*Gene::re)*Gene::size.x; + this->position.y = floatdist(*Gene::re)*Gene::size.y; + this->radius = floatdist(*Gene::re)*this->maxRadius(); } diff --git a/src/Genes.hpp b/src/Genes.hpp index 7e6b078..6798afe 100644 --- a/src/Genes.hpp +++ b/src/Genes.hpp @@ -18,6 +18,10 @@ public: Triangle }; + static Gene* create(GeneType type); + static Gene* copy(Gene* gene); + + GeneType type; virtual ~Gene(); @@ -31,6 +35,10 @@ public: class GeneCircle : public Gene { public: + static float stddev_position; + static float stddev_radius; + static float stddev_color; + GeneType type = Gene::Circle; virtual ~GeneCircle(); @@ -41,9 +49,6 @@ public: private: static sf::CircleShape circle; - static float stddev_position; - static float stddev_radius; - static float stddev_color; sf::Vector2f position; float radius;