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

📄 复件 gzj.cpp

📁 在VC++上实现感知机的神经网络算法
💻 CPP
字号:
#include<stdio.h>
#include<malloc.h>


void hardlim(float **pW, int *p2, float *p3);//test
bool iszeroE(int *ptQ, int *pA);  //test
void w_and_ep(float **pW, int *pE, int*p2);
void b_and_e(float *p_bsum, int *pE);
bool ispbool(int *pBool);

//输入向量P
int P_DIMENSION,p_dimension; //维数
int psum,PSUM,** p_psum=NULL; //矩阵p
//输出向量T
int Q_DIMENSION,q_dimension;// 维数
int tsum,**p_tsum=NULL;//矩阵
//神经元个数
int NERVE_CELL,nerve_cell;
//偏置矩阵B
float *p_bsum = NULL;
//权值矩阵W
float **p_wsum = NULL;
//实际输出向量S
int * pA=NULL;
//误差向量E
int * pE=NULL;
int * pBool=NULL;


void main(){


	//输入向量p的个数
	printf("请输入向量P的个数:= ");
	scanf("%d",&PSUM);
	psum=PSUM;
	printf("向量P的个数=%d\n",psum);

	//每个输入向P的维数
	printf("请输入向量P的维数:= ");
	scanf("%d",&P_DIMENSION);
	p_dimension=P_DIMENSION;
	printf("向量P的维数=%d\n",p_dimension);
	
	//申请内存空间
	p_psum = (int **)malloc(psum*sizeof(int));
	for(int i=0; i<psum; i++){
		*(p_psum + i) = (int *)malloc(p_dimension*sizeof(int));
	}
	
	//输入p的数值
	printf("请输入向量P[%d][%d]\n",psum,p_dimension);
	for(i=0; i<psum; i++){
		for(int j=0; j<p_dimension; j++){
			int temp;
			printf("P[%d][%d]:",i,j);
			scanf("%d",&temp);
			*(*(p_psum+i) + j) = temp;
		}
	}

	//打印矩阵
	printf("打印矩阵T:\n");
	for( i=0; i<psum; i++){
		for(int j=0; j<p_dimension; j++){
			printf("p[%d][%d]: %d\t",i,j,*(*(p_psum+i)+j));
		}
		printf("\n");
	}


	/*
	*yi xia shi shu ru t
	*/
//	int tsum;//tsum shi dui ying mei ge shu ru p de shu chu
	tsum = psum;
//	int Q_DIMENSION,q_dimension; //q_dimension shi mei ge t de wei shu
//	int **p_tsum=NULL;
	//输入T的维数
	printf("请输入目标输出向量T:\n");
	printf("请输入目标输出向量T的维数(必须和神经元个数相同)=");
	scanf("%d",&Q_DIMENSION);
	q_dimension=Q_DIMENSION;
	printf("q_dimension=%d\n",q_dimension);
	
	p_tsum = (int **)malloc(tsum*sizeof(int));
	for( i=0; i<tsum; i++){
		*(p_tsum + i) = (int *)malloc(q_dimension*sizeof(int));
	}
	//输入向量T
	printf("请输入目标输出向量T[%d][%d]:\n",tsum,q_dimension);
	for(i=0; i<tsum; i++){
		for(int j=0; j<q_dimension; j++){
			int temp;
			printf("T[%d][%d]:",i,j);
			scanf("%d",&temp);
			*(*(p_tsum+i) + j) = temp;
		}
	}

	//打印向量T

	//print    jiang gang cai shu ru de da yin chu lai
	printf("打印向量T:\n");
	for( i=0; i<tsum; i++){
		for(int j=0; j<q_dimension; j++){
			printf("t[%d][%d]: %d\t",i+1,j+1,*(*(p_tsum+i)+j));
		}
		printf("\n");
	}

	//输入偏置B,可以任意输入
	/*
	*yi xia shi shu ru pian zhi b[], ke ren yin shu ru
	*/
//	int NERVE_CELL,nerve_cell; //nerve_cell wei sheng jing yuan ge shu
//	float *p_bsum = NULL; //zhi xiang pian zhi ju zheng b de zhi zheng
	printf("输入偏置B,可以任意输入");
	printf("Enter nerve_cell:=   ( nerve_cell must be equal q_dimension )\n");
	scanf("%d",&NERVE_CELL);
	nerve_cell=NERVE_CELL;
	if(nerve_cell==q_dimension)
		printf("nerve_cell=%d\n",nerve_cell);
	else{
		printf("Wrong! nerve_cell must be equal q_dimension, so you must restart from the begin!");
		return;
	}

	p_bsum = (float *)malloc(nerve_cell*sizeof(float));

	//////////////////////////////////////////////////////////
	pA = (int *)malloc(nerve_cell*sizeof(int));  //test  a[]
	pE = (int *)malloc(nerve_cell*sizeof(int));	//test  e[]
	pBool = (int *)malloc(psum*sizeof(int));//test pbool[]
	for(i=0; i<psum; i++){
		*(pBool+i) = 0;
	}
	

	printf("Enter b[%d]\n",nerve_cell);
	for(i=0; i<nerve_cell; i++){
			float temp;
			printf("please enter a number No.%d:",i+1);
			scanf("%f",&temp);
			*(p_bsum + i) = temp;
	}

	//打印偏置B
	//print b[]
	printf("print the numbers which you entered:\n");
	for( i=0; i<nerve_cell; i++){
		printf("b[%d]: %f\t",i+1,*(p_bsum+i));
	}

	//输入权值矩阵W
	/*
	*yi xia shi shu ru quan zhi ju zheng w[][], ke ren yin shu ru
	*/
//	float **p_wsum = NULL;
	p_wsum = (float **)malloc(nerve_cell*sizeof(float));
	for( i=0; i<nerve_cell; i++){
		*(p_wsum + i) = (float *)malloc(p_dimension*sizeof(float));
	}
	printf("\n");

	printf("Enter w[%d][%d]\n",nerve_cell,p_dimension);
	for(i=0; i<nerve_cell; i++){
		for(int j=0; j<p_dimension; j++){
			float temp;
			printf("please enter a number No.%d,No.%d:",i+1,j+1);
			scanf("%f",&temp);
			*(*(p_wsum+i) + j) = temp;
		}
	}
	//打印权值矩阵W
	//print    jiang gang cai shu ru de da yin chu lai
	printf("print the numbers which you entered:\n");
	for( i=0; i<nerve_cell; i++){
		for(int j=0; j<p_dimension; j++){
			printf("w[%d][%d]: %f\t",i+1,j+1,*(*(p_wsum+i)+j));
		}
		printf("\n");
	}
	

	//以下是计算:
	/*
	 *yi xia shi ji shuan
	 *
	 */
	//test
	printf("以下是计算");
	for(i=0; i<psum; i++){
		printf("pbool[%d]:%d\t",i+1,*(pBool+i));
	}
	printf("\n");
	printf("\n==========compute begin==========\n");
	while(true){
		for(int m=0; m<psum; m++){
			hardlim(p_wsum, *(p_psum+m), p_bsum);//test    pA中已经做了pE的计算
					
								//pirnt a[] ???????????????????????????????
								for( i=0; i<nerve_cell; i++){
									printf("a[%d]: %d\t",i+1,*(pA+i));
								}
								printf("\n");

			if(iszeroE(*(p_tsum+m), pA)){
				*(pBool+m)=1;
				continue;
			}else{
				*(pBool+m)=0;
				w_and_ep(p_wsum, pE, *(p_psum+m));

								//print w[][]??????????????????????????????
								printf("\n");
								for( i=0; i<nerve_cell; i++){
									for(int j=0; j<p_dimension; j++){
				 						printf("w[%d][%d]: %f\t",i+1,j+1,*(*(p_wsum+i)+j));
									}	
				 					printf("\n");
								}
								printf("\n");

				b_and_e(p_bsum, pE);

								//print b[]?????????????????????????????????
								for( i=0; i<nerve_cell; i++){
									printf("b[%d]: %f\t",i+1,*(p_bsum+i));
								}
								printf("\n");
								
			}
			
		
		}//end for
								//print pbool[]??????????????????????????????
								printf("\n");
								for(i=0; i<psum; i++){
									printf("pbool[%d]:%d\t",i+1,*(pBool+i));
								}
								printf("\n");
		if(ispbool(pBool))
			break;
	}//end while
	printf("\n==========compute  end=========\n");


	//print the result w[][]
	printf("the result w[][] and b[] is :\n");
	for( i=0; i<nerve_cell; i++){
		for(int j=0; j<p_dimension; j++){
			printf("w[%d][%d]: %f\t",i+1,j+1,*(*(p_wsum+i)+j));
		}
		printf("\n");
	}
	printf("\n");

	//printthe result b[] 
	for( i=0; i<nerve_cell; i++){
		printf("b[%d]:%f\t",i+1,*(p_bsum+i));
	}
	printf("\n\n");
	
	return;	

}

void hardlim(float **pW, int *p2, float *p3){
	
	float sum = 0.0f;
	for(int i=0; i<nerve_cell; i++){    //S为神经元个数
		for(int j=0; j<p_dimension; j++){
			sum+=(*(*(pW+i)+j)) * (*(p2+j));
		}
		sum += *(p3 + i);
		if(sum>=0){
			sum=1;
			*(pA+i)=(int)sum;
		}else{
			sum=0;
			*(pA+i)=(int)sum;
		}
	}
}

bool iszeroE(int *ptQ, int *pA){
	for(int i=0; i<nerve_cell; i++){
		*(pE+i)=*(ptQ+i) - *(pA+i);
	}
			//print e[]?????????????????????????????
			for(int j=0; j<nerve_cell; j++){
				printf("e[%d]:%d\t",j+1,*(pE+j));
			}
			printf("\n");

	int count=0;
	for( i=0; i<nerve_cell; i++){
		
		if(*(pE+i)==0)
			count++;
	}
	if(count==nerve_cell)
		return true;
	else{
		count=0;
		return false;
	}
	
}

void w_and_ep(float **pW, int *pE, int*p2){   //公式4。38
	for(int i=0; i<nerve_cell; i++){
		for(int j=0; j<p_dimension; j++)
			*(*(pW+i)+j) += *(pE+i) * *(p2+j);
	}
}

void b_and_e(float *p_bsum, int *pE){     //公式4。39
	for(int i=0; i<nerve_cell; i++){
		*(p_bsum+i)+=(float)*(pE+i);
	}
}

bool ispbool(int *pBool){
	for(int i=0; i<psum; i++){
		if(*(pBool+i)!=1)
			return false;
	}
	return true;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -