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

📄 genalg.h

📁 与本人上次上传的类别一样
💻 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 + -