#include <climits>
#include <cstdio>
#include <cstring>
#include <ctime>
static const float DefaultTopFittest = 0.5;
const array& sampleY,
const int n) {
return searchSpace(sampleY * n + sampleX);
}
array selectFittest(
const array& sampleZ,
const int nSamples,
const float topFit = DefaultTopFittest) {
sort(values, indices, sampleZ);
int topFitElem = topFit * nSamples;
return (n > topFitElem) ? indices(
seq(n - topFitElem, n - 1)) : indices;
}
array& sampleZ,
const int nSamples,
const int n) {
array selection = selectFittest(sampleZ, nSamples);
array parentsX = sampleX(selection);
array parentsY = sampleY(selection);
array lowermask = (1 << crossover) - 1;
array uppermask = INT_MAX - lowermask;
array childrenX1 = (parentsX1 & uppermask) + (parentsX2 & lowermask);
array childrenY1 = (parentsY1 & uppermask) + (parentsY2 & lowermask);
array childrenX2 = (parentsX2 & uppermask) + (parentsX1 & lowermask);
array childrenY2 = (parentsY2 & uppermask) + (parentsY1 & lowermask);
sampleX =
join(0, childrenX1, childrenX2);
sampleY =
join(0, childrenY1, childrenY2);
mutantX = mutantX ^ (1 << (
randu(nSamples / 2,
u32) % bits));
mutantY = mutantY ^ (1 << (
randu(nSamples / 2,
u32) % bits));
sampleX =
join(0, sampleX, mutantX);
sampleY =
join(0, sampleY, mutantY);
sampleZ = update(searchSpace, sampleX, sampleY, n);
}
array& sampleZ,
const int nSamples,
const int n) {
sampleZ = update(searchSpace, sampleX, sampleY, n);
}
void init(
array& searchSpace,
array& searchSpaceXDisplay,
array& sampleZ,
const int nSamples,
const int n) {
searchSpace =
join(0, searchSpace,
flip(searchSpace, 0));
searchSpace =
join(1, searchSpace,
flip(searchSpace, 1));
initSamples(searchSpace, sampleX, sampleY, sampleZ, nSamples, n);
}
void reproducePrint(
float& currentMax,
array& searchSpace,
array& sampleX,
array& sampleY,
array& sampleZ,
const float trueMax,
const int nSamples, const int n) {
if (currentMax < trueMax * 0.99) {
float maximum = max<float>(sampleZ);
if (maximum < trueMax * 0.99) {
printf("Current max at ");
} else {
printf("\nMax found at ");
}
printf("(%d,%d): %f (trueMax %f)\n",
sampleX(whereM).scalar<unsigned int>(),
sampleY(whereM).scalar<unsigned int>(), maximum, trueMax);
currentMax = maximum;
reproduce(searchSpace, sampleX, sampleY, sampleZ, nSamples, n);
}
}
void geneticSearch(bool console, const int nSamples, const int n) {
array searchSpaceXDisplay = 0;
array searchSpaceYDisplay = 0;
init(searchSpace, searchSpaceXDisplay, searchSpaceYDisplay, sampleX,
sampleY, sampleZ, nSamples, n);
float trueMax = max<float>(searchSpace);
float maximum = -trueMax;
if (!console) {
af::Window win(1600, 800,
"Arrayfire Genetic Algorithm Search Demo");
do {
reproducePrint(maximum, searchSpace, sampleX, sampleY, sampleZ,
trueMax, nSamples, n);
win(0, 0).
surface(searchSpaceXDisplay, searchSpaceYDisplay,
searchSpace);
} else {
do {
reproducePrint(maximum, searchSpace, sampleX, sampleY, sampleZ,
trueMax, nSamples, n);
} while (maximum < trueMax * 0.99);
}
}
int main(int argc, char** argv) {
bool console = false;
const int n = 32;
const int nSamples = 16;
if (argc > 2 || (argc == 2 && strcmp(argv[1], "-"))) {
printf("usage: %s [-]\n", argv[0]);
return -1;
} else if (argc == 2 && argv[1][0] == '-') {
console = true;
}
try {
printf("** ArrayFire Genetic Algorithm Search Demo **\n\n");
printf(
"Search for trueMax in a search space where the objective function "
"is defined as :\n\n");
printf("SS(x ,y) = min(x, n - (x + 1)) + min(y, n - (y + 1))\n\n");
printf("(x, y) belongs to RxR; R = [0, n); n = %d\n\n", n);
if (!console) {
printf("The left figure shows the objective function.\n");
printf(
"The figure on the right shows current generation's parameters "
"and function values.\n\n");
}
geneticSearch(console, nSamples, n);
return 0;
}