- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
遗传算法的工作过程实质上就是模拟生物的进化过程其主要特点是
基于遗传算法解决01背包问题
邵阳学院,刘俊,刘希信息工程系:遗传算法【】属于进化算法( Evolutionary Algorithms) 的一种,它通过模仿自然界的选择与遗传的机理来寻找最优解. 遗传算法具有与问题领域无关切快速随机的搜索能力。搜索从群体出发,具有潜在的并行性,可以进行多个个体的同时比较搜索使用评价函数启发,过程简单使用概率机制进行迭代,具有随机性具有可扩展性,容易与其他算法结合。本文基本01背包问题。评价函数问题描述
1.问题描述
01背包问题是一类基础的背包问题,可以具体描叙为一个体积为volume的背包和n个物体,对于物体i,其体积为vi,价值为wi,01背包问题就是要在不超过背包体积的情况下,使装入背包的物体的价值量最大。问题的解的遗传表示【】
因为对于一件物品只有放进与不放进两种选择,所以只用两种状态就可以表示,于是采用二进制编码。当xi=0时,表示物体i不放入背包,当xi=1时表示物体i放入背包,则0-1背包问题的数学模型为,n个物体的背包问题的解可以表示为二进制串。
评价函数根据个体适应值对其进行优劣判定采用经典的赌轮选择算法【】,函数的功能是从群体中选择一个基因组,选中的几率正比于基因组的适应性分数。
SGenome backpack::RouletteWheelSelection(){
srand(time(0));
double fSlice = RandFloat() * m_dTotalFitnessScore;
double cfTotal = 0.0;
int SelectedGenome = 0;
for (int i=0; im_iPopSize; ++i){
cfTotal += m_vecGenomes[i].dFitness;
if (cfTotal fSlice) {
SelectedGenome = i;
break;
} }
return m_vecGenomes[SelectedGenome];
}
2.遗传算子用来改变繁殖过程中产生的子个体遗传组成
杂交算子【】,要求两个染色体在同一随机位置上断裂,然后将它们在断开点以后的部分进行互换,以形成两个新的染色体(子代)。
void backpack::Crossover( const vectorint mum,const vectorint dad,
vectorint baby1,vectorint baby2) {
if ( (RandFloat() m_dCrossoverRate) || (mum == dad)) {
baby1 = mum;
baby2 = dad;
return;
}
int cp = RandInt(0, m_iChromoLength - 1);
for (int i=0; icp; ++i){
baby1.push_back(mum[i]);
baby2.push_back(dad[i]);
}
for (int i=cp; imum.size(); ++i){
baby1.push_back(dad[i]);
baby2.push_back(mum[i]);
}
}
变异算子【9】,沿着染色体长度,位进行考察,并按m_dMutationRate给定的几率,将其中某些位进行翻转。
void backpack::Mutate(vectorint vecBits){
for (int curBit=0; curBitvecBits.size(); curBit++){
if (RandFloat() m_dMutationRate){
vecBits[curBit] = !vecBits[curBit];
} }}
可以设置适应性函数,为更好的解设置更高的分数,但这样容易造成数值分布的广度不够,使种群中最好和最差染色体的分数差别不大。我们可以记下每一代中的最差的价值,然后对种群中每一个解得出的价值减去这个最差的价值,这样相对差异变大,接下来使用轮盘选择法就会更有效可有效地从种群中移去最差的染色体,因为最差的适应性分数为0 【】。不同的变异算子【1】散播变异随机地选择一对位置,将其间的基因进行任意的移动。代码如下:
void backpack::MutateSM(vectorint chromo){
if (RandFloat() m_dMutationRate) return;
const int MinSpanSize = 3;
int beg, end;
ChooseSection(beg, end, chromo.size()-1,
文档评论(0)