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

📄 individual.cpp

📁 多目标优化进化算法目前公认效果收敛性最好的算法NSGA2c++源码,具有一般性
💻 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;}

⌨️ 快捷键说明

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