GALib-Parallel
Header-only C++ library for parallel evolutionary algorithms
Loading...
Searching...
No Matches
Population.h
Go to the documentation of this file.
1#ifndef POPULATION_H
2#define POPULATION_H
3
4#pragma once
5
6#include "Individual.h"
7#include <vector>
8#include <stdexcept>
9#include <algorithm>
10#include <random>
11#include <omp.h>
12
13namespace galib {
14
23 template <typename GeneType>
24 class Population {
25 private:
26 std::vector<Individual<GeneType>> individuals;
27 std::size_t num_genes_m;
28 public:
35 explicit Population(std::size_t size, std::size_t num_genes) : num_genes_m(num_genes) {
36 if (size == 0) throw std::invalid_argument("Population size cannot be zero");
37 individuals.assign(size, Individual<GeneType>(num_genes));
38 }
39
48 void initialize(GeneType lower, GeneType upper) {
49 #pragma omp parallel
50 {
51 std::random_device rd;
52 std::mt19937 rng(rd());
53 std::uniform_real_distribution<GeneType> distribution(lower, upper);
54
55 #pragma omp for schedule(static)
56 for (int i = 0; i < static_cast<int>(individuals.size()); ++i) {
57 for (auto& gene : individuals[i].getGenotype()) {
58 gene = distribution(rng);
59 }
60 }
61 }
62 }
63
68 [[nodiscard]] std::size_t size() const { return individuals.size(); }
69
74 [[nodiscard]] bool empty() const { return individuals.empty(); }
75
80 [[nodiscard]] std::size_t getNumGenes() const { return num_genes_m; }
81
87 Individual<GeneType>& operator [](std::size_t index) { return individuals[index]; }
88
94 const Individual<GeneType>& operator [](std::size_t index) const { return individuals[index]; }
95
97 typename std::vector<Individual<GeneType>>::iterator begin() { return individuals.begin(); }
98
100 typename std::vector<Individual<GeneType>>::iterator end() { return individuals.end(); }
101
103 typename std::vector<Individual<GeneType>>::const_iterator begin() const { return individuals.begin(); }
104
106 typename std::vector<Individual<GeneType>>::const_iterator end() const { return individuals.end(); }
107
113 return *std::min_element(individuals.begin(), individuals.end());
114 }
115 };
116}
117
118#endif // POPULATION_H
Represents a single candidate solution in the population.
Definition Individual.h:23
A container for a group of individuals in the genetic algorithm.
Definition Population.h:24
void initialize(GeneType lower, GeneType upper)
Randomly initializes all individuals within the specified bounds.
Definition Population.h:48
bool empty() const
Checks if the population is empty.
Definition Population.h:74
std::size_t getNumGenes() const
Returns the number of genes for individuals in this population.
Definition Population.h:80
Population(std::size_t size, std::size_t num_genes)
Constructs a population of a given size.
Definition Population.h:35
const Individual< GeneType > & getBestIndividual() const
Finds and returns the individual with the best fitness score.
Definition Population.h:112
std::vector< Individual< GeneType > >::iterator begin()
Returns an iterator to the beginning.
Definition Population.h:97
Individual< GeneType > & operator[](std::size_t index)
Accesses an individual by its index.
Definition Population.h:87
std::size_t size() const
Returns the total number of individuals in the population.
Definition Population.h:68
std::vector< Individual< GeneType > >::iterator end()
Returns an iterator to the end.
Definition Population.h:100
std::vector< Individual< GeneType > >::const_iterator end() const
Returns a constant iterator to the end.
Definition Population.h:106
std::vector< Individual< GeneType > >::const_iterator begin() const
Returns a constant iterator to the beginning.
Definition Population.h:103