?? guotao.cpp
字號:
// GuoTao.cpp: implementation of the CGuoTao class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GuoTao.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGuoTao::CGuoTao():m_PopSize(60),m_Precision(1e-10)
,m_MaxGeneration(5800),m_ParentNum(8) //雜交個體數目
{
m_VaryNum = CIndividual::VaryNum;
m_ConFuncNum = CIndividual::ConFuncNum;
m_LowerBound=new double[m_VaryNum];
m_UpperBound=new double[m_VaryNum];
m_Population=new CIndividual[m_PopSize];
m_MateParam = new double[m_ParentNum];
m_EvalutionNum = 0;
m_MaxOrMin = -1;
}
CGuoTao::~CGuoTao()
{
delete []m_LowerBound;
delete []m_UpperBound;
delete []m_Population;
delete []m_MateParam;
}
//-----------------random number generator-----------------
double CGuoTao::RandDoubleValue(double low,double high)
{
double val;
val=((double)(rand()%1000)/1000.0)*(high-low)+low;
return val;
}
int CGuoTao::RandIntValue(int Nmem)
{
int newval;
newval=(int)(((rand()%1000)/1000.0)*Nmem);
return newval;
}
void CGuoTao::InitPopulation()
{
int i,j;
double temp; //臨時保存產生的隨機實數
//---------------------自變量約束---------------------
for (i=0;i<m_VaryNum;i++) //變量個數
{//可以改為從文件讀取數據
m_LowerBound[i]=0; //各變量下界值
m_UpperBound[i]=10;//個體中變量的取值范圍
}
//---------------------自變量約束---------------------
srand(GetTickCount()); //包含在windows.h中
temp = 0.0;
for(i=0;i<m_VaryNum;i++)
{
for (j=0;j<m_PopSize;j++)
{
temp = RandDoubleValue(m_LowerBound[i],m_UpperBound[i]);
m_Population[j].XVary[i] = temp; //XVary[i]:保存個體自變量值
m_Population[j].Dev[i]=3.0;
}
}
}
void CGuoTao::CalculateFitness(CIndividual &Individual)
{
double *x; //臨時存儲函數中的變量
x=new double[m_VaryNum];
for (int i=0;i<m_VaryNum;i++)
{
x[i]=0.0;
}
for (i=0;i<m_VaryNum;i++)
{
x[i]=Individual.XVary[i];
}
double temp1 = 0.0;
double temp2 = 0.0;
//------------------計算目標函數適應度值------------------
Individual.value = 0.0;
temp1 = 0.0;
temp2 = 1.0;
double temp3 = 0.0;
for (i=0;i<m_VaryNum;i++)
{
temp1 += pow(cos(x[i]),4);
temp2 *= pow(cos(x[i]),2);
temp3 += (i+1)*x[i]*x[i];
}
Individual.value = (temp1-2*temp2)/sqrt(temp3);
//------------------計算目標函數適應度值------------------
Individual.fitness = m_MaxOrMin * Individual.value; //value to fitness
m_EvalutionNum++;
delete []x;
}
void CGuoTao::CalculateConFitness(CIndividual &Individual)
{
double *x; //臨時存儲函數中的變量
x=new double[m_VaryNum];
for (int i=0;i<m_VaryNum;i++)
{
x[i]=0.0;
}
for (i=0;i<m_VaryNum;i++)
{
x[i]=Individual.XVary[i];
}
double temp1 = 0.0;
double temp2 = 0.0;
//------------------計算約束函數適應度值------------------
//Individual.con[0] = 100-pow(x[0]-5,2)-pow(x[1]-5,2);
temp1 = 1.0;
temp2 = 0.0;
for (i=0;i<m_VaryNum;i++)
{
temp1 *= x[i];
temp2 += x[i];
}
Individual.con[0] = 0.75-temp1;
Individual.con[1] = temp1-0.75*m_VaryNum;
//------------------計算約束函數適應度值------------------
Individual.conFitness = 0.0;
for (i=0;i<m_ConFuncNum;i++)
{
if (Individual.con[i] <= 0.0)
{
Individual.con[i] = 0.0;
}
Individual.conFitness += Individual.con[i];
}
//判斷個體是否在可行區域
if (Individual.conFitness > 0)
{
Individual.feasible = 0;
}
else
Individual.feasible = 1;
delete []x;
}
void CGuoTao::CalculatePopFitness()
{
for (int i=0;i<m_PopSize;i++)
{
CalculateFitness(m_Population[i]);
if( m_ConFuncNum != 0)
{
CalculateConFitness(m_Population[i]);
}
}
}
bool CGuoTao::Better(CIndividual &Individual1,CIndividual &Individual2)
{
if (Individual1.conFitness < Individual2.conFitness)
{
return true;
}
else if (Individual1.conFitness > Individual2.conFitness)
{
return false;
}
else if((Individual1.conFitness == Individual2.conFitness)
&& (Individual1.fitness < Individual2.fitness))
{
return true;
}
else
{
return false;
}
}
void CGuoTao::FindBestAndWorst()
{
int i;
//找出最好個體
m_BestIndex=0;
for (i=1;i<m_PopSize;i++)
{
if(Better(m_Population[i],m_Population[m_BestIndex]))
{
m_BestIndex=i;
}
}
m_BestIndividual=m_Population[m_BestIndex];
//找出最壞個體
m_WorstIndex=0;
for (i=1;i<m_PopSize;i++)
{
if(Better(m_Population[m_WorstIndex],m_Population[i]))
{
m_WorstIndex=i;
}
}
m_WorstIndividual=m_Population[m_WorstIndex];
}
void CGuoTao::FindBestFitnessIndv()
{
int i;
int index = 0;
for (i=0;i<m_PopSize;i++)
{
if (m_Population[i].fitness < m_Population[index].fitness)
{
index = i;
}
}
m_IndvFitness = m_Population[index];
}
void CGuoTao::FindBestConFitnessIndv()
{
int i;
int index = 0;
for (i=0;i<m_PopSize;i++)
{
if (m_Population[i].conFitness < m_Population[index].conFitness)
{
index = i;
}
}
m_IndvConfitness = m_Population[index];
}
void CGuoTao::Cteate_a()
{
double sumA,tmpMin,tmpMax,MaxA,MinA;
MinA=-0.5;
MaxA=1.5;
for (int i=0;i<m_ParentNum;i++)
{
m_MateParam[i] = 0.0;
}
sumA=0.0;
for(i=0;i<=m_ParentNum-2;i++)
{
double mt1;
mt1=m_ParentNum-i+1;
tmpMin=1-sumA-MaxA*mt1;
tmpMax=1-sumA-MinA*mt1;
if(tmpMin<MinA)
tmpMin=MinA;
if(tmpMax>MaxA)
tmpMax=MaxA;
m_MateParam[i]=RandDoubleValue(tmpMin,tmpMax);
sumA=sumA+m_MateParam[i];
}
m_MateParam[m_ParentNum-1]=1-sumA;
}
void CGuoTao::GuoTao()
{
int i,j;
int *MatePool;
double low,up;
MatePool = new int[m_ParentNum];
for(i=0;i<m_ParentNum;i++)
{
MatePool[i]=i;
}
//generate the mate pool
i =0;
while ( i < m_ParentNum )
{
MatePool[i] = RandIntValue(m_PopSize-i);
j = 0;
while ( j < i )
{
while ( MatePool[i] == MatePool[j])
{
MatePool[i] = RandIntValue(m_PopSize-i);
}
j++;
}
i++;
}
MatePool[m_ParentNum-1] = m_BestIndex;
//generate the mate parameter
Cteate_a();
//generate the offspring using the multi-parent crossover
for(i=0;i<m_VaryNum;i++)
{
//Cteate_a();
m_tmpIndividual.XVary[i] = 0.0;
for(j=0;j<m_ParentNum;j++)
{
m_tmpIndividual.XVary[i] += m_MateParam[j]*m_Population[MatePool[j]].XVary[i];
}
low = m_LowerBound[i];
up = m_UpperBound[i];
if (m_tmpIndividual.XVary[i] < low)
{
m_tmpIndividual.XVary[i] = low+RandDoubleValue(0,1)*(up-low);
}
if (m_tmpIndividual.XVary[i] > up)
{
m_tmpIndividual.XVary[i] = up-RandDoubleValue(0,1)*(up-low);
}
}
//calculate the fitness of the offspring
CalculateFitness(m_tmpIndividual);
if (m_ConFuncNum != 0)
{
CalculateConFitness(m_tmpIndividual);
}
}
void CGuoTao::Display(int generation)
{
if(generation%1==0) //while(generation<m_MaxGeneration)?
{
//當前最好個體輸出到屏幕
cout<<setw(5)<<generation;
cout<<setw(8)<<m_EvalutionNum;
//顯示約束函數的值
if (m_ConFuncNum != 0)
{
cout<<setw(15)<<m_BestIndividual.conFitness;
}
cout.precision(10); //設置輸出精度
cout<<setw(20)<<m_BestIndividual.value<<endl;
}
}
void CGuoTao::Report(int generation,ofstream &ResultFile)
{
if(generation%1==0)
{
//當前最好個體輸出到文件
ResultFile<<setw(5)<<generation;
ResultFile<<setw(8)<<m_EvalutionNum;
ResultFile.precision(10); //設置輸出精度
ResultFile<<setw(20)<<m_BestIndividual.value<<endl;
}
}
void CGuoTao::RunGT()
{
ofstream ResultFile("result.txt");
ResultFile<<setw(5)<<"Gene";
ResultFile<<setw(8)<<"Num";
ResultFile.precision(10);
ResultFile<<setw(20)<<"Value"<<endl;
srand((unsigned)time(0));
InitPopulation();
CalculatePopFitness();
FindBestAndWorst();
int generation = 0; //當前演化代數
while ((generation < m_MaxGeneration) &&
(fabs(m_BestIndividual.fitness - m_WorstIndividual.fitness) > m_Precision))
{
generation++;
if (generation > m_MaxGeneration)
{
break;
}
if (fabs(m_BestIndividual.fitness - m_WorstIndividual.fitness) < m_Precision)
{
break;
}
for (int i=0;i<m_PopSize;i++) //popsize:群體大小
{
GuoTao();
if (Better(m_tmpIndividual,m_WorstIndividual))
{
m_Population[m_WorstIndex] = m_tmpIndividual;
}
if (Better(m_tmpIndividual,m_BestIndividual))
{
m_Population[m_BestIndex] = m_tmpIndividual;
}
FindBestAndWorst();
}
// GuoTao();
//
// if (Better(m_tmpIndividual,m_WorstIndividual))
// {
// m_Population[m_WorstIndex] = m_tmpIndividual;
// }
// if (Better(m_tmpIndividual,m_BestIndividual))
// {
// m_Population[m_BestIndex] = m_tmpIndividual;
// }
//
// FindBestAndWorst();
Display(generation);
Report(generation,ResultFile);
}
ResultFile.close();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -