/*神经元模型*/ #include < math.h> #include < stdio.h> #include < time.h> #include < stdlib.h> #include < conio.h> #define AND1 .571388 #define AND2 .560999 #define OR1 1.149045 #define OR2 1.131896 #define SITA 1 #define NIU .1 #define OMIGA 50 float w[2]; float terg[4][3]; main() { int m_result = 1, s; float w1[2]; while ( m_result != 5 ) { m_result = menu ( m_result ); date(); switch ( m_result ) { case ( 1 ) : /* 学习*/ case ( 3 ) : randomize(); /*重新学习*/ w[0] = random ( 80 ) +10; w[0] = w[0]/100.0; w[1] = random ( 80 ) +10; w[1] = w[1]/100.0; study(); break; case ( 2 ) : practic ( w ); /*实践新模型*/ break; case ( 4 ) : printf ( " what do you want to see, OR or AND?(1/2) " ); scanf ( " %d" , & s ); if ( s==1 ) {w1[0] = OR1; w1[1] = OR2; } else if ( s==2 ) {w1[0] = AND1; w1[1] = AND2; } else break; practic ( w1 ); break; /*演示已有模型*/ default: {} } /*End Switch*/ } /*End While */ clrscr(); printf ( " Good Bye!" ); } menu ( int r ) { int r1; clrscr(); printf ( " \n\n\n" ); printf ( " \t\t1\tStudy a Model\n" ); /* 学习 */ printf ( " \t\t2\tPratice the model\n" ); /*重新学习 */ printf ( " \t\t3\tDefail the MOdel\n" ); /*实践新模型 */ printf ( " \t\t4\tPrepared Model\n" ); /*演示已有模型*/ printf ( " \t\t5\tEnd\n" ); /*结束 */ printf ( " \n\n\t\tWhat do you want to choice?(%d)" , r ); r1 = getche(); if ( r1!=13 ) r = r1-48; return ( r ); } date() { /*显示模型*/ int i, j; clrscr(); for ( i = 0; i < 4; i++ ) for ( j = 0; j< 3; j++ ) { gotoxy ( 20+j*4, i+5 ); printf ( "%.0f", terg[i][j] ); } printf ( "\n\n\tThe quarities:%f, %f \n", w[0], w[1] ); } study() { /*学习子函数*/ float x, y, width; int wrong = 1, i, total = 0; input(); /*andinput(); */ /*orinput(); */ while ( wrong ) { wrong = 0; for ( i = 0; i< 4; i++ ) { x = OMIGA* ( w[0]*terg[i][0]+w[1]*terg[i][1]-SITA ); y = 1.0/ ( 1.0+exp ( -x ) ); width = terg[i][2]-y; /*误差 = "教师信号-Y" */ if ( fabs ( width ) >=.01 ) { wrong = 1; total++; w[0] = w[0]* ( 1+width*NIU ); /*改变权值0*/ w[1] = w[1]* ( 1+width*NIU ); /*改变权值1*/ if ( total> =200 ) /*防止程序进入死循环*/ {error(); return 1; } } } }/*若i的四次循环均满足" fabs(width)> =.01" 则wrong=0, 结束循环*/ } practic ( quarity ) /*实践新模型或演示已有模型, 由quarity[]值决定*/ float quarity[2]; { int k, y; float x, width, x1, x2; for ( k = 0; k < 4; k++ ) { gotoxy ( 0, 4+k*3 ); printf ( "\nPlease input :x1, x2 " ); scanf ( "%f, %f", &x1, &x2 ); x = OMIGA* ( quarity[0]*x1+quarity[1]*x2-SITA ); y = 1.0/ ( 1.0+exp ( -x ) ) +.01; /*精度为0.01*/ printf ( "\t\t\ty = "%d" , y); getch(); } } input() /*当选择"学习"功能时输入事件*/ {int i; printf("Please input the 4 groups data:\n\n"); for(i = 0; i< 4; i++){ printf("\tThe %d group x1, x2, teacher's point: ", i+1); scanf("%f, %f, %f", &terg[i][0], &terg[i][1], &terg[i][2]); } clrscr(); } andinput() {terg[0][0] = 1; terg[0][1] = 1; terg[0][2] = 1; terg[1][0] = 1; terg[1][1] = 0; terg[1][2] = 0; terg[2][0] = 0; terg[2][1] = 1; terg[2][2] = 0; terg[3][0] = 0; terg[3][1] = 0; terg[3][2] = 0; } orinput() {terg[0][0] = 1; terg[0][1] = 1; terg[0][2] = 1; terg[1][0] = 1; terg[1][1] = 0; terg[1][2] = 1; terg[2][0] = 0; terg[2][1] = 1; terg[2][2] = 1; terg[3][0] = 0; terg[3][1] = 0; terg[3][2] = 0; } error() /*初始权值选择不当或模型无法实现(如异或模型)时退出*/ {clrscr(); printf("\n\n\n\tBecause the firse QUARITIES's choise is unavailble, \n"); printf("\tIt can't get the right result, forveve!"); }