📄 genetic.h
字号:
// Genetic.h: interface for the CGenetic class.
//
//////////////////////////////////////////////////////////////////////
//遗传算法求解数值计算的类,采用二进制编码,保留最优品种,函数应首先化为下列形式
// Max f(x1,x2,..,xn)
// ai<=xi<=bi,i=1,...n
//
/////////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_GENETIC_H__29EB76CE_2D2D_424D_9E90_A52970E8C6A5__INCLUDED_)
#define AFX_GENETIC_H__29EB76CE_2D2D_424D_9E90_A52970E8C6A5__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include<math.h>
#include<afxwin.h>
#include<stdlib.h>
//POPULATION结构
typedef struct tagPOPULATION
{
double dMin;//储存每一代函数的最小值
double dMax;//储存每一代函数的最大值
double dAverage;//储存每一代函数的平均值
int Index[2];//储存每一代群体中最大和最小值的索引
}POPULATION;
//遗传算法类的定义
class CGenetic
{
public:
//
/////////////////////////////////////////////////////////////////////////
//构造函数类
/////////////////////////////////////////////////////////////////////////
//
//初始化函数,由变量个数,种群规模,编码精度决定了要分配的内存大小
BOOL Init(int nParameterCount,int nPopSize,double dCodePrecision);
//默认构造函数
CGenetic();
//指定参数的构造函数
void CGeneticInit(int nParameterCount,double Constraint[],int nPopSize=400,double dCodePrecisiondouble=0.01);
//计算目标函数值的函数
virtual double Function(double X[]);
//析构函数,释放内存
virtual ~CGenetic();
//内部函数计算2的n次方
static long _bry(int n);//内部函数
CGenetic& operator=(const CGenetic& other);
//
////////////////////////////////////////////////////////////////////
//操作函数类
/////////////////////////////////////////////////////////////////////////
//
//获得染色体长度,实际上指定了初始参数,染色体长度就定了
int GetChromLength();
//产生初始群体,随机产生
void GenerateInitialPopulation();
//对染色体进行解码,转换成变量的实际值
void DecodeChromosome(char* pointer,double X[]);
//计算各个个体的函数值和适应度,包括最大最小适应度
void ComputeValueAndFitness();
//选择算子
BOOL SelectionOperator();
//交叉算子
BOOL CrossoverOperator();
//变异算子
BOOL MutationOperator();
//进化函数,最终目标,耗内存较大
double Evolution(int nMaxStep,double Max[],double Min[],double Average[],double X[]);
//产生下一代个体
void GenerateNextPopulation();
//
/////////////////////////////////////////////////////////////////////////////////////
//参数设置函数类,
//////////////////////////////////////////////////////////////////////////////////////
//
//设置变量的约束参数,用户不必调用该函数,该函数已在构造函数里调用,为什么要在构造函数调用
//是因为要获得m-nlength的长度,以便初始化分配内存
void SetConstraint(double Value[]);
//设置交叉概率,默认为0.6,构造函数里面已经指定为默认值,如需要自己设置,需要在建立对象后调用此函数
void SetCrossoverPro(double dPc=0.6);
//设置变异概率,默认为0.001,构造函数里面已经指定为默认值,如需要自己设置,需要在建立对象后调用此函数
void SetMutationPro(double dPm=0.001);
//
/////////////////////////////////////////////////////////////////////////////////////
//结果观察函数类
//////////////////////////////////////////////////////////////////////////////////////
//
//获得变量个数
int GetParameterCount() const;
//获得编码精度
double GetCodePrecision() const;
//获得交叉概率
double GetCrossoverPro() const;
//获得变异概率
double GetMutationPro() const;
//获得染色体长度
int GetChromosomeLength() const;
//获得种群规模
int GetPopSize() const;
//获得每个变量的染色体长度
int* GetGetEachLength()const;
//获得变量约束
double* GetConstraint() const;
//获得种群数据二进制串的指针
char* GetPop() const;
//获得种群函数值的指针
double* GetPopValue() const;
//获得种群适应度的值的指针
double* GetPopFitness() const;
//获得目前种群中具有最大函数值
double GetMaxValue() const;
//获得目前种群中具有最小函数值
double GetMinValue() const;
//获得目前种群中平均函数值
double GetAverageValue() const;
//获得该代中具有最大适应度个体的解码变量值
double GetSolution(double X[]) ;
public:
//带******的必须在构造函数里指定
//
int m_nParameterCount;//参数个数 ******
int m_nLength;//编码长度,即染色体长度 ,等于各个变量编码长度之和
int m_nPopSize;//种群规模,默认为400*******
double m_dPc;//交叉概率*******
double m_dPm;//变异概率******
double m_dCodePrecision;//编码精度,指定函数变量的最小搜索精度******
char *m_pPop;//种群数据
double *m_pPopValue;//种群中每个个体的函数值
double *m_pPopFitness;//种群中每个个体的适应度
double *m_pConstraint;//*******约束变量的上下界数据,前m_nParameterCount个为下界,后m_nParameterCount个为上界
int *m_pEachLength;//由上面编码精度决定的每个变量的编码长度
POPULATION m_struct;
/***********************************
小生境遗传算法的附加参数与函数
***********************************/
double m_dPenality;
int m_nNicheGA;//小生境种群个数
double *m_pNicheFitness;//小生境适应度
char *m_pNichePop;//小生境编码
double m_dNichDistanceBoundary;
void InitComputeNichePop(int nNicheGA,double dNichDistanceBoundary);
void ComputeNicheValueAndFitness();
double HaimingDistance(int i,char *pNichePop,int j,char *pPop);
//void InitNichePop();
};
#endif // !defined(AFX_GENETIC_H__29EB76CE_2D2D_424D_9E90_A52970E8C6A5__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -