📄 genalg.h
字号:
// GenAlg.h: interface for the CGenAlg class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_GENALG_H__DDD4EEA1_4847_4E04_8A9F_1B3729E1FC7F__INCLUDED_)
#define AFX_GENALG_H__DDD4EEA1_4847_4E04_8A9F_1B3729E1FC7F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
class CGenome
{
public:
vector <int> Cities;
double dFitness;
CGenome():dFitness(0){}
CGenome(vector <int> c, double f): Cities(c), dFitness(f){}
};
class CGenAlg
{
public:
//这个容器将储存每一个个体的染色体
vector <CGenome> 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;
//构造函数
CGenAlg();
//初始化函数
void init(int popsize, double MutRate, double CrossRate, int GenLenght);
//罗盘赌选择函数
CGenome GetChromoRoulette();
//锦标赛选择函数
CGenome TournamentSelection(int N);
//基因交叉函数
void Crossover(const vector<double> &mum,
const vector<double> &dad,
vector<double> &baby1,
vector<double> &baby2);
void CrossoverOBX(const vector<int> &mum,
const vector<int> &dad,
vector<int> &baby1,
vector<int> &baby2);
//基因变异函数
void Mutate(vector<double> &chromo);
//插入式基因变异
void MutateIM(vector<int> &chromo);
vector <int> CGenAlg::CreateNewGenome();
void GrabNBest(int NBest,vector<CGenome> &vecNewPop);
// void GrabNBest(int NBest, vector<CGenome> &vecPop);
void FitnessScaleRank();
void CalculateBestWorstAvTot();
void Reset();
//这函数产生新一代基因
void Epoch(vector<CGenome> &vecNewPop);
public:
//用于访问私有成员的函数
vector<CGenome> GetChromos()const{return m_vecPop;}
double AverageFitness()const{return m_dTotalFitness / m_iPopSize;}
double BestFitness()const{return m_dBestFitness;}
void outputTheData(CDC* pDC);
private:
int m_ifSorted;
double m_arBestFitness[20000];
double m_arAverageFitness[20000];
};
#endif // !defined(AFX_GENALG_H__DDD4EEA1_4847_4E04_8A9F_1B3729E1FC7F__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -