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

📄 genetic.hpp

📁 遗传算法源程序evolution calculates the law origin code ,C-C++,人工智能/AI-NN-PR
💻 HPP
字号:
//头文件:		Genetic.hpp
//目的:			为遗传算法提供基类,该基类将评价函数值直接作为适合度,采用
//				新个体直接替换老个体的整体再生法
//语言:			VC++ 6.0
//时间:			1999年7月~2000年1月
//作者:			刘康
//环境:			Win32
//注意:			EvalVal(INDIVIDUAL&)应由用户类覆盖,以提供正确的评价函数.
////////////////////////////////////////////////////////////////////////////

#if !defined(__GENETIC_HPP)
#define __GENETIC_HPP

#include "chrom.hpp"

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//精英方法参数-NONE:无精英,ELITISM:有精英
enum ELITISM_METHOD { NONE, ELITISM };
//交叉方法参数-ONE_POINT:一点交叉,TWO_POINT:两点交叉,UNIFORM_CROSS:均匀交叉
enum CROSS_METHOD { ONE_POINT, TWO_POINT, UNIFORM_CROSS };
//变异参数方法-GEN_FIXED:参数固定,INTEPOLATION:参数插值
enum PARAMETER_METHOD { GEN_FIXED,GEN_INTERPOLATION };

class Genetic  
{
protected:
	//保护数据成员
	struct INDIVIDUAL {			//定义个体结构
		Chromosome Chrom;		//个体染色体
		double Fit;				//个体适合度
		double Val;				//个体评价函数值
	};
	//数据成员
	INDIVIDUAL* Individual;		//个体数组指针
	INDIVIDUAL* Children;		//孩子数组指针
	double *FitIndex;			//总适合度数组
	int IndNumber;				//个体数
	int GeneLen;				//基因长度
	int CurrentChild;			//当前再生亲子数
	int ChildrenNum;			//一代再生亲子数
	double ElitismProb;			//精英比率

	ELITISM_METHOD Elitism;		//精英方法标志
	CROSS_METHOD Cross;			//交叉方法标志
	PARAMETER_METHOD Parameter;	//参数方法标志
	double OperatorFit[2];		//算子适合度数组:交叉算子,变异算子

	double CrossProb;			//交叉率
	double MutProb;				//变异率

	double OperatorStart[2];	//初始算子适合度,用于算子插值
	double OperatorEnd[2];		//终止算子适合度,用于算子插值

	/////////////////////////////////////////////////////////////////
	//保护成员函数

	//一般成员函数
	bool IndInit();				//初始化个体数组
	void AllFit();				//计算所有个体适合度
	void AllVal();				//计算所有个体评价函数值
	void IndexSort();			//按适合度排序索引数组
	virtual void CalFitIndex();	//计算总适合度
	int Wheel(double*,int);		//滚轮选择函数,返回选择号

	//以下成员函数属于计算模块
	virtual double EvalVal(INDIVIDUAL&)=0;	//计算个体评价函数值

	//以下成员函数属于再生模块
	virtual int ParentSelect();				//双亲选择方法
	virtual int OperatorSelect();			//算子选择方法,0-交叉算子,1-变异算子
	virtual void GenMutation();				//变异再生方法
	virtual void GenCross();				//交叉再生方法
	virtual void GenElitism();				//精英方法
	virtual void Generation();				//产生新一代

	//通讯函数
	void (*Communication)(const char *gen,double fit,double val);
public:
	//公共数据成员
	int *IndIndex;				//个体适合度索引数组,按评价函数值高低存储个体号

	//构造函数
	Genetic();
	Genetic(int n, int gl);
	Genetic(Genetic& g);
	//析构函数
	virtual ~Genetic();

	/////////////////////////////////////////////////////////////////
	//成员函数

	//一般成员函数
	void SetNumLen(int IndN, int GLen);
	int GetNumber(){ return IndNumber; };	//获得个体数
	int GetGenLen(){ return GeneLen; };		//获得基因长度
	const char* GetGeneStr(int i);			//获得第i个个体基因字串

	void SetOperator(double c, double m);	//设置交叉变异算子适合度
	void SetFlags(CROSS_METHOD,ELITISM_METHOD e=ELITISM,
		PARAMETER_METHOD p=GEN_FIXED);			//设置标志集
	void SetCross(CROSS_METHOD c){Cross=c;};//设置交叉方法
	void SetElitism(ELITISM_METHOD e){Elitism=e;};//设置精英方法
	void SetParameter(PARAMETER_METHOD p){Parameter=p;};//设置参数方法
	void SetProbability(double c,double m);	//设置交叉率和变异率
	void SetEltmProb(double p){ElitismProb=p;};//设置精英比率
	void SetOptStartEnd(double,double,double,double);//设置初始,终止算子适合度

	//以下成员函数属于计算模块
	virtual double GetFit(int i);			//计算第i个个体适合度
	virtual double GetVal(int i);			//第i个体评价函数值,实数

	//运行遗传算法
	virtual void Prepare();					//准备遗传运算
	virtual const char* Run(unsigned long gn);//返回最佳二进制串

	//设置通讯函数
	void SetComm(void(*p)(const char*,double,double))
		{Communication=(void(*)(const char*,double,double))p;};
};

#endif // !defined(__GENETIC_HPP)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -