1. 程式人生 > >模式識別感知器演算法C++寫的

模式識別感知器演算法C++寫的

#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;
}