2016-02-10 02:53:54 +03:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include "genann.h"
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
printf("GENANN example 2.\n");
|
|
|
|
printf("Train a small ANN to the XOR function using random search.\n");
|
|
|
|
|
|
|
|
/* Input and expected out data for the XOR function. */
|
|
|
|
const double input[4][2] = {{0, 0}, {0, 1}, {1, 0}, {1, 1}};
|
|
|
|
const double output[4] = {0, 1, 1, 0};
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* New network with 2 inputs,
|
|
|
|
* 1 hidden layer of 2 neurons,
|
|
|
|
* and 1 output. */
|
2016-02-11 23:38:42 +03:00
|
|
|
genann *ann = genann_init(2, 1, 2, 1);
|
2016-02-10 02:53:54 +03:00
|
|
|
|
|
|
|
double err;
|
|
|
|
double last_err = 1000;
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
do {
|
|
|
|
++count;
|
|
|
|
if (count % 1000 == 0) {
|
|
|
|
/* We're stuck, start over. */
|
|
|
|
genann_randomize(ann);
|
|
|
|
}
|
|
|
|
|
2016-02-11 23:38:42 +03:00
|
|
|
genann *save = genann_copy(ann);
|
2016-02-10 02:53:54 +03:00
|
|
|
|
|
|
|
/* Take a random guess at the ANN weights. */
|
|
|
|
for (i = 0; i < ann->total_weights; ++i) {
|
|
|
|
ann->weight[i] += ((double)rand())/RAND_MAX-0.5;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* See how we did. */
|
|
|
|
err = 0;
|
|
|
|
err += pow(*genann_run(ann, input[0]) - output[0], 2.0);
|
|
|
|
err += pow(*genann_run(ann, input[1]) - output[1], 2.0);
|
|
|
|
err += pow(*genann_run(ann, input[2]) - output[2], 2.0);
|
|
|
|
err += pow(*genann_run(ann, input[3]) - output[3], 2.0);
|
|
|
|
|
|
|
|
/* Keep these weights if they're an improvement. */
|
|
|
|
if (err < last_err) {
|
|
|
|
genann_free(save);
|
|
|
|
last_err = err;
|
|
|
|
} else {
|
|
|
|
genann_free(ann);
|
|
|
|
ann = save;
|
|
|
|
}
|
|
|
|
|
|
|
|
} while (err > 0.01);
|
|
|
|
|
|
|
|
printf("Finished in %d loops.\n", count);
|
|
|
|
|
|
|
|
/* Run the network and see what it predicts. */
|
|
|
|
printf("Output for [%1.f, %1.f] is %1.f.\n", input[0][0], input[0][1], *genann_run(ann, input[0]));
|
|
|
|
printf("Output for [%1.f, %1.f] is %1.f.\n", input[1][0], input[1][1], *genann_run(ann, input[1]));
|
|
|
|
printf("Output for [%1.f, %1.f] is %1.f.\n", input[2][0], input[2][1], *genann_run(ann, input[2]));
|
|
|
|
printf("Output for [%1.f, %1.f] is %1.f.\n", input[3][0], input[3][1], *genann_run(ann, input[3]));
|
|
|
|
|
|
|
|
genann_free(ann);
|
|
|
|
return 0;
|
|
|
|
}
|