• 大小: 4KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-06
  • 语言: C/C++
  • 标签: GA  遗传算法  

资源简介

遗传算法 C++实现 控制台演示版本 附有详尽注释 注:因为是单数浮点数编码,所以未使用基因重组函数 如果看完仍然不懂,欢迎参看本人博客的一篇关于GA的文章 http://blog.csdn.net/emiyasstar__/article/details/6938608

资源截图

代码片段和文件信息

#include

#include
#include 
#include 
#include
#include“GA.h“

using namespace std;


//srand((unsigned) time(NULL));

double random()
{
double randNum;
randNum=rand()*1.0/RAND_MAX;
return randNum;
}

 GenAlg::GenAlg()
{

}



void GenAlg::init(int popsize double MutRate double CrossRate int GenLenghtdouble LeftPointdouble RightPoint)

{

popSize = popsize;

mutationRate = MutRate;

crossoverRate = CrossRate;

chromoLength = GenLenght;

totalFitness = 0;

generation = 0;

//fittestGenome = 0;

bestFitness = 0.0;

worstFitness = 99999999;

averageFitness = 0;

maxPerturbation=0.004;

leftPoint=LeftPoint;

rightPoint=RightPoint;

//清空种群容器,以初始化

vecPop.clear();

for (int i=0; i
{     

//类的构造函数已经把适应性评分初始化为0

vecPop.push_back(Genome());

//把所有的基因编码初始化为函数区间内的随机数。

for (int j=0; j
{

vecPop[i].vecGenome.push_back(random() * 

(rightPoint - leftPoint) + leftPoint);

}

}

}

void GenAlg::Reset()
{
totalFitness=0;
//bestFitness=0;
    //worstFitness=9999;
averageFitness=0;

}

void GenAlg::CalculateBestWorstAvTot()
{
for (int i=0; i
{

//累计适应性分数.
totalFitness+= vecPop[i].fitness;

if(vecPop[i].fitness>=bestFitness)
{
bestFitness=vecPop[i].fitness;
fittestGenome=vecPop[i];
}

if(vecPop[i].fitness<=worstFitness)
worstFitness=vecPop[i].fitness;

}

averageFitness=totalFitness/popSize;



}



Genome GenAlg:: GetChromoRoulette()

{

//产生一个0到人口总适应性评分总和之间的随机数.

//中m_dTotalFitness记录了整个种群的适应性分数总和)

double Slice = (random()) * totalFitness;

//这个基因将承载转盘所选出来的那个个体.

Genome TheChosenOne;

//累计适应性分数的和.

double FitnessSoFar = 0;

//遍历总人口里面的每一条染色体。

for (int i=0; i
{

//累计适应性分数.

FitnessSoFar += vecPop[i].fitness;

//如果累计分数大于随机数就选择此时的基因.

if (FitnessSoFar >= Slice)

{

TheChosenOne = vecPop[i];

break;

}

}

//返回转盘选出来的个体基因

return TheChosenOne;

}

void GenAlg::Mutate(vector &chromo)
{

//遵循预定的突变概率对基因进行突变

for (int i=0; i
{

//如果发生突变的话

if (random() < mutationRate)

{

//使该权值增加或者减少一个很小的随机数值

chromo[i] += ((random()-0.5) * maxPerturbation);

//保证袋鼠不至于跳出自然保护区.

if(chromo[i] < leftPoint)

{

chromo[i] = rightPoint;

}

else if(chromo[i] > rightPoint)

{

chromo[i] = leftPoint;

}

//以上代码非基因变异的一般性代码只是用来保证基因编码的可行性。

}


}
}

//此函数产生新的一代见证着整个进化的全过程.

//以父代种群的基因组容器作为参数传进去该函数将往该容器里放入新一代的基因组(当然是经过了优胜劣汰的)

void GenAlg::Epoch(vector &vecNewPop)

{

//用类的成员变量来储存父代的基因组(在此之前m_vecPop储存的是不带估值的所有基因组)

vecPop = vecNewPop;

//初始化相关变量

Reset();

//为相关变量赋值

CalculateBestWorstAvTot();

//清空装载新种群的容器

vecNewPop.clear();       

//产生新一代的

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5847  2011-11-05 15:26  GA遗传算法\GA.cpp

     文件       2929  2011-11-05 15:09  GA遗传算法\GA.h

     文件        566  2011-11-05 15:23  GA遗传算法\main.cpp

     目录          0  2011-11-05 15:25  GA遗传算法

----------- ---------  ---------- -----  ----

                 9342                    4


评论

共有 条评论