📄 anneal3.cpp
字号:
// Anneal.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include<iostream.h>
#include<stdlib.h>
#include<math.h>
#include<iomanip.h>
#include<stdio.h>
#include<time.h>
const int NUM_LAYER=4;
const int CPN=20;//样本输入个数
double w[4][4][4], w1[4][4][4];
double in_put[CPN];//输入
double in_net, out_net, out_exp;
int num_node[4]={1,4,2,1};
long double cp0=20.0,cp;//温度
double t=0.0;
double PI=3.1415926;
double a=1.0, min=-0.1, max=0.1, d=1.0;//用于归一化的值
double f[4][4], f1[4][4];//阀值
void initiat()//初始化函数
{
int i,j,k;
for(i=1;i<NUM_LAYER;i++)
for(j=0;j<num_node[i];j++)
{
f[i][j]=rand()/32767.0;
for(k=0;k<num_node[i-1];k++)
{
w[i][j][k]=rand()/32767.0;
cout<<"w"<<setw(0)<<i<<setw(0)<<j<<setw(0)<<k<<" ";
cout<<setprecision(5)<<w[i][j][k]<<endl;
}
}
in_put[0]=-2.0;
for(i=1;i<CPN;i++)
in_put[i]=in_put[i-1]+0.2;
for(i=0;i<CPN;i++)
{
a=(sin(in_put[i])*sin(in_put[i])-0.5)/(1+in_put[i]*in_put[i]);
if(min>a)
min=a;//求输出的最小值
if(max<a)
max=a;//求输出的最大值
}
d=max-min;
}
void cultivate_out_exp()//计算期望值函数
{
out_exp=(sin(in_net)*sin(in_net)-0.5)/(1+in_net*in_net);
out_exp=(out_exp-min)/d;//归一化期望输出
//fprintf(fp_out_exp,"%f ",out_exp);
}
void net_work(double w[4][4][4], double f[4][4])//计算输出值函数
{
int i,j,k;
double x_node[4][4];
double u_node[4][4];
x_node[0][0]=in_net;
for(i=1;i<NUM_LAYER;i++)
for(j=0;j<num_node[i];j++)
{
u_node[i][j]=0;
for(k=0;k<num_node[i-1];k++)
{
u_node[i][j]+=x_node[i-1][k]*w[i][j][k];
}
u_node[i][j]-=f[i][j];
x_node[i][j]=1.0/(1.0+exp(-u_node[i][j]));//神经网络的激发函数
}
out_net=x_node[3][0];
}
double cultivate_cost()//计算代价函数
{
double cost;
cost=(out_exp-out_net)*(out_exp-out_net)*0.5;
return cost;
}
void generate_w()//生成函数
{
double r;
int i,j,k;
double w_add, f_add;
int num_node[4]={1,4,2,1};
for(i=1;i<NUM_LAYER;i++)
for(j=0;j<num_node[i];j++)
{
r=rand()/32767.0-0.5;
f_add=cp*tan((r-0.5)*PI);
f1[i][j]=f[i][j]+f_add*0.001;//生成函数产生阀值偏移
for(k=0;k<num_node[i-1];k++)
{
r=rand()/32767.0-0.5;
w_add=cp*tan((r-0.5)*PI);//生成函数产生权系数偏移
w1[i][j][k]=w[i][j][k]+w_add*0.001;
}
}
}
void main()
{
double cost0_total, cost1_total;
double cost0[20], cost1[20];
double diff_cost;
double min_cost0_total=1;
int m,i,j,k;
long count1=0, count0=0;
long cc=0;
double x,y,z;
srand((unsigned)time(NULL));
FILE *fp_count;
FILE *fp_in_put;
FILE *fp_out_exp;
FILE *fp_out_net;
FILE *fp_cost0_total;
FILE *fp_cp;
FILE *fp_min_cost0_total;
FILE *fp_w100;//1
FILE *fp_w110;//2
FILE *fp_w120;//3
FILE *fp_w130;//4
FILE *fp_w200;//5
FILE *fp_w201;//6
FILE *fp_w202;//7
FILE *fp_w203;//8
FILE *fp_w210;//9
FILE *fp_w211;//10
FILE *fp_w212;//11
FILE *fp_w213;//12
FILE *fp_w300;//13
FILE *fp_w301;//14
fp_in_put=fopen("in_put.dat","w");
fp_out_net=fopen("out_net.dat","w");
fp_count=fopen("count.dat","w");
fp_out_exp=fopen("out_expected.dat","w");
fp_cost0_total=fopen("cost0_total.dat","w");
fp_cp=fopen("cp_temperature.dat","w");
fp_min_cost0_total=fopen("min_cost0_total.dat","w");
fp_w100=fopen("w100.dat","w");//1
fp_w110=fopen("w110.dat","w");//2
fp_w120=fopen("w120.dat","w");//3
fp_w130=fopen("w130.dat","w");//4
fp_w200=fopen("w200.dat","w");//5
fp_w201=fopen("w201.dat","w");//6
fp_w202=fopen("w202.dat","w");//7
fp_w203=fopen("w203.dat","w");//8
fp_w210=fopen("w210.dat","w");//9
fp_w211=fopen("w211.dat","w");//10
fp_w212=fopen("w212.dat","w");//11
fp_w213=fopen("w213.dat","w");//12
fp_w300=fopen("w300.dat","w");//13
fp_w301=fopen("w301.dat","w");//14
initiat();
for(i=0;i<CPN;i++)
fprintf(fp_in_put,"%f",in_put[i]);
do
{
if(count0%10000==0)
{
fprintf(fp_w100,"%f ",w[1][0][0]);//1
fprintf(fp_w110,"%f ",w[1][1][0]);//2
fprintf(fp_w120,"%f ",w[1][2][0]);//3
fprintf(fp_w130,"%f ",w[1][3][0]);//4
fprintf(fp_w200,"%f ",w[2][0][0]);//5
fprintf(fp_w201,"%f ",w[2][0][1]);//6
fprintf(fp_w202,"%f ",w[2][0][2]);//7
fprintf(fp_w203,"%f ",w[2][0][3]);//8
fprintf(fp_w210,"%f ",w[2][1][0]);//9
fprintf(fp_w211,"%f ",w[2][1][1]);//10
fprintf(fp_w212,"%f ",w[2][1][2]);//11
fprintf(fp_w213,"%f ",w[2][1][3]);//12
fprintf(fp_w300,"%f ",w[3][0][0]);//13
fprintf(fp_w301,"%f ",w[3][0][1]);//14
cc++;
}
cost0_total=0;
for(m=0;m<CPN;m++)
{
in_net=in_put[m];
cultivate_out_exp();
net_work(w,f);
fprintf(fp_out_net,"(%d)%d=%f ",count0,m,out_net);//第n次学习20个样本输出
cost0[m]=cultivate_cost();
cost0_total+=cost0[m];
}
fprintf(fp_cost0_total,"%d=%f ",count0,cost0_total);//第n次学习的总代价
count0++;
if(cost0_total<min_cost0_total)
{
min_cost0_total=cost0_total;
fprintf(fp_min_cost0_total,"%d=%f ",count0,cost0_total);
}
cp=cp0/(log(10+count0));
fprintf(fp_cp,"%f ",cp);
do
{
cost1_total=0;
generate_w();
for(m=0;m<CPN;m++)
{
in_net=in_put[m];
cultivate_out_exp();
net_work(w1,f1);
cost1[m]=cultivate_cost();
cost1_total+=cost1[m];
}
diff_cost=cost1_total-cost0_total;
count1++;
z=exp(diff_cost/cp);
x=1.0/(1.0+z);//接受函数
y=rand()/32767.0;
if((diff_cost<=0)&(x>y))
break;
if(count1>1000)
break;
}while(1);
fprintf(fp_count,"c0=%d c1=%d ",count0,count1);
count1=0;
for(i=1;i<NUM_LAYER;i++)
for(j=0;j<num_node[i];j++)
{
f[i][j]=f1[i][j];
for(k=0;k<num_node[i-1];k++)
{
w[i][j][k]=w1[i][j][k];
cout<<"w"<<i<<j<<k<<" "<<w[i][j][k]<<endl;
}
}
if((cost0_total<=0.001)||(count0>100000))
break;
}while(1);
fprintf(fp_w100," %f",w[1][0][0]);//1
fprintf(fp_w110," %f",w[1][1][0]);//2
fprintf(fp_w120," %f",w[1][2][0]);//3
fprintf(fp_w130," %f",w[1][3][0]);//4
fprintf(fp_w200," %f",w[2][0][0]);//5
fprintf(fp_w201," %f",w[2][0][1]);//6
fprintf(fp_w202," %f",w[2][0][2]);//7
fprintf(fp_w203," %f",w[2][0][3]);//8
fprintf(fp_w210," %f",w[2][1][0]);//9
fprintf(fp_w211," %f",w[2][1][1]);//10
fprintf(fp_w212," %f",w[2][1][2]);//11
fprintf(fp_w213," %f",w[2][1][3]);//12
fprintf(fp_w300," %f",w[3][0][0]);//13
fprintf(fp_w301," %f",w[3][0][1]);//14
cout<<"total count: "<<count0<<endl;
cout<<"the end temperature is: "<<cp<<endl;
cout<<"the total cost is: "<<cost0_total<<endl;
fprintf(fp_count,"\n记录次数=%ld\n",cc);
fprintf(fp_count,"外循环次数=%ld\n",count0);
fclose(fp_in_put);
fclose(fp_out_net);
fclose(fp_count);
fclose(fp_out_exp);
fclose(fp_cost0_total);
fclose(fp_cp);
fclose(fp_min_cost0_total);
fclose(fp_w100);
fclose(fp_w110);
fclose(fp_w120);
fclose(fp_w130);
fclose(fp_w200);
fclose(fp_w201);
fclose(fp_w202);
fclose(fp_w203);
fclose(fp_w210);
fclose(fp_w211);
fclose(fp_w212);
fclose(fp_w213);
fclose(fp_w300);
fclose(fp_w301);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -