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

📄 genmsrch.cpp

📁 一个在vc++环境中实现的遗传算法
💻 CPP
字号:
//头文件:		GenMSrch.hpp
//目的:			为遗传算法提供基类,该基类将评价函数值直接作为适合度,采用
//				新个体直接替换老个体的整体再生法,在搜索过程中,采用多目标法
//语言:			VC++ 6.0
//时间:			1999年11月~2000年1月
//作者:			刘康
//环境:			Win32
//注意:			EvalVal(INDIVIDUAL&)应由用户类覆盖,以提供正确的评价函数.
////////////////////////////////////////////////////////////////////////////

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

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

GenMSrch::GenMSrch(int n, int gl):Genetic(n,gl)
{
	VRProb = .2;
	SProb = .5;
}

GenMSrch::~GenMSrch()
{

}

//交叉再生方法
void GenMSrch::GenCross()
{
	if(CurrentChild>=ChildrenNum-1) return;
	int parent1 = ParentSelect();		//选择双亲1
	int *indSort = new int[IndNumber];
	int *indDis = new int[IndNumber];
	for(int st=0; st<IndNumber; st++)	//计算其它个体与双亲1的距离
	{
		indDis[st] = VisualDis(parent1,st);
		indSort[st] = st;
	}
	for(st=0; st<IndNumber-1; st++)		//将其他个体按距离排序
	{
		int mDis = st;
		for(int sst=st+1; sst<IndNumber; sst++)
			if(indDis[sst]<indDis[mDis]) mDis = sst;
		int tmp = indSort[st];
		indSort[st] = indSort[mDis];
		indSort[mDis] = tmp;
		tmp = indDis[st];
		indDis[st] = indDis[mDis];
		indDis[mDis] = tmp;
	}
	double *index = new double[IndNumber];//个体总适合度数组
	index[0] = Individual[indSort[0]].Fit;
	for(st=1; st<IndNumber; st++)		//按与双亲1距离计算个体总适合度
		index[st] = Individual[indSort[st]].Fit+index[st-1];
	int len = (int)((rand()/(double)RAND_MAX)*IndNumber*VRProb);
	if(len<1) len = 1;					//计算距离内个体个数
	int parent2;
	if(rand()/(double)RAND_MAX<=SProb)	//近亲结婚
	{
		parent2 = Wheel(index+1,len);	//滚轮选择,排除双亲1
		parent2 = indSort[parent2];
	}
	else								//远亲结婚
	{
		parent2 = Wheel(index+len,IndNumber-len);//滚轮选择
		parent2 = indSort[parent2];
	}
	delete []indSort;
	delete []indDis;
	delete []index;
	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;
}

//可视距离函数
int GenMSrch::VisualDis(int P1,int P2)
{
	int sLong = 0;
	for(int i=1; i<=Individual[P1].Chrom.GetLen(); i++)
		if(Individual[P1].Chrom.GetInt(i,i)!=Individual[P2].Chrom.GetInt(i,i))
			sLong++;
	return sLong;
}

⌨️ 快捷键说明

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