?? individual.cpp
字號:
///////////////////////////////////////////////////////////////////
/*****************************************************************
Copyright: Artificial Life and Adaptive Robotics Laboratory - ALAR
School of ITEE, UNSW@ADFA, Australia, 2005
*******************************************************************/
/////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "individual.h"individual::individual(){ InumberofGenes=0; InumberofObjs=0; chromosome_len=0; DglobalFitness=0; rank=-1; //age=-1; setNULL(); }individual::individual(int n_Genes,int n_Objs,int *GSize,double *Ub,double *Lb,double *real_params,int withbinary){ DglobalFitness=0; rank=-1;//age=-1; Initialize(n_Genes,n_Objs,GSize,Ub,Lb,real_params,withbinary);}
void individual::Initialize(int n_Genes,int n_Objs,int *GSize,double *Ub,double *Lb,double *real_params,int withbinary){ InumberofGenes=n_Genes; InumberofObjs=n_Objs; setNULL(); Isize = new int[InumberofGenes];
Psize = new int[InumberofGenes];
DfitnessC = new double[InumberofObjs]; DfitnessN = new double[InumberofObjs]; Dgenes = new double[InumberofGenes]; Dlower = new double[InumberofGenes]; Dupper = new double[InumberofGenes];
int i, cp=0, gs=0;
chromosome_len=0;
for(i=0;i<InumberofGenes;i++)
{
Isize[i] = GSize[i];
if (i == 0) Psize[i] = 0;
else Psize[i] = Psize[i-1] + GSize[i];
Dgenes[i] = real_params[i];
Dupper[i] = Ub[i];
Dlower[i] = Lb[i];
chromosome_len += GSize[i];
}
if (withbinary) { Bgenes=new unsigned int[chromosome_len];
int i,j,k,gs=0,cp=0;
for(i=0;i<chromosome_len;i++)
Bgenes[i]=0;
for(i=0;i<InumberofGenes;i++)
{
cp +=Isize[i];
j=cp-1;
unsigned int *st=value2string(real_params[i],i,gs);
for (k=gs-1;k>=0;k--)
{
Bgenes[j]=st[k];
j--;
}
if (st) {delete [] st; st=NULL;}
}
}}
individual::~individual(){ if (Dgenes) {delete Dgenes; Dgenes=NULL;} if (Bgenes) {delete Bgenes; Bgenes=NULL;} if (Isize) {delete Isize;Isize=NULL;}
if (Psize)
{delete Psize;Psize=NULL;} if (Dupper) {delete Dupper;Dupper=NULL;} if (Dlower) {delete Dlower;Dlower=NULL;} if (DfitnessC) {delete DfitnessC;DfitnessC=NULL;} if (DfitnessN) {delete DfitnessN; DfitnessN=NULL;} //setNULL();}unsigned int* individual::value2string(double value, int gene_index, int &lsize){ unsigned long d_value=0; unsigned int s=0; d_value=(unsigned long)((value-Dlower[gene_index])*(pow(2,Isize[gene_index])-1)/(Dupper[gene_index]-Dlower[gene_index])); unsigned int* temp = d2b(d_value,s); // -> return s value as well lsize=s; return temp;}unsigned long individual::b2d(unsigned int *digits,unsigned int lbits){ unsigned long c=0; for(unsigned int i=0;i<lbits;i++) { if (digits[i]==1) c += (unsigned long)pow(2,lbits-1-i); } return c;}unsigned int* individual::d2b(unsigned long number, unsigned int &lbits){ int remain = 0; int i,c = 0; unsigned int binary[32]; while( number != 0 ) { remain = number % 2; number = number / 2; if (remain==1) binary[c] = 1; else binary[c]=0; c++; }
unsigned int *temp=new unsigned int[c];
for (i=0;i<c;i++) temp[i]=binary[c-1-i]; lbits=c; return temp;}void individual::set_chromosome(unsigned int *ch){ int i; for (i=0;i<chromosome_len;i++) Bgenes[i]=ch[i]; for(i=0;i<InumberofGenes;i++) Dgenes[i]=decode_gene(i);}void individual::print_fn(ofstream &f){ int i; for (i=0;i<InumberofObjs;i++) f << setiosflags(ios::fixed|ios::showpoint) << setprecision(6) << DfitnessC[i] << "\t"; for (i=0;i<InumberofObjs;i++) f << setiosflags(ios::fixed|ios::showpoint) << setprecision(6) << DfitnessN[i] << "\t"; f << endl;}void individual::print_x(ofstream &f){ int i; for (i=0;i<InumberofGenes;i++) f << setiosflags(ios::fixed|ios::showpoint) << setprecision(6) << Dgenes[i] << " \t"; f << endl;}double individual::decode_gene(int index){ double c=0.0; int i,j=0; int cp=Isize[index]; int ci=Psize[index];
for(i=ci;i<ci+cp;i++) {
if (Bgenes[i]==1)
c += (unsigned long)pow(2,cp-1-j);
j++;
}
return (Dlower[index]+c*(Dupper[index]-Dlower[index])/(pow(2,cp)-1)); }void individual::set_Dfitness(double *values){ if (values) { for (int i=0;i<InumberofObjs;i++)
{ DfitnessN[i]=values[i];
DfitnessC[i]=values[i];
} }}void individual::setNULL(){ Dgenes =NULL; Bgenes=NULL; Isize=NULL;
Psize=NULL; Dupper=NULL; Dlower=NULL; DfitnessC=NULL; DfitnessN=NULL; }individual &individual::operator=(const individual &id){ InumberofGenes = id.InumberofGenes; InumberofObjs = id.InumberofObjs; DglobalFitness = id.DglobalFitness;
rank = id.rank;
chromosome_len = id.chromosome_len; if (!Isize) Isize =new int[InumberofGenes];
if (!Psize) Psize =new int[InumberofGenes]; if (!DfitnessC) DfitnessC =new double[InumberofObjs]; if (!DfitnessN) DfitnessN =new double[InumberofObjs]; if (!Dgenes) Dgenes =new double[InumberofGenes]; if (!Dlower) Dlower =new double[InumberofGenes]; if (!Dupper) Dupper =new double[InumberofGenes];
if (id.Bgenes)
{
if (!Bgenes) Bgenes=new unsigned int[chromosome_len];
}
int i,k, cp=0, gs=0; for(i=0;i<InumberofGenes;i++)
{
Dgenes[i] =id.Dgenes[i];
Isize[i] =id.Isize[i];
Psize[i] =id.Psize[i];
Dupper[i] =id.Dupper[i];
Dlower[i] =id.Dlower[i];
cp += Isize[i];
for (k=gs;k<cp;k++)
{
Bgenes[k]= id.Bgenes[k];
}
gs = cp;
}
for (i=0;i<InumberofObjs;i++)
{
DfitnessN[i]=id.DfitnessN[i];
DfitnessC[i]=id.DfitnessC[i];
}
return *this;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -