📄 1.cpp
字号:
/* 训练集 0 0 0 0 0 0
0 0 0 0 1 0
0 0 0 1 0 0
1 0 0 0 0 0
1 0 0 0 1 0
1 0 0 1 0 0
0 0 1 1 1 1
0 1 0 0 0 0
0 1 0 0 1 0
0 1 0 1 0 0
0 1 0 1 1 1
0 1 1 0 0 0
0 1 1 0 1 1
0 1 1 1 0 1
0 1 1 1 1 1
1 1 1 1 0 1
最后一列为期望输出值
五人表决系统,超过半数者通过 */
#include <stdlib.h>
#include <stdio.h>
double x1[]={0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1};//输入向量
double x2[]={0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1};
double x3[]={0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1};
double x4[]={0,0,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,0,1,0,1,0};
double x5[]={0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,0};
int d[]={0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1};//期待输出
double w1=0.5,w2=0.7,w3=0.6,w4=0.5,w5=0.8;//初始化联结权值
double o=0.6,s=0.4;//初始化阈值,增益因子
void main()
{
int i=0,out;
while (i!=22)//网络学习过程,即调整阈值、学习因子和权值的过程
{
i=0;
for (int j=0;j<22;j++)
{
if (w1*x1[j]+w2*x2[j]+w3*x3[j]+w4*x4[j]+w5*x5[j]-o>=0)//得到输出
out=1;
else out=0;
if (out==d[j]) i++;//输出符合期望输出的示例数
else//输出与期望输出不一致,调整阈值、学习因子、联结权值
{
o=o+s*(d[j]-out)*(-1);
w1=w1+s*(d[j]-out)*x1[j];
w2=w2+s*(d[j]-out)*x2[j];
w3=w3+s*(d[j]-out)*x3[j];
w4=w4+s*(d[j]-out)*x4[j];
w5=w5+s*(d[j]-out)*x5[j];
}
}
}
//以下为使用网络的过程
if (i==22)//若网络训练成功则进行示例验证(即网络学习)
{
printf ("五人表决系统\n");
int x1,x2,x3,x4,x5;
while (1)
{
printf ("请输入一号表决情况(0否决,1通过):");
scanf ("%d",&x1);
if (x1!=1 && x1!=0)
{
printf ("非法输入!");
break;
}
printf ("请输入二号表决情况(0否决,1通过):");
scanf ("%d",&x2);
if (x2!=1 && x2!=0)
{
printf ("非法输入!");
break;
}
printf ("请输入三号表决情况(0否决,1通过):");
scanf ("%d",&x3);
if (x3!=1 && x3!=0)
{
printf ("非法输入!");
break;
}
printf ("请输入四号表决情况(0否决,1通过):");
scanf ("%d",&x4);
if (x4!=1 && x4!=0)
{
printf ("非法输入!");
break;
}
printf ("请输入五号表决情况(0否决,1通过):");
scanf ("%d",&x5);
if (x5!=1 && x5!=0)
{
printf ("非法输入!");
break;
}
if (w1*x1+w2*x2+w3*x3+w4*x4+w5*x5-o>=0)//大于等于0表示表决通过,小于0失败
printf ("表决通过!\n");
else
printf ("表决未通过!\n");
printf ("------------------------------------------------------\n\n");
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -