public static double ComputePassRate(string[] lines, CrossroadControllerReinforcement crossroadController) { var passRate = 0.0; foreach (var line in lines) { var input = new double[crossroadController.NofTrafficLights]; var output = new double[crossroadController.NofStates]; var values = line.Split(' '); for (var i = 0; i < crossroadController.NofTrafficLights; i++) { input[i] = double.Parse(values[i], CultureInfo.InvariantCulture); } for (var i = 0; i < crossroadController.NofStates; i++) { output[i] = double.Parse(values[crossroadController.NofTrafficLights + i]); } var isPassed = true; for (var i = 0; i < crossroadController.NofStates; i++) { for (var j = 0; j < crossroadController.NofTrafficLights; j++) { crossroadController.RNeurons[i].dendrits[j] = input[j] * crossroadController.W1[j, i]; } crossroadController.RNeurons[i].Activation(); if (Math.Abs(crossroadController.RNeurons[i].axon - output[i]) > 0.1) { isPassed = false; break; } } if (isPassed) { passRate += 1.0; } } return(passRate / lines.Length); }
public static void TeachW1(CrossroadControllerReinforcement crossroadController, string pathToEducationExample) { var lines = File.ReadAllLines(pathToEducationExample); double bestPassRate = ComputePassRate(lines, crossroadController); var bestMatrix = new double[crossroadController.NofTrafficLights, crossroadController.NofStates]; CopyMatrix(crossroadController.W1, bestMatrix, crossroadController.NofTrafficLights, crossroadController.NofStates); foreach (var line in lines) { var input = new double[crossroadController.NofTrafficLights]; var output = new double[crossroadController.NofStates]; var values = line.Split(' '); for (var i = 0; i < crossroadController.NofTrafficLights; i++) { input[i] = double.Parse(values[i], CultureInfo.InvariantCulture); } for (var i = 0; i < crossroadController.NofStates; i++) { output[i] = double.Parse(values[crossroadController.NofTrafficLights + i]); } var nofRepeats = 0; for (var i = 0; i < crossroadController.NofStates; i++) { if (nofRepeats >= 100) { nofRepeats = 0; continue; } for (var j = 0; j < crossroadController.NofTrafficLights; j++) { crossroadController.RNeurons[i].dendrits[j] = input[j] * crossroadController.W1[j, i]; } crossroadController.RNeurons[i].Activation(); if (Math.Abs(crossroadController.RNeurons[i].axon - output[i]) > 0.1) { // double e = (output[i] - crossroadController.RNeurons[i].axon) * // crossroadController.RNeurons[i].axon * (1 - crossroadController.RNeurons[i].axon); for (var j = 0; j < crossroadController.NofTrafficLights; j++) { //crossroadController.W1[j, i] += 0.01 * (input[j] - crossroadController.W1[j, i]); crossroadController.W1[j, i] = crossroadController.W1[j, i] + (output[i] - crossroadController.RNeurons[i].axon) * input[j]; // crossroadController.W1[j, i] = crossroadController.W1[j, i] + 0.025*e*input[j]; } double newPassRate = ComputePassRate(lines, crossroadController); if (newPassRate > bestPassRate) { bestPassRate = newPassRate; CopyMatrix(crossroadController.W1, bestMatrix, crossroadController.NofTrafficLights, crossroadController.NofStates); } i--; nofRepeats++; } else { nofRepeats = 0; } /* if (Math.Abs(crossroadController.RNeurons[i].axon - output[i] - (-1)) < double.Epsilon) * { * double e = (output[i] - crossroadController.RNeurons[i].axon)* * crossroadController.RNeurons[i].axon*(1 - crossroadController.RNeurons[i].axon); * * for (var j = 0; j < crossroadController.NofTrafficLights; j++) * { * //crossroadController.W1[j, i] += 0.01*(input[j] - crossroadController.W1[j, i]); * crossroadController.W1[j, i] = crossroadController.W1[j, i] + 0.025*e*input[j]; * } * * double newPassRate = ComputePassRate(lines, crossroadController); * if (newPassRate > bestPassRate) * { * bestPassRate = newPassRate; * CopyMatrix(crossroadController.W1, bestMatrix, crossroadController.NofTrafficLights, crossroadController.NofStates); * } * * i--; * nofRepeats++; * } * else if (Math.Abs(crossroadController.RNeurons[i].axon - output[i] - 1) < double.Epsilon) * { * double e = (output[i] - crossroadController.RNeurons[i].axon) * * crossroadController.RNeurons[i].axon * (1 - crossroadController.RNeurons[i].axon); * * for (var j = 0; j < crossroadController.NofTrafficLights; j++) * { * //crossroadController.W1[j, i] -= 0.01*(input[j] - crossroadController.W1[j, i]); * crossroadController.W1[j, i] = crossroadController.W1[j, i] + 0.025 * e * input[j]; * } * * double newPassRate = ComputePassRate(lines, crossroadController); * if (newPassRate > bestPassRate) * { * bestPassRate = newPassRate; * CopyMatrix(crossroadController.W1, bestMatrix, crossroadController.NofTrafficLights, crossroadController.NofStates); * } * * i--; * nofRepeats++; * } * else * { * nofRepeats = 0; * }*/ } } }