模式識別感知器演算法C++寫的
阿新 • • 發佈:2019-02-06
#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; }