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

📄 genetic.h

📁 遗传算法的核心实现类 C++语言编写
💻 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 + -