#include<stdio.h>#include<time.h>#define C 1void main(){ //s[]用于记录各点坐标乘积; //arrey[]用于存放将输入点变换后的点 int i,j,k,N1,N2,x[10][3],s[4],d[10],arrey[10][5],w[5]; int count=1; printf("感知器算法(两类别三维问题)\n"); printf("\n请输入第一类坐标点数N1:"); scanf("%d",&N1); printf("请输入第一类各点的坐标:\n"); for( i=0; i<N1 ; i++) { scanf("%d,%d,%d",&x[i][0],&x[i][1],&x[i][2]); } printf("\n请输入第二类坐标点数N2:"); scanf("%d",&N2); printf("请输入第二类各点的坐标:\n"); for( i=0; i<N2 ; i++) { scanf("%d,%d,%d",&x[i+N1][0],&x[i+N1][1],&x[i+N1][2]); } printf("\n输入的第一类点为:\n"); for( j=0 ; j< N1 ; j++) { arrey[j][0]=1; arrey[j][1]=x[j][0]; arrey[j][2]=x[j][1]; arrey[j][3]=x[j][2]; arrey[j][4]=1; printf("(%d,%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3],arrey[j][4]); } printf("\n输入的第二类点为:\n"); for( j=N1 ; j<(N1+N2) ; j++) { arrey[j][0]=2; arrey[j][1]=(-1)*x[j][0]; arrey[j][2]=(-1)*x[j][1]; arrey[j][3]=(-1)*x[j][2]; arrey[j][4]=-1; printf("(%d,%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3],arrey[j][4]); } printf("\n取参数C为:%d\n",C); printf("初始向量 w(1)=:"); // //初始值:主要是w[1]到w[4] // w[0]=1;w[1]=-1;w[2]=-2;w[3]=-2;w[4]=0; printf("(%d,%d,%d,%d)\n\n",w[1],w[2],w[3],w[4]); printf("迭代过程如下:\n\n"); do { for( i=0 ; i<(N1+N2) ; i++) { for( j=0; j<4 ; j++) { s[j]=arrey[i][j+1]*w[j+1]; } printf("w(%d)*x(%d)=(%d,%d,%d,%d)*(%d,%d,%d,%d)t",count,count,w[1],w[2],w[3],w[4],arrey[i][1],arrey[i][2],arrey[i][3],arrey[i][4]); d[i]=s[0]+s[1]+s[2]+s[3]; printf("=%d\n",d[i]); // //如果d[i]<=0, 则要惩罚 // if(d[i]<=0) { for(k=0; k<4 ; k++) { w[k+1]=C*arrey[i][k+1]+w[k+1]; } printf("w(%d)*x(%d)=%d<=0,要惩罚,惩罚后向量 w(%d)=:(",count,count,d[i],count+1); printf("%d,%d,%d,%d",w[1],w[2],w[3],w[4]); //for( k=0; k<4 ;k++) //{ // printf("%d",w[k+1]); //} printf(")\n"); } else { printf("w(%d)*x(%d)=%d>0,向量 w(%d)=:(",count,count,d[i],count+1); printf("%d,%d,%d,%d",w[1],w[2],w[3],w[4]); //for( k=0; k<4 ;k++) //{ // printf("%d",w[k+1]); //} printf(")\n"); } printf("\n"); count++; } k=0; for(j=(N1+N2-1); j>=0 ;j--) { if(d[j]>0) { k++; } } if(k<N1+N2) { printf("未能收敛,继续迭代\n\n"); } }while(k<N1+N2); printf("\n优化后的向量 w(%d)=:(",count); printf("%d,%d,%d,%d",w[1],w[2],w[3],w[4]); //for( k=0; k<4 ;k++) //{ // printf("%d",w[k+1]); //} printf(")\n");}