RockyML  0.0.1
A High-Performance Scientific Computing Framework
differential_evolution.h
1 /*
2  Copyright (C) 2022 Amirabbas Asadi , All Rights Reserved
3  distributed under Apache-2.0 license
4 */
5 #ifndef ROCKY_ZAGROS_DE_STRATEGY
6 #define ROCKY_ZAGROS_DE_STRATEGY
7 
8 #include <rocky/zagros/strategies/strategy.h>
9 
10 namespace rocky{
11 namespace zagros{
12 
13 template<typename T_e, int T_dim>
15 protected:
16  system<T_e>* problem_;
17  // target container
18  basic_scontainer<T_e, T_dim>* container_;
19  // candidates container
20  basic_scontainer<T_e, T_dim>* candidates_;
21  // DE hyper-parameters
22  T_e CR_;
23  T_e DW_;
24  // number of crossovers
25  int n_crossovers_;
26 
27 public:
28  basic_differential_evolution(system<T_e>* problem, basic_scontainer<T_e, T_dim>* container, basic_scontainer<T_e, T_dim>* candidates, T_e CR=0.9, T_e DW=0.9){
29  this->problem_ = problem;
30  this->container_ = container;
31  this->candidates_ = candidates;
32  this->CR_ = CR;
33  this->DW_ = DW;
34  this->n_crossovers_ = candidates->n_particles();
35  }
41  T_e rand_uniform(){
42  static std::uniform_real_distribution<T_e> dist(0.0, 1.0);
43  return dist(rocky::utils::random::prng());
44  }
45  // apply differential evolution within groups in parallel
46  virtual void apply(){
47  if(container_->n_particles() < 4){
48  spdlog::warn("For using differential evolution the number of particles must be at least 4!");
49  return;
50  }
51  tbb::parallel_for(0, n_crossovers_, [this](int p){
52  int parents[4];
53  this->container_->sample_n_particles(parents, 4);
54  auto& [x, a, b, c] = parents;
55  // making a copy of x
56  std::copy(this->container_->particle(x),
57  this->container_->particle(x) + T_dim,
58  this->candidates_->particle(p));
59  for(int d=0; d<T_dim; d++){
60  // perform crossover based on the crossover probability CR
61  if(this->rand_uniform() > this->CR_)
62  continue;
63  // apply crossover
64  this->candidates_->particles[p][d] = this->container_->particles[a][d] +
65  this->DW_ * (this->container_->particles[b][d] -
66  this->container_->particles[c][d]);
67  }
68  });
69  // replace improved solutions
70  candidates_->evaluate_and_update(problem_);
71  container_->replace_with(candidates_);
72  }
73 };
74 
75 
76 };
77 };
78 
79 #endif
rocky::zagros::search_strategy
Interface for evolution strategies.
Definition: strategy.h:42
rocky::zagros::basic_scontainer::sample_n_particles
void sample_n_particles(int *indices, int n=1)
sample n distinct particles from a group efficient when n is small
Definition: scontainer.h:119
rocky::zagros::basic_scontainer::replace_with
void replace_with(basic_scontainer< T_e, T_dim > *cnt)
replace the best values from another container
Definition: scontainer.h:266
rocky::zagros::basic_differential_evolution
Definition: differential_evolution.h:14
rocky::zagros::basic_scontainer
a data container representing a scontainer
Definition: scontainer.h:31
rocky::zagros::system
Definition: system.h:20
rocky::zagros::basic_scontainer::evaluate_and_update
void evaluate_and_update(system< T_e > *problem, int rng_start, int rng_end)
evaluate and update the particles within a range
Definition: scontainer.h:205
rocky::zagros::basic_scontainer::particle
T_e * particle(int p)
get the starting address of a specific particle
Definition: scontainer.h:71
rocky::zagros::basic_differential_evolution::rand_uniform
T_e rand_uniform()
generate a uniform random number
Definition: differential_evolution.h:41