📄 race.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 + -