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

📄 art2_c++.cpp

📁 人工神经网络arp2算法常规
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include<iostream.h>


//DEFINE	
#define N 5//N维输入的个数
#define Mi 40//神经元个数的最大值
#define ru 0.996//阈值


class ART2
{
private:
	int M;//当前的神经元个数
	int I;//竞争优胜输出或新的输出
	int k;//记录重置次数
	int Restrain[Mi];//记录重置位子
	int pp;//竞争次数
	double a;//系数
	double b;//系数
	double c;//系数
	double d;//系数
	double cta;//非线性变换阈值
	double tMax;//t向量中的最大值									
	double z[N];//向量参数
	double v[N];//向量参数
	double q[N];//向量参数
	double s[N];//向量参数
	double u[N];//向量参数
	double p[N];//向量参数
	double t[N];//向量参数
	double r[N];//向量参数
	double y[N];//抑止向量
	double x[N];//输入的N维向量
	double w1[Mi][N];//由底向上的权值
	double w2[N][Mi];//有顶向下的权值
	double ZModule;//z的模|Z|
	double PModule;//p的模|P|
	double UModule;//u的模|U|
	double RModule;//r的模|R|
	double VModule;//v的模|V|
	double SModule;
	double QModule;
	void Train();//权值训练函数
	void AddNervecell();//增加神经元
	void SearchLayer();//搜索
	void RunF1();//运行F1场
	void Competition();//获得竞争神经元
	double NonlinerChange(double );//非线性变化
	double GetModule(double *,int );//得到模
public:
	ART2(void);
	void LoadData();//输入数据
	void Run();//运行
	void ShowResult();//显示结果
};


ART2::ART2()
{
	int i,j;
	a=10;
	b=10;
	c=0.1;
	d=0.9;
	cta=1.0/sqrt(N);
	I=0;
	M=1;//当前输出层的神经元个数
	for(j=0;j<N;j++)
		for(i=0;i<M;i++)
		{
			w1[i][j]=1.0/((1-d)*2);///////sqrt(N)
			w2[j][i]=0;
		}
		for(j=0;j<N;j++)
		{
			u[j]=0;
			s[j]=0;
			q[j]=0;
			p[j]=0;
			v[j]=0;
		}
}


void ART2::LoadData(void)
{
	int i,j;
	cout<<"输入"<<N<<"维的向量:\n";
	for(j=0;j<N;j++)cin>>x[j];
	for(i=0;i<Mi;i++)
		Restrain[i]=-1;
	for(j=0;j<N;j++)
	{
		t[j]=0;
	}
	for(i=0;i<M;i++)
		y[i]=0;
	k=0;
	pp=0;
}


double ART2::GetModule(double mo[],int n)
{
	int j;
	double T;
	T=0;
	for(j=0;j<n;j++)T+=mo[j]*mo[j];
	T=sqrt(T);
	return (T);
}


double ART2::NonlinerChange(double x)
{
	double f;
	if(x>=cta)
		f=x;
	else
		f=0;
	return (f);
}


void ART2::RunF1(void)
{
	int i,j;
	double fq[N];//f(q[i])
	double fs[N];//f(s[i])
	for(j=0;j<N;j++)
		z[j]=x[j]+a*u[j];

	ZModule=GetModule(z,N);
	for(j=0;j<N;j++)
	{
		if(ZModule!=0)
			q[j]=z[j]/(ZModule);
		else
			q[j]=0;
	}


	for(j=0;j<N;j++)
	{
		fq[j]=NonlinerChange(q[j]);
		fs[j]=NonlinerChange(s[j]);
		v[j]=fq[j]+b*fs[j];
	}

	VModule=GetModule(v,N);
	for(j=0;j<N;j++)
	{
		if(VModule!=0)
			u[j]=v[j]/(VModule);								 
		else
			u[j]=0;
	}

	for(j=0;j<N;j++)
		p[j]=u[j];						

	for(i=0;i<M;i++)
		for(j=0;j<N;j++)
			t[i]+=w1[i][j]*p[j];

}


void ART2::Competition()
{
	int i,j;
	tMax=0;	
	for(i=0;i<M;i++)						
	{	
		j=0;
		while(i!=Restrain[j]&&j<N)
			j++;
		if(tMax<t[i]&&j==N)						
		{
			tMax=t[i];
			I=i;								
		}
	}

	for(i=0;i<M;i++)
		y[i]=0;					
	y[I]=1;
	for(j=0;j<N;j++)p[j]=u[j]+d*w2[j][I];					

	PModule=GetModule(p,N);			
	for(j=0;j<N;j++)
	{
		if(PModule!=0)
			s[j]=p[j]/(PModule);
		else
			s[j]=0;
	}
	UModule=GetModule(u,N);
	for(j=0;j<N;j++)
	{
		if(UModule!=0||PModule!=0)
			r[j]=(u[j]+c*p[j])/(UModule+c*PModule);
		else
			r[j]=0;
	}
	RModule=GetModule(r,N);
	pp++;
}


void ART2::SearchLayer()
{
		Restrain[k]=I;
		k++;//竞争节点所受抑制的位置的存储
}


void ART2::AddNervecell(void)
{
	int j;
	M++;
	for(j=0;j<N;j++)
	{
		w1[j][M-1]=1.0/((1-d)*sqrt(N));
		w2[M-1][j]=0;
	}
	cout<<"当前所有神经元都不相似,故增加新的神经元!\n";
	I=M-1;
}


void ART2::Train(void)
{
	int j;
	for(j=0;j<N;j++)
	{
		w1[I][j]+=d*(p[j]-w1[I][j]);
		w2[j][I]+=d*(p[j]-w2[j][I]);
	}
}


void ART2::Run(void)
{
	RunF1();
	while(pp<=M)
	{
		Competition();
		if(RModule>=ru)
			break;
		else
			SearchLayer();
	}
	if(pp>M)
		AddNervecell();
	Train();
}


void ART2::ShowResult(void)
{
	cout<<"输出结果为:\n";
	cout<<"第"<<I+1<<"个输出神经元获胜!\n";
	cout<<'\n';
}


ART2 ART;

void main()
{
	int j;
	for(j=0;j<40;j++)
	{
		ART.LoadData();
		ART.Run();
		ART.ShowResult();
	}
}

⌨️ 快捷键说明

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