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

📄 neucell.cpp

📁 BP神经网络程序
💻 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 + -