模式识别感知器算法C++写的

来源:互联网 发布:java集成极光推送 编辑:程序博客网 时间:2024/06/05 20:47
#include <iostream>#include <cstdio>using namespace std;const int maxn = 100+5;int C;int N1,N2;int x[maxn][2];int arr[maxn<<1][4];//记录输入的点变化之后的点int s[3];//记录各点坐标的乘积int w[4];int num = 1;int d[maxn];int main(){    cout<<"输入N1和N2,表示第一类和第二类的点得个数"<<endl;    cin>>N1>>N2;    cout<<"请输入N1所有点的坐标"<<endl;    for(int i=0;i<N1;i++)        cin>>x[i][0]>>x[i][1];    cout<<"请输入N2所有点的坐标"<<endl;    for(int i=N1;i<N1+N2;i++)        cin>>x[i][0]>>x[i][1];    //for(int i=0;i<N1+N2;i++)//test      //  cout<<x[i][0]<<' '<<x[i][1]<<endl;      cout<<endl<<"第一类点为:"<<endl;      for(int i=0;i<N1;i++)//写成增广向量的形式,然后输出出来      {          arr[i][0] = 1;          arr[i][1] = x[i][0];          arr[i][2] = x[i][1];          arr[i][3] = 1;          cout<<arr[i][1]<<' '<<arr[i][2]<<' '<<arr[i][3]<<endl;      }      cout<<endl<<"第二类点为:"<<endl;      for(int i=N1;i<N1+N2;i++)//写成增广向量的形式,然后输出出来      {          arr[i][0] = 2;          arr[i][1] = (-1)*x[i][0];          arr[i][2] = (-1)*x[i][1];          arr[i][3] = -1;          cout<<arr[i][1]<<' '<<arr[i][2]<<' '<<arr[i][3]<<endl;      }      cout<<"请输入参数C,建议取1"<<endl;      cin>>C;      cout<<"您取得参数C="<<C<<endl;      w[0] = 1;      for(int i=1;i<4;i++)        w[i] = 0;      cout<<"初始向量w[1] = {"<<w[1]<<' '<<w[2]<<' '<<w[3]<<'}'<<endl;      cout<<"下面进行迭代过程"<<endl;      int k = 0;      do      {          for(int i=0;i<N1+N2;i++)          {              for(int j=0;j<3;j++)                s[j] = arr[i][j+1]*w[j+1];               printf("w(%d)*x(%d)=(%d,%d,%d)*(%d,%d,%d)t",num,num,w[1],w[2],w[3],arr[i][1],arr[i][2],arr[i][3]);              d[i] = s[0]+s[1]+s[2];              printf("=%d\n",d[i]);              if(d[i]<=0)//罚              {                  for(k=0;k<3;k++)                    w[k+1] = C*arr[i][k+1] + w[k+1];                  printf("w(%d)*x(%d)=%d<=0,罚,罚后向量 w(%d)=:(",num,num,d[i],num+1);                  printf("%d,%d,%d",w[1],w[2],w[3]);                  printf(")\n");              }              else              {                   printf("w(%d)*x(%d)=%d>0,向量 w(%d)=:(",num,num,d[i],num+1);                   printf("%d,%d,%d",w[1],w[2],w[3]);                   printf(")\n");              }              cout<<endl;              num++;          }          k = 0;          for(int j=(N2+N1-1);j>=0;j--)            if(d[j]>0)                k++;            if(k<N1+N2)                cout<<"未能成功,继续迭代!"<<endl;      }while(k<N1+N2);    //cout<<"优化后的向量:"<<endl;    printf("\n优化后的向量 w(%d)=:(",num);    printf("%d,%d,%d",w[1],w[2],w[3]);    printf(")\n");    cout<<endl;    printf("判别函数为:d(x)=(%d)x1+(%d)x2+(%d)",w[1],w[2],w[3]);    return 0;}
阅读全文
0 0
原创粉丝点击