#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INPUTSIZE 64 //dimension of the input
#define K_NEURONS 3 //number of kohonen neurons
#define OUT_NEURONS 2 //number of out neurons
#define NUM_TRAIN 3 //number of trainingset
#define NUM_TEST 10000 //number of testset
#define VERBOSE 0 //output verbosity
#define NUM_ERRORS 12 //number of errors
#define NUMRUN 100 //number of run
#define TH 0.5 //threshold value
#define ALPHA 0.7
#define BETA 0.7
#define GAMMA 0.01
/******************
TYPES
******************/
typedef enum modstate{MODIFIED,UNMODIFIED}modstate;
typedef struct neuron{
float weight[INPUTSIZE];
float z;
int y;
}neuron;
typedef enum inputvalue{ONE,LL,VL,UNKNOWN}inputvalue;
typedef struct input{
inputvalue rightvalue;
float data[INPUTSIZE];
}input;
/**********************************
PRINT INPUTVALUE
**********************************/
//pretty print the value of the given inputvalue
void printinputvalue(inputvalue in){
if(in==ONE)
printf(" 1 ");
if(in==VL)
printf(" V ");
if(in==LL)
printf(" L ");
if(in==UNKNOWN)
printf(" ? ");
}
/*********************************
NETWORK TOPOLOGY
*********************************/
// the topology is a single layer network
neuron kohonenlayer[K_NEURONS];
neuron groslayer[OUT_NEURONS];
/********************************
PRINT INPUT DATA
********************************/
//nicely printout an input data
void printinput(input n){
int i;
printf("\t");
for(i=0;i<INPUTSIZE;i++){
if(INPUTSIZE==64){
if(!(i%8))
printf("\n\t");
}
else{
if(!(i%6))
printf("\n\t");
}
if(n.data[i]>0)
printf("#");
else
printf(" ");
}
printf("\n\n");
}
/*************************
PRINT OUTPUT
*************************/
void printoutput(){
int i;
for(i=0;i<OUT_NEURONS;i++){
if(i%8==0)
printf("\n");
if(groslayer[i].y>0)
printf("# ");
else
printf(". ");
}
printf("\n-------------\n");
}
/*************************
RANDOMIZED INPUT DATA
*************************/
//return the required input with 1 bit of error
input randomized_normalized_value(inputvalue i,int error){
input in;
if(INPUTSIZE==64){
if(i==ONE){
//1
in.rightvalue=ONE;
in.data[0]=0; in.data[1]=0; in.data[2]=0; in.data[3]=1; in.data[4]=1; in.data[5]=0;in.data[6]=0; in.data[7]=0;
in.data[8]=0; in.data[9]=0; in.data[10]=1; in.data[11]=1;in.data[12]=1; in.data[13]=0; in.data[14]=0; in.data[15]=0;
in.data[16]=0; in.data[17]=1;in.data[18]=1; in.data[19]=1; in.data[20]=1; in.data[21]=0; in.data[22]=0; in.data[23]=0;
in.data[24]=0; in.data[25]=0; in.data[26]=0; in.data[27]=1; in.data[28]=1; in.data[29]=0;in.data[30]=0; in.data[31]=0;
in.data[32]=0; in.data[33]=0; in.data[34]=0; in.data[35]=1; in.data[36]=1; in.data[37]=0;in.data[38]=0;in.data[39]=0;
in.data[40]=0; in.data[41]=0; in.data[42]=0; in.data[43]=1; in.data[44]=1; in.data[45]=0; in.data[46]=0;in.data[47]=0;
in.data[48]=0; in.data[49]=0; in.data[50]=0; in.data[51]=1; in.data[52]=1; in.data[53]=0; in.data[54]=0;in.data[55]=0;
in.data[56]=0; in.data[57]=0; in.data[58]=1; in.data[59]=1; in.data[60]=1; in.data[61]=1; in.data[62]=0;in.data[63]=0;
}
if(i==LL){
//L
in.rightvalue=LL;
in.data[0]=1; in.data[1]=1; in.data[2]=0; in.data[3]=0; in.data[4]=0; in.data[5]=0;in.data[6]=0; in.data[7]=0;
in.data[8]=1; in.data[9]=1; in.data[10]=0; in.data[11]=0;in.data[12]=0; in.data[13]=0; in.data[14]=0; in.data[15]=0;
in.data[16]=1; in.data[17]=1;in.data[18]=0; in.data[19]=0; in.data[20]=0; in.data[21]=0; in.data[22]=0; in.data[23]=0;
in.data[24]=1; in.data[25]=1; in.data[26]=0; in.data[27]=0; in.data[28]=0; in.data[29]=0;in.data[30]=0; in.data[31]=0;
in.data[32]=1; in.data[33]=1; in.data[34]=0; in.data[35]=0; in.data[36]=0; in.data[37]=0;in.data[38]=0;in.data[39]=0;
in.data[40]=1; in.data[41]=1; in.data[42]=0; in.data[43]=0; in.data[44]=0; in.data[45]=0; in.data[46]=0;in.data[47]=0;
in.data[48]=1; in.data[49]=1; in.data[50]=0; in.data[51]=0; in.data[52]=0; in.data[53]=0; in.data[54]=0;in.data[55]=1;
in.data[56]=1; in.data[57]=1; in.data[58]=1; in.data[59]=1; in.data[60]=1; in.data[61]=1; in.data[62]=1;in.data[63]=1;
}
if(i==VL){
//V
in.rightvalue=VL;
in.data[0]=1; in.data[1]=0; in.data[2]=0; in.data[3]=0; in.data[4]=0; in.data[5]=0;in.data[6]=0; in.data[7]=1;
in.data[8]=1; in.data[9]=0; in.data[10]=0; in.data[11]=0;in.data[12]=0; in.data[13]=0; in.data[14]=0; in.data[15]=1;
in.data[16]=0; in.data[17]=1;in.data[18]=0; in.data[19]=0; in.data[20]=0; in.data[21]=0; in.data[22]=1; in.data[23]=0;
in.data[24]=0; in.data[25]=1; in.data[26]=0; in.data[27]=0; in.data[28]=0; in.data[29]=0;in.data[30]=1; in.data[31]=0;
in.data[32]=0; in.data[33]=0; in.data[34]=1; in.data[35]=0; in.data[36]=0; in.data[37]=1;in.data[38]=0;in.data[39]=0;
in.data[40]=0; in.data[41]=0; in.data[42]=1; in.data[43]=0; in.data[44]=0; in.data[45]=1; in.data[46]=0;in.data[47]=0;
in.data[48]=0; in.data[49]=0; in.data[50]=0; in.data[51]=1; in.data[52]=1; in.data[53]=0; in.data[54]=0;in.data[55]=0;
in.data[56]=0; in.data[57]=0; in.data[58]=0; in.data[59]=1; in.data[60]=1; in.data[61]=0; in.data[62]=0;in.data[63]=0;
}
//code used to randimize and normalize the input
int k;
if(error){ //if the error parameter is set to 0 no error are introduced, to 1 NUM_ERRORS are introduced in the generated input
srandomdev();
for(k=0;k<NUM_ERRORS;k++){
long rand=random()%INPUTSIZE;
if(in.data[rand]==1)
in.data[rand]=0;
else
in.data[rand]=1;
}
}
int sum=0;
for(k=0;k<INPUTSIZE;k++){
sum+=in.data[k]*in.data[k];
}
float rad=sqrt(sum);
for(k=0;k<INPUTSIZE;k++){
in.data[k] = in.data[k]/rad;
}
return in;
}
}
/***********************
WEIGHT INIT
***********************/
void init(){
int i,j;
for(i=0;i<K_NEURONS;i++){
input training=randomized_normalized_value(i%3,0);
for(j=0;j<INPUTSIZE;j++)
kohonenlayer[i].weight[j]=GAMMA*training.data[j] + (1-GAMMA)*1/sqrt(INPUTSIZE);
}
for(i=0;i<OUT_NEURONS;i++){
for(j=0;j<K_NEURONS;j++){
groslayer[i].weight[j]=0;
}
}
}
/**********************************
SIMULATE THE NETWORK
**********************************/
//compute the outcome of the network for the given input
void simulatenetwork(input inp){
int i,j;
int max=0;
for(i=0;i<K_NEURONS;i++){
kohonenlayer[i].z=0;
}
//propagate input through kohonen layer
for(i=0;i<K_NEURONS;i++){
for(j=0;j<INPUTSIZE;j++){
kohonenlayer[i].z += kohonenlayer[i].weight[j]*inp.data[j];
}
if(kohonenlayer[max].z<kohonenlayer[i].z)
max=i;
}
//set to 0 all the non winning neurons
for(i=0;i<K_NEURONS;i++){
kohonenlayer[i].y=0;
}
//set to 1 the winning neuron
kohonenlayer[max].y=1;
//compute the output of the out layer
for(i=0;i<OUT_NEURONS;i++){
groslayer[i].z = groslayer[i].weight[max];
if(groslayer[i].z>TH)
groslayer[i].y=1;
else
groslayer[i].y=0;
}
}
/***********************************
CONVERSION BIT->VALUE
************************************/
//simply return the value computed by the network in an inputvalue format
inputvalue result(){
if(groslayer[0].y==0 && groslayer[1].y==1 ){
return VL;
}
if(groslayer[0].y==1 && groslayer[1].y==1 ){
return ONE;
}
if(groslayer[0].y==1 && groslayer[1].y==0 ){
return LL;
}
printf("r: UN ");
return UNKNOWN;
}
/*********************************
SET WEIGHT
*********************************/
//modify the weight of every neurons trying to minimized the error on the output
void setweight(input training){
int i,j;
//set weight of the winner
for(i=0;i<K_NEURONS;i++){
for(j=0;j<INPUTSIZE;j++){
if(kohonenlayer[i].y==1)
kohonenlayer
cpnn.rar_CPNN_counter propagation_https//cpnn5.com
版权申诉
130 浏览量
2022-09-14
17:37:33
上传
评论
收藏 2KB RAR 举报
JonSco
- 粉丝: 77
- 资源: 1万+
最新资源
- 数据库管理工具:dbeaver-ce-23.3.3-stable.x86-64.rpm
- 网络安全详细介绍.docx
- 爱普生打印机L805废墨仓清零软件永久版和说明
- 数据库管理工具:dbeaver-ce-23.3.3-macos-x86-64.dmg
- 数据库管理工具:dbeaver-ce-23.3.3-macos-aarch64.dmg
- 神经网络详细介绍.docx
- 数据库管理工具:dbeaver-ce-23.3.2-x86-64-setup.exe
- 小米电视2刷机包55寸48寸通刷包V1.2.15,降级专用
- 数据库管理工具:dbeaver-ce-23.3.2-stable.x86-64.rpm
- 无人驾驶汽车如何处理地图和定位?
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈