⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.cpp

📁 统计Hopfield网运行算法经过调试可以运行
💻 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 + -