?? 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 + -