public virtual void ReinforcementLearning3(double reward, bool useAbleitung) { if (useAbleitung) { for (int i = 0; i < NeuronValue.Last().Length; ++i) { NeuronDeltaValue[NeuronDeltaValue.Length - 1][i] = 0; NeuronDeltaValue[NeuronDeltaValue.Length - 1][i] = (NeuronValue.Last()[i] * reward) * NeuroMaths.Ableitung(NeuronArt.Last(), NeuronValue.Last()[i], ArtT.Last()); } } else { for (int i = 0; i < NeuronValue.Last().Length; ++i) { NeuronDeltaValue[NeuronDeltaValue.Length - 1][i] = 0; NeuronDeltaValue[NeuronDeltaValue.Length - 1][i] = (NeuronValue.Last()[i] * reward); } } for (int i0 = NeuronValue.Length - 2; i0 > 0; --i0) { for (int i1 = 0; i1 < NeuronValue[i0].Length; ++i1) { NeuronDeltaValue[i0][i1] = 0; for (int i2 = 0; i2 < NeuronValue[i0 + 1].Length; ++i2) { NeuronDeltaValue[i0][i1] += Weights[i0][i1][i2] * NeuronDeltaValue[i0 + 1][i2]; } NeuronDeltaValue[i0][i1] *= NeuroMaths.Ableitung(NeuronArt[i0], NeuronValue[i0][i1], ArtT[i0]); } } }
public void DeltawertBerechen(double[] outputSoll) { if (outputSoll.Length != NeuronDeltaValue.Last().Length) { throw new Exception("Der gewollte Output hat die Falsche länge"); } for (int i = 0; i < NeuronValue.Last().Length; ++i) { NeuronDeltaValue[NeuronDeltaValue.Length - 1][i] = 0; NeuronDeltaValue[NeuronDeltaValue.Length - 1][i] = NeuroMaths.Ableitung(NeuronArt.Last(), NeuronValue.Last()[i], ArtT.Last()) * (outputSoll[i] - NeuronValue.Last()[i]); } for (int i0 = NeuronValue.Length - 2; i0 > 0; --i0) { Parallel.For(0, NeuronValue[i0].Length, i1 => { NeuronDeltaValue[i0][i1] = 0; for (int i2 = 0; i2 < NeuronValue[i0 + 1].Length; ++i2) { NeuronDeltaValue[i0][i1] += Weights[i0][i1][i2] * NeuronDeltaValue[i0 + 1][i2]; } NeuronDeltaValue[i0][i1] *= NeuroMaths.Ableitung(NeuronArt[i0], NeuronValue[i0][i1], ArtT[i0]); }); } }