genalg.h
来自「用C++开发的一个人工神经网络小游戏」· C头文件 代码 · 共 154 行
H
154 行
// GenAlg.h: interface for the CGenAlg class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_GENALG_H__DA36AFD5_8CBD_4865_A267_A5F422035C8C__INCLUDED_)
#define AFX_GENALG_H__DA36AFD5_8CBD_4865_A267_A5F422035C8C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
//nclude"Function.h"
//#include"NeuralNet.h"
using namespace std;
class SGenome
{
public:
vector <int> action;
vector <double> time;
double dFitness;
SGenome():dFitness(0){}
SGenome( vector <int> a, vector <double> t, double f): action(a), time(t), dFitness(f){}
//overload '<' used for sorting
/*
friend bool operator<(SGenome& lhs, SGenome& rhs)
{
return (lhs.dFitness < rhs.dFitness);
}
*/
};
class CGenAlg
{
public:
//这个容器用于临时存储所有人口的基因
vector <SGenome> m_vecPop;
//人口数量
int m_iPopSize;
//每一个基因组的基因的总数目
int m_iChromoLength;
//所有个体对应的适应性的总和
double m_dTotalFitness;
//在所有个体当中最适应的个体的适应性评分
double m_dBestFitness;
//所有个体的适应性评分的平均值
double m_dAverageFitness;
//在所有个体当中最不适应的个体的适应性评分
double m_dWorstFitness;
//最适应的个体在m_vecPop容器里面的索引号
int m_iFittestGenome;
//基因突变的概率,一般介于0.05和0.3之间
double m_dMutationRate;
//基因交叉的概率一般设为0.7
double m_dCrossoverRate;
//这个容器储存了交叉点的有效位置
vector<int> m_vecSplitPoints;
//代数的记数器
int m_cGeneration;
//基因交叉函数
void Crossover(const vector<double> &mum,
const vector<double> &dad,
vector<double> &baby1,
vector<double> &baby2,
const vector<double> &mum2,
const vector<double> &dad2,
vector<double> &baby12,
vector<double> &baby22
);
//基因交叉函数
//这个基因交叉函数只在神经元对应基因的起末位置作交叉点
//(保证交换后某神经元对应的基因的完整性)
void CrossoverAtSplits(const vector<int> &originalAction ,
const vector<double> &originalTime,
vector<int> &action ,
vector<double> &time);
//基因变异函数
void MutateTime(vector<double> &chromo);
void MutateAction(vector<int> &chromo);
//void Mutate(const vector<double> &originalAction , const vector<double> &originalTime,vector<double> &action , vector<double> &time);
//转盘函数
SGenome GetChromoRoulette();
void GrabNBest(int NBest, vector<SGenome> &vecPop);
void FitnessScaleRank();
void CalculateBestWorstAvTot();
void Reset();
public:
void outputTheData(CDC* pDC);
void init(int popsize,double MutRate,double CrossRate,int GenLenght);
//构造函数
CGenAlg();
//这函数产生新一代基因
void Epoch(vector<SGenome> &vecNewPop);
//用于访问私有成员的函数
vector<SGenome> GetChromos()const{return m_vecPop;}
double AverageFitness()const{return m_dTotalFitness / m_iPopSize;}
double BestFitness()const{return m_dBestFitness;}
};
#endif // !defined(AFX_GENALG_H__DA36AFD5_8CBD_4865_A267_A5F422035C8C__INCLUDED_)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?