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

📄 wgenalg.h

📁 用C++开发的一个人工神经网络小游戏
💻 H
字号:
// WGenAlg.h: interface for the CWGenAlg class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WGENALG_H__970EB390_D9D2_440B_869E_1DFEBEBFBFFF__INCLUDED_)
#define AFX_WGENALG_H__970EB390_D9D2_440B_869E_1DFEBEBFBFFF__INCLUDED_

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

#include <vector>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include "GenAlg.h"
//nclude"Function.h"
//#include"NeuralNet.h"
using namespace std;


class SWGenome
{
public:
  vector <double>	vecWeights;

	double          dFitness;

	SWGenome():dFitness(0){}

	SWGenome( vector <double> w, double f): vecWeights(w), dFitness(f){}
	
	
	//overload '<' used for sorting
	/*
	friend bool operator<(SWGenome& lhs, SWGenome& rhs)
	{
		return (lhs.dFitness < rhs.dFitness);
	}
	*/
	
};


class CWGenAlg
{
public:
	
	//这个容器将储存每一个个体的基因组
	vector <SWGenome>	 m_vecPop;

	//人口数量
	int m_iPopSize;
	
	//每一个基因组的基因的总数目
	int m_iChromoLength;

	//所有个体对应的适应性的总和
	double m_dTotalFitness;

	//在所有个体当中最适应的个体的适应性评分
	double m_dBestFitness;

	//所有个体的适应性评分的平均值
	double m_dAverageFitness;

	//在所有个体当中最不适应的个体的适应性评分
	double m_dWorstFitness;

	//最适应的个体在m_vecPop容器里面的索引号
	int		m_iFittestGenome;

	//基因突变的概率,一般介于0.05和0.3之间
	double m_dMutationRate;

	//基因交叉的概率一般设为0.7
	double m_dCrossoverRate;
	
	//这个容器储存了交叉点的有效位置
	vector<int> m_vecSplitPoints;

	//代数的记数器
	int	  m_cGeneration;




	//基因交叉函数
	void     Crossover(const vector<double> &mum,
                     const vector<double> &dad,
                     vector<double>       &baby1,
                     vector<double>       &baby2);

	
	//基因交叉函数
	//这个基因交叉函数只在神经元对应基因的起末位置作交叉点
	//(保证交换后某神经元对应的基因的完整性)
	void     CrossoverAtSplits(const vector<double> &mum,
		const vector<double> &dad,
		vector<double>       &baby1,
		vector<double>       &baby2);
	
	
	//基因变异函数
	void    Mutate(vector<double> &chromo);
	
	//转盘函数
	SWGenome	GetChromoRoulette();

	void	  GrabNBest2(int	 NBest,    vector<SWGenome>	&vecPop);

	void	  FitnessScaleRank();

	void	  CalculateBestWorstAvTot();

	void	  Reset();



public:
	//构造函数
	CWGenAlg();
	void init(int popsize, double MutRate, double CrossRate, int GenLenght);


	//这函数产生新一代基因
	void	Epoch(vector<SWGenome> &old_pop);


	//用于访问私有成员的函数
	vector<SWGenome>	GetChromos()const{return m_vecPop;}
	double			    AverageFitness()const{return m_dTotalFitness / m_iPopSize;}
	double		    	BestFitness()const{return m_dBestFitness;}

	void outputTheData(CDC* pDC);

	
private:
	double m_arBestFitness[5000];
	double m_arAverageFitness[5000];
};

#endif // !defined(AFX_WGENALG_H__970EB390_D9D2_440B_869E_1DFEBEBFBFFF__INCLUDED_)

⌨️ 快捷键说明

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