📄 art2_c++.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 + -