📄 bp.cpp
字号:
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
FILE *fp;
double Q=0.5; //阈值
double TEM; //温度
#define N 1//样本个数
#define IN 4//样本输入个数
#define ON 4//样本输出个数
int X[N][IN]={{0,1,1,1}}; //隐层的输入
int Y[N][ON]={{0,1,1,1}}; //输出层输入
int W[IN][IN]; //隐层至输出层权值
int P[IN]; //单个样本输入数据
int T[ON]; //单个样本输出数据
int H[ON]; //用于起交换作用
int O[ON]; //输出层输出
double net[ON];
double PI[ON];
//初始化W
initial()
{
int i,j;
for(i=0;i<IN;i++)
{
for(j=0;j<IN;j++)
{
W[i][j]=X[N][i]*X[N][j];
}
}
//使对角线为0
for(i=0;i<IN;i++)
W[i][i]=0;
fprintf(fp,"初始化后W为:\n");
for(i=0;i<ON;i++) //输出
{
for(j=0;j<ON;j++)
fprintf(fp,"%d ",W[i][j]);
fprintf(fp,"\n");
}
return 1;
}//子程序initial()结束
//获得第m个样本的输入数据
input_P(int m)
{
for (int i=0;i<IN;i++)
P[i]=X[m][i];
return 1;
}
//子程序input_P(m)结束
//获得第m个样本的输出数据,本程序中没有作用
input_T(int m)
{
fprintf(fp,"理想输出为:");
for (int k=0;k<ON;k++)
{
T[k]=Y[m][k];
fprintf(fp,"%d ",T[k]);
}
fprintf(fp,"\n");
return 1;
}//子程序input_T(m)结束
//初始化O
H_I_O()
{
for (int k=0;k<N;k++)
{
for (int j=0;j<ON;j++)
O[j]=Y[k][j];
}
return 1;
}
//输出层输出:O*W
O_I_O()
{
//temp作用
for(int k=0;k<ON;k++)
{
H[k]=O[k];
O[k]=0;
}
//计算O*W
for (k=0;k<ON;k++)
{
for (int j=0;j<ON;j++)
O[k]=O[k]+H[j]*W[j][k];
}
//计算net[j]
for(k=0;k<ON;k++)
{
net[k]=O[k]+P[k];
}
return 1;
}
//子程序O_I_O()结束
/**********************/
/**程序入口,即主程序**/
/**********************/
main(void)
{
srand(time(NULL));/*随机函数种子*/
if ((fp=fopen("bp.txt","a+"))==NULL)
{
printf("不能创建bp.txt文件!\n");
exit(1);
}
int time=0;//训练次数
double PE=0.2,PT=0.1; //预定误差和最小温度
TEM=10;//初始温度
double T_var,r;
initial();//初始化W
H_I_O(); //初始化输出O
do
{
++time; //学习次数加一
fprintf(fp,"-----------------\n");
fprintf(fp,"第%d 轮:",time);
fprintf(fp,"\n");
for (int m=0;m<N;m++)
{
input_P(m);//获得第m个样本的输入数据
input_T(m);//获得第m个样本的输出数据
O_I_O(); //第m个样本到输出层的输出O
r=(rand()%9+1)*0.1;//产生0.1-0.9的随机数
fprintf(fp,"实际输出为:");
for(int i=0;i<ON;i++)
{
PI[i]=1/(1+exp(-1*(net[i]-Q)/TEM));
if(PI[i]>r)
O[i]=1;
else
O[i]=0;
fprintf(fp,"%d ",O[i]);
}
fprintf(fp,"\n");
T_var=(rand()%2+8)*0.1;//产生0.8-0.9的随机数
TEM=TEM*T_var;
} //全部样本训练完毕
}while(TEM>PT);
//输出
fprintf(fp,"现在的温度为: %f \n",TEM);
printf("现在的温度为: %f \n",TEM);
fclose(fp);
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -