27 static Example examples[] =
29 { GOOD, false,false, 0, WANDER },
30 { GOOD, false,false, 1, WANDER },
31 { GOOD, false,true, 1, ATTACK },
32 { GOOD, false,true, 2, ATTACK },
33 { GOOD, true, false, 2, HIDE },
34 { GOOD, true, false, 1, ATTACK },
35 { OK, false,false, 0, WANDER },
36 { OK, false,false, 1, HIDE },
37 { OK, false,true, 1, ATTACK },
38 { OK, false,true, 2, HIDE },
39 { OK, true, false, 2, HIDE },
40 { OK, true, false, 1, HIDE },
41 { POOR, false,false, 0, WANDER },
42 { POOR, false,false, 1, HIDE },
43 { POOR, false,true, 1, HIDE },
44 { POOR, false,true, 2, RUN },
45 { POOR, true, false, 2, RUN },
46 { POOR, true, false, 1, HIDE }
49 char * behaviors[4] = { "Run", "Hide", "Wander", "Attack" };
51 #define NUM_EXAMPLES (sizeof(examples) / sizeof(Example))
53 static Example tests[] =
55 { GOOD, true, true, 1 },
56 { OK, true, true, 2 },
57 { POOR, false,false,0 },
58 { POOR, true, true, 1 },
59 { GOOD, false,true, 3 },
60 { GOOD, true, false,3 },
61 { POOR, true, false,3 }
64 #define NUM_TESTS (sizeof(tests) / sizeof(Example))
66 #define NUM_ITERATIONS 6000
68 #define LEARN_RATE 0.2
74 static Neuron inputNeurons[NUM_INPUT];
75 static Neuron hiddenNeurons[NUM_HIDDEN];
76 static Neuron outputNeurons[NUM_OUTPUT];
78 class NeuralApp : Application
82 // ********** CONSTRUCT NEURAL NETWORK *****************
86 RandomSeed((int)(GetTime() * 1000));
87 // Input to hidden cells synapses
88 for(i = 0; i<NUM_HIDDEN; i++)
89 hiddenNeurons[i].Init();
90 for(i = 0; i<NUM_OUTPUT; i++)
91 outputNeurons[i].Init();
92 for(i = 0; i<NUM_INPUT; i++)
94 Neuron * input = &inputNeurons[i];
97 input->axons.size = NUM_HIDDEN;
98 for(h = 0; h<NUM_HIDDEN; h++)
100 Neuron * hidden = &hiddenNeurons[h];
101 Synapse * synapse = &input->axons._[h];
103 if(!hidden->dendrons.size)
104 hidden->dendrons.size = NUM_INPUT;
105 hidden->dendrons._[i] = synapse;
107 synapse->dendron = input;
108 synapse->axon = hidden;
109 synapse->weight = GetRandDouble(-0.5, 0.5);
113 // Hidden to output cells synapses
114 for(h = 0; h<NUM_HIDDEN; h++)
116 Neuron * hidden = &hiddenNeurons[h];
118 hidden->axons.size = NUM_OUTPUT;
119 for(o = 0; o<NUM_OUTPUT; o++)
121 Neuron * output = &outputNeurons[o];
122 Synapse * synapse = &hidden->axons._[o];
124 if(!output->dendrons.size)
125 output->dendrons.size = NUM_HIDDEN;
126 output->dendrons._[h] = synapse;
128 synapse->dendron = hidden;
129 synapse->axon = output;
130 synapse->weight = GetRandDouble(-0.5, 0.5);
132 hidden->bias = GetRandDouble(-0.5, 0.5);
136 for(o = 0; o<NUM_OUTPUT; o++)
138 Neuron * output = &outputNeurons[o];
139 output->bias = GetRandDouble(-0.5, 0.5);
142 // ********** TRAIN NEURAL NETWORK *****************
143 for(i = 0; i<NUM_ITERATIONS; i++)
146 for(e = 0; e<NUM_EXAMPLES; e++)
148 Example * example = &examples[e];
150 for(c = 0; c<NUM_OUTPUT; c++)
151 outputNeurons[c].Unactivate();
153 inputNeurons[0].activation = (double)example->health;
154 inputNeurons[1].activation = example->hasKnife;
155 inputNeurons[2].activation = example->hasGun;
156 inputNeurons[3].activation = example->ennemies;
157 for(c = 0; c<NUM_OUTPUT; c++)
158 outputNeurons[c].Activate();
160 for(c = 0; c<NUM_OUTPUT; c++)
161 outputNeurons[c].error = ((double)example->result == c) - outputNeurons[c].activation;
163 for(c = 0; c<NUM_INPUT; c++)
164 inputNeurons[c].BackPropagate();
165 for(c = 0; c<NUM_OUTPUT; c++)
166 outputNeurons[c].Teach(LEARN_RATE);
170 // ********** TEST NEURAL NETWORK *****************
171 for(c = 0; c<NUM_EXAMPLES; c++)
173 Example * example = &examples[c];
176 for(o = 0; o<NUM_OUTPUT; o++)
177 outputNeurons[o].Unactivate();
179 inputNeurons[0].activation = (double)example->health;
180 inputNeurons[1].activation = example->hasKnife;
181 inputNeurons[2].activation = example->hasGun;
182 inputNeurons[3].activation = example->ennemies;
184 for(o = 0; o<NUM_OUTPUT; o++)
185 outputNeurons[o].Activate();
187 winner = Neuron_Winner(outputNeurons, NUM_OUTPUT);
188 printf("%s\n", behaviors[winner]);
191 // ********** UNKNOWN TEST CASES *****************
192 printf("\n\nUnknown Cases:\n\n");
193 for(c = 0; c<NUM_TESTS; c++)
195 Example * example = &tests[c];
198 for(o = 0; o<NUM_OUTPUT; o++)
199 outputNeurons[o].Unactivate();
201 inputNeurons[0].activation = (double)example->health;
202 inputNeurons[1].activation = example->hasKnife;
203 inputNeurons[2].activation = example->hasGun;
204 inputNeurons[3].activation = example->ennemies;
206 for(o = 0; o<NUM_OUTPUT; o++)
207 outputNeurons[o].Activate();
209 winner = Neuron_Winner(outputNeurons, NUM_OUTPUT);
210 printf("%s\n", behaviors[winner]);