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

📄 population.cpp

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

#include "stdafx.h"
#include "GA.h"
#include "Population.h"

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

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

Population::Population()
{
	individual=new Individual[POPULATION_SIZE];

}

Population::~Population()
{
	delete []individual;
}

void Population::IndivMutate(int MutateNum)
{
	int i,k,t;
	int *temp=new int[MutateNum];
	for(i=0;i<MutateNum;i++)
	{
		k=rand()%POPULATION_SIZE;
		for(t=0;t<i;t++)
		{
			if(k==temp[t])
			{
				k=rand()%POPULATION_SIZE;
				t=-1;
			}
		}
		temp[i]=k;
		(individual+k)->ChroMutate();
	}
}

void Population::Crossover(int CrossNum)
{
	int i,k,t;
	int *temp=new int[CrossNum];
	for(i=0;i<CrossNum;i++)
	{
		k=rand()%POPULATION_SIZE;
		for(t=0;t<i;t++)
		{
			if(k==temp[t])
			{
				k=rand()%POPULATION_SIZE;
				t=-1;
			}
		}
		temp[i]=k;
	}

	for(i=0;i<CrossNum;i+=2)
	{
		(individual+temp[i])->ChroCross(*(individual+temp[i+1]));
	}
}

void Population::Selection()
{
	SetIndivSurv();

	int newPopuSize=0;
	for(int i=0;i<POPULATION_SIZE;i++)
	{
		newPopuSize+=(individual+i)->SurvivalNum;
	}

	Individual *New_individual=new Individual[POPULATION_SIZE];

	if(newPopuSize<=POPULATION_SIZE)
	{
		for(int i=0,k=0;i<POPULATION_SIZE,k<newPopuSize;i++)
		{
			for(int j=0;j<(individual+i)->SurvivalNum;j++)
			{
				*(New_individual+k)=*(individual+i);
				k++;
			}
		}
		for(k=newPopuSize;k<POPULATION_SIZE;k++)
		{
			*(New_individual+k)=*(individual+Index);
		}		
	}
	else
	{
		while(newPopuSize>POPULATION_SIZE)
		{
			double min=Max;
			int minIndex;			
			for(int i=0;i<POPULATION_SIZE;i++)
			{
				if((individual+i)->SurvivalNum>0&&(individual+i)->Fitness<min)
				{
					min=(individual+i)->Fitness;
					minIndex=i;
				}
			}
			(individual+minIndex)->SurvivalNum--;
			newPopuSize--;
		}

		for(int i=0,k=0;i<POPULATION_SIZE,k<newPopuSize;i++)
		{
			for(int j=0;j<(individual+i)->SurvivalNum;j++)
			{
				*(New_individual+k)=*(individual+i);
				k++;
			}
		}
	}

	
	for(i=0;i<POPULATION_SIZE;i++)
	{
		*(individual+i)=*(New_individual+i);
	}

	delete []New_individual;
}

void Population::SetIndivSurv()
{
	double *FitBuf= new double[POPULATION_SIZE];
	
	for(int a=0;a<POPULATION_SIZE;a++)
	{
		(individual+a)->CountFitness();
		FitBuf[a]=(individual+a)->Fitness;
	}
		
	Max=individual->Fitness;
	Min=individual->Fitness;
	Index=0;

	for(int i=1;i<POPULATION_SIZE;i++)
	{
		if(Max<(individual+i)->Fitness)
		{
			Max=(individual+i)->Fitness;
			Index=i;
		}
		if(Min>(individual+i)->Fitness)Min=(individual+i)->Fitness;
	}

	double sum=0;
	for(i=0;i<POPULATION_SIZE;i++)
	{
		if(Min<0)(individual+i)->Fitness-=Min;
		sum+=(individual+i)->Fitness;
	}
	Avg=sum/POPULATION_SIZE;
	if(Min<0)Max-=Min;
	for(a=0;a<POPULATION_SIZE;a++)
	{
		(individual+a)->CountFitness(Avg,Max,0);
	}
	if(Min<0)Max+=Min;

	sum=0;
	for(i=0;i<POPULATION_SIZE;i++)
	{
		sum+=(individual+i)->Fitness;
	}

	for(i=0;i<POPULATION_SIZE;i++)
	{
		(individual+i)->SurvivalValue=(individual+i)->Fitness/sum;
		(individual+i)->Fitness=FitBuf[i];
	}

	for(i=0;i<POPULATION_SIZE;i++)
	{
		double temp;
		int t;
		temp=(individual+i)->SurvivalValue*POPULATION_SIZE;
		t=(int)temp;
		if((temp-t)>=0.5)
			(individual+i)->SurvivalNum=t+1;
		else
			(individual+i)->SurvivalNum=t;
	}

	delete []FitBuf;
}

⌨️ 快捷键说明

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