📄 neucell.cpp
字号:
////neucell.cpp
//
#include "StdAfx.h"
#include "neucell.h"
#include <stdlib.h>
#include <time.h>
IMPLEMENT_SERIAL(CNeuCell, CObject,1)
CNeuCell::CNeuCell()
{
m_dInTemp=0;
m_dLim=0;
m_iType=NEURON_LIM;
m_iInputNum=1;
m_dNet=0;
m_dOutput=0;
m_dDeriv=0;
m_pdV=new double[1];
m_pdW=new double[1];
m_pdDivW=new double[1];
*m_pdW=0;
*m_pdV=0;
*m_pdDivW=0;
}
CNeuCell::CNeuCell(double ValveValue,NEURONTYPE TransferFunctionType,int InputNum)
{
m_dInTemp=0;
m_dLim=ValveValue;
m_iType=TransferFunctionType;
m_iInputNum=InputNum;
m_dNet=0;
m_dOutput=0;
m_pdDivW=new double[m_iInputNum];
m_pdV=new double[m_iInputNum];
m_pdW=new double[m_iInputNum];
srand((unsigned)time(NULL));
for (int i=0;i<m_iInputNum;i++)
{
*(m_pdW+i)=((double)rand())/32767;
*(m_pdV+i)=((double)rand())/32767;
*(m_pdDivW+i)=0;
}
}
CNeuCell::~CNeuCell()
{
delete [] m_pdV;
delete [] m_pdW;
}
void CNeuCell::SetNeuCell(double ValveValue,NEURONTYPE TransferFunctionType,int InputNum)
{
m_dInTemp=0;
m_dLim=ValveValue;
m_iType=TransferFunctionType;
m_iInputNum=InputNum;
delete [] m_pdV;
delete [] m_pdW;
delete [] m_pdDivW;
m_pdV=new double[m_iInputNum];
m_pdW=new double[m_iInputNum];
m_pdDivW=new double[m_iInputNum];
srand((unsigned)time(NULL));
for (int i=0;i<InputNum;i++)
{
*(m_pdW+i)=((double)rand())/32767;
*(m_pdV+i)=((double)rand())/32767;
*(m_pdDivW+i)=0;
}
}
void CNeuCell::InputV(int NumTh,double InputValue)
{
*(m_pdV+NumTh)=InputValue;
}
void CNeuCell::InputW(int NumTh,double InputValue)
{
*(m_pdDivW+NumTh)=InputValue-*(m_pdW+NumTh);
*(m_pdW+NumTh)=InputValue;
}
double CNeuCell::GetV(int NumTh)
{
return *(m_pdV+NumTh);
}
double CNeuCell::GetW(int NumTh)
{
return *(m_pdW+NumTh);
}
double CNeuCell::GetValve()
{
return m_dLim;
}
double CNeuCell::GetNet()
{
return m_dNet;
}
double CNeuCell::GetDeriv()
{
return m_dDeriv;
}
double CNeuCell::GetDivW(int Numth)
{
return *(m_pdDivW+Numth);
}
double CNeuCell::sigm(double par)
{
return 1/(1+exp(-par));
}
double CNeuCell::gaus(double par)
{
return exp(-par*par/2);
}
double CNeuCell::Output(bool CalculateOrNo)
{
if (CalculateOrNo)
{
for (int i=0;i<m_iInputNum;i++)
{
m_dInTemp+=*(m_pdV+i)*(*(m_pdW+i));
}
m_dNet=m_dInTemp-m_dLim;
m_dInTemp=0;
switch(m_iType)
{
case 1:
if (m_dNet>0)
m_dOutput=1;
else
m_dOutput=0;
break;
case 2:
if (m_dNet>0)
m_dOutput=1;
else
m_dOutput=-1;
break;
case 3:
m_dOutput=sigm(m_dNet);
m_dDeriv=m_dOutput*(1-m_dOutput);
break;
case 4:
m_dOutput=tanh(m_dNet);
m_dDeriv=1/(cosh(m_dNet)*cosh(m_dNet));
break;
case 5:
m_dOutput=gaus(m_dNet);
m_dDeriv=-m_dOutput*m_dNet;
break;
default:
m_dOutput=0;
break;
}
}
return m_dOutput;
}
void CNeuCell::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar<<m_dDeriv<<m_dInTemp<<m_dNet<<m_dOutput<<m_iInputNum<<m_iType<<m_dLim;
for (int i=0;i<m_iInputNum;i++)
{
ar<<m_pdV[i]<<m_pdW[i];
}
}
else
{
ar>>m_dDeriv>>m_dInTemp>>m_dNet>>m_dOutput>>m_iInputNum>>m_iType>>m_dLim;
for (int i=0;i<m_iInputNum;i++)
{
ar>>m_pdV[i]>>m_pdW[i];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -