import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.io.*;
import javax.swing.Timer;
public class BP {
static double[] objectPattern = {8,7,8,7,9,7,8,8,9,6};// 训练样本期望输出值
static double[] finalOutput = new double[10];// 一共10个样本输出值
// double[][] initInput = {
// {40,10,15,35,11,12,11,8,10,11},
// {36,38,35,10,9,7,11,32,7,31},
// {34,15,18,13,35,33,33,8,32,11},
// {40,29,29,29,7,27,28,21,27,27},
// {16,9,13,16,26,28,9,27,9,15},
// {16,8,12,12,9,18,9,18,7,12},
// {27,8,12,10,13,25,12,10,10,25},
// {8,10,10,25,25,10,25,12,25,16},
// {26,26,26,9,18,16,13,25,12,9},
// {24,20,24,24,20,11,10,8,6,16},
// };// 训练样本输入值一共10对
static double[][] testInput = {
{40,10,15,35,11,12,11,8,10,11},
{36,38,35,10,9,7,11,32,7,31},
{34,15,18,13,35,33,33,8,32,11},
{40,29,29,29,7,27,28,21,27,27},
{16,9,13,16,26,28,9,27,9,15},
{16,8,12,12,9,18,9,18,7,12},
{27,8,12,10,13,25,12,10,10,25},
{8,10,10,25,25,10,25,12,25,16},
{26,26,26,9,18,16,13,25,12,9},
{24,20,24,24,20,11,10,8,6,16},};
static int inputNum = 10, middleNum = 30, outputNum = 1;// 输入层,隐层,输出层神经元个数
static double[][] v = new double[middleNum][inputNum];// 输入层与隐层连接权
static double[] w = new double[middleNum];// 隐层与输出层连接权
static double[] r = new double[middleNum];// 隐层阈值
static double[] y = new double[middleNum];// 隐层输出值
static double q = 0;// 输出层输出值
static double e2 = Math.random() * 2 - 1;// 输出层阈值
static double a = 3;// 权学习指数
static double b = 3;// 阈学习指数
static double c = 0.6;// 动量因子
double d = 1.1;// 比例因子
static int count = 1;// 学习计数器
static double ei = 1;// 目标均方误差阈值并作为学习停止的条件
static double ex = 0;// 传递输出误差的中间参数
static double[][] vi = new double[middleNum][inputNum];// 输入层与隐层连接权变化值
static double[] wi = new double[middleNum];// 隐层与输出层连接权变化值
static double[] ri = new double[middleNum];// 隐层阈值变化值
static double ie = 0;// 输出层阈值变化值
static double errorOfOutput = 0;
static int count1 = 0;
static int count2 = 0;
static int maxcount = 0;
static int max = 0;
static double max1 = 0;
static double zhengquelv = 0;
public static void main(String[] args) {
// ArrayList<double[][]> initInput=new ArrayList<double[][]>();
double[][] initInput=new double[1000][10];
double[] temp1=new double[10];
// ArrayList<ArrayList<double[]>> initInput = new ArrayList<ArrayList<double[]>>();
/*initInput=new ArrayList<double[]>();*/
File file = new File("C:/Users/Administrator/Desktop/initInput.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
String line1[]= new String[10];
int hangshu=0;
while(line!=null){
line1=line.split(",");
for(int i=0;i<10;i++)
{temp1[i]=Double.valueOf(line1[i]);
// double a1=Double.valueOf(line1[0]);
// double b1=Double.valueOf(line1[1]);
// double c1=Double.valueOf(line1[2]);
// double d1=Double.valueOf(line1[3]);
// double e1=Double.valueOf(line1[4]);
// double f1=Double.valueOf(line1[5]);
// double g1=Double.valueOf(line1[6]);
// double h1=Double.valueOf(line1[7]);
// double i1=Double.valueOf(line1[8]);
// double j1=Double.valueOf(line1[9]);
initInput[hangshu][i]=temp1[i];
}
// initInput.add(new double[]{a1,b1,c1,d1,e1,f1,g1,h1,i1,j1});
hangshu++;
line = reader.readLine();
}
// for(int i=0;i<hangshu;i++)
// for(int j=1;j<10;j++)
// {System.out.print(initInput[i][j]+"\t");
// System.out.println();}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BP bp = new BP();
for (int p = 0; p < 30; p++) {
int sumcount = 0;
ei = 1;
max = 1;
maxcount = 0;
max1 = 0;
for (int t = 0; t < 30; t++) {
ei = 1;
max = 0;
bp.init();
for (count = 1; count < 30000 && ei > 0.01; count++) {// 学习停止条件
bp.calculate();
}
// System.out.println("总共学习"+count+"次");
sumcount = sumcount + count;
for (int k = 0; k < 10; k++) {
double[] inputOfThisTime = testInput[k];// 选择训练对进行训练,输入训练对
double objectOfThisTime = objectPattern[k];// 选择训练对进行训练,输出训练对
double errorOfOutput = 0;// 输出层各单元误差
double[] errorOfMiddle = new double[middleNum];// 隐层各单元误差
double temp = 0;
for (int j = 0; j < v.length; j++) {
for (int i = 0; i < v[0].length; i++) {
temp += v[j][i] * inputOfThisTime[i];
}
y[j] = 1 / (1 + Math.exp((-1) * (temp - r[j])));// 隐层的输出
}
temp = 0;
for (int i = 0; i < w.length; i++) {
temp += w[i] * y[i];
}
finalOutput[k] = 1 / (1 + Math.exp((-1) * (temp - e2)));
if (finalOutput[k] > max1) {
max1 = finalOutput[k];
max = k;
}
// System.out.println("选择系统"+finalOutput[k]);
}
if (max == 0) {
maxcount = maxcount + 1;
}
}// 输出层的输出
System.out.print("平均选择次数" + sumcount / 30);
zhengquelv = (double) maxcount / 30.0;
System.out.print(" 选择正确个数" + maxcount);
System.out.println(" 第" + (p + 1) + "次" + "选择正确率" + zhengquelv);
maxcount = 0;
}
}
void init() {// 初始化各参数
for (int i = 0; i < inputNum; i++)
for (int j = 0; j < middleNum; j++) {
v[j][i] = Math.random() * 2 - 1;// 初始化输入层与隐层之间的连接权
w[j] = Math.random() * 2 - 1;// 初始化隐层与输出层连接权
r[j] = Math.random() * 2 - 1;// 初始化隐层阈值
vi[j][i] = 0;// 初始化输入层与隐层之间的连接权变化
wi[j] = 0;// 初始化隐层与输出层之间连接权变化值
ri[j] = 0;// 初始化隐层阈值
}
}
private void calculate() {
double[][] initInput=new double[1000][10];
double errorOfOutput = 0;// 输出层各单元误差
double[][] errorOfMiddlesums = new double[middleNum][inputNum];
double[] errorOfMiddlesum = new double[middleNum];// 所有训练队隐层各单元误差总和
double[] errorOfMiddlesum1 = new double[middleNum];
double[] errorOfMiddle1 = new double[middleNum];
double errorOfOutputsum = 0;
double changeOfOutput = 0;
double changeOfOutputsum = 0;
double changeOutput = 0;
double changeOutputsum = 0;
double[] ysum = new double[middleNum];
for (int k = 0; k < 10; k++) {
double[] inputOfThisTime = initInput[k];// 选择训练对进行训练,输入训练对
double objectOfThisTime = objectPattern[k];// 选择训练对进行训练,输出训练对
double[] errorOfMiddle = new double[middleNum];// 隐层各单元误差
double temp = 0;
for (int j = 0; j < v.length; j++) {
for (int i = 0; i < v[0].length; i++) {
temp += v[j][i] * inputOfThisTime[i];
}
y[j] = 1 / (1 + Math.exp((-1) * (temp - r[j])));// 隐层的输出
}
temp = 0;
for (int i = 0; i < w.length; i++) {
temp += w[i] * y[i];
}
finalOutput[k] = 1 / (1 + Math.exp((-1) * (temp - e2)));// 输出层的输出
changeOfOutput = (objectOfThisTime - finalOutput[k])
* (objectOfThisTime - finalOutput[k]);// 每个训练对输出层输出的均方差
changeOfOutputsum += changeOfOutput;// 输出层输出的均方差的和
errorOfOutput = (objectOfThisTime - finalOutput[k])
* finalOutput[k] * (1 - finalOutput[k]);// 每个输出层各单元误差
errorOfOutputsum += errorO