Files
neat/main.cpp
T
2010-09-30 15:23:17 -07:00

111 lines
2.0 KiB
C++

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include "NEAT.h"
#include "IteratorHelper.h"
class MyNEAT: public NEAT
{
public:
MyNEAT(int num_inputs, int num_outputs) : NEAT(num_inputs,num_outputs)
{
// empty
}
virtual bool TestNetworks(std::vector<NeuralNetwork>& networks, std::vector<float>& fitness)
{
bool solution_found = false;
iterate_each( std::vector<NeuralNetwork>::iterator, it_network, networks )
{
std::vector<float> inputs;
std::vector<float> outputs;
float error_sum = 0.0f;
float error;
int hits = 0;
#define ON (1.0f)
#define OFF (0.0f)
// 0, 0 = 0
inputs.push_back(OFF);
inputs.push_back(OFF);
(*it_network).Reset();
(*it_network).Update(inputs,outputs);
error = outputs[0] - OFF;
error_sum += error * error;
if ( outputs[0] < 0.44f )
{
++hits;
}
// 0, 1 = 1
inputs.clear();
inputs.push_back(OFF);
inputs.push_back(ON);
(*it_network).Reset();
(*it_network).Update(inputs,outputs);
error = outputs[0] - ON;
error_sum += error * error;
if ( outputs[0] > 0.6f )
{
++hits;
}
// 1, 0 = 1
inputs.clear();
inputs.push_back(ON);
inputs.push_back(OFF);
(*it_network).Reset();
(*it_network).Update(inputs,outputs);
error = outputs[0] - ON;
error_sum += error * error;
if ( outputs[0] > 0.6f )
{
++hits;
}
// 1, 1 = 0
inputs.clear();
inputs.push_back(ON);
inputs.push_back(ON);
(*it_network).Reset();
(*it_network).Update(inputs,outputs);
error = outputs[0] - OFF;
error_sum += error * error;
if ( outputs[0] < 0.5f )
{
++hits;
}
// average
error_sum /= 4.0f;
// store
fitness.push_back(error_sum);
//printf("error = %0.5f\n",error_sum);
// did we solve it?
if ( hits == 4 )
{
solution_found = true;
}
}
//printf("\n");
return solution_found;
}
};
int main (int argc, char * const argv[])
{
MyNEAT n(2,1);
srand( (unsigned)time( NULL ) );
n.Run();
return 0;
}