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

📄 main.cpp

📁 本算法采用LVQ竞争学习网络
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for(i=0; i<unitnumber; i++)
		sumtemp += v[i] * hn_out[i];
	sumtemp += y_b;
	//y=sumtemp;
	y = 1/(1+exp(-sumtemp));
	if(y<0.01) y=0.01;
	if(y>0.99) y=0.99;
	
}

void delta(int m)
{
	errtemp =data[m].teach-y;
	error += 0.5*errtemp*errtemp;     
	y_delta = errtemp*y*(1-y);  
	for(i=0; i<unitnumber; i++)             //计算隐含层的delta
	{
	//	errtemp = 0.0;
		errtemp = y_delta * v[i];
		hn_delta[i] = errtemp* hn_out[i]*(1.0-hn_out[i]);
	}
	
}

double vsum[HN];
void v_sum()
{
	for(i=0; i<unitnumber; i++)
		vsum[i]=vsum[i]+y_delta*hn_out[i];
	
}

double bsum;
void b_sum()
{
	bsum=bsum+y_delta;
	
}

double hnsum[HN];
void hnb_sum()
{   
	for(i=0; i<unitnumber; i++)
	hnsum[i]=hnsum[i]+hn_delta[i];
	
}

double wsum[HN][IN];
void w_sum()
{
	for(i=0; i<unitnumber; i++)
		for(j=0;j<IN;j++)
			wsum[i][j]=wsum[i][j]+hn_delta[i]*xout[j];
		
}

double r=0.01;
void  choose()
{
	
	
	double cha;
	cha=error-error_1;
	if(cha>0) 
	alpha=alpha*(1-r);
	
	if(cha<0) 
	alpha=alpha*(1+r);

    
}


double chaos(double x)
{
	double q1=0.8;
	double q2=0.6;
	double result;
	result=q1*x*exp(-q2*fabs(x));
	return result;

}



void outquan()
{

	double parameter;
	for(i=0; i<unitnumber; i++)					//调整输出层的权值和偏置系数
	{ 

		parameter=v[i]-v0[i];
		v1[i]=v[i];
		parameter=alpha * vsum[i]+chaos(parameter);
		v0[i]=v1[i];
		
	}
	y_b+= beta * bsum;	
}

void hnquan()
{
	double parameter;
	for(i=0; i<unitnumber; i++)                //调整隐含层的权值和偏置系数
	{
		for(j=0; j<IN; j++)
		{   

			parameter=w[i][j]-w0[i][j];
			w1[i][j]=w[i][j];
			parameter = alpha*wsum[i][j] +chaos(parameter);
			w0[i][j]=w1[i][j];
			
		}
		
		hn_b[i] += beta * hnsum[i]; 
	}
	
	
}
//-----------------------------------------------------------

void hiddenlayunitchoose(int k);
void main()
{
	double price;
	int vector[daynumber];
	//srand((unsigned)time(NULL));
	getteachingdataprice();
	getteachingdataload();
	gettestingdataprice();
	gettestingload();
	ofstream  fp;
	fp.open("out.txt",ios::out);
	double err_1=0.0;
	for(int interval=0;interval<N;interval++)
	{
		hiddenlayunitchoose(interval);
		for(int i=1;i<daynumber;i++)
		teachinginputset(i,interval);
		GLVQ(interval,vector);//if(interval>=32)  
		initializing();
		loop=0;
		while(loop<times)
		{
			loop++;
			error=0.0;
			//...............................................................
			bsum=0;
			for(i=0; i<unitnumber; i++)
				vsum[i]=0.0;
			for(i=0; i<unitnumber; i++)
				hnsum[i]=0.0;
			for(i=0; i<unitnumber; i++)
				for(j=0; j<IN; j++)
					wsum[i][j]=0.0;
		//..............................................................................
				
				for(int m=0; m<daynumber; m++)
				{
					//if(vector[m])	
					{
						//cout<<"vector["<<m<<"]="<<vector[m]<<endl;
						layer_in(m);
						hnout();
						yout();
						delta(m);
						v_sum();
						b_sum();
						hnb_sum(); 
						w_sum();
					}
				}
				
			//	cout<<"Error="<<error<<endl;
			//	if(error==0)  break;
				choose();
				outquan();
				hnquan();
				if(fabs(error-error_1)< errlimit&&error>error_1) break;
				error_1=error;
				
				
		}
		//cout<<"Error="<<error<<endl;
		//输出训练结果
		//cout<<endl<<"training completion............"<<endl;
		//cout<<"unitnumber="<<unitnumber<<endl;
		//cout<<"Error="<<error<<endl;
		//cout<<"Loop="<<loop<<endl;
		
		//	利用上面训练得到的权值和偏置系数进行检验
		
		cout<<endl<<"testing............"<<endl;
		testinginputset(daynumber,interval);
		double err_1=0.0;
		for(i=0; i<IN; i++)                 //设置输入层的输出
			xout[i]=data[daynumber].input[i];
		for(i=0; i<unitnumber; i++)							
		{
			sumtemp = 0.0;
			for(j=0; j<IN; j++)
				sumtemp += w[i][j] * xout[j];
			sumtemp +=hn_b[i];
			hn_out[i]=1/(1+exp(-sumtemp));			
		}
		
		sumtemp = 0.0;
		for(i=0; i<unitnumber; i++)
			sumtemp += v[i] * hn_out[i];
		sumtemp += y_b;
		//	y=sumtemp;
		y = 1/(1+exp(-sumtemp));
		price=y*maxprice;
		pricepointer[daynumber][interval]=price;
		double err;
		err=data[daynumber].teach-y;
		cout<<"第"<<interval+1<<"点预测的结果为:"<<price<<endl;
		fp/*<<"第"<<interval+1<<"点预测的结果为:"*/<<price<<endl;
		cout<<"第"<<interval+1<<"点实际的电价为:"<<data[daynumber].teach*maxprice<<endl;
		//fp<<"第"<<interval+1<<"点实际的结果为:"<<data[daynumber].input[IN-1]*maxprice<<endl;
		//fp<<endl;
		double percent;
		percent=fabs(err)/data[daynumber].teach;
		cout<<"第"<<interval+1<<"点预测的相对误差为:"<<100*percent<<"%"<<endl;
		//cout<<endl;
		err_1+=percent;	
	}
		
		fp<<"平均相对误差为:"<<100*(err_1/N)<<"%"<<endl;
}

void hiddenlayunitchoose(int k)
{
	switch(k)
	{
		case 0 :unitnumber=8;break;
		case 1 :unitnumber=8;break;
		case 2: unitnumber=8;break;
		case 3: unitnumber=8;break;
		case 4: unitnumber=8;break;
		case 5: unitnumber=8;break;
		case 6: unitnumber=12;break;
		case 7: unitnumber=16;break;
		case 8: unitnumber=8;break;
		case 9: unitnumber=8;break;
		case 10: unitnumber=8;break;
		case 11: unitnumber=8;break;
		case 12: unitnumber=8;break;
		case 13: unitnumber=8;break;
		case 14: unitnumber=8;break;
		case 15: unitnumber=16;break;
		case 16: unitnumber=8;break;
		case 17: unitnumber=8;break;
		case 18: unitnumber=8;break;
		case 19: unitnumber=8;break;
		case 20: unitnumber=8;break;
		case 21: unitnumber=6;break;
		case 22:unitnumber=6;break;
		case 23:unitnumber=8;break;
		case 24:unitnumber=8;break;
		case 25:unitnumber=3;break;
		case 26:unitnumber=3;break;
		case 27:unitnumber=9;break;
		case 28:unitnumber=3;break;
		case 29:unitnumber=3;break;
		case 30:unitnumber=8;break;
		case 31:unitnumber=7;break;
		case 32:unitnumber=9;break;
		case 33:unitnumber=16;break;
		case 34:unitnumber=5;break;
		case 35:unitnumber=12;break;
		case 36:unitnumber=5;break;
		case 37:unitnumber=5;break;
		case 38:unitnumber=5;break;
		case 39:unitnumber=5;break;
		case 40:unitnumber=5;break;
		case 41:unitnumber=5;break;
		case 42:unitnumber=5;break;
		case 43:unitnumber=5;break;
		case 44:unitnumber=5;break;
		case 45:unitnumber=5;break;
		case 46:unitnumber=5;break;
		case 47:unitnumber=5;break;
		case 48:unitnumber=5;break;
		case 49:unitnumber=5;break;
		case 50:unitnumber=5;break;
		case 51:unitnumber=5;break;
		case 52:unitnumber=5;break;
		case 53:unitnumber=5;break;
		case 54:unitnumber=5;break;
		case 55:unitnumber=5;break;
		case 56:unitnumber=5;break;
		case 57:unitnumber=5;break;
		case 58:unitnumber=5;break;
		case 59:unitnumber=5;break;
		case 60:unitnumber=5;break;
		case 61:unitnumber=5;break;
		case 62:unitnumber=5;break;
		case 63:unitnumber=5;break;
		case 64:unitnumber=5;break;
		case 65:unitnumber=5;break;
		case 66:unitnumber=5;break;
		case 67:unitnumber=5;break;
		case 68:unitnumber=5;break;
		case 69:unitnumber=5;break;
		case 70:unitnumber=5;break;
		case 71:unitnumber=5;break;
		case 72:unitnumber=5;break;
		case 73:unitnumber=5;break;
		case 74:unitnumber=5;break;
		case 75:unitnumber=6;break;
		case 76:unitnumber=5;break;
		case 77:unitnumber=5;break;
		case 78:unitnumber=5;break;
		case 79:unitnumber=5;break;
		case 80:unitnumber=5;break;
		case 81:unitnumber=5;break;
		case 82:unitnumber=5;break;
		case 83:unitnumber=5;break;
		case 84:unitnumber=5;break;
		case 85:unitnumber=5;break;
		case 86:unitnumber=5;break;
		case 87:unitnumber=5;break;
		case 88:unitnumber=5;break;
		case 89:unitnumber=8;break;
		case 90:unitnumber=8;break;
		case 91:unitnumber=8;break;
		case 92:unitnumber=6;break;
		case 93:unitnumber=8;break;
		case 94:unitnumber=8;break;
		case 95:unitnumber=7;break;
		default: unitnumber=6;
	}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -