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

📄 individual.cpp

📁 遗传算法程序求函数极值点,可调交叉和变异个数
💻 CPP
字号:
// Individual.cpp: implementation of the Individual class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GA.h"
#include "Individual.h"

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

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

Individual::Individual()
{
	Chromosome=new Gene[MAX_GENE_NUM*2];

}

Individual::~Individual()
{
	delete []Chromosome;
}

void Individual::ChroMutate()
{
	int i,k,t;
	int *temp=new int[MUTATION_NUMBER];
	for(i=0;i<MUTATION_NUMBER;i++)
	{
		k=rand()%(MAX_GENE_NUM*2);
		for(t=0;t<i;t++)
		{
			if(k==temp[t])
			{
				k=rand()%(MAX_GENE_NUM*2);
				t=-1;
			}
		}
		temp[i]=k;
		(Chromosome+k)->Mutate();
	}
}

void Individual::CountFitness()
{
	int a=0,b=0;
	for(int i=0;i<MAX_GENE_NUM;i++)
	{
		if((Chromosome+i)->gene)a+=(int)pow(2,i);
	}
	for(int j=MAX_GENE_NUM;j<MAX_GENE_NUM*2;j++)
	{
		if((Chromosome+j)->gene)b+=(int)pow(2,j-MAX_GENE_NUM);
	}
	x=LOWERLIMIT+a*(UPPERLIMIT-LOWERLIMIT)/(pow(2,MAX_GENE_NUM)-1);
	y=LOWERLIMIT+b*(UPPERLIMIT-LOWERLIMIT)/(pow(2,MAX_GENE_NUM)-1);

	Fitness=f1(x,y);
}

void Individual::CountFitness(double avg,double max,double min)
{
/*	Fitness=(Fitness-avg)/(max-avg)+fabs((min-avg)/(max-avg));
	Fitness=pow(Fitness,0.5);
//	if(Fitness>=avg)Fitness=exp(Fitness-avg);
//	else Fitness=exp(Fitness-avg);
	Fitness=exp(Fitness);*/
}

void Individual::ChroCross(Individual &Ind)
{
	int i,k,t;
	int *temp=new int[CROSSOVER_NUMBER];
	for(i=0;i<CROSSOVER_NUMBER;i++)
	{
		k=rand()%MAX_GENE_NUM;
		for(t=0;t<i;t++)
		{
			if(k==temp[t])
			{
				k=rand()%MAX_GENE_NUM;
				t=-1;
			}
		}
		temp[i]=k;
	}
	for(i=0;i<CROSSOVER_NUMBER;i++)
	{
		((this->Chromosome)+temp[i])->Cross(*(Ind.Chromosome+temp[i]));
	}
}

Individual& Individual::operator =(const Individual &indiv)
{
	x=indiv.x;
	y=indiv.y;
	for(int i=0;i<MAX_GENE_NUM*2;i++)
	{
		*(Chromosome+i)=*(indiv.Chromosome+i);
	}
	return *this;
}

⌨️ 快捷键说明

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