?? ga.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 + -