📄 keepaliven.h
字号:
/*This is a routine to keep the fronts alive (caring the end problem)*/
void keepalive(population *pop1_ptr,population *pop2_ptr,population *pop3_ptr,int gen);
typedef struct
{
int maxrank, /*Max rank of the global population*/
rankar[2*maxpop][2*maxpop], /*record of array of individual numbers at
a particular rank */
rankno[2*maxpop]; /*record of no. of individuals at a particular rank*/
int genes[2*maxpop][maxchrom],
rank[2*maxpop], /*rank of different individuals*/
flag[2*maxpop]; /*Setting the flag */
float fitness[2*maxpop][maxfun], /*Fitness function values for the different
individuals*/
cub_len[2*maxpop], /*Dummyfitness*/
xreal[2*maxpop][maxvar], /*value of the decoded variables for different individuals */
xbin[2*maxpop][maxvar], /* binray-coded variables */
error[2*maxpop], /*Error Values of the individuals*/
constr[2*maxpop][maxcons];
}globpop;
/*Population structure for the pool having both the old as well as new
population*/
globpop globalpop,*global_pop_ptr;
void grank(int gen);
/*Ranking the global pool*/
void grankc(int gen);
/*Ranking the global pool when the constraints are there*/
int indcmp1(float *ptr1,float *ptr2);
/*Comparison of the variables*/
void gsort(int rnk,int sel);
/*Sorting for the function values in ascending order*/
void gshare(int rnk);
/*Sharing the fitness*/
void sort(int rnk);
int left,Lastrank;
float fpara1[2*maxpop][2];
void keepalive(population *pop1_ptr,population *pop2_ptr,population *pop3_ptr,int gen)
{
int i,j,jj,k,m,a1,l,front_pop[maxpop],rec;
int sum,st,str,pool,poolf,sel,r1;
int *gene1_ptr, *gene2_ptr,leftsum,x;
float rnd,a,*gene3_ptr,x3,*gene4_ptr,*xbin1_ptr,*xbin2_ptr;
/*Forming the global mating pool*/
for(i = 0;i < popsize;i++)
{
if(nchrom > 0)
{
/*Binary Coded GA genes are copied*/
for(k = 0;k < chrom;k++)
{
globalpop.genes[i][k]=pop1_ptr->ind[i].genes[k];
globalpop.genes[i+popsize][k] = pop2_ptr->ind[i].genes[k];
}
for (k=0; k < nchrom; k++)
{
globalpop.xbin[i][k] = pop1_ptr->ind[i].xbin[k];
globalpop.xbin[i+popsize][k] = pop2_ptr->ind[i].xbin[k];
}
}
if (nvar > 0)
{
/*For Real Coded GA x values are copied */
for(k = 0;k < nvar;k++)
{
globalpop.xreal[i][k] = pop1_ptr->ind[i].xreal[k];
globalpop.xreal[i+popsize][k] = pop2_ptr->ind[i].xreal[k];
}
}
/*Fitness is copied to the global pool */
for(l = 0;l < nfunc;l++)
{
globalpop.fitness[i][l] = pop1_ptr->ind[i].fitness[l];
globalpop.fitness[i+popsize][l] = pop2_ptr->ind[i].fitness[l];
}
/*Initial;ising the dummyfitness to zero */
globalpop.cub_len[i] = 0;
globalpop.cub_len[i+popsize] = 0;
globalpop.error[i] = pop1_ptr->ind[i].error;
globalpop.error[i+popsize] = pop2_ptr->ind[i].error;
for (jj=0; jj<ncons; jj++)
{
globalpop.constr[i][jj] = pop1_ptr->ind[i].constr[jj];
globalpop.constr[i+popsize][jj] = pop2_ptr->ind[i].constr[jj];
}
}
global_pop_ptr = &(globalpop);
/*Finding the global ranks */
if(ncons == 0)
grank(gen);
else
grankc(gen);
m = globalpop.maxrank;
/* Sharing the fitness to get the dummy fitness */
for(i = 0;i < m;i++)
{
gshare(i+1);
}
poolf = popsize;
pool = 0;
/*Initializing the flags of population to zero */
for(i = 0;i < 2*popsize;i++)
{
globalpop.flag[i] = 0;
}
// decide which all solutions belong to the pop3
rec = 0;
st = 0;
for(i = 0 ;i < m ; i++)
{
/* Elitism Applied Here */
st = pool;
pool += globalpop.rankno[i];
if(pool <= popsize)
{
for(k = 0;k < 2*popsize ;k++)
{
if(globalpop.rank[k] == i+1)
globalpop.flag[k] = 1;
}
pop3_ptr->rankno[i] = globalpop.rankno[i];
}
else
{
sel = popsize - st;
Lastrank = i+1;
pop3_ptr->rankno[i] = sel;
gsort(i+1,sel);
break;
}
}
k = 0;
for(i = 0,k = 0;i < 2*popsize && k < popsize; i++)
{
if(nchrom > 0)
{
if(globalpop.flag[i] == 1)
{
gene1_ptr = &(globalpop.genes[i][0]);
xbin1_ptr = &(globalpop.xbin[i][0]);
pop3_ptr->ind_ptr = &(pop3_ptr->ind[k]);
gene2_ptr = &(pop3_ptr->ind_ptr->genes[0]);
xbin2_ptr = &(pop3_ptr->ind_ptr->xbin[0]);
for(j = 0 ; j < chrom; j++)
{
*gene2_ptr++ = *gene1_ptr++;
}
for (j=0; j < nchrom; j++)
*xbin2_ptr++ = *xbin1_ptr++;
}
}
if (nvar > 0)
{
if(globalpop.flag[i] == 1)
{
gene3_ptr = &(globalpop.xreal[i][0]);
pop3_ptr->ind_ptr = &(pop3_ptr->ind[k]);
gene4_ptr = &(pop3_ptr->ind_ptr->xreal[0]);
for(j = 0 ;j < nvar;j++)
{
*gene4_ptr++ = *gene3_ptr++;
}
}
}
if(globalpop.flag[i] == 1)
{
for(j = 0;j < nfunc;j++)
pop3_ptr->ind[k].fitness[j] = globalpop.fitness[i][j];
pop3_ptr->ind[k].cub_len = globalpop.cub_len[i];
if(ncons != 0)
pop3_ptr->ind[k].error = globalpop.error[i];
for (jj=0; jj<ncons; jj++)
pop3_ptr->ind[k].constr[jj] = globalpop.constr[i][jj];
pop3_ptr->ind[k].rank = globalpop.rank[i];
k++; // increment the pop3 counter
}
}
pop3_ptr->maxrank = Lastrank;
return;
}
void grank(int gen)
{
int i,j,k,rnk,val,nondom,popsize1,gflg[2*maxpop],q;
float *ptr1,*ptr2;
FILE *gr;
gr = fopen("g_rank_record.out","a");
fprintf(gr,"Genration no. = >d\n",gen);
/*----------------------------* RANKING *---------------------------------*/
rnk = 0;
nondom = 0;
popsize1 = 2*popsize;
for(i = 0;i < popsize1;i++)
{
gflg[i] = 2;
}
for(k = 0;k < popsize1;k++)
{
q = 0;
for(j = 0;j < popsize1;j++)
{
if (gflg[j] != 1) break;
}
if(j == popsize1) break;
rnk = rnk +1;
for( j = 0 ;j < popsize1; j++)
{
if(gflg[j] == 0) gflg[j] = 2;
}
for(i = 0;i < popsize1 ; i++)
{
if(gflg[i] != 1 && gflg[i] != 0)
{
ptr1 = &(global_pop_ptr->fitness[i][0]);
for(j = 0;j < popsize1 ; j++)
{
if( i!= j)
{
if(gflg[j] != 1)
{
ptr2 = &(global_pop_ptr->fitness[j][0]);
val = indcmp1(ptr1,ptr2);
if( val == 2)
{
gflg[i] = 0;/* individual 1 is dominated */
break;
}
if(val == 1)
{
gflg[j] = 0;/* individual 2 is dominated */
}
if(val == 3)
{
nondom++;/* individual 1 &amt; 2 are non dominated */
if(gflg[j] != 0)gflg[j] = 3;
}
}
}
}
if( j == popsize1)
{
global_pop_ptr->rank[i] = rnk;
gflg[i] = 1;
global_pop_ptr->rankar[rnk-1][q] = i;
q++;
}
}
}
global_pop_ptr->rankno[rnk-1] = q;
}
global_pop_ptr->maxrank = rnk;
fprintf(gr," RANK No Of Individuals\n");
for(i = 0;i < rnk;i++)
fprintf(gr,"\t>d\t>d\n",i+1,globalpop.rankno[i]);
fclose(gr);
return;
}
void grankc(gen)
{
int i,j,k,rnk,val,nondom,popsize1,gflg[2*maxpop],q;
float *ptr1,*ptr2;
float *err_ptr1,*err_ptr2;
FILE *gr;
gr = fopen("g_rank_record.out","a");
fprintf(gr,"Genration no. = >d\n",gen);
/*----------------------------* RANKING *---------------------------------*/
rnk = 0;
nondom = 0;
popsize1 = 2*popsize;
min_fit = popsize1;
delta_fit = 0.1 *popsize1;
for(i=0;i<popsize1;i++)
{
gflg[i] = 2;
}
for(k = 0;k < popsize1;k++)
{
q = 0;
for(j = 0;j < popsize1;j++)
{
if (gflg[j] != 1) break;
}
if(j == popsize1) break;
rnk = rnk +1;
for( j = 0 ;j < popsize1; j++)
{
if(gflg[j] == 0) gflg[j] = 2;
}
for(i = 0;i< popsize1 ; i++)
{
if(gflg[i] != 1 && gflg[i] != 0)
{
ptr1 = &(global_pop_ptr->fitness[i][0]);
err_ptr1 = &(global_pop_ptr->error[i]);
for(j = 0;j < popsize1 ; j++)
{
if( i!= j)
{
if(gflg[j] != 1)
{
ptr2 = &(global_pop_ptr->fitness[j][0]);
err_ptr2 = &(global_pop_ptr->error[j]);
if(*err_ptr1 < 1.0e-6 && *err_ptr2 > 1.0e-6)
{/* first feasible second individaul is infeasible*/
gflg[j] = 0;
}
else
{
if(*err_ptr1 >1.0e-6 && *err_ptr2 < 1.0e-6)
{/*first individual is infeasible and second is feasible*/
gflg[i] = 0;
break;
}
else
{/*both feasible or both infeasible*/
if(*err_ptr1 > *err_ptr2)
{
gflg[i] = 0;
/*first individual is more infeasible*/
break;
}
else
{
if(*err_ptr1 < *err_ptr2)
gflg[j] = 0;
/*second individual is more infeasible*/
else
{
val = indcmp1(ptr1,ptr2);
if( val == 2)
{
gflg[i] = 0;
/* individual 1 is dominated */
break;
}
if(val == 1)
{
gflg[j] = 0;
/* individual 2 is dominated */
}
if(val == 3)
{
nondom++;/* individual 1 &amt; 2 are non dominated */
if(gflg[j] != 0) gflg[j] = 3;
}
}
}
}
}
}
}
}
if( j == popsize1)
{
global_pop_ptr->rank[i] = rnk;
gflg[i] = 1;
global_pop_ptr->rankar[rnk-1][q] = i;
q++;
}
}
}
global_pop_ptr->rankno[rnk-1] = q;
}
global_pop_ptr->maxrank = rnk;
fprintf(gr," RANK No Of Individuals\n");
for(i = 0;i < rnk;i++)
{
fprintf(gr,"\t>d\t>d\n",i+1,globalpop.rankno[i]);
}
fclose(gr);
return;
}
int indcmp1(float *ptr1,float *ptr2)
{
float fit1[maxfun],fit2[maxfun];
int i,value,m,n;
for(i = 0;i < nfunc ;i++)
{
fit1[i] = *ptr1++;
fit2[i] = *ptr2++;
}
m = 0;n=0;
while(m < nfunc && fit1[m] <= fit2[m])
{
if((fit2[m] - fit1[m]) < 1e-7) n++;
m++;
}
if(m == nfunc)
{
if(n == nfunc) value = 3;
else value = 1; /*value = 1 for dominating*/
}
else
{
m = 0;n = 0;
while(m < nfunc && fit1[m] >= fit2[m])
{
if((fit1[m] - fit2[m]) < 1e-7) n++;
m++;
}
if(m == nfunc)
{
if(n != nfunc)
value = 2; /*value = 2 for dominated */
else value = 3;
}
else value = 3; /*value = 3 for incomparable*/
}
return value;
}
/* This is the file used to sort the dummyfitness arrays */
void gsort(int rnk,int sel)
{
int i,j,a,q;
float array[2*maxpop][2],temp,temp1;
q = globalpop.rankno[rnk-1];
for(i = 0 ;i < q ;i++)
{
array[i][0] = globalpop.rankar[rnk-1][i];
a = globalpop.rankar[rnk-1][i];
array[i][1] = globalpop.cub_len[a];
}
for(i = 0;i < q ;i++)
{
for(j = i+1;j < q;j++)
{
if(array[i][1] < array[j][1])
{
temp = array[i][1];
temp1 = array[i][0];
array[i][1] = array[j][1];
array[i][0] = array[j][0];
array[j][1] = temp;
array[j][0] = temp1;
}
}
}
for(i = 0;i < sel;i++)
{
a = array[i][0];
globalpop.flag[a] = 1;
}
return;
}
/*========================================================================*/
void gshare(int rnk)
{
float length[2*maxpop][2],max;
int i,j,m1,a ;
m1 = globalpop.rankno[rnk-1];
for(j = 0;j < nfunc;j++)
{
for(i = 0;i < m1;i++)
{
fpara1[i][0] = 0;
fpara1[i][1] = 0;
}
for(i = 0;i < m1;i++)
{
a = globalpop.rankar[rnk-1][i];
fpara1[i][0] = (float)a ;
fpara1[i][1] = globalpop.fitness[a][j];
}
sort(m1); /*Sort the arrays in ascending order of the fitness*/
max = fpara1[m1-1][1];
for(i = 0;i < m1;i++)
{
if(i == 0 ||i == (m1-1))
{
length[i][0] = fpara1[i][0];
length[i][1] = 100*max;
}
else
{
length[i][0] = fpara1[i][0];
length[i][1] = fabs(fpara1[i+1][1]- fpara1[i-1][1]);
}
}
for(i = 0;i < m1;i++)
{
a = length[i][0];
globalpop.cub_len[a] += length[i][1];
}
}
return;
}
void sort(int m1)
{
float temp,temp1;
int i1,j1,k1;
for(k1 = 0;k1 < m1-1;k1++)
{
for(i1 = k1+1;i1 < m1;i1++)
{
if(fpara1[k1][1] > fpara1[i1][1])
{
temp = fpara1[k1][1];
temp1 = fpara1[k1][0];
fpara1[k1][1] = fpara1[i1][1];
fpara1[k1][0] = fpara1[i1][0];
fpara1[i1][1] = temp;
fpara1[i1][0] = temp1;
}
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -