using System; using System.IO; namespace AIProject { class BackPropagationNeuralNetwork { private int Mode; // 0:binary 1:bipolar private int MaxEpoch; private int Epoch; private int NumberOfInput; private int NumberOfOutput; private double alpha; private double TestSetError; private double ErrorLimit; private int maxiter; private int NumberOfHiddenUnit; private int[][] training_data_input; private int[][] training_data_output; private double[] x; private double[] y; private double[] y_in; private double[] delta_y; private double[] z_in; private double[] delta_z_in; private double[] z; private double[] delta_z; private double[][] v; private double[][] delta_v; private double[][] w; private double[][] delta_w; public int getMode() { return Mode; } public void setMode(int newmode) { Mode=newmode; } public int getNumberOfOutput() { return NumberOfOutput; } public int getNumberOfInput() { return NumberOfInput; } public int getMaxEpoch() { return MaxEpoch; } public void setMaxEpoch(int newmaxepoch) { MaxEpoch=newmaxepoch; } public int getNumberOfHiddenUnit() { return NumberOfHiddenUnit; } public double getAlpha() { return alpha; } public void setAlpha(double newalpha) { alpha=newalpha; } public double getErrorLimit() { return ErrorLimit; } public void setErrorLimit(double errlimit) { ErrorLimit=errlimit; } public int getMaximumNumberOfIteration() { return maxiter; } public void setMaximumNumberOfIteration(int iter) { maxiter=iter; } public double getTestSetError() { return TestSetError; } public int SaveToFile(string FileName) { if (System.IO.File.Exists(FileName)) { System.Console.WriteLine("{0} sudah ada.", FileName); return 1; } System.IO.StreamWriter sr = System.IO.File.CreateText(FileName); sr.Close(); return 0; } public int LoadFromFile(string FileName) { try { using (StreamReader sr = new StreamReader(FileName)) { String line; while ((line = sr.ReadLine()) != null) { } } } catch (Exception e) { Console.WriteLine("The file could not be read:"); Console.WriteLine(e.Message); return 1; } return 0; } public void setV(int[] new_v) { Array.Copy(new_v,v,new_v.Length); } public void setW(int[] new_w) { Array.Copy(new_w,w,new_w.Length); } public void AddTrainingDataInput(int[] input) { //TODO: add checking to the number of input, make sure it's consistent if (training_data_input==null) { training_data_input=new int[1][]; training_data_input[0]=input; } else { int[][] temp=new int[training_data_input.Length+1][]; Array.Copy(training_data_input,temp,training_data_input.Length); Array.Copy(input,training_data_input[training_data_input.GetUpperBound(0)],input.Length); } } public void AddTrainingDataOutput(int[] output) { if (training_data_output==null) { training_data_output=new int[1][]; training_data_output[0]=output; } else { int[][] temp=new int[training_data_output.Length+1][]; Array.Copy(training_data_output,temp,training_data_output.Length); Array.Copy(output,training_data_output[training_data_output.GetUpperBound(0)],output.Length); } } public void train() { int repx; double error; while ( (EpochErrorLimit) ) { error=0; for (repx=0;repx