public SpikingNetwork(int InputCount, int OutputCount, int Layers, int NeuronAmount, int SynapsAmount) { Inputs = new float[InputCount]; Outputs = new float[OutputCount]; Neurons = new Neuron[Layers + 2][]; Neurons[0] = new Neuron[InputCount]; Neurons[Layers + 1] = new Neuron[OutputCount]; for (int i = 0; i < Layers; i++) { Neurons[i + 1] = new Neuron[NeuronAmount]; } for (int i = 0; i < Layers + 2; i++) { for (int j = 0; j < Neurons[i].Length; j++) { Neurons[i][j] = new Neuron(Form1.Rand.Next(3, 7)); if (i < Neurons.Length - 1) { for (int k = 0; k < Neurons[i + 1].Length; k++) { if (Form1.Rand.NextDouble() > 0.1) { Synaps S = new Synaps(k, SynapsDir.Forward); Neurons[i][j].Synapses.Add(S); } } } if (i > 0) { for (int k = 0; k < Neurons[i - 1].Length; k++) { if (Form1.Rand.NextDouble() > 0.01) { Synaps S = new Synaps(k, SynapsDir.Backward); Neurons[i][j].Synapses.Add(S); } } } } } /*for (int i = 0; i < SynapsAmount; i++) * { * int Layer = Form1.Rand.Next(Neurons.Length); * SynapsDir Dir = (Form1.Rand.NextDouble()>0.25||Layer==0)&& Layer !=Layers+1? SynapsDir.Forward : SynapsDir.Backward; * if(Dir== SynapsDir.Forward) * { * Synaps S = new Synaps(Form1.Rand.Next(Neurons[Layer + 1].Length), Dir, Lerp(-0.2f, 0.75f, (float)Form1.Rand.NextDouble()), Form1.Rand.Next(2, 5)); * Neurons[Layer][Form1.Rand.Next(Neurons[Layer].Length)].Synapses.Add(S); * }else * { * Synaps S = new Synaps(Form1.Rand.Next(Neurons[Layer - 1].Length), Dir, Lerp(-0.2f, 0.75f, (float)Form1.Rand.NextDouble()), Form1.Rand.Next(2, 5)); * Neurons[Layer][Form1.Rand.Next(Neurons[Layer].Length)].Synapses.Add(S); * } * }*/ }
int SynapsExist(int Layer, int Source, int Target, SynapsDir Dir) { for (int i = 0; i < Neurons[Layer][Source].Synapses.Count; i++) { Synaps S = Neurons[Layer][Source].Synapses[i]; if (S.Dir == Dir && S.Id == Target) { return(i); } } return(-1); }