www.pudn.com > bp_cpp.zip > neuron.h
#ifndef _PUBLIC_ANN_NEURON_H #define _PUBLIC_ANN_NEURON_H /* * public/ann/neuron.h * 2004-02-16 by ShanLanshan */ #include#include "public/ann/annbase.h" #include "public/ann/annfunc/annfunc.h" #include "public/ann/attrobj.h" #include "public/ann/neuronobj.h" namespace ann { class Neuron; /* 轴突 */ class Axone { public: AnnFuncGroup *m_funcgroup; /* 输出函数族 */ ann_float m_value; /* 输出 */ Neuron *m_neuron; /* 轴突所属于的神经元 */ list m_synapse; /* 所连结到的突触的列表 */ public: Axone(Neuron *neuron); ~Axone(); // 计算轴突输出 inline void cacu_output(); // 得到轴突突出 inline ann_float get_output() {return m_value;}; inline void set_output(ann_float v) {m_value= v;}; }; /* 突触权值 */ class SynapsePower: public SharedObj { private: ann_float m_value; public: inline SynapsePower() {m_value = 0;}; inline ann_float get_value() {return m_value;}; inline void set_value(ann_float v) {m_value = v;}; inline void update_value(ann_float v) {m_value += v;}; }; /* 突触 */ class Synapse: public LifeObj, public GridObj { public: list m_input; /* 第一个为输入轴突,其余为辅助轴突 */ SynapsePower *m_power; /* 输入权值 */ Neuron *m_neuron; /* 输入到的神经元 */ public: Synapse(Neuron *neuron, SynapsePower *power=NULL); ~Synapse(); // 取得连接在突出上的轴突引用 inline Axone& get_axone() {return *m_input.front();}; inline ann_float get_input() {return get_axone().get_output();}; inline Neuron* get_input_neuron() {return get_axone().m_neuron;}; inline void update_power(ann_float v) {m_power->update_value(v);}; inline ann_float get_power() {return m_power->get_value();}; inline void set_power(ann_float v) {m_power->set_value(v);}; // 计算突触的输出值 ann_float get_output(); }; /* 所有神经元类的父类 */ class Neuron: public NeuronObj, public LifeObj, public GridObj { protected: ann_float m_stimulation; /* 输入总和 */ //ann_func_p m_respond_func; /* 响应函数 */ ann_float m_respond; /* 响应 */ list m_synapse_list; /* 输入突触列表 */ list m_axone_list; /* 输出轴突列表 */ friend class Axone; friend class Synapse; friend class BPLayer; public: Neuron(); virtual ~Neuron(); // 随机化神经元初始状态 void random(); ann_float get_respond() {return m_respond;}; // 取得神经元的轴突引用 inline Axone& get_axone() {return m_axone_list.front();}; // 取神经元的输出函数族 inline AnnFuncGroup* get_output_func() {return get_axone().m_funcgroup;}; /* 设置神经元的输出函数 */ void set_output_func(AnnFuncGroup *g) {assert(g != NULL); get_axone().m_funcgroup = g;}; /* 计算神经元的响应值 */ virtual void respond(); /* 将神经元的响应值输出到轴突 */ virtual void output(); /* 接受突触的连接 */ int accept_conn(Axone &axone); /* 接受另外一个神经元的连接 */ int accept_conn(Neuron *neuron); /* 设置神经元的输出值 */ void set_output(ann_float v); /* 取得神经元的输出值 */ inline ann_float get_output() {return get_axone().get_output();}; }; } #endif /* !_PUBLIC_ANN_NEURON_H */