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

📄 bpnet.h

📁 基于BP网络的C++源代码,可以进行逻辑运算
💻 H
字号:
#define P 30
#define Q 0.6

#include "iostream.h"
#include <math.h>


class BPNet
{
public:
	int nLayNumb;
	int nUnitNumb[4];
	double w[4][6][6];
	double OutPut[4][6],InPut[16][2];
	int bSuccess;
public:
	BPNet();
	~BPNet();
	void TestFunc();
};

BPNet::BPNet()
{
	int sum=0;

	cout<<"输入网络层数: ";
	cin>>nLayNumb;
	cout<<'\n';
	
	cout<<"输入各层神经元数: ";
	for (int i=0;i<nLayNumb;i++)
	{
		cin>>nUnitNumb[i];
	}
	cout<<'\n';

	for (int l=0;l<nLayNumb-1;l++)
	{
		for (int m=0;m<nUnitNumb[l];m++)
		{
			for (int n=0;n<nUnitNumb[l+1];n++)
			{
				sum++;
			}
		}
	}

	cout<<"输入"<<sum<<"个初始权值: ";

	for (l=1;l<nLayNumb;l++)
	{
		for (int m=0;m<nUnitNumb[l];m++)
		{
			for (int n=0;n<nUnitNumb[l-1];n++)
			{
				cin>>w[l][m][n];
			}
		}
	}
	cout<<'\n';
}

BPNet::~BPNet()
{

}

void BPNet::TestFunc()
{

	double dData[P][2]=
		{	1.0,0.8,   
			0.2,0.0,
			1.0,1.0,
			0.9,0.1,
			1.0,0.8,
			1.0,1.0,
			0.1,0.2,
			1.0,0.9,
			0.0,1.0,
			0.8,0.2,
			0.0,0.0,
			0.2,0.9,
			0.9,0.9,
			0.0,0.0,
			0.8,0.1,
			0.0,0.0,
			0.1,0.2,
			0.9,0.8,
			0.0,0.9,
			1.0,0.0,
			0.9,0.8,
			0.0,0.9,
			1.0,0.8,
			1.0,0.0,
			0.9,0.9,
			0.9,0.9,
			0.0,1.0,
			1.0,0.0,
			0.9,0.8,
			0.0,1.0
		};

	//double t[P]={1,0,1,0,1,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,0,0,1,0};//与
	double t[P]={0,0,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,1,1,0,1};  //异或
	//double t[P]={1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1};//或

	double dError[P][4][6],finalerror[P];
	int i,j,l,p,k;
	double sum=0,sum1=0;
	double wOffset[4][6][6];

	for (k=0;k<200000;k++)
	{
		
		
		for (p=0;p<P;p++)
		{
			for (j=0;j<nUnitNumb[0];j++)
			{
				OutPut[0][j]=dData[p][j];      //第p层各神经元的输出
			}

			for (l=1;l<nLayNumb;l++)
			{
				for (j=0;j<nUnitNumb[l];j++)
				{
					sum=0;
					for (i=0;i<nUnitNumb[l-1];i++)
					{
						sum+=w[l][j][i]*OutPut[l-1][i];
					}
					OutPut[l][j]=1/(1+exp(-sum));
				}
			}

			dError[p][nLayNumb-1][nUnitNumb[nLayNumb-1]-1]=
				(t[p]-OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1])*OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1]*(1-OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1]);		
		
			finalerror[p]=t[p]-OutPut[nLayNumb-1][nUnitNumb[nLayNumb-1]-1];
			
			if (fabs(finalerror[p])<0.2)
			{
				continue;
			}

			for (l=nLayNumb-2;l>=0;l--)
			{
				for (j=0;j<nUnitNumb[l];j++)
				{
					sum1=0;
					for (i=0;i<nUnitNumb[l+1];i++)
					{
						sum1+=w[l][j][i]*dError[p][l+1][i];
					}
					dError[p][l][j]=OutPut[l][j]*(1-OutPut[l][j])*sum1;
				}			
			}

			for (l=1;l<nLayNumb;l++)
			{
				for (j=0;j<nUnitNumb[l];j++)
				{
					for (i=0;i<nUnitNumb[l-1];i++)
					{
						wOffset[l][j][i]=Q*dError[p][l][j]*OutPut[l-1][i];
						w[l][j][i]+=wOffset[l][j][i];
					}
				}
			}
		
		}
		
		int errorToatl=0;

		for (i=0;i<P;i++)
		{
			if (fabs(finalerror[i])<0.2)
			{
				errorToatl+=1;
			}
		}
		
		if (errorToatl==P)
		{
			cout<<"样本学习结束!\n迭代次数:"<<k;
			cout<<'\n';	
			bSuccess=1;
			break;
		}
		else
		{
			bSuccess=0;
		}
	}

	

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -