--- /dev/null
+#include "swarm.h"
+
+typedef struct {
+ int dim;
+ int particlec;
+ range *rrange;
+ double (*f)(double*); // fitness function
+ double cr; // crossover probability = .9
+ double dw; // differential weight = .8
+} de_parameters;
+
+void de_optimize(de_parameters *par, double *res);
--- /dev/null
+#include <stdlib.h>
+#include "vector.h"
+#include "de.h"
+
+void de_optimize(de_parameters *par, double *res) {
+ int l = par->particlec * par->dim;
+ double *mem = malloc(sizeof(double) * l * 2);
+ int conv = 0;
+ double *xs = mem;
+ double *ys = mem + l;
+ for (double *x = xs; x < ys; x += par->dim)
+ vec_pick(par->dim, par->rrange, x);
+ while (conv < 1000) {
+ for (double *x = xs; x < ys; x += par->dim) {
+ double *y = x + l;
+ double *picks[4] = { x }; // agents { x, a, b, c }
+ for (int i = 1; i < 4; i++) {
+ double *pick = xs + (rand() % (par->particlec - i));
+ picks[i] = pick;
+ for (int k = 0; k < i; k++)
+ if (pick >= picks[k]) picks[i]++;
+ }
+ int r = rand() % par->dim;
+ for (int i = 0; i < par->dim; i++) {
+ if (i == r || rands() < par->cr) y[i] = picks[1][i] + par->dw * (picks[2][i] - picks[3][i]);
+ else y[i] = x[i];
+ }
+ if (par->f(y) <= par->f(x)) vec_copy(par->dim, y, x);
+ else conv++;
+ }
+ }
+ double *best = xs;
+ double bestf = par->f(best);
+ for (double *x = xs; x < ys; x += par->dim) {
+ double cur = par->f(x);
+ if (cur < bestf) {
+ best = x;
+ bestf = cur;
+ }
+ }
+ vec_copy(par->dim, best, res);
+ free(mem);
+}
#include <math.h>
#include <stdio.h>
#include "vector.h"
-#include "swarm.h"
+#include "de.h"
double b0(double *x) {
return -x[0];
(range) { -100.0, 100.0 },
(range) { -100.0, 100.0 }
};
+ /*
swarm_parameters par = {
2,
100,
2.05,
2.05
};
- particle_state best = { vec_alloc(par.dim), 0.0 };
- swarm_optimize(&par, &best);
+ */
+ de_parameters par = {
+ 2,
+ 100,
+ rrange,
+ f,
+ 0.9,
+ 0.8
+ };
+ // particle_state best = { vec_alloc(par.dim), 0.0 };
+ double res[2];
+ //swarm_optimize(&par, &best);
+ de_optimize(&par, res);
printf("apso: converged in x=");
- vec_print(par.dim, best.x);
- printf(" with fitness f(x)=%f\n", best.fitness);
+ vec_print(par.dim, res);
+ printf(" with fitness f(x)=%f\n", f(res));
// GtkApplication *app = gui_init();
// return g_application_run(G_APPLICATION(app), argc, argv);
return 0;