/// <summary> /// Aktualizuje wejscia po kolejnej rundzie gry /// </summary> /// <param name="AIDecision">własna decyzja</param> /// <param name="opponentDecision">decyzja przeciwnika</param> public void updateInputs(Decision AIDecision, Decision opponentDecision ) { //przesuwamy wejscia w prawo double[] oldInputs = new double[inputs.Length]; inputs.CopyTo(oldInputs, 0); for (int j = 3; j < inputs.Length; ++j) inputs[j] = oldInputs[j - 3]; //dopisujemy nowe wejscia for (int j = 0; j < 3; ++j) { inputs[j] = AIDecision.ToNeural()[j]; inputs[j + inputs.Length / 2] = opponentDecision.ToNeural()[j]; } }
/// <summary> /// Funkcja odpowiedzialna za proces nauki /// </summary> /// <param name="AIDecision">decyzja podjeta przez siec</param> /// <param name="opponentDecision">decyzja przeciwnika</param> public void updateWeights(Decision AIDecision, Decision opponentDecision) { Decision expectedDecision = opponentDecision.GetCounter(); //decyzja, ktora powinnismy podjac if (expectedDecision == AIDecision) return; //i tak sie wagi nie zmienia, wiec konczymy funkcje od razu double[] desiredOutput = expectedDecision.ToNeural(); double[] currentOutput = AIDecision.ToNeural(); for (int i = 0; i < outputs.Length; ++i) { double diff = (desiredOutput[i] - currentOutput[i]) * learningRate; //obliczamy poprawke for (int j = 0; j < inputs.Length; ++j) weights[i, j] += diff * inputs[j]; //wprowadzamy poprawke do wag sieci } if (minLearningRate < learningRate - learnigEnstinguishRate) learningRate -= learnigEnstinguishRate; }