实验五:遗传算法求解函数最值问题实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for (inti=1;i<N;i++)
if(fitnessValfi]>fitnessValfid])
id=£;
decode(grcup[id]jy);
val-f(x,y);returnid;
1}
4.运行结果
借助matlab软件,我们可以知道该函数在该定义域下的图像为
实验五:遗传算法求解函数最值问题实验
一、实验目的
使用遗传算法求解函数
f
在m及yDll的最大值。
使用遗传算法进行求解,篇末所附源代码中带有算法的详细注 释。算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,
F面运行时将给出不同参数的结果对比。
//参数
const intN-2&0;"种群的个休数
{
if(random01() <probCross)
{
if(preh-1)pre= i;
else
{
crossover(group[pre],group[i]);pre ■ -1;
}
}
这里根据交叉参数cross num进行多点交叉,首先随机生成交叉
点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于
经过一定的进化之后得到最终种群,从中选择最优的个体即可得
到最终的结果。
//获取种群最优你
-intgetOptimal(Ch^crescr:-oup[mxn]doubled—double&』doubled\)
//计算适应值.遍历得到最优值并进行解码
doublefitnessVal[mxn];
for (inti=0ji<Nj i++) f itnessValfi] ■fitness(group:[i])Jintid =超;
定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。
//融饶
for(intg=0j g<maxGeneration; g++)
(
设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的 操作。
const intlen= 30;"每个个体的染色体的长度,xffiyS占一半
const intcrossnum= 4;"交叉操作B孩点交叉曲支叉点个数
const intmaxGeneration=19000;//最大进化代^
const doubleprobCross=9.85;//概率
const doubleprobMutation-15;//豈异IK率
//适应度巒数』为避免负值.把目标函数加Y正数
EJdoublefitness(constCh^crrcscrcRc)
{
doublek,y;
decode(cx# y);
retiurnf(x, y)+5;
2•交叉操作
首先是根据交叉概率probCross选择要交叉的个体进行交叉
//根据交叉槪率进行交叉
for(inti=pre = -1;i<N; i++)
但实验时发现结果不好,经过仔细研究之后发现源自文库这里在
取某些值的时候,目标函数计算出来的 适应值可能会出现负值,这时 如果按照把每个个体的适应值除以适应值的总和的进行归一化的话 会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归 一化的时候除以了一个负值,选择时就会选择一些不良的个体, 对实 验结果造成影响。对于这个问题,我把适应度函数定为目标函数的函 数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一 化和选择的操作。实验结果表明,之前的实验结果很不稳定,修正后 的结果比较稳定,趋于最大值。
//初始化种群
for (inti=0;i<N;i++)
grcup[i]=Chrcmc50me();
然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交
叉及变异三个操作。
1•选择操作
首先计算当前每个个体的适应度函数值,这里的适应度函数即为 所要求的优化函数,然后归一化求得每个个体选中的概率, 然后用轮 盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群
//根据变异概率迸行变异
for (inti=0;i<N; i++)
if(randQm61() < probMutation)
mutate(group[i]);
变异时先随机生成变异的位置,然后把改位的01值翻转。
//变异操作
Hvoidmutate(ChrcfnosomeS c)
{
//随机选行翻转
inti-rand()%len; c-g[i] =
没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。
//交叉操作’使用參点交叉
Itvoidcrossover(ChromosoiriE&clrCh^crrcscn'c4c2)
{
//生成交叉点位置,期F序
irrtcrosspoint[mxn ];
forfinti-0; i<crassriumj i++) crosspoint[i]=rand()%Ion; sort(crosspoint, crosspoint+crossnum);
体。
//选择操作
Elvoidselect(匚hromosoraegroup[mxn])
"计算每个个体的询?概率doublefitnessVal[mxn];
for (inti = i< N; i++)0;
//使用轮蛊賭算法困环体doublerandNum=rando<iT01();intj;
for(j-B;j < N- 1; j++)
if(randNum < prab[j])
selectld[i] * j;break;
(j—N-1) selectld[i] = j;
//把种群更新为新选挥的个体集合
for(inti=0;i< N;temGroup[i]=g^oup[i]
for (inti «ft; i < N;group[i]=temOrcupfselectId[i]];
//骑越
boolflag-令;
for(inti = j=0; i<1.亡n;i++)
swap(d.g[l]Jc2.g[i]);
if(i== crosspcint[j])
//妇杲若干个交叉点重合”则效果叠加 "偃数个交叉点效果瑁当于没有交叉点while(j<
flag = [flag;
3.变异操作
首先是根据变异概率probMutation选择要变异的个体
if(fitnessValfi]>fitnessValfid])
id=£;
decode(grcup[id]jy);
val-f(x,y);returnid;
1}
4.运行结果
借助matlab软件,我们可以知道该函数在该定义域下的图像为
实验五:遗传算法求解函数最值问题实验
一、实验目的
使用遗传算法求解函数
f
在m及yDll的最大值。
使用遗传算法进行求解,篇末所附源代码中带有算法的详细注 释。算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,
F面运行时将给出不同参数的结果对比。
//参数
const intN-2&0;"种群的个休数
{
if(random01() <probCross)
{
if(preh-1)pre= i;
else
{
crossover(group[pre],group[i]);pre ■ -1;
}
}
这里根据交叉参数cross num进行多点交叉,首先随机生成交叉
点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于
经过一定的进化之后得到最终种群,从中选择最优的个体即可得
到最终的结果。
//获取种群最优你
-intgetOptimal(Ch^crescr:-oup[mxn]doubled—double&』doubled\)
//计算适应值.遍历得到最优值并进行解码
doublefitnessVal[mxn];
for (inti=0ji<Nj i++) f itnessValfi] ■fitness(group:[i])Jintid =超;
定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。
//融饶
for(intg=0j g<maxGeneration; g++)
(
设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的 操作。
const intlen= 30;"每个个体的染色体的长度,xffiyS占一半
const intcrossnum= 4;"交叉操作B孩点交叉曲支叉点个数
const intmaxGeneration=19000;//最大进化代^
const doubleprobCross=9.85;//概率
const doubleprobMutation-15;//豈异IK率
//适应度巒数』为避免负值.把目标函数加Y正数
EJdoublefitness(constCh^crrcscrcRc)
{
doublek,y;
decode(cx# y);
retiurnf(x, y)+5;
2•交叉操作
首先是根据交叉概率probCross选择要交叉的个体进行交叉
//根据交叉槪率进行交叉
for(inti=pre = -1;i<N; i++)
但实验时发现结果不好,经过仔细研究之后发现源自文库这里在
取某些值的时候,目标函数计算出来的 适应值可能会出现负值,这时 如果按照把每个个体的适应值除以适应值的总和的进行归一化的话 会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归 一化的时候除以了一个负值,选择时就会选择一些不良的个体, 对实 验结果造成影响。对于这个问题,我把适应度函数定为目标函数的函 数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一 化和选择的操作。实验结果表明,之前的实验结果很不稳定,修正后 的结果比较稳定,趋于最大值。
//初始化种群
for (inti=0;i<N;i++)
grcup[i]=Chrcmc50me();
然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交
叉及变异三个操作。
1•选择操作
首先计算当前每个个体的适应度函数值,这里的适应度函数即为 所要求的优化函数,然后归一化求得每个个体选中的概率, 然后用轮 盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群
//根据变异概率迸行变异
for (inti=0;i<N; i++)
if(randQm61() < probMutation)
mutate(group[i]);
变异时先随机生成变异的位置,然后把改位的01值翻转。
//变异操作
Hvoidmutate(ChrcfnosomeS c)
{
//随机选行翻转
inti-rand()%len; c-g[i] =
没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。
//交叉操作’使用參点交叉
Itvoidcrossover(ChromosoiriE&clrCh^crrcscn'c4c2)
{
//生成交叉点位置,期F序
irrtcrosspoint[mxn ];
forfinti-0; i<crassriumj i++) crosspoint[i]=rand()%Ion; sort(crosspoint, crosspoint+crossnum);
体。
//选择操作
Elvoidselect(匚hromosoraegroup[mxn])
"计算每个个体的询?概率doublefitnessVal[mxn];
for (inti = i< N; i++)0;
//使用轮蛊賭算法困环体doublerandNum=rando<iT01();intj;
for(j-B;j < N- 1; j++)
if(randNum < prab[j])
selectld[i] * j;break;
(j—N-1) selectld[i] = j;
//把种群更新为新选挥的个体集合
for(inti=0;i< N;temGroup[i]=g^oup[i]
for (inti «ft; i < N;group[i]=temOrcupfselectId[i]];
//骑越
boolflag-令;
for(inti = j=0; i<1.亡n;i++)
swap(d.g[l]Jc2.g[i]);
if(i== crosspcint[j])
//妇杲若干个交叉点重合”则效果叠加 "偃数个交叉点效果瑁当于没有交叉点while(j<
flag = [flag;
3.变异操作
首先是根据变异概率probMutation选择要变异的个体