神经元网络

#include<iostream>
#include<iomanip>
#include <fstream>
#define cin fin
#define MAX_VEXNUM 101        //最大顶点数
using namespace std;
ifstream fin("data.in");
const int infinity = INT_MAX; //代表无穷大
//--------------顶点的类定义---------------------
class Vertex
{
	private:
		int vertexname;  //顶点名称
		int Yu;         //神经元阈值
		int Statu;      //神经元状态
	public:
		Vertex(int v1=0, int y=0, int s=0):
		  vertexname(v1), Yu(y), Statu(s){}
		  int getVertexName() {         //返回顶点名称         
			  return vertexname;
		  }
		  void setVertexName(int name) {
			  vertexname = name;
		  }
		  void setYu(int y) {
			  Yu = y;
		  }
		  void setStatu(int s) {
			  Statu = s;
		  }
		  int getVertexYu() {           //返回顶点阈值         
			  return Yu;
		  }
		  int getVertexStatu() {        //返回顶点名称         
			  return Statu;
		  }
};
//---------------------邻接矩阵存储图---------------------------
template<class VertexType, class EdgeType>
class Gragh_Matrix
{
	private:
		VertexType vexs[MAX_VEXNUM];             //顶点表数组
		EdgeType edges[MAX_VEXNUM][MAX_VEXNUM];  //邻接矩阵!
		int vNum;       //顶点数
		int eNum;       //边数
		bool visited[MAX_VEXNUM];  //标记数组
	public:
		Gragh_Matrix();
		~Gragh_Matrix(){}
		bool CreatMGragh();       //建立有向网络图的邻接存储结构
		void DisplayMGragh();     //输出邻接矩阵
		int GetVertexName(const int i)   {return (this->vexs[i]).getVertexName();} //获取顶点名称                     
		int GetVertexIndex(const int vertexName);   //获取顶点在图(数组)中的位置
		bool IsVertexExist(int v1);                      //判断该顶点是否存储在图中
		int VertexOD(const int vertexname);              //出度
		void CalAllStatu();    //计算所有节点状态
		void OutStatu();      //输出输出层处于兴奋状态的神经元
};


//------------------构造函数------------------------
template<class VertexType, class EdgeType>
Gragh_Matrix<VertexType, EdgeType>::Gragh_Matrix()
{
	this->eNum = 0;
	this->vNum = 0;
};
//-----------------创建邻接矩阵存储图---------------
template<class VertexType, class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::CreatMGragh()
{
	int i, j,k;  
	int S, Y;
//cout<<"请输入神经元数目N(有向图节点数)和P(有向图边数目):"<<endl;
	cin>>this->vNum>>this->eNum;
	for (i=0; i<vNum; i++)
	{	
		//cout<<"请输入第"<<i+1<<"个顶点的初始状态和阈值:";
		cin>>S>>Y;
		vexs[i].setVertexName(i+1);
		vexs[i].setStatu(S);
		vexs[i].setYu(Y);
	}
	for (i=0; i<vNum; i++)                //初始化邻接矩阵
	{
		for (j=0; j<vNum; j++)
		{
			edges[i][j] = infinity;
		}
	}
	int v1, v2;
	EdgeType w;
	for (k=0; k<eNum; k++)
	{
		//cout<<"请输入第"<<k+1<<"条边的起点、终点、权值:";
		cin>>v1>>v2>>w;
		int m = GetVertexIndex(v1);
		int n = GetVertexIndex(v2);
		edges[m][n] = w;
	}
	return true;
}
//---------------获取顶点在图(顶点表)中的位置---------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::GetVertexIndex(const int vertexName)
{
	for (int index=0; index != vNum; ++index)
	{
		if(vertexName == GetVertexName(index))
			return index;
	}
	return -1;
}
//---------------判断图中是否存在顶点v1---------------
template<class VertexType,class EdgeType>
bool Gragh_Matrix<VertexType, EdgeType>::IsVertexExist(int v1)
{
	int i = GetVertexIndex(v1);
	if(i == -1) return false;
	else return true;
}
//--------------计算顶点出度---------------------
template<class VertexType,class EdgeType>
int Gragh_Matrix<VertexType, EdgeType>::VertexOD(const int vertexname)
{
	if (!IsVertexExist(vertexname))
	{
		return -1;
	}
	int v = GetVertexIndex(vertexname);  //元素V在邻接矩阵中的行数
	int OD = 0;
	for (int i=0; i<vNum; ++i) 
	{
		if (edges[v][i] != infinity)      //邻接矩阵中该行的"元素数"即该顶点的出度
			++OD;
	}
	return OD;
}
//---------------------计算所有节点状态-----------------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::CalAllStatu()
{
	int record;	
	for (int i = 0; i<vNum; ++i) //i代表列
	{
		bool Conver = false;                   //判断该神经元是否受上一级神经元所影响
		record = vexs[i].getVertexStatu();     //record 记录vexs[i]节点的初始状态  非输入层开始都为零
		for (int j=0; j<vNum; ++j) //j代表行
		{
			if (edges[j][i] != infinity && vexs[j].getVertexStatu() > 0)
			{
				record += vexs[j].getVertexStatu() * edges[j][i];   //vexs[j]即为链接vexs[i]的前一个节点
				Conver = true;
			}
		}
		if (Conver)
		{
			record = record - vexs[i].getVertexYu();
		    vexs[i].setStatu(record);
		}
	}
}
//------------------------(按顺序)输出(活跃的)输出层状态--------------------------
template<class VertexType,class EdgeType>
void Gragh_Matrix<VertexType, EdgeType>::OutStatu()
{
	int i;
	bool flag = false;
	for (i=0; i<vNum; ++i)
	{
		if ( (vexs[i].getVertexStatu() > 0) && (VertexOD(i+1) == 0) )
		{
			cout<< i+1 <<" "<< vexs[i].getVertexStatu() <<endl;
			flag = true;
		}
	}
	if (!flag)
	{
		cout<<"NULL"<<endl;
	}
}

//---------------主函数--------------------------
#include "Gragh_Matrix.h"
#include <Ctime>
int main()
{	
	time_t start=clock();

	Gragh_Matrix<Vertex, int> G;
	G.CreatMGragh();    //创建图
	G.CalAllStatu();        //计算全部神经元的状态
	G.OutStatu();      //输出输出层处于兴奋状态的节点

	time_t end=clock();
	double t=difftime(end,start); 
	cout <<"耗时:"<< t <<"  MS."<< endl;
	system("pause");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值