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

📄 ga.cpp

📁 连轧过程控制仿真程序
💻 CPP
字号:
// GA.cpp: implementation of the GA class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "2level.h"
#include "GA.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

GA::GA()
{
	
	

}

GA::~GA()
{
	

}


//不需要改变
int GA::constraint_check(double x[],global y)
{
	de_dragmodel yield;
	pressmodel press;
	speedmodel speed;
	torquemodel torque;
	powermodel power;
	double rH[5];
	int i;
	if((4.25>x[1])&&(x[1]>x[2])&&(x[2]>x[3])&&(x[3]>x[4])&&
		(x[1]<y.h[0]+0.2)&&(x[1]>y.h[0]-0.2)&&(x[2]<y.h[1]+0.2)&&(x[2]>y.h[1]-0.2)&&(x[3]<y.h[2]+0.2)&&(x[1]>y.h[2]-0.2))
	{
		y.h[0]=x[1];
		y.h[1]=x[2];
		y.h[2]=x[3];
				
		y.H[1]=y.h[0];
		y.H[2]=y.h[1];
		y.H[3]=y.h[2];
		
		//compute the relative press value  of  1 stand to 4 stand;

		rH[0]=(y.H[0]-y.h[0])/y.H0;
		rH[1]=(y.H[0]-y.h[1])/y.H0;
		rH[2]=(y.H[0]-y.h[2])/y.H0;
		rH[3]=(y.H[0]-y.h[3])/y.H0;
		rH[4]=(y.H[0]-y.h[4])/y.H0;

		for(i=0;i<=4;i++)
		{
			y.r[i]=(y.H[i]-y.h[i])/y.H[i];
		
		}
		
		//compute the yield ;
	
		for (i=0;i<=4;i++)
		{
			y.de_drag[i]=yield.de_drag(y.m,rH[i]);

		}
	
		//compute the press value of every stand;
	
		for (i=0;i<=4;i++)
		{
			y.P[i]=press.press1(i,y,y.de_drag[i]);
			if(y.P[i]>y.max_P)
			{
				return 0;
			}
		}
	
		//compute the rolling speed;
		for(i=0;i<=4;i++)
		{
			y.vr[i]=speed.roll_speed(i,y);
		}
	
		//compute the torque of every stand;
			
		for(i=0;i<=4;i++)
		{
			y.MM[i]=torque.torque(i,y);
			
		
		}
				
		//compute the power of every stand;
			
		for(i=0;i<=4;i++)
		{
			y.W[i]=power.power(i,y);
			if(y.W[i]>y.max_power[i])
			{
				return 0;
			}
		}
		return 1;
	}
	else
	{
		return 0;
	}
}

void GA::initialization(double H0,double h4,global y)
{
	
	int k;
	double h[4];
	
	double H[4];
	double x[5];
	bool nn;
	h[3]=y.h[3];
		
	//编码
   
	for(k=1; k<=POP_SIZE; k++)
	{
		nn=false;
	 
		while(nn==false)
		{
			/*
			h[0]=myu(0.68*H0,0.9*H0);
			H[1]=h[0];
			h[1]=myu(0.65*H[1],0.9*H[1]);
			H[2]=h[1];
			h[2]=myu(0.7*H[2],0.9*H[2]);
			H[3]=h[2];
			*/
			
			h[0]=myu(y.h[0]-0.3,y.h[0]+0.3);
			H[1]=h[0];
			h[1]=myu(y.h[1]-0.3,y.h[1]+0.3);
			H[2]=h[1];
			h[2]=myu(y.h[2]-0.3,y.h[2]+0.3);
			H[3]=h[2];
		
			if(H[3]<h[3])
			{
				H[3]=1.05*h[3];
				h[2]=H[3];

			}
		
			if(H[2]<h[2])
			{
				H[2]=1.05*h[2];
				h[1]=H[2];
			}
			if(H[1]<h[1])
			{
				H[1]=1.05*h[1];
				h[0]=H[1];
			}

			x[1]=h[0];
			x[2]=h[1];
			x[3]=h[2];
			x[4]=1.5;
			
			if(constraint_check(x,y)==1)
			{
				CHROMOSOME[k][1]=h[0];
				CHROMOSOME[k][2]=h[1];
				CHROMOSOME[k][3]=h[2];
				nn=true;
						
			}
			
		}
		
	 }
	
	
	return;
}
void GA::objective_function(global y)
{
	double x1,x2,x3;
	de_dragmodel yield;
	pressmodel press;
	speedmodel speed;

	torquemodel torque;
	powermodel power;
	double sum_power_ratio=0; //功率平衡因数和
	double aver_power_ratio;  //平均功率平衡因数
  	
	double rH[5];
	int i,j;
	for(j = 1; j <= POP_SIZE; j++)
	{
		x1 = CHROMOSOME[j][1];
		x2 = CHROMOSOME[j][2];
		x3 = CHROMOSOME[j][3];
		
		y.h[4]=y.h5;
		y.h[0]=x1;
		y.h[1]=x2;
		y.h[2]=x3;
		y.h[3]=y.h[4]/(1-0.05);
		
		y.H[0]=y.H0;
		y.H[1]=y.h[0];
		y.H[2]=y.h[1];
		y.H[3]=y.h[2];
		y.H[4]=y.h[3];
		
		//compute the relative press value  of  1 stand to 4 stand;

		rH[0]=(y.H[0]-y.h[0])/y.H0;
		rH[1]=(y.H[0]-y.h[1])/y.H0;
		rH[2]=(y.H[0]-y.h[2])/y.H0;
		rH[3]=(y.H[0]-y.h[3])/y.H0;
		rH[4]=(y.H[0]-y.h[4])/y.H0;

		for(i=0;i<=4;i++)
		{
			y.r[i]=(y.H[i]-y.h[i])/y.H[i];
		
		}
		
		//compute the yield ;
	
		for (i=0;i<=4;i++)
		{
			y.de_drag[i]=yield.de_drag(y.m,rH[i]);

		}
	
		//compute the press value of every stand;
	
		for (i=0;i<=4;i++)
		{
			y.P[i]=press.press1(i,y,y.de_drag[i]);
		}
	
		//compute the rolling speed;
		for(i=0;i<=4;i++)
		{
			y.vr[i]=speed.roll_speed(i,y);
		}
	
		//compute the torque of every stand;
				
		for(i=0;i<=4;i++)
		{
			y.MM[i]=torque.torque(i,y);
		
		}
				
		//compute the power of every stand;
			
		for(i=0;i<=4;i++)
		{
			y.W[i]=power.power(i,y);
		}
		
		//计算平衡因数
		
		for(i=0;i<=3;i++)
		{
			y.power_ratio[i]=y.W[i]/y.max_power[i];
		}
		//compute the average power ratio
		
		for(i=1;i<=3;i++)
		{
			sum_power_ratio=sum_power_ratio+y.power_ratio[i];
		}
		aver_power_ratio=sum_power_ratio/3;
		
		y.ratio[0]=y.P[0]/y.P[1];
	
		y.ratio[1]=y.power_ratio[1]/aver_power_ratio;
		y.ratio[2]=y.power_ratio[2]/aver_power_ratio;
		y.ratio[3]=y.power_ratio[3]/aver_power_ratio;

		double a[4];
		a[0]=0.8;
		a[1]=1;
		a[2]=1;
		a[3]=1;
		
		OBJECTIVE[j][1]=0;
		for(i=0;i<=3;i++)
		{
			OBJECTIVE[j][1] = OBJECTIVE[j][1]+100*a[i]*(1-y.ratio[i])*(1-y.ratio[i]);
			
		}
		
	}
	for(j=1;j<=POP_SIZE;j++)
	{
	  OBJECTIVE[j][0]= OBJECTIVE[j][1];
	
	}
	return;
}

double *GA::GA_1(global y)
{	
	int i;
	double pp[POP_SIZE+1];
	////////////////
	double sum_object;
	double sum_q;
	////////////////
	double *p;
	sum_object=0;
	sum_q=0;
	for(int j=0;j<=POP_SIZE;j++)
	{
		sum_object=sum_object+OBJECTIVE[j][0];

	}
	for(j=0;j<=POP_SIZE;j++)
	{
		q[j]=1-OBJECTIVE[j][0]/sum_object;
		sum_q=sum_q+q[j];
	}
	for(j=1;j<=POP_SIZE;j++)
	{
		q[j]=q[j-1]+q[j]/sum_q;
	}
	initialization(y.H0,y.h[4],y);
	evaluation(0,y);
	
	for(i=1; i<=GEN; i++) 
	{
		p=mutation_probability(i);
		for(j=1;j<=POP_SIZE;j++)
		{
			pp[j]=p[j];
		}
		selection();
		crossover2(y,i);
		mutation(y,pp,i);
		evaluation(i,y);
		/////////////////////////
		sum_object=0;
		sum_q=0;
		for(j=0;j<=POP_SIZE;j++)
		{
			sum_object=sum_object+OBJECTIVE[j][0];

		}
		for(j=0;j<=POP_SIZE;j++)
		{
			q[j]=1-OBJECTIVE[j][0]/sum_object;
			sum_q=sum_q+q[j];
		}
		for(j=1;j<=POP_SIZE;j++)
		{
			q[j]=q[j-1]+q[j]/sum_q;
		}
		////////////////////////
		if(OBJECTIVE[0][0]<0.1)
		{			
			break;
		}
		
	}
	
	CHROMOSOME[0][0]=i;
		
	return &CHROMOSOME[0][0];

		
}
void GA::evaluation(int gen,global y)
{
	double a;
	int   i, j, k, label;
	objective_function(y);
	if(gen==0)
	{
		for(k=0; k<=M; k++) OBJECTIVE[0][k]=OBJECTIVE[1][k];
		for(j = 1; j <= N; j++) CHROMOSOME[0][j]=CHROMOSOME[1][j];
	}
	for(i=0; i<POP_SIZE; i++)
	{                  
		//排序,从好到坏
	    label=0;  
	    a=OBJECTIVE[i][1];
	    for(j=i+1; j<=POP_SIZE; j++)
		{
			if((TYPE*a)<(TYPE*OBJECTIVE[j][1]))//找出最好值
			{
				a=OBJECTIVE[j][1];  
			    label=j;
			}
		}
	    if(label!=0) 
		{
			for(k=0; k<=M; k++) 
			{
				a=OBJECTIVE[i][k];
			    OBJECTIVE[i][k]=OBJECTIVE[label][k];
			    OBJECTIVE[label][k]=a;
			}
		    for(j=1; j<=N; j++) 
			{
				a=CHROMOSOME[i][j];
		        CHROMOSOME[i][j]=CHROMOSOME[label][j];
			    CHROMOSOME[label][j]=a;
			}
		}
  }
 
 return;
  
}

void GA::selection()
{
	double r, temp[POP_SIZE+1][N+1];
	int   i, j, k;
	for(i=1; i<=POP_SIZE; i++) 
	{
		r=myu(0, q[POP_SIZE]);
		for(j=0; j<=POP_SIZE; j++) 
		{
			if(r<=q[j]) 
			{
				for(k=1; k<=N; k++) temp[i][k]=CHROMOSOME[j][k];
				break;
			}
		}
	}
	for(i=1; i<=POP_SIZE; i++)
		for(k=1; k<=N; k++)
			CHROMOSOME[i][k]=temp[i][k];
}

void GA::crossover(global y)
{
	int   i, j, jj, k, pop;
	double r, x[N+2], z[N+1];
	pop=POP_SIZE/2;
	for(i=1; i<=pop; i++) 
	{
		if(myu(0,1)>P_CROSSOVER) continue;
		j=(int)myu(1,POP_SIZE);
		jj=(int)myu(1,POP_SIZE);
		r=myu(0,1);
		//没有直接编码成二进制,而是用十进制编码
		for(k=1; k<=N; k++) 
		{
			x[k]=r*CHROMOSOME[j][k]+(1-r)*CHROMOSOME[jj][k];   
			z[k]=r*CHROMOSOME[jj][k]+(1-r)*CHROMOSOME[j][k];
		}
		x[N+1]=1.5;
		if(constraint_check(x,y)==1)
			for(k=1; k<=N; k++) CHROMOSOME[j][k]=x[k];
		if(constraint_check(z,y)==1)
			for(k=1; k<=N; k++) CHROMOSOME[jj][k]=z[k];
	}
}
void  GA::crossover2(global y,int kk)
{
	double p1=1;
	double a=0.92;
	int   i, j, jj, k, pop;
	double r, x[N+2], z[N+1];
	p1=p1*exp(sqrt(sqrt(kk))*log(a));
	pop=POP_SIZE/2;
	for(i=1; i<=pop; i++) 
	{
		if(myu(0,1)<p1) continue;
		j=(int)myu(1,POP_SIZE);
		jj=(int)myu(1,POP_SIZE);
		r=myu(0,1);
		//没有直接编码成二进制,而是用十进制编码
		for(k=1; k<=N; k++) 
		{
			x[k]=r*CHROMOSOME[j][k]+(1-r)*CHROMOSOME[jj][k];   
			z[k]=r*CHROMOSOME[jj][k]+(1-r)*CHROMOSOME[j][k];
		}
		x[N+1]=1.5;
		if(constraint_check(x,y)==1)
			for(k=1; k<=N; k++) CHROMOSOME[j][k]=x[k];
		if(constraint_check(z,y)==1)
			for(k=1; k<=N; k++) CHROMOSOME[jj][k]=z[k];
	}

}

void GA::mutation(global y,double pp[POP_SIZE+1],int kk)
{
	int i, j, k;
	double x[N+1], z[N+1], infty, direction[N+1];
	double INFTY=0.8, precision=0.001;
	double a=0.7;
	INFTY=1.2*exp(sqrt(sqrt(kk))*log(a));
		
	for(i=1; i<=POP_SIZE; i++)
	{
		if(myu(0,1)<pp[i]) continue;
		for(k=1; k<=N; k++) x[k] = CHROMOSOME[i][k];
		for(k=1; k<=N; k++)
		{
			direction[k]=myu(-1,1);
		}
		infty=myu(0,INFTY);
		while(infty>precision) 
		{
			for(j=1; j<=N; j++) z[j]=x[j]+infty*direction[j];
			if(constraint_check(z,y)==1) 
			{
				for(k=1; k<=N; k++) CHROMOSOME[i][k]=z[k];
				break;
			}
			infty=myu(0,infty);
		}
	}
}
double *GA::mutation_probability(int k)
{
	double p1;
	double p2;
	double a;
	double pc[POP_SIZE+1];
	//////////////
	//中间变量;
	double min;
	double sum;
	double aver;
	//////////////
	p1=0.2;
	p2=0.02;
	a=0.9;
	min=OBJECTIVE[1][1];
	sum=0;
	aver=0;
	/*
	for(int i=2;i<=POP_SIZE;i++)
	{
		if(OBJECTIVE[i][1]<min)
		{
			min=OBJECTIVE[i][1];
		}
		sum=sum+OBJECTIVE[i][1];
	}
	aver=sum/POP_SIZE;
	for(i=1;i<=POP_SIZE;i++)
	{
		if(OBJECTIVE[i][1]>aver)
		{
			pc[i]=p1;
			pc[i]=pc[i]*exp(sqrt(k)*log(a));
		}
		else
		{
			pc[i]=p2+(p1-p2)*(OBJECTIVE[i][1]-min)/(aver-min);
			pc[i]=pc[i]*exp(sqrt(k)*log(a));
		}

	}
	*/
	
	///////////////////////////////////////////////////////////
	for(int i=2;i<=POP_SIZE;i++)
	{
		if(OBJECTIVE[i][1]>min)
		{
			min=OBJECTIVE[i][1];
		}
		sum=sum+OBJECTIVE[i][1];
	}
	aver=sum/POP_SIZE;
	for(i=1;i<=POP_SIZE;i++)
	{
		if(OBJECTIVE[i][1]<aver)
		{
			pc[i]=p1;
			pc[i]=pc[i]*exp(sqrt(k)*log(a));
		}
		else
		{
			pc[i]=p2+(p1-p2)*(min-OBJECTIVE[i][1])/(min-aver);
			pc[i]=pc[i]*exp(sqrt(k)*log(a));
		}

	}
	
	///////////////////////////////////////////////////
	return &pc[0];

}
double GA::myu(double a, double b) // Uniform Distribution
{
  double y;
  if(a>b) {
	AfxMessageBox("请重新调整数据范围");
	exit(1);
  }
  y = (double)rand()/(RAND_MAX);
  return (a+(b-a)*y); 
}

⌨️ 快捷键说明

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