📄 wgenalg.h
字号:
// WGenAlg.h: interface for the CWGenAlg class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_WGENALG_H__970EB390_D9D2_440B_869E_1DFEBEBFBFFF__INCLUDED_)
#define AFX_WGENALG_H__970EB390_D9D2_440B_869E_1DFEBEBFBFFF__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include "GenAlg.h"
//nclude"Function.h"
//#include"NeuralNet.h"
using namespace std;
class SWGenome
{
public:
vector <double> vecWeights;
double dFitness;
SWGenome():dFitness(0){}
SWGenome( vector <double> w, double f): vecWeights(w), dFitness(f){}
//overload '<' used for sorting
/*
friend bool operator<(SWGenome& lhs, SWGenome& rhs)
{
return (lhs.dFitness < rhs.dFitness);
}
*/
};
class CWGenAlg
{
public:
//这个容器将储存每一个个体的基因组
vector <SWGenome> 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);
//基因交叉函数
//这个基因交叉函数只在神经元对应基因的起末位置作交叉点
//(保证交换后某神经元对应的基因的完整性)
void CrossoverAtSplits(const vector<double> &mum,
const vector<double> &dad,
vector<double> &baby1,
vector<double> &baby2);
//基因变异函数
void Mutate(vector<double> &chromo);
//转盘函数
SWGenome GetChromoRoulette();
void GrabNBest2(int NBest, vector<SWGenome> &vecPop);
void FitnessScaleRank();
void CalculateBestWorstAvTot();
void Reset();
public:
//构造函数
CWGenAlg();
void init(int popsize, double MutRate, double CrossRate, int GenLenght);
//这函数产生新一代基因
void Epoch(vector<SWGenome> &old_pop);
//用于访问私有成员的函数
vector<SWGenome> GetChromos()const{return m_vecPop;}
double AverageFitness()const{return m_dTotalFitness / m_iPopSize;}
double BestFitness()const{return m_dBestFitness;}
void outputTheData(CDC* pDC);
private:
double m_arBestFitness[5000];
double m_arAverageFitness[5000];
};
#endif // !defined(AFX_WGENALG_H__970EB390_D9D2_440B_869E_1DFEBEBFBFFF__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -