人工智能实验报告之欧阳美创编.docx

上传人:b****7 文档编号:9502064 上传时间:2023-02-05 格式:DOCX 页数:11 大小:18.47KB
下载 相关 举报
人工智能实验报告之欧阳美创编.docx_第1页
第1页 / 共11页
人工智能实验报告之欧阳美创编.docx_第2页
第2页 / 共11页
人工智能实验报告之欧阳美创编.docx_第3页
第3页 / 共11页
人工智能实验报告之欧阳美创编.docx_第4页
第4页 / 共11页
人工智能实验报告之欧阳美创编.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

人工智能实验报告之欧阳美创编.docx

《人工智能实验报告之欧阳美创编.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告之欧阳美创编.docx(11页珍藏版)》请在冰豆网上搜索。

人工智能实验报告之欧阳美创编.docx

人工智能实验报告之欧阳美创编

人工智能第二次实验报告

一.

时间:

2021.01.01

创作:

欧阳美

二.实验题目:

遗传算法的设计与实现

三.实验目的:

通过人工智能课程的学习,熟悉遗传算法的简单应用。

四.实验内容

用遗传算法求解f(x)=x2的最大值,x∈[0,31],x取整数。

可以看出该函数比较简单,只要是为了体现遗传算法的思想,在问题选择上,选了一个比较容易实现的,把主要精力放在遗传算法的实现,以及核心思想体会上。

四.实验过程:

1.实现过程

(1)编码

使用二进制编码,随机产生一个初始种群。

L表示编码长度,通常由对问题的求解精度决定,编码长度L越长,可期望的最优解的精度也就越高,过大的L会增大运算量。

针对该问题进行了简化,因为题设中x∈[0,31],所以将二进制长度定为5就够用了;

(2)生成初始群体

种群规模表示每一代种群中所含个体数目。

随机产生N个初始串结构数据,每个串结构数据成为一个个体,N个个体组成一个初始群体,N表示种群规模的大小。

当N取值较小时,可提高遗传算法的运算速度,但却降低种群的多样性,容易引起遗传算法早熟,出现假收敛;而N当取值较大时,又会使得遗传算法效率降低。

一般建议的取值范围是20—100。

(3)适应度检测

根据实际标准计算个体的适应度,评判个体的优劣,即该个体所代表的可行解的优劣。

本例中适应度即为所求的目标函数;

(4)选择

从当前群体中选择优良(适应度高的)个体,使它们有机会被选中进入下一次迭代过程,舍弃适应度低的个体。

本例中采用轮盘赌的选择方法,即个体被选择的几率与其适应度值大小成正比;

(5)交叉

遗传操作,根据设置的交叉概率对交配池中个体进行基因交叉操作,形成新一代的种群,新一代中间个体的信息来自父辈个体,体现了信息交换的原则。

交叉概率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的主要方法,所以交叉概率通常应取较大值;但若过大的话,又可能破坏群体的优良模式。

一般取0.4到0.99。

(6)变异

随机选择中间群体中的某个个体,以变异概率大小改变个体某位基因的值。

变异为产生新个体提供了机会。

变异概率也是影响新个体产生的一个因素,变异概率小,产生新个体少;变异概率太大,又会使遗传算法变成随机搜索。

一般取变异概率为0.0001—0.1。

(7)结束条件

当得到的解大于等于900时,结束。

从而观看遗传的效率问题。

五.代码及结果:

/*遗传算法设计最大值*/

#include

#include

#include

#include

#defineC0//测试

#defineCFLAG4//测试标记

#defineJIAOCHA_RATE0.5//交叉概率一般取0.4到0.99

#defineBIANYI_RATE0.09//变异概率为0.0001-0.1

#defineITER_NUM1000//迭代次数

#definePOP_NUM20//染色体个数

#defineGENE_NUM5//基因位数

#defineFEXP(x)((x)*(x))//y=x^2

typedefunsignedintUINT;

//染色体

typedefstruct{

chargeneBit[GENE_NUM];//基因位

UINTfitValue;//适应值

}Chromosome;

//将二进制的基因位转化为十进制

UINTtoDec(Chromosomepop){

UINTi;

UINTradix=1;

UINTresult=0;

for(i=0;i

{

result+=(pop.geneBit[i]-'0')*radix;

radix*=2;

}

returnresult;

}

UINTcalcFitValue(UINTx){

returnFEXP(x);

}

voidtest(Chromosome*pop){

inti;

intj;

for(i=0;i

{

printf("%d:

",i+1);

for(j=0;j

printf("%c",pop[i].geneBit[j]);

printf("%4d",toDec(pop[i]));

printf("fixValue=%d\n",calcFitValue(toDec(pop[i])));

}

}

//变异得到新个体:

随机改变基因

voidmutation(Chromosome*pop){

UINTrandRow,randCol;

UINTrandValue;

randValue=rand()%100;

if(randValue>=(int)(BIANYI_RATE*100))

{

#if(C==1)&&(CFLAG==4)

printf("\n种群个体没有基因变异\n");

#endif

return;

}

randCol=rand()%GENE_NUM;//随机产生将要变异的基因位

randRow=rand()%POP_NUM;//随机产生将要变异的染色体位

#if(C==1)&&(CFLAG==4)

printf("\n变异前\n");

test(pop);

printf("\n变异的位置为:

染色体号=%d基因位号=%d\n",randRow+1,randCol);

#endif

pop[randRow].geneBit[randCol]=(pop[randRow].geneBit[randCol]=='0')?

'1':

'0';//1变为0,0变为1

pop[randRow].fitValue=calcFitValue(toDec(pop[randRow]));

#if(C==1)&&(CFLAG==4)

printf("\n变异后\n");

test(pop);

#endif

}

//创建初始群体

voidcreatePop(Chromosome*pop){

UINTi,j;

UINTrandValue;

UINTvalue;

srand((unsigned)time(NULL));

for(i=0;i

{

for(j=0;j

{

randValue=rand()%2;

pop[i].geneBit[j]=randValue+'0';//将随机数0或1赋给基因

}

value=toDec(pop[i]);

pop[i].fitValue=calcFitValue(value);

}

#if(C==1)&&(CFLAG==1)

printf("\n随机分配的种群如下:

\n");

test(pop);

#endif

}

//更新种群

voidupdatePop(Chromosome*newPop,Chromosome*oldPop){

UINTi;

for(i=0;i

oldPop[i]=newPop[i];

}

}

//选择优良个体:

根据适应度选择最优解,即最优个体

voidselect(Chromosome*pop){

UINTi,j;

UINTsumFitValue;//总适应值

UINTaFitValue;//平均适应值

floatchoice[POP_NUM];//选择

ChromosometempPop;//交换变量

#if(C==1)&&(CFLAG==2)//测试

printf("\n没有选择前的种群如下:

\n");

test(pop);

#endif

//根据个体适应度冒泡降序排序

for(i=POP_NUM;i>0;i--)

{

for(j=0;j<(i-1);j++)

{

if(pop[j+1].fitValue>pop[j].fitValue)

{

tempPop=pop[j+1];

pop[j+1]=pop[j];

pop[j]=tempPop;

}

}

}

//计算总适应值

sumFitValue=0;

for(i=0;i

{

sumFitValue+=pop[i].fitValue;

}

aFitValue=(UINT)(((float)sumFitValue/POP_NUM)+0.5);//计算平均适应值

//计算出每个群体选择机会,群体的概率=群体适应值/总适应值,平均概率=平均适应值/总适应值,群体选择机会=(群体的概率/平均概率)

for(i=0;i

{

choice[i]=((float)pop[i].fitValue/sumFitValue)/((float)aFitValue/sumFitValue);

choice[i]=(float)((int)(choice[i]*100+0.5)/100.0);//保留到小数点后2位

}

//根据选择概率来繁殖优良个体,并淘汰较差个体

for(i=0;i

{

if(((int)(choice[i]+0.55))==0)//如果choice[i]==0淘汰繁殖一次最优的群体

pop[POP_NUM-1]=pop[0];

}

#if(C==1)&&(CFLAG==2)

printf("\n经过选择以后的种群:

\n");

test(pop);

#endif

}

//交叉:

基因交换

voidcross(Chromosome*pop){

chartmpStr[GENE_NUM]="";

UINTi;

UINTrandPos;

UINTrandValue;

randValue=rand()%100;

if(randValue>=(int)(JIAOCHA_RATE*100)){

#if(C==1)&&(CFLAG==3)

printf("\n种群没有进行交叉.\n");

#endif

return;}

#if(C==1)&&(CFLAG==3)

printf("\n交叉前,种群如下:

\n");

test(pop);

printf("\n交叉的位置依次为:

");

#endif

//染色体两两交叉

for(i=0;i

randPos=(rand()%(GENE_NUM-1)+1);//产生随机交叉点,范围是1到GENE_NUM-1

strncpy(tmpStr,pop[i].geneBit+randPos,GENE_NUM-randPos);

strncpy(pop[i].geneBit+randPos,pop[i+1].geneBit+randPos,GENE_NUM-randPos);

strncpy(pop[i+1].geneBit+randPos,tmpStr,GENE_NUM-randPos);

#if(C==1)&&(CFLAG==3)

printf("%d",randPos);

#endif

}

//对个体计算适应度

for(i=0;i

pop[i].fitValue=calcFitValue(toDec(pop[i]));

}

#if(C==1)&&(CFLAG==3)

printf("\n交叉后,种群如下:

\n");

test(pop);

#endif

}

//输出结果

voidresult(Chromosome*pop){

UINTi;

UINTx=0;

UINTmaxValue=0;//函数的最大值

for(i=0;i

{

if(pop[i].fitValue>maxValue){

maxValue=pop[i].fitValue;

x=toDec(pop[i]);

}

}

printf("\n当x=%d时,函数得到最大值为:

%d\n\n",x,maxValue);

}

intmain(intargc,char*argv[]){

intcount;//迭代次数

ChromosomecurPop[POP_NUM];//初始种群或者当前总群

ChromosomenextPop[POP_NUM];//变异后种群

createPop(curPop);

for(count=1;count<(ITER_NUM+1);count++){

updatePop(curPop,nextPop);//更新种群

select(nextPop);//选择

cross(nextPop);//交叉

mutation(nextPop);//变异

updatePop(nextPop,curPop);//更新

printf("\n第%d次迭代:

\n",count);

test(curPop);

}

result(curPop);

return0;

}

实验结果:

实验小结:

经过本次实验对遗传算法有了深刻的了解,充分体会到遗传算法对优缺点

,了解了演化算法的基本思想,虽然过程中出现了很多小问题,比如大小写什么的还有就是逻辑错误,但是最终在理解的基础上成功实现了功能,认真分析后,提高了解决问题的能力。

时间:

2021.01.01

创作:

欧阳美

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1