⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anneal3.cpp

📁 神经网络
💻 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 + -