#include<stdio.h>
#include<time.h>
#define C 1
int main()
{
//s[]用于记录各点坐标乘积;
//arrey[]用于存放将输入点变换后的点
int i,j,k,N1,N2,x[20][2],s[3],d[20],arrey[20][4],w[4];
int count=1;
printf("感知器算法(两类别2维问题)\n");
printf("\n请输入第1类坐标点数N1:");
scanf("%d",&N1);
printf("请输入第1类各点的坐标:\n");
for( i=0; i<N1 ; i++)
scanf("%d,%d",&x[i][0],&x[i][1]);
printf("\n请输入第二类坐标点数N2:");
scanf("%d",&N2);
printf("请输入第二类各点的坐标:\n");
for( i=0; i<N2 ; i++)
scanf("%d,%d",&x[i+N1][0],&x[i+N1][1]);
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]=1;
printf("(%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3]);
}
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;
printf("(%d,%d,%d)\n",arrey[j][1],arrey[j][2],arrey[j][3]);
}
printf("\n取参数C为:%d\n",C);
printf("初始向量 w(1)=:");
w[0]=1;
w[1]=0;
w[2]=0;
w[3]=0;
printf("(%d,%d,%d)\n\n",w[1],w[2],w[3]);
printf("迭代过程如下:\n\n");
do
{
for( i=0 ; i<(N1+N2) ; i++)
{
for( j=0; j<3 ; j++)
s[j]=arrey[i][j+1]*w[j+1];
printf("w(%d)*x(%d)=(%d,%d,%d)*(%d,%d,%d)t",count,count,w[1],w[2],w[3],arrey[i][1],arrey[i][2],arrey[i][3]);
d[i]=s[0]+s[1]+s[2];
printf("=%d\n",d[i]);
if(d[i]<=0)//如果d[i]<=0, 则要惩罚
{
for(k=0; k<3 ; 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",w[1],w[2],w[3]);
printf(")\n");
}
else
{
printf("w(%d)*x(%d)=%d>0,向量 w(%d)=:(",count,count,d[i],count+1);
printf("%d,%d,%d",w[1],w[2],w[3]);
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",w[1],w[2],w[3]);
printf(")\n");
printf("判别函数为:d(x)=(%d)x1+(%d)x2+(%d)",w[1],w[2],w[3]);
}