人工智能实验报告Word下载.docx

上传人:b****5 文档编号:20370367 上传时间:2023-01-22 格式:DOCX 页数:11 大小:46.02KB
下载 相关 举报
人工智能实验报告Word下载.docx_第1页
第1页 / 共11页
人工智能实验报告Word下载.docx_第2页
第2页 / 共11页
人工智能实验报告Word下载.docx_第3页
第3页 / 共11页
人工智能实验报告Word下载.docx_第4页
第4页 / 共11页
人工智能实验报告Word下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

人工智能实验报告Word下载.docx

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

人工智能实验报告Word下载.docx

而N当取值较大时,又会使得遗传算法效率降低。

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

(3)适应度检测

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

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

(4)选择

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

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

(5)交叉

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

交叉概率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的主要方法,所以交叉概率通常应取较大值;

但若过大的话,又可能破坏群体的优良模式。

一般取0.4到0.99。

(6)变异

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

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

变异概率也是影响新个体产生的一个因素,变异概率小,产生新个体少;

变异概率太大,又会使遗传算法变成随机搜索。

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

(7)结束条件

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

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

六.代码及结果:

七.

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

#include<

stdio.h>

string.h>

stdlib.h>

time.h>

#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<

GENE_NUM;

i++)

{

result+=(pop.geneBit[i]-'

0'

)*radix;

radix*=2;

}

returnresult;

}

UINTcalcFitValue(UINTx){

returnFEXP(x);

voidtest(Chromosome*pop){

inti;

intj;

POP_NUM;

printf("

%d:

"

i+1);

for(j=0;

j<

j++)

%c"

pop[i].geneBit[j]);

%4d"

toDec(pop[i]));

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)&

\n变异前\n"

test(pop);

\n变异的位置为:

染色体号=%d基因位号=%d\n"

randRow+1,randCol);

#endif

pop[randRow].geneBit[randCol]=(pop[randRow].geneBit[randCol]=='

)?

'

1'

:

'

;

//1变为0,0变为1

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

\n变异后\n"

}

//创建初始群体

voidcreatePop(Chromosome*pop){

UINTi,j;

UINTvalue;

srand((unsigned)time(NULL));

randValue=rand()%2;

pop[i].geneBit[j]=randValue+'

//将随机数0或1赋给基因

value=toDec(pop[i]);

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

(CFLAG==1)

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

\n"

//更新种群

voidupdatePop(Chromosome*newPop,Chromosome*oldPop){

i++){

oldPop[i]=newPop[i];

//选择优良个体:

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

voidselect(Chromosome*pop){

UINTsumFitValue;

//总适应值

UINTaFitValue;

//平均适应值

floatchoice[POP_NUM];

//选择

ChromosometempPop;

//交换变量

(CFLAG==2)//测试

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

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

for(i=POP_NUM;

i>

0;

i--)

(i-1);

if(pop[j+1].fitValue>

pop[j].fitValue)

tempPop=pop[j+1];

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

pop[j]=tempPop;

//计算总适应值

sumFitValue=0;

sumFitValue+=pop[i].fitValue;

aFitValue=(UINT)(((float)sumFitValue/POP_NUM)+0.5);

//计算平均适应值

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

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

choice[i]=(float)((int)(choice[i]*100+0.5)/100.0);

//保留到小数点后2位

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

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

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

(CFLAG==2)

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

//交叉:

基因交换

voidcross(Chromosome*pop){

chartmpStr[GENE_NUM]="

"

UINTrandPos;

=(int)(JIAOCHA_RATE*100)){

(CFLAG==3)

\n种群没有进行交叉.\n"

(CFLAG==3)

\n交叉前,种群如下:

\n交叉的位置依次为:

//染色体两两交叉

i+=2){

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);

%d"

randPos);

//对个体计算适应度

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

\n交叉后,种群如下:

//输出结果

voidresult(Chromosome*pop){

UINTx=0;

UINTmaxValue=0;

//函数的最大值

if(pop[i].fitValue>

maxValue){

maxValue=pop[i].fitValue;

x=toDec(pop[i]);

\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);

//更新

\n第%d次迭代:

count);

test(curPop);

result(curPop);

return0;

实验结果:

实验小结:

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

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

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

当前位置:首页 > 幼儿教育 > 育儿理论经验

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

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