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

📄 ga.cpp

📁 一个简单的改进的遗传算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -