5 #ifndef ROCKY_ZAGROS_PSO_STRATEGY
6 #define ROCKY_ZAGROS_PSO_STRATEGY
7 #include <rocky/zagros/strategies/strategy.h>
15 template<
typename T_e,
int T_dim>
18 typedef Eigen::Map<Eigen::Matrix<T_e, 1, T_dim, Eigen::RowMajor>> eigen_particle;
19 enum update_mode {use_particles, use_groups};
48 this->problem_ = problem;
49 this->main_container_ = main_container;
50 this->particles_v_ = particles_v;
51 this->particles_best_ = particles_best;
52 this->groups_best_ = groups_best;
53 this->node_best_ = node_best;
54 this->cluster_best_ = cluster_best;
57 static std::uniform_real_distribution<T_e> dist(0.0, 1.0);
58 return dist(rocky::utils::random::prng());
61 virtual void initialize_velocity(){
62 for(
int p=0; p<main_container_->n_particles(); ++p){
63 std::fill(particles_v_->particles[p].begin(), particles_v_->particles[p].end(), 0.0);
68 this->initialize_velocity();
71 virtual void update_particles_best(
int rng_start,
int rng_end){
73 tbb::parallel_for(rng_start, rng_end, [
this](
int p){
74 T_e val = this->main_container_->values[p];
75 if (val < this->particles_best_->values[p]){
76 this->particles_best_->values[p] = val;
78 std::copy(this->main_container_->particle(p),
79 this->main_container_->particle(p) + T_dim,
80 this->particles_best_->particle(p));
84 virtual void update_particles_best(
int rng_start=0){
85 update_particles_best(rng_start, main_container_->n_particles());
88 virtual void update_groups_best(
int rng_start,
int rng_end){
89 tbb::parallel_for(rng_start, rng_end, [
this](
int t){
91 auto min_el = std::min_element(this->particles_best_->
value(rng.first),
92 this->particles_best_->value(rng.second));
93 if (*min_el < this->groups_best_->values[t]){
94 int min_el_ind =
static_cast<int>(min_el - this->particles_best_->
value(0));
95 this->groups_best_->values[t] = *min_el;
96 std::copy(this->particles_best_->
particle(min_el_ind),
97 this->particles_best_->particle(min_el_ind)+T_dim,
98 this->groups_best_->particle(t));
103 virtual void update_groups_best(){
104 update_groups_best(0, this->main_container_->n_groups());
106 template<update_mode T_um=use_groups>
107 void update_node_best(){
108 if constexpr(T_um == use_groups){
109 auto min_el = std::min_element(this->groups_best_->values.begin(),
110 this->groups_best_->values.end());
111 if (*min_el < this->node_best_->values[0]){
112 int min_el_ind =
static_cast<int>(min_el - this->groups_best_->values.begin());
113 std::copy(this->groups_best_->
particle(min_el_ind),
114 this->groups_best_->particle(min_el_ind)+T_dim,
115 this->node_best_->particle(0));
116 node_best_->values[0] = *min_el;
120 void update_cluster_best(){
121 if (this->node_best_->values[0] < this->cluster_best_->values[0]){
122 std::copy(this->node_best_->
particle(0),
123 this->node_best_->particle(0)+T_dim,
124 this->cluster_best_->particle(0));
125 this->cluster_best_->values[0] = this->node_best_->values[0];
140 tbb::parallel_for(0, this->main_container_->n_particles(), [
this](
int p){
141 eigen_particle x(this->main_container_->particle(p));
142 eigen_particle v(this->particles_v_->particle(p));
149 template<
typename T_e,
int T_dim>
152 typedef Eigen::Map<Eigen::Matrix<T_e, 1, T_dim, Eigen::RowMajor>> eigen_particle;
155 tbb::parallel_for(0, this->main_container_->n_particles(), [
this](
int p){
156 int p_group = this->main_container_->particle_group(p);
157 eigen_particle x(this->main_container_->particle(p));
158 eigen_particle v(this->particles_v_->particle(p));
159 eigen_particle p_best(this->particles_best_->particle(p));
160 eigen_particle p_best_gr(this->groups_best_->particle(p_group));
161 v = v * this->hyper_w_ + (2.0 * this->rand_uniform() * (p_best - x))
162 + (2.0 * this->rand_uniform() * (p_best_gr - x));
174 virtual void apply(){
175 this->hyper_w_ = this->rand_uniform();
176 this->update_particles_best();
177 this->update_groups_best();
178 this->update_node_best();
179 this->update_cluster_best();
186 template<
typename T_e,
int T_dim>
189 typedef Eigen::Map<Eigen::Matrix<T_e, 1, T_dim, Eigen::RowMajor>> eigen_particle;
192 tbb::parallel_for(0, this->main_container_->n_particles(), [
this](
int p){
193 int p_group = this->main_container_->particle_group(p);
194 eigen_particle x(this->main_container_->particle(p));
195 eigen_particle v(this->particles_v_->particle(p));
196 eigen_particle p_best(this->particles_best_->particle(p));
197 eigen_particle p_best_gr(this->groups_best_->particle(p_group));
198 eigen_particle p_best_n(this->node_best_->particle(0));
199 if(this->particles_best_->values[p] == this->groups_best_->values[p_group]){
200 v = v * this->hyper_w_ + (2.0 * this->rand_uniform() * (p_best - x))
201 + (2.0 * this->rand_uniform() * (p_best_n - x));
203 v = v * this->hyper_w_ + (2.0 * this->rand_uniform() * (p_best - x))
204 + (2.0 * this->rand_uniform() * (p_best_gr - x));
209 pso_l2_strategy(system<T_e>* problem,
210 basic_scontainer<T_e, T_dim>* main_container,
211 basic_scontainer<T_e, T_dim>* particles_v,
212 basic_scontainer<T_e, T_dim>* particles_best,
213 basic_scontainer<T_e, T_dim>* groups_best,
214 basic_scontainer<T_e, T_dim>* node_best,
215 basic_scontainer<T_e, T_dim>* cluster_best):basic_pso<T_e, T_dim>(problem, main_container, particles_v, particles_best, groups_best, node_best, cluster_best){
217 virtual void apply(){
218 this->hyper_w_ = this->rand_uniform();
219 this->update_particles_best();
220 this->update_groups_best();
221 this->update_node_best();
222 this->update_cluster_best();
223 this->update_particles_v();
224 this->update_particles_x();
228 template<
typename T_e,
int T_dim>
231 typedef Eigen::Map<Eigen::Matrix<T_e, 1, T_dim, Eigen::RowMajor>> eigen_particle;
234 tbb::parallel_for(0, this->main_container_->n_particles(), [
this](
int p){
235 int p_group = this->main_container_->particle_group(p);
236 eigen_particle x(this->main_container_->particle(p));
237 eigen_particle v(this->particles_v_->particle(p));
238 eigen_particle p_best(this->particles_best_->particle(p));
239 eigen_particle p_best_gr(this->groups_best_->particle(p_group));
240 eigen_particle p_best_c(this->cluster_best_->particle(0));
241 if(this->particles_best_->values[p] == this->groups_best_->values[p_group]){
242 v = v * this->hyper_w_ + (2.0 * this->rand_uniform() * (p_best - x))
243 + (2.0 * this->rand_uniform() * (p_best_c - x));
245 v = v * this->hyper_w_ + (2.0 * this->rand_uniform() * (p_best - x))
246 + (2.0 * this->rand_uniform() * (p_best_gr - x));
251 pso_l3_strategy(system<T_e>* problem,
252 basic_scontainer<T_e, T_dim>* main_container,
253 basic_scontainer<T_e, T_dim>* particles_v,
254 basic_scontainer<T_e, T_dim>* particles_best,
255 basic_scontainer<T_e, T_dim>* groups_best,
256 basic_scontainer<T_e, T_dim>* node_best,
257 basic_scontainer<T_e, T_dim>* cluster_best):basic_pso<T_e, T_dim>(problem, main_container, particles_v, particles_best, groups_best, node_best, cluster_best){
259 virtual void apply(){
260 this->hyper_w_ = this->rand_uniform();
261 this->update_particles_best();
262 this->update_groups_best();
263 this->update_node_best();
264 this->update_cluster_best();
265 this->update_particles_v();
266 this->update_particles_x();