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

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

?? genetic.cpp

?? 遺傳基因算法源代碼(資料)
?? CPP
字號:
//頭文件:		Genetic.hpp
//目的:			為遺傳算法提供基類,該基類將評價函數值直接作為適合度,采用
//				新個體直接替換老個體的整體再生法
//語言:			VC++ 6.0
//時間:			1999年7月
//作者:			劉康
//環境:			Win32
//注意:			EvalVal(INDIVIDUAL&)應由用戶類覆蓋,以提供正確的評價函數.
//////////////////////////////////////////////////////////////////////

#include <stdlib.h>
#include "Genetic.hpp"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Genetic::Genetic()
{
	IndNumber = 0;
	GeneLen = 0;
	Elitism = ELITISM;
	Cross = ONE_POINT;
	Parameter = GEN_FIXED;
	OperatorFit[0]=60;  OperatorFit[1]=OperatorFit[0]+40;
	OperatorStart[0] = 70; OperatorStart[1] = 30;
	OperatorEnd[0] = 50; OperatorEnd[1] = 50;
	CrossProb = 0.8;
	MutProb = 0.01;
	ElitismProb = 0.1;
	CurrentChild = 0;
	ChildrenNum = IndNumber;
	Individual = 0;
	Children = 0;
	IndIndex = 0;
	FitIndex = 0;
	Communication = NULL;
}
Genetic::Genetic(int n, int gl)
{
	IndNumber = n;
	GeneLen = gl;
	Elitism = ELITISM;
	Cross = ONE_POINT;
	Parameter = GEN_FIXED;
	OperatorFit[0]=60;  OperatorFit[1]=OperatorFit[0]+40;
	OperatorStart[0] = 70; OperatorStart[1] = 30;
	OperatorEnd[0] = 50; OperatorEnd[1] = 50;
	CrossProb = 0.8;
	MutProb = 0.01;
	ElitismProb = 0.1;
	CurrentChild = 0;
	ChildrenNum = IndNumber;
	IndInit();
	Communication = NULL;
}
Genetic::Genetic(Genetic& g)
{
	Elitism = g.Elitism;
	Cross = g.Cross;
	Parameter = g.Parameter;
	OperatorFit[0] = g.OperatorFit[0];
	OperatorFit[1] = g.OperatorFit[1];
	OperatorStart[0] = g.OperatorStart[0];
	OperatorStart[1] = g.OperatorStart[1];
	OperatorEnd[0] = g.OperatorEnd[0];
	OperatorEnd[1] = g.OperatorEnd[1];
	CrossProb = g.CrossProb;
	MutProb = g.MutProb;
	IndNumber = g.IndNumber;
	GeneLen = g.GeneLen;
	CurrentChild = g.CurrentChild;
	ChildrenNum = g.ChildrenNum;
	ElitismProb = g.ElitismProb;
	Communication = g.Communication;
	IndInit();
	for(int i=0; i<IndNumber; i++)
	{
		Individual[i].Chrom = g.Individual[i].Chrom;
		Individual[i].Fit = g.Individual[i].Fit;
		Individual[i].Val = g.Individual[i].Val;
		FitIndex[i] = g.FitIndex[i];
		IndIndex[i] = g.IndIndex[i];
	}
}

Genetic::~Genetic()
{
	if(Individual) delete []Individual;
	if(Children) delete []Children;
	if(IndIndex) delete []IndIndex;
	if(FitIndex) delete []FitIndex;
}

//設置個體數和個體長度
void Genetic::SetNumLen(int IndN, int GLen)
{
	if(Individual) delete []Individual;
	if(Children) delete []Children;
	if(IndIndex) delete []IndIndex;
	if(FitIndex) delete []FitIndex;
	IndNumber = IndN;
	GeneLen = GLen;
	ChildrenNum = IndNumber;
	IndInit();
}

//個體初始化
bool Genetic::IndInit()
{
	Individual = new INDIVIDUAL[IndNumber];
	Children = new INDIVIDUAL[IndNumber];
	IndIndex = new int[IndNumber];
	FitIndex = new double[IndNumber];
	if(Individual && Children && IndIndex && FitIndex) 
	{
		for(int i=0; i<IndNumber; i++)
		{
			Individual[i].Chrom.SetLen(GeneLen);
			Children[i].Chrom.SetLen(GeneLen);
			IndIndex[i] = i;
		}
		return true;
	}
	else return false;
}
//計算總適合度
void Genetic::CalFitIndex()
{
	double allfit = 0;
	for(int i=0; i<IndNumber; i++)
	{
		allfit += Individual[i].Fit-Individual[IndIndex[IndNumber-1]].Fit;
		FitIndex[i] = allfit;
	}
}
//設置交叉變異適合度
void Genetic::SetOperator(double c, double m)
{
	OperatorFit[0] = c;
	OperatorFit[1] = OperatorFit[0]+m;
}
//設置標志集
void Genetic::SetFlags(CROSS_METHOD c, ELITISM_METHOD e, PARAMETER_METHOD p)
{
	Cross = c;
	Elitism = e;
	Parameter = p;
}
//設置交叉率和變異率
void Genetic::SetProbability(double c, double m)
{
	CrossProb = c;
	MutProb = m;
}
//獲得第i個個體基因字串
const char* Genetic::GetGeneStr(int i)
{
	return Individual[i].Chrom.GetGeneStr();
}
//計算所有個體適合度
void Genetic::AllFit()
{
	for(int i=0; i<IndNumber; i++)
		GetFit(i);
}
//個體適合度計算
double Genetic::GetFit(int i)
{
	Individual[i].Fit = Individual[i].Val;
	return Individual[i].Fit;
}
//計算所有個體評價函數值
void Genetic::AllVal()
{
	for(int i=0; i<IndNumber; i++)
		GetVal(i);
}
//計算個體評價函數值
double Genetic::GetVal(int i)
{
	return EvalVal(Individual[i]);
}
//滾輪選擇方法
int Genetic::Wheel(double* index, int len)
{
	double random = (rand()/(double)RAND_MAX)*index[len-1];
	int i = 0;
	while(random>index[i] && i<len-1) i++;
	return i;
}
//雙親選擇方法
int Genetic::ParentSelect()
{
	return Wheel(FitIndex,IndNumber);
}
//按適合度排序索引數組
void Genetic::IndexSort()
{
	for(int i=0; i<IndNumber; i++)
	{
		int max = i;
		for(int j=i; j<IndNumber; j++)
			if(Individual[IndIndex[max]].Val<Individual[IndIndex[j]].Val)
				max = j;
		int t = IndIndex[max];
		IndIndex[max] = IndIndex[i];
		IndIndex[i] = t;
	}
}
//算子選擇方法:0-交叉算子,1-變異算子
int Genetic::OperatorSelect()
{
	return Wheel(OperatorFit,2);
}
//變異再生方法
void Genetic::GenMutation()
{
	if(CurrentChild>=ChildrenNum) return;
	int parent = ParentSelect();
	Children[CurrentChild].Chrom = Individual[parent].Chrom.Mutation(MutProb);
	CurrentChild++;
}
//交叉再生方法
void Genetic::GenCross()
{
	if(CurrentChild>=ChildrenNum-1) return;
	int parent1 = ParentSelect();
	int parent2 = ParentSelect();
	if((rand()/(double)RAND_MAX)<CrossProb)
	{
		if(Cross == ONE_POINT)
			Individual[parent1].Chrom.OneCross(Individual[parent2].Chrom,
											   Children[CurrentChild].Chrom,
											   Children[CurrentChild+1].Chrom);
		else if(Cross == TWO_POINT)
			Individual[parent1].Chrom.TwoCross(Individual[parent2].Chrom,
											   Children[CurrentChild].Chrom,
											   Children[CurrentChild+1].Chrom);
		else
			Individual[parent1].Chrom.UniCross(Individual[parent2].Chrom,
											   Children[CurrentChild].Chrom,
											   Children[CurrentChild+1].Chrom);
	}
	else
	{
		Children[CurrentChild].Chrom = Individual[parent1].Chrom;
		Children[CurrentChild+1].Chrom = Individual[parent2].Chrom;
	}
	CurrentChild += 2;
}
//精英方法
void Genetic::GenElitism()
{
	int elitismNum = int(ChildrenNum*ElitismProb);
	if(elitismNum <1) elitismNum = 1;
	if(CurrentChild+elitismNum>IndNumber)
		elitismNum = IndNumber-CurrentChild;
	for(int i=CurrentChild; i<CurrentChild+elitismNum; i++)
		Children[i].Chrom = Individual[IndIndex[i]].Chrom;
	CurrentChild += elitismNum;
}
//產生新一代
void Genetic::Generation()
{
	CurrentChild = 0;
	if(Elitism==ELITISM) GenElitism();
	while(CurrentChild < ChildrenNum-1)
	{
		if(OperatorSelect()==1 || CurrentChild>=ChildrenNum-1)
			GenMutation();
		else
			GenCross();
	}
	INDIVIDUAL *tmpInd;
	tmpInd = Individual;
	Individual = Children;
	Children = tmpInd;
//	for(int i=0; i<ChildrenNum; i++)
//		Individual[IndIndex[IndNumber-i-1]].Chrom = Children[i].Chrom;
	Prepare();
}
//運行遺傳算法
const char* Genetic::Run(unsigned long gn)
{
	Prepare();
	double OperatorStep=0;
	if(Parameter == GEN_INTERPOLATION)
		OperatorStep = (OperatorEnd[0]-OperatorStart[0])/gn;
	for(unsigned long generator=0; generator<gn; generator++)
	{
		if(Parameter == GEN_INTERPOLATION)
			OperatorFit[0] += OperatorStep;
		Generation();
		if(Communication!=NULL)
			Communication(Individual[IndIndex[0]].Chrom.GetGeneStr(),
				Individual[IndIndex[0]].Fit,
				Individual[IndIndex[0]].Val);
	}
	return Individual[IndIndex[0]].Chrom.GetGeneStr();
}
//準備遺傳運算
void Genetic::Prepare()
{
	AllVal();
	IndexSort();
	AllFit();
	CalFitIndex();
}
//設置初始算子適合度
void Genetic::SetOptStartEnd(double s1,double e1,double s2,double e2)
{
	OperatorStart[0] = s1;
	OperatorStart[1] = s2;
	OperatorEnd[0] = e1;
	OperatorEnd[1] = e2;
	OperatorFit[0] = OperatorStart[0];
	OperatorFit[1] = OperatorStart[0]+OperatorEnd[0];
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品在线三区| 国产精品传媒视频| 色呦呦国产精品| 国产一区二区调教| 亚洲成人精品在线观看| 欧美国产1区2区| 欧美videos中文字幕| 在线观看一区二区精品视频| 国产成人免费av在线| 免费看欧美女人艹b| 亚洲第一激情av| 亚洲精品一二三四区| 国产欧美一区二区三区在线老狼| 日韩一区二区三区观看| 欧美色视频在线| 色成年激情久久综合| gogo大胆日本视频一区| 国产精品白丝jk黑袜喷水| 欧美96一区二区免费视频| 亚洲国产三级在线| 一区二区三区美女视频| 亚洲三级在线看| 国产欧美一区二区精品忘忧草| 日韩欧美视频一区| 91精品黄色片免费大全| 欧美日本韩国一区二区三区视频| 欧美在线色视频| 色乱码一区二区三区88| 91女神在线视频| 99久久国产免费看| 91麻豆免费观看| 91视频一区二区| 99久久99久久精品免费观看| 成人免费福利片| 成人免费视频网站在线观看| 成人三级在线视频| fc2成人免费人成在线观看播放| 国产一区二区三区高清播放| 国产另类ts人妖一区二区| 国产成人自拍网| 成人理论电影网| 色综合天天综合网天天看片 | 激情偷乱视频一区二区三区| 蜜桃视频免费观看一区| 视频一区免费在线观看| 日本美女一区二区三区视频| 久久成人免费日本黄色| 九九九久久久精品| 国产剧情av麻豆香蕉精品| 国产黑丝在线一区二区三区| 东方aⅴ免费观看久久av| 成人性生交大片| 91国产精品成人| 91麻豆精品国产自产在线| 欧美一区二区免费观在线| 久久网站最新地址| 国产精品日韩精品欧美在线| 亚洲日穴在线视频| 婷婷久久综合九色综合伊人色| 日本午夜精品一区二区三区电影 | 经典三级在线一区| 国产美女久久久久| 91麻豆免费在线观看| 欧美理论在线播放| 精品福利二区三区| 亚洲视频小说图片| 免费一区二区视频| 成人午夜视频在线| 欧美日韩激情一区| 久久婷婷国产综合国色天香| 亚洲免费观看高清| 免费一区二区视频| 99精品国产热久久91蜜凸| 678五月天丁香亚洲综合网| 久久综合久久99| 一级做a爱片久久| 国产一区欧美二区| 欧美亚洲综合色| 久久夜色精品一区| 亚洲综合色噜噜狠狠| 经典三级在线一区| 91成人免费在线| 久久久噜噜噜久久中文字幕色伊伊| 亚洲视频一二三区| 韩国三级在线一区| 欧美日韩在线播放| 国产精品久久久久久一区二区三区| 午夜天堂影视香蕉久久| 成人av在线资源网| 日韩欧美电影一二三| 亚洲免费高清视频在线| 国产高清视频一区| 91精品国产色综合久久ai换脸| 国产精品嫩草99a| 美女网站色91| 欧美色爱综合网| 国产精品进线69影院| 九九精品一区二区| 欧美精品 日韩| 亚洲免费视频中文字幕| 国产成人无遮挡在线视频| 欧美人妖巨大在线| 伊人一区二区三区| bt7086福利一区国产| 欧美成人女星排行榜| 午夜私人影院久久久久| 色婷婷综合久久久中文字幕| 国产性天天综合网| 看电影不卡的网站| 欧美日韩国产免费| 亚洲黄色片在线观看| 成人h精品动漫一区二区三区| 91 com成人网| 国产精品沙发午睡系列990531| 日韩二区在线观看| 91精品午夜视频| 亚洲制服丝袜av| 在线观看一区二区精品视频| xnxx国产精品| 激情偷乱视频一区二区三区| 国产欧美一区二区在线观看| 亚洲一区在线观看网站| 国产精品久久久久aaaa| 国产精品99久久久久久似苏梦涵| 欧美一区二区在线免费观看| 亚洲成人av一区二区| 欧洲一区在线观看| 亚洲精品国久久99热| 91麻豆国产精品久久| 亚洲欧美日韩电影| 91色在线porny| 亚洲三级视频在线观看| 91视频.com| 亚洲综合一二区| 欧美视频三区在线播放| 亚洲电影视频在线| 制服.丝袜.亚洲.中文.综合| 亚洲国产综合在线| 欧美老年两性高潮| 日日摸夜夜添夜夜添国产精品| 欧美男男青年gay1069videost| 亚洲成人av福利| 91精品国产高清一区二区三区 | 成a人片亚洲日本久久| 国产精品视频在线看| 99久久精品国产毛片| 亚洲影院在线观看| 337p亚洲精品色噜噜噜| 麻豆91在线观看| 久久久久久9999| 99re在线视频这里只有精品| 亚洲男同1069视频| 欧美精品1区2区3区| 老司机精品视频一区二区三区| 欧美精品一区二区在线观看| 国产91在线|亚洲| 樱桃视频在线观看一区| 欧美精品xxxxbbbb| 国产剧情av麻豆香蕉精品| 国产精品福利av| 欧美日韩精品综合在线| 精东粉嫩av免费一区二区三区| 国产欧美一区二区精品仙草咪| 91在线国内视频| 亚洲h精品动漫在线观看| 精品国产a毛片| 成人动漫一区二区三区| 亚洲一二三四区| 日韩精品专区在线| 成人动漫一区二区三区| 婷婷成人综合网| 欧美激情一区二区三区不卡| 欧美在线不卡视频| 国产综合久久久久久鬼色| 自拍视频在线观看一区二区| 欧美一区二区三区婷婷月色 | 4hu四虎永久在线影院成人| 极品少妇一区二区三区精品视频| 国产精品久久福利| 91麻豆精品久久久久蜜臀| 成人激情av网| 欧美aⅴ一区二区三区视频| 国产精品嫩草99a| 日韩一区二区免费高清| av在线不卡免费看| 成人精品免费视频| 一区二区三区不卡视频在线观看| 日韩欧美美女一区二区三区| 91在线精品一区二区三区| 精品一区二区免费看| 亚洲午夜久久久| 国产精品毛片高清在线完整版 | 中文字幕在线观看一区二区| 欧美一区二区三区人| a级精品国产片在线观看| 久久成人免费日本黄色| 性欧美大战久久久久久久久| 亚洲日本va在线观看| 国产日韩欧美在线一区| 日韩欧美一卡二卡|