人工智能实验报告实用.docx

上传人:b****6 文档编号:16485557 上传时间:2023-07-14 格式:DOCX 页数:13 大小:48.32KB
下载 相关 举报
人工智能实验报告实用.docx_第1页
第1页 / 共13页
人工智能实验报告实用.docx_第2页
第2页 / 共13页
人工智能实验报告实用.docx_第3页
第3页 / 共13页
人工智能实验报告实用.docx_第4页
第4页 / 共13页
人工智能实验报告实用.docx_第5页
第5页 / 共13页
人工智能实验报告实用.docx_第6页
第6页 / 共13页
人工智能实验报告实用.docx_第7页
第7页 / 共13页
人工智能实验报告实用.docx_第8页
第8页 / 共13页
人工智能实验报告实用.docx_第9页
第9页 / 共13页
人工智能实验报告实用.docx_第10页
第10页 / 共13页
人工智能实验报告实用.docx_第11页
第11页 / 共13页
人工智能实验报告实用.docx_第12页
第12页 / 共13页
人工智能实验报告实用.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

人工智能实验报告实用.docx

《人工智能实验报告实用.docx》由会员分享,可在线阅读,更多相关《人工智能实验报告实用.docx(13页珍藏版)》请在冰点文库上搜索。

人工智能实验报告实用.docx

人工智能实验报告实用

人工智能实验报告

人工智能第二次实验报告

一.实验题目:

   遗传算法的设计与实现

二.实验目的:

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

三.实验内容

用遗传算法求解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〈stdio。

h>  

#include〈string.h>

#include

h>

#include〈time。

h>  

#defineC  0  //测试

#defineCFLAG 4   //测试标记 

#defineJIAOCHA_RATE0.5 //交叉概率一般取0。

4到0。

99

#define BIANYI_RATE 0.09//变异概率为0.0001—0.1

#defineITER_NUM 1000 //迭代次数

#definePOP_NUM  20  //染色体个数

#defineGENE_NUM5 //基因位数

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

typedefunsignedintUINT; 

//染色体

typedefstruct{        

 chargeneBit[GENE_NUM]; //基因位

  UINTfitValue;   //适应值

}Chromosome;  

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

UINTtoDec(Chromosomepop){

UINTi;

UINT radix= 1;

UINT result =0;

  for(i=0; i〈GENE_NUM;i++) 

{  

  result +=(pop。

geneBit[i]-’0')*radix; 

 radix *=2;

  } 

   returnresult; 

} 

UINTcalcFitValue(UINTx) {

returnFEXP(x);  

}

void test(Chromosome*pop){ 

 inti;

  intj;  

  for(i=0;i<POP_NUM;i++)

 {

  printf(”%d:

", i+1);

    for(j=0;j〈GENE_NUM;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){

UINT i,j;

 UINTrandValue;

 UINT value; 

 srand((unsigned)time(NULL)); 

 for(i=0;i

{

 for(j=0;j〈GENE_NUM;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){

UINT i; 

  for(i=0;i

  oldPop[i]=newPop[i]; 

 }   

//选择优良个体:

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

void select(Chromosome *pop){

    UINT i,j; 

UINT sumFitValue;  //总适应值 

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<POP_NUM;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〈POP_NUM;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){  

  char  tmpStr[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<POP_NUM;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);  

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

 printf(” %d”,randPos);

#endif 

 } 

  //对个体计算适应度

for(i=0;i<POP_NUM; 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<POP_NUM;i++) 

{ 

  if(pop[i]。

fitValue> maxValue)  {

  maxValue=pop[i]。

fitValue;

   x =toDec(pop[i]); 

    } 

} 

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

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

intmain(int argc,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;  

}        

实验结果:

    

实验小结:

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

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

...谢阅...

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

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2