1、人工智能实验报告实用人工智能实验报告人工智能第二次实验报告一实验题目: 遗传算法的设计与实现二实验目的: 通过人工智能课程的学习,熟悉遗传算法的简单应用。三实验内容 用遗传算法求解f (x) =x2的最大值,x ,1,x取整数。可以看出该函数比较简单,只要是为了体现遗传算法的思想,在问题选择上,选了一个比较容易实现的,把主要精力放在遗传算法的实现,以及核心思想体会上。四. 实验过程:1.实现过程 (1)编码使用二进制编码,随机产生一个初始种群。L 表示编码长度,通常由对问题的求解精度决定,编码长度L 越长,可期望的最优解的精度也就越高,过大的会增大运算量。针对该问题进行了简化,因为题设中 0,
2、31,所以将二进制长度定为5就够用了;()生成初始群体种群规模表示每一代种群中所含个体数目。随机产生N个初始串结构数据,每个串结构数据成为一个个体,N个个体组成一个初始群体,表示种群规模的大小。当取值较小时,可提高遗传算法的运算速度,但却降低种群的多样性,容易引起遗传算法早熟,出现假收敛;而当取值较大时,又会使得遗传算法效率降低。一般建议的取值范围是20-100. .感谢聆听.(3)适应度检测根据实际标准计算个体的适应度,评判个体的优劣,即该个体所代表的可行解的优劣。本例中适应度即为所求的目标函数;()选择从当前群体中选择优良(适应度高的)个体,使它们有机会被选中进入下一次迭代过程,舍弃适应度
3、低的个体。本例中采用轮盘赌的选择方法,即个体被选择的几率与其适应度值大小成正比; (5)交叉遗传操作,根据设置的交叉概率对交配池中个体进行基因交叉操作,形成新一代的种群,新一代中间个体的信息来自父辈个体,体现了信息交换的原则.交叉概率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的主要方法,所以交叉概率通常应取较大值;但若过大的话,又可能破坏群体的优良模式.一般取0。4到。9。 .感谢聆听.()变异随机选择中间群体中的某个个体,以变异概率大小改变个体某位基因的值。变异为产生新个体提供了机会.变异概率也是影响新个体产生的一个因素,变异概率小,产生新个体少;变异概率太大,又会使遗传算法变
4、成随机搜索。一般取变异概率为0010。1。(7)结束条件当得到的解大于等于90时,结束。从而观看遗传的效率问题.五. 代码及结果:*遗传算法设计最大值/ #inclu std。h inclde string.h include nclud ime。 defne C 0 /测试 fin CLA 4 /测试标记 #defne JIAOHRTE 0.5 /交叉概率一般取0。4到0。99definBIYI_ATE 0.09 /变异概率为00010 #dfine ITE_NUM 0 /迭代次数 #efie PP_M 0 /染色体个数dfine GE_UM 5 /基因位数 #dee FXP(x) ((x)
5、()) /y=x2 tyedef unsigne n U; /染色体 edef suct car eneBitGEN_NU;/基因位 NT itValu; /适应值 Chromsome; /将二进制的基因位转化为十进制 UNT toDec(Chroosome po) UINT i; ITradix =1; NTresul 0; f(i=0;NE_UM; +) result+= (pp。enBiti-)rdix; ri = 2; reun esult; INT calcFiValue(UINT x) eturn FX(); voiet(Chrmoom *p) it i; in j; fr(i0;
6、 iPP_UM; i) nt(”%d: ,i); for(j=0; jGE_NUM; j+) pitf(,pop.eneitj); pritf( 4d, oDec(o); printf(” fxVaue=%dn”, clcFitalu(tDec(opi); /变异得到新个体:随机改变基因 vi mutin(Chrmosome pp) N randow,ranol; UIN ranVl; radValueand()%10; if(andValu= (int)(IANYI_RAT*00) #f (C=1) & (CFLAG=4) printf(种群个体没有基因变异n”); #eif return
7、; ndCol =rad()GENENUM; /随机产生将要变异的基因位 adRow =and()POP_NM; / 随机产生将要变异的染色体位 if(=1) (FLG=4) printf(n变异前n); est(pp); printf(n变异的位置为:染色体号=%d 基因位号=%”,rnow+,rndo); #enif poradowgeneBtandCo = (pprandwgeneitndCol=0) ?1:0;/1变为,变为1 opndRw.ftVau cacFitVau(oDe(opandRow) ); i(C1)& (CFAG=4) print(n变异后n); test(po);
8、nif /创建初始群体 oid ceteop(Chromoom pp) UIi,j; UNT randVlue; UNTvae; sand(unsigne)tm(NULL)); for(i=0; iPONUM; i+) fo(j=0; EE_NM; +) ranl = and()2; popi.gneBijandVl+0; / 将随机数或1赋给基因 vlue= toDec(pp); popifale =calFitValue(ale); i (C=) & (CFLA=1) pinf(”n随机分配的种群如下:); tet(pop); edi /更新种群 vid upatePop(homo new
9、Pop, Cromomeodp) Ni; for(i=0; POP_UM; +) oldopinewPopi; /选择优良个体:根据适应度选择最优解,即最优个体 vodseect(Chrmooepop) UNT ,j; UINT smFitValu; /总适应值 UNT aitVlu; /平均适应值 fa hoiceOP_NU; /选择 hrmosome ePp; /交换变量 #if(C=) (CFLAG)/测试 rntf(没有选择前的种群如下:); est(pop); edf /根据个体适应度冒泡降序排序 f(i=P_U; i0; i-) or(j=0; ppj.ftu) tmpPop p+
10、1; po1 = o; popj = tepP; /计算总适应值 sitVale 0; fr(i=0; iPP_U; ) umtlue + opi.tVlue; FiValu (UINT)((float)sFitVle/OP_NU)+0.5); /计算平均适应值 /计算出每个群体选择机会,群体的概率=群体适应值/总适应值,平均概率= 平均适应值总适应值,群体选择机会 = (群体的概率/平均概率) for(i=0;iPOPNM;+) che =(at)popi.fitValue/sumFitValue)((fa)aFtVale/sumFiValue); choc=(oat)(in)(chocei
11、*100+0.5)/0。0);/保留到小数点后2位 /根据选择概率来繁殖优良个体,并淘汰较差个体 fr(i=; iPOP_M; i+) f(((int)(chiei+0.55) = ) /如果hoici=淘汰繁殖一次最优的群体 popOPNUM1= pp; f(C=1)& (FLA=2) prit(经过选择以后的种群:n); test(pop); endif /交叉:基因交换 vod ros(Choosome p) chartmpStrGNE_=”; U i; N andPo; UINT randVaue; radVauernd()%0; f(nVlue =(int)(JIAOCA_AE100
12、)) f (C=1) (CFLA3) rit(种群没有进行交叉.n); endif rturn ; #f(=1) & (CFLG=) ntf(n交叉前,种群如下:n”); st(pop); print(”n交叉的位置依次为:”); ndif /染色体两两交叉 fr(0; iOP_NM; i+=2) randPos (rand()(EN_NUM1)+1); / 产生随机交叉点,范围是1到GEE_UM1 strny(tmStr,poi。geneBi+ranPos, GENE_NMranPos); trcpy(pp。gnBitrandPo, poi。geneBit+raPos, GEE_NUMand
13、Pos); strncpy(ppi+1.geBitrnos, tmStr, GEE_NUMranPo); if (=1)& (CFLG=) itf(”%”, randPos); endf / 对个体计算适应度 for(i0; OP_UM;i+) p.italue calcFVal(tDec(popi) ); i (C=1) &(CFLAG=3) rn(n交叉后,种群如下:); est(pp); ndf /输出结果vid resul(Crmosmepp) UI i; UINT x = 0; UIT axValu 0; / 函数的最大值 fr(;iO_M; i+) if(oi。ftValu max
14、Vu) maxVaue op。ftalue; = toec(oi); ritf(当x=%时,函数得到最大值为:dn, x, maxVlue); int m(targc, char argv)t count; /迭代次数 Choosome cropPP_NUM; /初始种群或者当前总群 hromosoe nextPopPOP_NUM; /变异后种群 rtePop(rPo); for(count1; out(ER_NUM1); ount+) pdatePp(uop, extPop); / 更新种群 slec(extPop); /选择 crs(nextPop); /交叉 man(ePop); /变异 udatePop(nxtPop, urPop); /更新 print(”n第%d次迭代:n”, ount); test(urPo); esult(crPop); eurn 0; 实验结果: 实验小结:经过本次实验对遗传算法有了深刻的了解,充分体会到遗传算法对优缺点,了解了演化算法的基本思想,虽然过程中出现了很多小问题,比如大小写什么的还有就是逻辑错误,但是最终在理解的基础上成功实现了功能,认真分析后,提高了解决问题的能力.谢阅.