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

📄 race.cpp

📁 一个利用C++开发遗传算法类
💻 CPP
字号:
// Race.cpp: implementation of the CRace class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Race.h"
#include "stdlib.h"
#include "math.h"

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

CRace::CRace()
{
	this->Generation=0;
	this->Sum_Fit=0;
}

CRace::~CRace()
{

}

void CRace::InitializeRace(int _RaceSize, double PCross, double PMutate,Variable * pVar,int VarNum)
{
	int i,j;

	this->RaceSize=_RaceSize;
	this->Prossible_Cross=PCross;
	this->Prossible_Mutate=PMutate;
	this->Variable_Number=VarNum;
	this->m_pIdls=(CIndividual *)calloc(_RaceSize,sizeof(CIndividual));

	for(i=0;i<_RaceSize;i++)
	{
		for(j=0;j<VarNum;j++)
		{
			(this->m_pIdls+i)->AddBehaver((pVar+j)->BitNumbers,(pVar+j)->MinValue,(pVar+j)->MaxValue);
		}
		(this->m_pIdls+i)->InitialValue();
	}

}

double CRace::TargetFunction(int VarNum, CIndividual *pIdl)
{
	double x,y;	
	double pi=3.14159265;

	x=pIdl->GetBehaverValue(1);
	y=pIdl->GetBehaverValue(2);


	//return x*sin(10*pi*x)+2.0;
	return(0.5-(pow(sin(sqrt(x*x+y*y)),2)-0.5)/pow((1+0.001*(x*x+y*y)),2));


}

double CRace::FitnessFunction(int VarNum, CIndividual *pIdl)
{
	return TargetFunction(VarNum,pIdl);
}

void CRace::CaculateFitness()
{
	int i;
	double sum_fitness=0;
	double _fitness;
	for(i=0;i<this->RaceSize;i++)
	{
		(this->m_pIdls+i)->TargetValue=TargetFunction(Variable_Number,this->m_pIdls+i);
		_fitness=FitnessFunction(Variable_Number,this->m_pIdls+i);
		(this->m_pIdls+i)->Fitness=_fitness;
		sum_fitness+=_fitness;
	}
	this->Sum_Fit=sum_fitness;

	for(i=0;i<this->RaceSize;i++)
	{
		(this->m_pIdls+i)->Possible_Select=(this->m_pIdls+i)->Fitness/sum_fitness;
		(this->m_pIdls+i)->Possible_Sel_Sum+=(this->m_pIdls+i)->Possible_Select;
	}
}

int CRace::Evaluate()
{
	return 0;
}

void CRace::Select()
{
////////////////////////轮盘赌法/////////////////////////////////////////
/*	int i,j,k;
////////Clear the past counts//////////	
	for(i=0;i<this->RaceSize;i++)
		(this->m_pIdls+i)->Select_Count=0;

	for(i=0;i<this->RaceSize;i++)
	{
		(this->m_pIdls+BatMatch((rand()%999)*0.001))->Select_Count++;
	}

////////exchange with the high and the low fitness guys/////////////////	
	while(1)
	{
		for(i=0;((this->m_pIdls+i)->Select_Count<=1)&(i<this->RaceSize);i++);
			if(i<this->RaceSize)
			{
				for(j=0;((this->m_pIdls+j)->Select_Count>0)&(j<this->RaceSize);j++);
				if(j<this->RaceSize)
				{
					for(k=1;k<=this->m_pIdls->BehaverListNum;k++)
					{
						(this->m_pIdls+j)->SetBehaverValue(k,(this->m_pIdls+i)->GetBehaverValue(k));
					}
					(this->m_pIdls+j)->Select_Count=1;	
				}
				else
					break;
			}
			else
				break;
	}
*/
////////////////////////排序法(去小加大)/////////////////////////////////////////
	double minposs,maxposs;
	int i=0,j=0,k;
	minposs=this->m_pIdls->Possible_Select;
	maxposs=minposs;
	for(k=0;k<this->RaceSize;k++)
	{
		if((this->m_pIdls+k)->Possible_Select<minposs)
		{
			minposs=(this->m_pIdls+k)->Possible_Select;
			i=k;
		}

		if((this->m_pIdls+k)->Possible_Select>maxposs)
		{
			maxposs=(this->m_pIdls+k)->Possible_Select;
			j=k;
		}
	}

	for(k=1;k<=this->m_pIdls->BehaverListNum;k++)
	{
		(this->m_pIdls+i)->SetBehaverValue(k,(this->m_pIdls+j)->GetBehaverValue(k));
	}
}

void CRace::Cross()
{
	int * sortmat=(int *)calloc(this->RaceSize,sizeof(int));
	int i,j,j1,k,temp,CrossPoision;
	BIT * pBit;

	////生成一个序列用于为个体配对///////
	for(i=0;i<this->RaceSize;i++)
		*(sortmat+i)=i;
	////随机进行排序///////
	for(k=0;k<5;k++)
	{
		i=(rand())%(this->RaceSize-1);
		j=(rand())%(this->RaceSize-1);
		temp=*(sortmat+i);
		*(sortmat+i)=*(sortmat+j);
		*(sortmat+j)=temp;
	}
	
/*////test preogramme////
	printf("\n");
	for(i=0;i<this->RaceSize;i++)
	{
		printf("%d ",*(sortmat+i));
	}
	printf("\n");
///////////////////////
*/
	///////两两交叉///////////////
	k=this->m_pIdls->BitListNum;

	for(i=0;i<this->RaceSize-1;i+=2)
	{
		CrossPoision=(rand())%(k-1)+1;/////随机生成交叉位
		j=*(sortmat+i);
		j1=*(sortmat+i+1);

		pBit=(this->m_pIdls+j)->GetBit(CrossPoision)->pmBit;
		(this->m_pIdls+j)->GetBit(CrossPoision)->pmBit=(this->m_pIdls+j1)->GetBit(CrossPoision)->pmBit;
		(this->m_pIdls+j1)->GetBit(CrossPoision)->pmBit=pBit;
	
	}

/*	for(i=0;i<this->RaceSize-1;i+=2)
	{
		pBit=(this->m_pIdls+i)->GetBit(3)->pmBit;
		(this->m_pIdls+i)->GetBit(3)->pmBit=(this->m_pIdls+i+1)->GetBit(3)->pmBit;
		(this->m_pIdls+i+1)->GetBit(3)->pmBit=pBit;
	}
  */
	this->Generation++;
}

/////每个周期中选择一个个体对其执行变异操作,改变种群的适应度////
void CRace::Mutate()
{
	int index_idl,index_psn;
//	if((double)(rand()%99)/100<this->Prossible_Mutate)
//	{
		index_idl=rand()%(this->RaceSize-1);
		index_psn=rand()%(this->m_pIdls->BitListNum-1);
		(this->m_pIdls+index_idl)->NotBit(index_psn);
//	}
}
int CRace::BatMatch(double randvalue)
{
	int i=0,flag=0;
	double temp1,temp2;
	temp1=fabs(this->m_pIdls->Possible_Sel_Sum-randvalue);
	for(i=1;i<this->RaceSize;i++)
	{
		temp2=fabs((this->m_pIdls+i)->Possible_Sel_Sum-randvalue);
		if(temp2<temp1)
		{
			flag=i;
			temp1=temp2;
		}
	}
	return flag;
}

void CRace::Display(CListCtrl * pLstCtrl,int index)
{
	int i;
	CString str;
	//str
	for(i=0;i<this->RaceSize;i++)
	{
		str.Format("%d",i);
		pLstCtrl->InsertItem(index+i,str);
		(this->m_pIdls+i)->Display(pLstCtrl,index+i);

		if(i==0)
		{
			str.Format("%d",this->Generation);
			pLstCtrl->SetItemText(index,7,str);
			str.Format("%f",this->Sum_Fit/this->RaceSize);
			pLstCtrl->SetItemText(index,8,str);

		}

	}

	pLstCtrl->SetColumnWidth(0,50);
	pLstCtrl->SetColumnWidth(1,LVSCW_AUTOSIZE);
	pLstCtrl->SetColumnWidth(2,LVSCW_AUTOSIZE);
	pLstCtrl->SetColumnWidth(3,LVSCW_AUTOSIZE);
	pLstCtrl->SetColumnWidth(4,LVSCW_AUTOSIZE);
	pLstCtrl->SetColumnWidth(5,LVSCW_AUTOSIZE);
	pLstCtrl->SetColumnWidth(6,LVSCW_AUTOSIZE);
	pLstCtrl->SetColumnWidth(7,40);
	pLstCtrl->SetColumnWidth(8,80);
}

void CRace::RunOnce(int style,CListCtrl * pLstCtrl)
{
	this->CaculateFitness();
	this->Select();
	this->Cross();
	this->Mutate();
	this->Mutate();
	this->Mutate();
	if(style!=0)
		this->Display(pLstCtrl,pLstCtrl->GetItemCount());

}

⌨️ 快捷键说明

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