www.pudn.com > 基于VC的神经网络开发程序包(源码).rar > HopfieldNetwork.h
#ifndef _HOPFIELDNETWORK_H #define _HOPFIELDNETWORK_H #include "Network.h" #include "RecurrentNeuron.h" #include "Matrix.h" #includenamespace annie { /** Similar to the signum function, but used for non-bipolar Hopfield networks. * @param x A real value * @return 0 if x<=0, 1 otherwise. */ real isPositive(real x); /** A Hopfield network - content addressable memory and energy. * The Hopfield network is considered a landmark in the field of neural computing. * This model can store a number of patterns and retrieve the correct pattern starting * from a noisy or incomplete pattern so that a network can be trained to identify * patterns or images. Hopfield proposed this model as a model of biological memory * (often called "content addressable memory"), similar to the way a human brain * recognizes an image based on the past experience or learning. * * Hopfield also introduced another important idea by establishing a new connection * between computation and physics with the concept of energy in his model and showed * that computation can be viewed as a transition to lower energy states. */ class HopfieldNetwork : public Network { protected: /// true if patterns are bipolar (ie, elements are -1 or 1), false if not (elements are 0 or 1) bool _bipolar; /// The number of patterns that have been given to the network to be stored int _nPatterns; /// The weight matrix of the network Matrix *_weightMatrix; /// The recurrent neurons, each of them is connected to everyone else with weights from the weight matrix RecurrentNeuron** _neurons; virtual bool _equal(std::vector &p1, std::vector &p2); int _time; public: /** Creates a Hopfield network, which can store bipolar binary patterns * (i.e., patterns consisting of -1's and 1's). * Diagonal elments of the weight matrix will be zero. * Neurons will NOT have a bias. * @param size The size/number of bits of/in the patterns to be stored */ HopfieldNetwork(int size); /** Creates a Hopfield network, which can store binary patterns. * Diagonal elments of the weight matrix will be zero. * @param size The size/number of bits of/in the patterns to be stored * @param bias true if the neurons are to have a bias, false otherwise * @param bipolar true if patterns are bipolar (elements are -1 or 1), false if not * (elements are 0 or 1). */ HopfieldNetwork(int size, bool bias, bool bipolar); /** Loads a Hopfield network from a file. * @see save * @param filename The name of the filename to load the network from * @throws Exception on any error */ HopfieldNetwork(const char *filename); /// Cleans up memory by getting rid of the weight matrix and neurons virtual ~HopfieldNetwork(); /** Adds a pattern to the network by making suitable adjustments to the weight * matrix. * @param pattern The bipolar pattern (of getSize() length) to be stored * @throws Exception If the given pattern is not bipolar (i.e., consisting of only -1s and 1s) and * the network is designed for bipolar patters or if the pattern does not consist of 0s and 1s */ virtual void addPattern(int pattern[]); /// Returns the energy at the current state of the network. virtual real getEnergy(); /** Returns the energy of the supplied pattern. * Energy of a pattern depends on the weight matrix */ virtual real getEnergy(int pattern[]); /// Returns the size of the patterns that can be stored (i.e., length of the pattern vector) virtual int getSize(); /// Steps the network in time virtual void step(); /** The number of steps the network has taken since the last call to getOutput * @see getNextOutput * @see getOutput */ virtual int getTime(); /** The number of patterns that the network has been instructed to store * This will be the same as the number of calls to addPattern * @see addPattern */ virtual int getPatternCount(); /// Returns a copy of the weight matrix that is used by this network virtual Matrix getWeightMatrix(); /// Returns "HopfieldNetwork" virtual const char* getClassName(); /** Saves the network to a file * \todo Implement this! * @param filename The name of the file to store the network into so that it * can be loaded from there later */ virtual void save(const char *filename); /** Sets the weight between the ith and jth neuron. * Since the weights are symmetruc, the weight between * neuron i and neuron j will be the same as the weight * between neuron j and neuron i, which will be the same * as the weight supplied. * @param i The ith neuron * @param j The jth neuron * @param weight The weight of the link (i,j) and (j,i) */ virtual void setWeight(int i, int j, real weight); /* Given an input pattern, keeps iterating through time till the network * output converges. Ofcourse, it is possible that this never happens * and hence a timeout has to be specified. * \todo Implement this! * @param pattern The initial input pattern given to the network * @param updateAll Determines type of updating (synchronous, asynchronous) * @param timeout The maximum number of iteration to try convergence for * @return false if the network output didn't converge till the timeout, true otherwise */ //virtual bool converge(int pattern[], bool updateAll, int timeout); /** Get the bias at the given neuron * @param i The neuron whose bias is wanted * @return The bias */ virtual real getBias(int i); /** Sets the bias of the given neuron. * @param i The neuron whose bias is to be set * @param bias The bias value to give the ith neuron */ virtual void setBias(int i, real bias); /** Sets the initial output of the neurons to the values * in the given array and resets time to 0. * @param pattern An array containing the initial outputs of the * neurons. The array must contain getSize() elements */ virtual void setInput(int pattern[]); /** Sets the initial output of the neuron to the values * in the given vector of integers and sets time to 0. * @param pattern A vector of integers containing the initial outputs * of the neurons. The vector must contain getSize() * elements, each -1 or 1 (if bipolar) or 0 or 1 if not. */ virtual void setInput(std::vector &pattern); /** Returns the current outputs of the neurons. * @return A vector v, where v[i] = current output at the ith neuron */ virtual std::vector getOutput(); /** Steps the network through one unit of time and returns * the output. * @return A vector v, where v[i] = output of the ith neuron */ virtual std::vector getNextOutput(); /** The HopfieldNetwork generally deals with vectors of integers * only because the neurons are binary. * But since this class implements the Network class, it must * provide this function as well, which returns the same thing * as setInput() following by getOutput() would, except that the * neuron's output will be of type real instead of int */ virtual VECTOR getOutput(VECTOR &input); /** Sets the initial input of the network and then steps through * time, returning true if the network converges before the given * timeout. * @param pattern The initial output of the network * @param timeout The maximum number of steps the network should go through * @return true if the pattern converges within the timeout, false otherwise */ virtual bool propagate(int pattern[], int timeout); /** Sets the initial input of the network and then steps through * time, returning true if the network converges before the given * timeout. * @param pattern The initial output of the network * @param timeout The maximum number of steps the network should go through * @return true if the pattern converges within the timeout, false otherwise */ virtual bool propagate(std::vector &pattern, int timeout); }; }; //namespace annie #endif // define _HOPFIELDNETWORK_H