亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cgenalg.cpp

?? 開發(fā)游戲人工智能的王道書
?? CPP
字號:
#include "CGenAlg.h"




//-----------------------------------constructor-------------------------
//
//	sets up the population with random floats
//
//-----------------------------------------------------------------------
CGenAlg::CGenAlg(int	  popsize,
                 double	MutRat,
                 double	CrossRat,
                 int	  numweights) :	m_iPopSize(popsize),
                                      m_dMutationRate(MutRat),
										                  m_dCrossoverRate(CrossRat),
										                  m_iChromoLength(numweights),
										                  m_dTotalFitness(0),
										                  m_cGeneration(0),
										                  m_iFittestGenome(0),
										                  m_dBestFitness(0),
										                  m_dWorstFitness(99999999),
										                  m_dAverageFitness(0)
{
	//initialise population with chromosomes consisting of random
	//weights and all fitnesses set to zero
	for (int i=0; i<m_iPopSize; ++i)
	{
		m_vecPop.push_back(SGenome());

		for (int j=0; j<m_iChromoLength; ++j)
		{
			m_vecPop[i].vecWeights.push_back(RandomClamped());
		}
	}
}


//---------------------------------Mutate--------------------------------
//
//	mutates a chromosome by perturbing its weights by an amount not 
//	greater than CParams::dMaxPerturbation
//-----------------------------------------------------------------------
void CGenAlg::Mutate(vector<double> &chromo)
{
	//traverse the chromosome and mutate each weight dependent
	//on the mutation rate
	for (int i=0; i<chromo.size(); ++i)
	{
		//do we perturb this weight?
		if (RandFloat() < m_dMutationRate)
		{
			//add or subtract a small value to the weight
			chromo[i] += (RandomClamped() * CParams::dMaxPerturbation);
		}
	}
}

//----------------------------------GetChromoRoulette()------------------
//
//	returns a chromo based on roulette wheel sampling
//
//-----------------------------------------------------------------------
SGenome CGenAlg::GetChromoRoulette()
{
	//generate a random number between 0 & total fitness count
	double Slice = (double)(RandFloat() * m_dTotalFitness);

	//this will be set to the chosen chromosome
	SGenome TheChosenOne;
	
	//go through the chromosones adding up the fitness so far
	double FitnessSoFar = 0;
	
	for (int i=0; i<m_iPopSize; ++i)
	{
		FitnessSoFar += m_vecPop[i].dFitness;
		
		//if the fitness so far > random number return the chromo at 
		//this point
		if (FitnessSoFar >= Slice)
		{
			TheChosenOne = m_vecPop[i];

      break;
		}
		
	}

	return TheChosenOne;
}
	
//-------------------------------------Crossover()-----------------------
//	
//  given parents and storage for the offspring this method performs
//	crossover according to the GAs crossover rate
//-----------------------------------------------------------------------
void CGenAlg::Crossover(const vector<double> &mum,
                        const vector<double> &dad,
                        vector<double>       &baby1,
                        vector<double>       &baby2)
{
	//just return parents as offspring dependent on the rate
	//or if parents are the same
	if ( (RandFloat() > m_dCrossoverRate) || (mum == dad)) 
	{
		baby1 = mum;
		baby2 = dad;

		return;
	}

	//determine a crossover point
	int cp = RandInt(0, m_iChromoLength - 1);

	//create the offspring
	for (int i=0; i<cp; ++i)
	{
		baby1.push_back(mum[i]);
		baby2.push_back(dad[i]);
	}

	for (i=cp; i<mum.size(); ++i)
	{
		baby1.push_back(dad[i]);
		baby2.push_back(mum[i]);
	}
	
	
	return;
}

//-----------------------------------Epoch()-----------------------------
//
//	takes a population of chromosones and runs the algorithm through one
//	 cycle.
//	Returns a new population of chromosones.
//
//-----------------------------------------------------------------------
vector<SGenome> CGenAlg::Epoch(vector<SGenome> &old_pop)
{
	//assign the given population to the classes population
  m_vecPop = old_pop;

  //reset the appropriate variables
  Reset();

  //sort the population (for scaling and elitism)
  sort(m_vecPop.begin(), m_vecPop.end());

  //calculate best, worst, average and total fitness
	CalculateBestWorstAvTot();
  
  //create a temporary vector to store new chromosones
	vector <SGenome> vecNewPop;

	//Now to add a little elitism we shall add in some copies of the
	//fittest genomes. Make sure we add an EVEN number or the roulette
  //wheel sampling will crash
	if (!(CParams::iNumCopiesElite * CParams::iNumElite % 2))
	{
		GrabNBest(CParams::iNumElite, CParams::iNumCopiesElite, vecNewPop);
	}
	

	//now we enter the GA loop
	
	//repeat until a new population is generated
	while (vecNewPop.size() < m_iPopSize)
	{
		//grab two chromosones
		SGenome mum = GetChromoRoulette();
		SGenome dad = GetChromoRoulette();

		//create some offspring via crossover
		vector<double>		baby1, baby2;

		Crossover(mum.vecWeights, dad.vecWeights, baby1, baby2);

		//now we mutate
		Mutate(baby1);
		Mutate(baby2);

		//now copy into vecNewPop population
		vecNewPop.push_back(SGenome(baby1, 0));
		vecNewPop.push_back(SGenome(baby2, 0));
	}

	//finished so assign new pop back into m_vecPop
	m_vecPop = vecNewPop;

	return m_vecPop;
}

//-----------------------------FitnessScaleRank----------------------
//
//	This type of fitness scaling sorts the population into ascending
//	order of fitness and then simply assigns a fitness score based 
//	on its position in the ladder. (so if a genome ends up last it
//	gets score of zero, if best then it gets a score equal to the size
//	of the population. You can also assign a multiplier which will
//	increase the 'seperation' of genomes on the ladder and allow the 
//	population to converge much quicker
//---------------------------------------------------------------------
void CGenAlg::FitnessScaleRank()
{
	const int FitnessMultiplier = 1;

	//assign fitness according to the genome's position on
	//this new fitness 'ladder'
	for (int i=0; i<m_iPopSize; i++)
	{
		m_vecPop[i].dFitness = i * FitnessMultiplier;
	}

	//recalculate values used in selection
	CalculateBestWorstAvTot();
} 

//-------------------------GrabNBest----------------------------------
//
//	This works like an advanced form of elitism by inserting NumCopies
//  copies of the NBest most fittest genomes into a population vector
//--------------------------------------------------------------------
void CGenAlg::GrabNBest(int	            NBest,
                        const int	      NumCopies,
                        vector<SGenome>	&Pop)
{
  //add the required amount of copies of the n most fittest 
	//to the supplied vector
	while(NBest--)
	{
		for (int i=0; i<NumCopies; ++i)
		{
			Pop.push_back(m_vecPop[(m_iPopSize - 1) - NBest]);
	  }
	}
}

//-----------------------CalculateBestWorstAvTot-----------------------	
//
//	calculates the fittest and weakest genome and the average/total 
//	fitness scores
//---------------------------------------------------------------------
void CGenAlg::CalculateBestWorstAvTot()
{
	m_dTotalFitness = 0;
	
	double HighestSoFar = 0;
	double LowestSoFar  = 9999999;
	
	for (int i=0; i<m_iPopSize; ++i)
	{
		//update fittest if necessary
		if (m_vecPop[i].dFitness > HighestSoFar)
		{
			HighestSoFar	 = m_vecPop[i].dFitness;
			
			m_iFittestGenome = i;

			m_dBestFitness	 = HighestSoFar;
		}
		
		//update worst if necessary
		if (m_vecPop[i].dFitness < LowestSoFar)
		{
			LowestSoFar = m_vecPop[i].dFitness;
			
			m_dWorstFitness = LowestSoFar;
		}
		
		m_dTotalFitness	+= m_vecPop[i].dFitness;
		
		
	}//next chromo
	
	m_dAverageFitness = m_dTotalFitness / m_iPopSize;
}

//-------------------------Reset()------------------------------
//
//	resets all the relevant variables ready for a new generation
//--------------------------------------------------------------
void CGenAlg::Reset()
{
	m_dTotalFitness		= 0;
	m_dBestFitness		= 0;
	m_dWorstFitness		= 9999999;
	m_dAverageFitness	= 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
4438x成人网最大色成网站| 中文字幕一区二区在线播放| 国产欧美日韩综合| 一区二区成人在线| 国产精品亚洲一区二区三区在线| 亚洲在线视频网站| 国内精品在线播放| 欧美日韩精品电影| 制服丝袜国产精品| 1024国产精品| 国产一区二区毛片| 69p69国产精品| 欧美高清在线精品一区| 日韩福利电影在线| 在线免费观看一区| 国产精品美女一区二区在线观看| 国产精品午夜在线| 免费看欧美女人艹b| 欧美在线你懂得| 中文字幕免费不卡| 精久久久久久久久久久| 在线电影国产精品| 一区二区三区国产精品| 波波电影院一区二区三区| 精品久久久久久最新网址| 午夜精品免费在线| 欧美日韩一区三区四区| 一区二区三区中文免费| 免费三级欧美电影| 欧美精品第1页| 亚洲九九爱视频| 99久久精品国产一区二区三区 | 色哟哟一区二区| 亚洲国产精品高清| 国产一区在线观看麻豆| 色综合欧美在线| 中文字幕一区二区三区四区不卡| 亚洲一区二区三区四区五区黄| 奇米在线7777在线精品| 91精品婷婷国产综合久久| 天天综合日日夜夜精品| 国产成人亚洲精品狼色在线| 久久一二三国产| 亚洲精品第1页| 91免费看片在线观看| 日韩欧美专区在线| 日本成人超碰在线观看| 欧美一区二区三区免费观看视频 | 国产成人av电影| 国产日韩一级二级三级| 成人爱爱电影网址| 亚洲女同ⅹxx女同tv| 91福利视频在线| 亚洲成人av在线电影| 日韩一区二区在线观看视频播放| 亚洲欧洲一区二区三区| 色偷偷一区二区三区| 久久九九99视频| 99国产精品久| 久久伊人蜜桃av一区二区| 国产一区二区伦理| 亚洲三级在线免费观看| 欧美日韩一级黄| 久久精品国产精品亚洲红杏| 久久蜜桃一区二区| 成人h精品动漫一区二区三区| 欧美在线小视频| 美女在线观看视频一区二区| 久久综合狠狠综合久久激情| 色综合久久久久久久久| 日欧美一区二区| 国产午夜精品福利| 91九色最新地址| 久草这里只有精品视频| 亚洲天堂成人网| 欧美日韩亚洲另类| 国精产品一区一区三区mba视频| 欧美精品久久99| 亚洲成在人线在线播放| 国产日韩v精品一区二区| 欧洲另类一二三四区| 亚洲欧美成人一区二区三区| 97se狠狠狠综合亚洲狠狠| 午夜久久久久久久久| 国产精品丝袜久久久久久app| 国产传媒久久文化传媒| 亚洲国产精品久久人人爱| 欧美日本一区二区在线观看| 粉嫩av一区二区三区在线播放| 欧美精品一区二区久久久| 韩国成人精品a∨在线观看| 亚洲视频在线观看三级| 亚洲精品在线观看网站| 色婷婷综合视频在线观看| 国内偷窥港台综合视频在线播放| 久久蜜臀精品av| 日韩一卡二卡三卡国产欧美| 色哟哟国产精品| 成人高清免费在线播放| 韩国三级中文字幕hd久久精品| 久久久激情视频| 日韩一级大片在线观看| 92精品国产成人观看免费| 高清在线成人网| 美国三级日本三级久久99| 亚洲成人午夜电影| 亚洲美女在线一区| 国产精品免费丝袜| 日本一二三四高清不卡| 久久久久久毛片| 精品国产乱码久久久久久老虎 | 国产一区二区三区四| 热久久免费视频| 性感美女久久精品| 亚洲国产欧美一区二区三区丁香婷| 欧美精品v国产精品v日韩精品| 久99久精品视频免费观看| 久久久精品日韩欧美| 不卡av在线免费观看| 亚洲成人午夜电影| 丝袜美腿高跟呻吟高潮一区| 午夜伦欧美伦电影理论片| 丁香一区二区三区| 国产98色在线|日韩| 国产·精品毛片| 成人福利视频在线看| 99天天综合性| 91久久精品一区二区| 欧美日韩国产综合草草| 欧美日韩dvd在线观看| 欧美不卡一二三| 国产偷v国产偷v亚洲高清 | 一区二区三区小说| 一区二区三区中文免费| 日韩经典一区二区| 美女一区二区三区在线观看| 国产美女精品人人做人人爽| 粉嫩蜜臀av国产精品网站| 97精品久久久久中文字幕 | 亚洲一区二区成人在线观看| 亚洲一区二区三区免费视频| 亚洲不卡在线观看| 久草中文综合在线| 午夜av一区二区三区| 美女在线观看视频一区二区| 国产很黄免费观看久久| 91免费视频观看| 欧美一级片免费看| 国产视频一区在线播放| 欧美精品丝袜久久久中文字幕| 99视频热这里只有精品免费| 欧美伊人久久久久久午夜久久久久| 处破女av一区二区| 在线观看亚洲一区| 日韩欧美国产成人一区二区| 国产精品视频yy9299一区| 亚洲欧美aⅴ...| 日韩一区在线播放| 日韩精品成人一区二区在线| 亚洲国产精品天堂| 国产成人在线视频网址| 国产一本一道久久香蕉| 欧美性猛交xxxxxx富婆| 色呦呦国产精品| 91国产成人在线| 久久精品这里都是精品| 亚洲成人动漫精品| 91在线播放网址| 精品国产免费人成电影在线观看四季 | 一本一道波多野结衣一区二区| 99久久精品国产麻豆演员表| 日韩欧美国产wwwww| 午夜激情久久久| 欧美人与性动xxxx| 亚洲一区二区在线免费观看视频| 精品伦理精品一区| 制服丝袜亚洲色图| 欧美一区二区视频在线观看| 欧美剧情电影在线观看完整版免费励志电影| 91丨porny丨国产| 欧美r级在线观看| 一区二区三区资源| 午夜欧美大尺度福利影院在线看 | 欧美色视频一区| 中文字幕一区二区三区乱码在线 | 免费在线看成人av| 91麻豆自制传媒国产之光| 91精品91久久久中77777| 国产欧美精品区一区二区三区 | 欧美日韩久久一区二区| 中文字幕中文字幕一区| 粉嫩一区二区三区在线看| 欧美精品一区二区在线观看| 免费日韩伦理电影| 欧美精品在线观看播放| 欧美精品一区二区不卡| 蜜桃精品视频在线| 欧美va在线播放| 精品一区二区在线观看| 日韩精品中文字幕在线不卡尤物|