#include <math.h>
#include <stdlib.h>
+#include <omp.h>
#include "swarm.h"
#include "vector.h"
void swarm_populate(swarm *sw, const range *rrange) {
sw->particles = malloc(sizeof(particle) * sw->params.particlec);
sw->global_best = &sw->particles[0];
+ #pragma omp parallel for
for (int p = 0; p < sw->params.particlec; p++) {
particle *pt = &sw->particles[p];
pt->current.x = vec_alloc(sw->params.dim);
}
pt->current.fitness = sw->params.f(pt->current.x);
pt->best.fitness = pt->current.fitness;
- if (pt->current.fitness < sw->global_best->current.fitness) sw->global_best = pt;
+ #pragma omp critical
+ {
+ if (pt->current.fitness < sw->global_best->current.fitness)
+ sw->global_best = pt;
+ }
}
}
void swarm_velocity_update(swarm *sw) {
+ #pragma omp parallel for
for (int p = 0; p < sw->params.particlec; p++) {
particle *pt = &sw->particles[p];
for (int d = 0; d < sw->params.dim; d++)
pt->velocity[d] = sw->params.w * pt->velocity[d] + sw->params.c * rands() * (pt->best.x[d] - pt->current.x[d]) + sw->params.s * rands() * (sw->global_best->current.x[d] - pt->current.x[d]);
}
+ #pragma omp parallel for
for (int p = 0; p < sw->params.particlec; p++) {
particle *pt = &sw->particles[p];
vec_add(sw->params.dim, pt->velocity, pt->current.x);
pt->current.fitness = sw->params.f(pt->current.x);
if (pt->current.fitness < pt->best.fitness) pt->best = pt->current;
- if (pt->current.fitness < sw->global_best->current.fitness) sw->global_best = &sw->particles[p];
+ #pragma omp critical
+ {
+ if (pt->current.fitness < sw->global_best->current.fitness)
+ sw->global_best = pt;
+ }
}
}