您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-24 11:13 316 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息