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

📄 main.cpp

📁 本算法采用相似搜索
💻 CPP
字号:
#include "head.h"
double forcastcoefficient[N];
int number;
double maxprice=500;
double forcastprice[N];
double forcasterror[N];
//double maxerror=0.0;
//double meanerror=0.0;
double threshold=0.9998;
double deltay[N];
double cossimilardegree(double a[N],double b[N]);
void regression(int ,int  );
//double cossimilardegree1(double a[N],double b[N]);
void findsimilarday(double x[N]);
void regressioncoefficientchecking( ); 
double yuce(int);
void correct(double x[]);
void weightedregression(double x[N],int ,int );

double a[N];
double b[N];
void main(void)
{
	double p[N];
	ofstream fp;
	fp.open("out_price.txt",ios::out);
	getteachingdataload();
	getteachingdataprice();
	getdataload();
	getdataprice();
	//for(int i=0;i<=daynumber;i++)
		//data2[i]=data[i];
	
	//findsimilarday(data[daynumber].loadsequence);
//	fp<<"当余弦相关度阈值设为"<<threshold<<"时"<<endl;
	//fp<<"回归数据的天数为"<<number+1<<endl;
	//fp<<"平均百分比误差为"<<100*meanerror<<"%"<<endl;
//	fp<<"最大相对误差为"<<100*maxerror<<"%"<<endl;
//	fp<<endl;
	//weightedregression(data[daynumber].loadsequence,0,7);
	regression(0,96);
	for(int j=0;j<96;j++)
	p[j]=yuce(j);

	//regression(32,24);
	weightedregression(data[daynumber].loadsequence,32,96);
	for(j=32;j<N;j++)
	p[j]=yuce(j);

	for(int i=0;i<N;i++)
	{
		fp/*<<"第"<<i+1<<"点预测电价"*/<<p[i]<<endl;
	//	fp<<"第"<<i+1<<"点实际电价 "<<data2[daynumber].pricesequence[i]<<endl;
	//	fp<<"第"<<i+1<<"点相对误差"<<100*forcasterror[i]<<"%"<<endl;
	//	fp<<endl;
	
	}
	
	
}


double cossimilardegree(double t[N],double p[N])//求余弦夹角
{
	double a[N];
	double b[N];
	double sum;
	double innerproduct=0.0;
	for(int i=0;i<N;i++)
		a[i]=t[i];
	for(i=0;i<N;i++)
		b[i]=p[i];
	sum=0.0;
	for(i=0;i<N;i++)
		sum+=a[i]*a[i];
	sum=sqrt(sum);
	for(i=0;i<N;i++)
		a[i]=a[i]/sum;

	sum=0.0;
	for(i=0;i<N;i++)
		sum+=b[i]*b[i];
	sum=sqrt(sum);
	for(i=0;i<N;i++)
		b[i]=b[i]/sum;
	
	for(i=0;i<N;i++)
		innerproduct+=a[i]*b[i];

	//cout<<"innerproduct="<<innerproduct<<endl;
	return  innerproduct;
}


double ratio[daynumber][N];
void weightedregression(double x[N],int p,int q)
{
	
	double reciprocalsum=0.0;
	double reciprocal[daynumber];
	int k=0;
	double sum_1[N];
	double sum_2[N];
	double sum_3[N];
	double sum_4[N];
	double weight[daynumber];
	double temp[daynumber];
	for(int m=0;m<daynumber; m++)
	{	

		temp[m]=cossimilardegree(x,data[m].loadsequence);
		//cout<<"temp["<<m<<"]="<<temp[m]<<endl;
		if(temp[m]>threshold) 
		{
			//cout<<"temp["<<m<<"]="<<temp[m]<<endl;
			data1[k]=data[m];
			reciprocal[k]=temp[m];
			reciprocalsum+=reciprocal[k];
			k=k+1;
		}
	}

	number=k-1;
	cout<<"相似天数为"<<number+1<<endl;

	for(k=0;k<=number;k++)
	{
		weight[k]=reciprocal[k]/reciprocalsum;
		//cout<<"weight[k]="<<weight[k]<<endl;
	}

	for(int i=p;i<q;i++)
	{	
		 sum_1[i]=0.0;
		 sum_2[i]=0.0;
		 sum_3[i]=0.0;
		 sum_4[i]=0.0;
		 for(k=0;k<=number;k++)
		{
			//ratio[k][i]=data1[k].pricesequence[i];///data1[k].loadsequence[i];
			sum_1[i]+=weight[k]*data1[k].loadsequence[i];
			//cout<<"sum_1[i]="<<sum_1[i]<<endl;
			sum_2[i]+=weight[k]*data1[k].pricesequence[i];
			sum_3[i]+=weight[k]*data1[k].pricesequence[i]*data1[k].loadsequence[i];
			sum_4[i]+=weight[k]*data1[k].loadsequence[i]*data1[k].loadsequence[i];
			
		}

		a[i]=(sum_3[i]-sum_2[i]*sum_1[i])/(sum_4[i]-sum_1[i]*sum_1[i]);
		//cout<<"a["<<i<<"]="<<a[i]<<endl;
		b[i]=sum_2[i]-a[i]*sum_1[i];
	
	}
}


void regression(int q,int p)
{
	double averagex[N];
	double averagey[N];
	double sum_1[N];
	double sum_2[N];
	double sum_3[N];
	double sum_4[N];
	for(int i=q;i<p;i++)
	{	
		sum_1[i]=0.0;
		sum_2[i]=0.0;
		sum_3[i]=0.0;
		sum_4[i]=0.0;
		for(int k=0;k<daynumber;k++)
		{
			//ratio[k][i]=data1[k].pricesequence[i];///data1[k].loadsequence[i];
			sum_1[i]+=data[k].loadsequence[i];
			//cout<<"sum_1[i]="<<sum_1[i]<<endl;
			sum_2[i]+=data[k].pricesequence[i];
		 }

		averagex[i]=sum_1[i]/(daynumber);
		averagey[i]=sum_2[i]/(daynumber);

		for(k=0;k<daynumber;k++)
		{
			sum_3[i]+=(data[k].loadsequence[i]-averagex[i])*(data[k].loadsequence[i]-averagex[i]);
			sum_4[i]+=(data[k].loadsequence[i]-averagex[i])*(data[k].pricesequence[i]-averagey[i]);
			
			
		}
		
		a[i]=sum_4[i]/sum_3[i];
		//cout<<"a[i]="<<a[i]<<endl;
		b[i]=averagey[i]-a[i]*averagex[i];
	
	}
}



/*
void correct(double x[])
{
	double  averagex[N];
	double   averagey[N];
	double  sumx[N];
	double  sumy[N];
	double  sx[N];
	double  sy[N];
	double  coefficient[N];
	double constant[N];
	//number=22;
	/*
	for(int k=1;k<=number;k++)
		for(int i=0;i<N;i++)
		{
			Data1[k-1].loadsequence[i]=data1[k].loadsequence[i]-data1[k-1].loadsequence[i];
			Data1[k-1].pricesequence[i]=data1[k].pricesequence[i]-data1[k-1].pricesequence[i];
		}
	*/
	/*
	for(int i=0;i<N;i++)
	{
		sumx[i]=0.0;
		sumy[i]=0.0;
		for(int k=1;k<=number;k++)
		{
			sumx[i]+=Data1[k-1].loadsequence[i];
			sumy[i]+=Data1[k-1].pricesequence[i];
		
		}

		averagex[i]=sumx[i]/number;
		averagey[i]=sumy[i]/number;

		sx[i]=0.0;
		sy[i]=0.0;

		for(k=1;k<=number;k++)
		{
			sx[i]+=(Data1[k-1].loadsequence[i]-averagex[i])*(Data1[k-1].pricesequence[i]-averagey[i]);
			cout<<"sx[i]="<<sx[i]<<endl;
			sy[i]+=(Data1[k-1].loadsequence[i]-averagex[i])*(Data1[k-1].loadsequence[i]-averagex[i]);
		
		}
		
		coefficient[i]=sx[i]/sy[i];
		constant[i]=averagey[i]-coefficient[i]*averagex[i];
		//deltay[i]=constant[i]+coefficient[i]*x[i];
		cout<<"deltay[i]="<<deltay[i]<<endl;
	}

}

*/

double yuce(int interval)
{
	//double x[N];
	double q;
	//for(int i=0;i<N;i++)
	//	x[i]=data2[daynumber].loadsequence[i]-data1[number].loadsequence[i];
//	correct(x);
	forcastprice[interval]=a[interval]*data[daynumber].loadsequence[interval]+b[interval];
	//cout<<"forcastcoefficient[i]="<<forcastcoefficient[i]<<endl;
	//forcastprice[i]=forcastcoefficient[i]*data2[daynumber].loadsequence[i];
	if(forcastprice[interval]>maxprice) forcastprice[interval]=maxprice;
	q=forcastprice[interval];
	forcasterror[interval]=(forcastprice[interval]-data[daynumber].pricesequence[interval])/data[daynumber].pricesequence[interval];
//	if(fabs(forcasterror[interval])>maxerror) maxerror=fabs(forcasterror[interval]);
	//meanerror+=fabs(forcasterror[interval]);
	cout<<"第"<<interval+1<<"预测电价"<<forcastprice[interval]<<"     ";
	
	cout<<"第"<<interval+1<<"实际电价 "<<data[daynumber].pricesequence[interval]<<endl;
	
	//cout<<"第"<<interval+1<<"相对误差"<<100*forcasterror[interval]<<"%"<<endl;
	
	//cout<<endl;
	////fp<<endl;
	return q;
}







/*
void regressioncoefficientchecking( )                   
{
	double ta[N];
	double tb[N];
	double sum=0.0;
	double loadsum[N];
	double loadaverage[N];
	double standarderr[N];
	double astandarderr[N];
	double bstandarderr[N];
	double revluation[daynumber];
	double yevluation[N];
	double Ta_5=2.051;
	for(int i=0;i<N;i++)
	{
		yevluation[i]=0.0;
		for(int k=0;k<=number;k++)
		{
			revluation[k]=(forcastprice[i]-(a[i]*data1[k].loadsequence[i]+b[i]))*(forcastprice[i]-(a[i]*data1[k].loadsequence[i]+b[i]));
			yevluation[i]+=revluation[k];
		}
	}
	
	for(i=0;i<N;i++)
	{
		loadsum[i]=0.0;
		loadaverage[i]=0.0;
		for(int k=0;k<=number;k++)
		loadsum[i]+=data1[k].loadsequence[i];
		for(k=0;k<=number;k++)
			loadaverage[i]+=(data1[k].loadsequence[i]-loadsum[i]/(number+1))*(data1[k].loadsequence[i]-loadsum[i]/(number+1));
		loadaverage[i]=sqrt(loadaverage[i]);
	}
	for(i=0;i<N;i++)
	{
		standarderr[i]=sqrt(yevluation[i]/(number+1-2));	
		bstandarderr[i]=standarderr[i]/sqrt(number+1);
		astandarderr[i]=standarderr[i]/loadaverage[i];
	}

	cout<<"相似天数为"<<number+1<<endl;
	for(i=0;i<N;i++)
	{
		
		cout<<endl;
		ta[i]=fabs(a[i])/astandarderr[i];
		cout<<"ta["<<i<<"]="<<ta[i]<<endl;
		tb[i]=fabs(b[i])/bstandarderr[i];

		//if(ta[i]>Ta_5) cout<<"a["<<i<<"]与零有显著差异"<<endl;
	//	else cout<<"a["<<i<<"]与零无显著差异"<<endl;

	//	if(tb[i]>Ta_5) cout<<"b["<<i<<"]与零有显著差异"<<endl;
	
	//	else	cout<<"b["<<i<<"]与零无显著差异"<<endl;
	}

	//for(i=0;i<N;i++)
	{
	//	if(ta[i]>Ta_5&&tb[i]>Ta_5)
		{

		//	cout<<"ta["<<i<<"]="<<ta[i]<<endl;
		//	cout<<"tb["<<i<<"]="<<tb[i]<<endl;
			
		}
	}
}
*/

/*
//int num_dat;
double z;
void iapcir(double *x,double *y,int n,double *a,int m,double *dt)
{
	   int i,j,k;
	   double p,c,g,q,d1,d2,s[100],t[100],b[100];
	   for (i=0; i<=m-1; i++) a[i]=0.0;
	   if (m>n) m=n;
	   if (m>20) m=20;
	   z=0.0;
	   for (i=0; i<=n-1; i++) z=z+x[i]/(1.0*n);
	   
	   b[0]=1.0; d1=1.0*n; p=0.0; c=0.0;
	   for (i=0; i<=n-1; i++)
	   { 
		   p=p+(x[i]-z); c=c+y[i];}
	   c=c/d1; p=p/d1;
	   a[0]=c*b[0];
	   if (m>1)
	   { 
		   t[1]=1.0; t[0]=-p;
		   d2=0.0; c=0.0; g=0.0;
		   for (i=0; i<=n-1; i++)
		   { 
			   q=x[i]-z-p; d2=d2+q*q;
			   c=c+y[i]*q;
			   g=g+(x[i]-z)*q*q;
		   }
		   c=c/d2; p=g/d2; q=d2/d1;
		   d1=d2;
		   a[1]=c*t[1]; a[0]=c*t[0]+a[0];
	   }

	   for (j=2; j<=m-1; j++)
	   { 
		   s[j]=t[j-1];
		   s[j-1]=-p*t[j-1]+t[j-2];
		   if (j>=3)
			   for (k=j-2; k>=1; k--)
				   s[k]=-p*t[k]+t[k-1]-q*b[k];
			   s[0]=-p*t[0]-q*b[0];
			   d2=0.0; c=0.0; g=0.0;
			   for (i=0; i<=n-1; i++)
			   { 
				   q=s[j];
				   for (k=j-1; k>=0; k--)
					   q=q*(x[i]-z)+s[k];
				   
				   d2=d2+q*q; c=c+y[i]*q;
				   
				   g=g+(x[i]-z)*q*q;
			   }
				
			   c=c/d2; p=g/d2; q=d2/d1;
			   d1=d2;
			   a[j]=c*s[j]; t[j]=s[j];
				
			   for (k=j-1; k>=0; k--)
			   { 
				   a[k]=c*s[k]+a[k];
				   b[k]=t[k]; 
				   t[k]=s[k];
			   }
	   }
	   dt[0]=0.0; dt[1]=0.0; dt[2]=0.0;
	   for (i=0; i<=n-1; i++)
	   { 
		   q=a[m-1];
		   for (k=m-2; k>=0; k--)
			   q=a[k]+q*(x[i]-z);
		   p=q-y[i];
		   if (fabs(p)>dt[2]) dt[2]=fabs(p);
		   dt[0]=dt[0]+p*p;
		   dt[1]=dt[1]+fabs(p);
	   }
	   return;
}

*/
















⌨️ 快捷键说明

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