📄 genetic.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 + -