📄 ga.cpp
字号:
// GA.cpp: implementation of the CGA class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <math.h>
#include <time.h>
#include "MyGA.h"
#include "GA.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CGA, CObject, 1)
CGA::CGA()
{
varibleSize=5;
pcross=pmutation=sumfitness=max=avg=min=0.;
bestfit.Ki=0;bestfit.generation=0;
for(int i=0;i<sizeof(oldrand)/sizeof(double);i++)
{oldrand[i]=0.;}
for(i=0;i<4;i++)bestfit.fitness[i]=0.;
}
CGA::~CGA()
{
if(Outfitness)
delete Outfitness;
}
////////////////////////////////////////////////////////////////
void CGA::CalculateGA(CDC *pDC,CString str1[])
{
int i;
CString str;
//****************************************************************判断各变量范围
if(varibleSize>varibleSizeMax)
{
str.Format("变量的值:%d>变量的最大值:%d\n\n请修改程序的定义varibleSizeMax值!",varibleSize,varibleSizeMax);
AfxMessageBox(str);
return;
}
if((popSize%2)!=0)
{
popSize++;
AfxMessageBox("群的值已经修改为偶数!");
}
if(popSize>popSizeMax)
{
str.Format("变量的值:%d>变量的最大值:%d\n\n请修改程序的定义popSizeMax值!",popSize,popSizeMax);
AfxMessageBox(str);
return;
}
if(pcross>0.9){pcross=0.9;AfxMessageBox("交叉概率被修改到:0.2---0.9之间!");}
else if(pcross<0.2){pcross=0.2;AfxMessageBox("交叉概率被修改到:0.2---0.9之间!");}
if(pmutation>0.1){pmutation=0.1;AfxMessageBox("变异概率被修改到:0.01---0.1之间!");}
else if(pmutation<0.01){pmutation=0.01;AfxMessageBox("变异概率被修改到:0.01---0.1之间!");}
if(Kmax>100){AfxMessageBox("重复计算次数太大,被修改为100次!");Kmax=100;}
//////////////////////////////////////////////////////////
chromsize=(varibleSize*lchrom)/(8*sizeof(unsigned));//变量染色体占几个字节
if((varibleSize*lchrom)%(8*sizeof(unsigned)))
chromsize++;
i=lchrom;//一个变量的染色体长度
if(chromsize>chromSizeMax)
{
lchrom=(chromSizeMax*8*sizeof(unsigned))/varibleSize;
chromsize=(varibleSize*lchrom)/(8*sizeof(unsigned));
if((varibleSize*lchrom)%(8*sizeof(unsigned))) chromsize++;
str.Format("每个变量的染色体数太大:%d\n已经修改为:%d!",i,lchrom);
AfxMessageBox(str);
}
int bestindex[2],worseindex[2];
Outfitness=new double[genMax];
for(Ki=0;Ki<=Kmax;Ki++)
{
nmutation = 0;
ncross = 0;
gen=KBestGen=0;
randomize();//初始化全局计数变量和一些数值
VCinitpop();
str.Format("当前初始群的参数:适应度最大=%10.5g;最小=%10.5g;平均=%10.5g;累计=%10.5g; ",max,min,avg,sumfitness);
VCstatistics(oldpop);
resultStrOut(pDC,str1);
do
{
gen++;
BestWorseIndex(oldpop,bestIndex,worseindex);
generation();//产生新一代
//////////////////////////////////////////////
BestWorseIndex(newpop,bestindex,worseindex);
newpop[worseindex[0]]=oldpop[bestIndex[0]];//用老种群的最佳个体代替新种群的最差个体
newpop[worseindex[1]]=oldpop[bestIndex[1]];//用老种群的最佳个体代替新种群的最差个体
/*CString str;
str.Format("%f",oldpop[bestIndex[0]].fitness);
AfxMessageBox(str);*/
//bestIndex[0]=worseindex[0];
//bestIndex[1]=worseindex[1];
///////////////////////////////////////
VCstatistics(newpop);//计算新一代种群的适应度统计数据
resultStrOut(pDC,str1);//输出新一代统计数据
for(i=0;i<=popSize-1;i++)
{
temp=oldpop[i];
oldpop[i]=newpop[i];
newpop[i]=temp;
}
}//while((gen-KBestGen)<genMax);
while(gen<genMax);
}
}
void CGA::randomize()//设定随机数种子并初始化随机数发生器
{
for(int i=0; i<=54; i++)
oldrand[i] = 0.;
jrand=0;
//srand((unsigned)time(NULL));
if(Kmax<10)
oldrand[55]=(double)((rand()%10000)/10000.);//随机数种子[0-1]
else
{
oldrand[55]=((double)Ki)/Kmax+(rand()%10000)/1000000.;
if(oldrand[55]>1.)
oldrand[55]=1.;
}
warmup_random();
}
void CGA::warmup_random()//初始化随机数发生器,需要oldrand[55]
{
int i,j;
double new_random, prev_random;
oldrand[54] = oldrand[55];
new_random = 0.000000001;
prev_random = oldrand[55];
for(i = 1 ; i <= 54; i++)
{
j = (21*i)%54;
oldrand[j] = new_random;
new_random = prev_random-new_random;
if(new_random<0.0) new_random = new_random + 1.0;
prev_random = oldrand[j];
}
advance_random();
advance_random();
advance_random();
jrand = 0;
}
void CGA::advance_random()// 产生55个随机数
{
double new_random;
for(int i = 0; i < 24; i++)
{
new_random = oldrand[i] - oldrand[i+31];
if(new_random < 0.0)
new_random = new_random + 1.0;
oldrand[i] = new_random;
}
for(i = 24; i < 55; i++)
{
new_random = oldrand [i] - oldrand [i-24];
if(new_random < 0.0)
new_random = new_random + 1.0;
oldrand[i] = new_random;
}
}
int CGA::flip(double prob)// 以一定概率产生0或1
{
if(randomperc() <= prob)return(1);
else return(0);
}
double CGA::randomperc() //与库函数random()作用相同, 产生[0,1]之间一个随机数
{
jrand++;
if(jrand >= 55)
{
jrand = 1;
advance_random();
}
return((double) oldrand[jrand]);
}
int CGA::randLow_high(int low, int high)//在整数low和high之间产生一个随机整数
{
int i;
if(low >= high)i = low;
else
{
i =(int)(randomperc() * (high - low + 1)) + low;
if(i > high) i = high;
}
return(i);
}
void CGA::VCinitpop()//随机初始化种群
{
int j, j1, k, stop;
unsigned mask = 1;
for(j=0;j<popSize;j++)
{
for(k=0;k<chromsize;k++)
{
oldpop[j].chrom[k] = 0;
if(k==(chromsize-1))stop=lchrom*varibleSize-(k*(8*sizeof(unsigned)));
else stop =8*sizeof(unsigned);
for(j1 = 1; j1 <= stop; j1++)
{
oldpop[j].chrom[k] = oldpop[j].chrom[k]<<1;
if(flip(0.5))oldpop[j].chrom[k]=oldpop[j].chrom[k]|mask;
}
}
oldpop[j].parent[0] = 0;//初始父个体信息
oldpop[j].parent[1] = 0;
oldpop[j].xsite = 0;
Dobjfunc(&(oldpop[j]));//计算初始适应度
}
}
void CGA::Dobjfunc(pINDIVIDUAL st)//解码,计算适应度函数值
{
unsigned mask=1;
unsigned bitpos;
unsigned tp;
double bitpow ;
int i,ij,j,k,stop;
for(i=0;i<=varibleSize-1;i++)
st->varible[i]= 0.;
i=0;ij=0;
for(k=0;k<chromsize;k++)
{
if(k==(chromsize-1))
stop=lchrom*varibleSize-(k*(8*sizeof(unsigned)));
else stop=8*sizeof(unsigned);
tp=st->chrom[k];
for(j=0;j<stop;j++)
{
if((tp&mask) == 1)
{
if(i%lchrom==0)
bitpow=1;
else
{
bitpos=i%lchrom;
bitpow=pow(2.,(double)bitpos);
}
st->varible[ij]+=bitpow;
}
i+=1;
ij=i/lchrom;
tp = tp>>1;
}
}
//////////////可修改
double x1,x2,x3,x4,x5;
/*x1=4.096*st->varible[0]/(pow(2,(double)lchrom)-1)-2.048;
x2=4.096*st->varible[1]/(pow(2,(double)lchrom)-1)-2.048;
st->varible[0]=x1;
st->varible[1]=x2;
st->fitness=100*(x1*x1-x2)*(x1*x2-x2)+(1-x1)*(1-x1);*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -