利用遗传算法求函数f.docx
- 文档编号:29317937
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:7
- 大小:16.83KB
利用遗传算法求函数f.docx
《利用遗传算法求函数f.docx》由会员分享,可在线阅读,更多相关《利用遗传算法求函数f.docx(7页珍藏版)》请在冰豆网上搜索。
利用遗传算法求函数f
长春师范大学
实验报告
课程数学建模
系别15级数学与应用数学
班级数本四班
学号1507140432
姓名蒋佳诺
利用遗传算法求函数f(x)=10+x.*cos(5*pi*x),xq-1,1]的最大值点代码如下:
clearall;
clc;
%%%%%清除所有之前的程序%%%%%
x=linspace(-1,1);
y=10+x.*cos(5*pi*x);
figure
(1);
plot(x,y,'r')
title(‘函数曲线图“
xlabel(‘x')
ylabel(‘y')
%%%%%绘制图中函数图形%%%%%
%%主程序%%
globalBitLength
%全局变量,计算如果满足求解精度至少需要编码的长度globalboundsbegin
%全局变量,自变量的起始点%globalboundsend
%全局变量,自变量的终止点%bounds=[-1,1];%一维自变量的取值范围%
precision=0.0001;
%运算精度%
boundsbegin=bounds(:
1);boundsend=bounds(:
2);
%计算如果满足求解精度至少需要多长的染色体%
BitLength=ceil(log2((boundsend-boundsbegin)'./precision));popsize=50;
%初始种群大小Generationnmax=20;
%最大代数
pcrossover=0.90;
%交配概率
pmutation=0.09;
%变异概率
population=round(rand(popsize,BitLength));
%初始种群,行代表一个个体,列代表不同个体的%计算适应度
[Fitvalue,cumsump]=fitnessfun(population);
%输入群体population,返回适应度Fitvalue和累积概率cumsump
Generation=1;
WhileGeneration 2: popsize %1对1对群体进行如下操作(交叉,变异)%选择 seln=selection(population,cumsump); %交叉scro=crossover(population,seln,pcrossover);scnew(j,: )=scro(1,: ); scnew(j+1,: )=scro(2,: ); %变异smnew(j,: )=mutation(smnew(j,: ),pmutation);smnew(j+1,: )=mutation(smnew(j+1,: ),pmutation);end %产生了新的种群population=smnew; %计算新种群的适应度[Fitvalue,cumsump]=fitnessfun(population); %记录当前代最好的适应度和平均适应度[fmax,nmax]=max(Fitvalue); ,其对应的个体 %最好的适应度为fmax(即函数值最大)为nmax fmean=mean(Fitvalue); %平均适应度为fmean ymax(Generation)=fmax; %每代中最好的适应度 ymean(Generation)=fmax; %每代中平均的适应度%记录当前代的最佳染色体个体x=transform2to10(population(nmax,: )); %population(nmax,: )为最佳染色体个体xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength)-1); xmax(Generation)=xx; Generation=Generation+1 end Generation=Generation-1; %Generation加1,减1的操作是为了能记录各代中的最佳函数值xmax(Generation) targetfunvalue=targetfun(xmax)[Besttargetfunvalue,nmax]=max(targetfunvalue)Bestpopulation=xmax(nmax) %绘制经过遗传运算后的适应度曲线figure (2); hand1=plot(1: Generation,ymax); set(hand1,'linestyle','-‘,'linewidth',1,'marker','h',markersize',8) holdon;hand2=plot(1: Generation,ymean); set(hand2,'color','k‘,'linestyle','-‘,'linewidth',1,'marker','h',markersize',8) xlabel(‘进化代数)' ylabel(‘最大和平均适应度'); xlim([1Generationnmax]); legend(‘最大适应度','平均适应)度;' boxoff; holdoff; %%%%%%计算适应度函数%%%%%%[Fitvalue,cumsump]=fitnessfun(population); globalBitLength globalboundsbegin globalboundsendpopsize=size(population,1); %计算个体个数 fori=1: popsizex=transform2to10(population(i,: )); %将二进制转换为十进制 %转化为[-2,2]区间的实数xx=boundsbegin+x*(boundsend-boundsbegin)/(power(2,BitLength) -1); Fitvalue(i)=targetfun(xx); %计算函数值,即适应度 end %给适应度函数加上一个大小合理的数以便保证种群适应值为正数Fitvalue=Fitvalue‘%该处还有一个作用就是决定适应度是有利于选取几个有利个体(加强竞争)还是减弱竞争。 %计算选择概率 fsum=sum(Fitvalue) Pperpopulation=Fitvalue/fsum %适应度归一化,及被复制的概率 %计算累积概率 cumsump (1)=Pperpopulation (1) fori=2: popsize cumsump(i)=cumsump(i-1)+Pperpopulation(i) %求累计概率 end cumsump=cumsump' %累计概率 %%%%%%%%%计算目标函数%%%%%%%%% functiony=targetfun(x)%目标函数 y=10+x.*cos(5*pi*x); end %%%%%%%%新种群交叉操作%%%%%%%% %输入population为种群,slen为选择的两个个体,pc为交配的概率 functionscro=crossover(population,slen,pc); BitLength=size(population,2);%二进制的个数pcc=IfCroIfMut(pc);%根据交叉概率决定是否进行交叉操作,1则是,0则否 ifpcc==1%进行交叉操作 chb=round(rand*(BitLength-2))+1;%随机产生一个交叉位scro(1,: )=[population(slen (1),1: chb)population(slen (2),chb+1: BitLength)]; %序号为slen (2)的个体在交叉位chb前面的信息与序号为slen (1)的个体在交叉位chb+1后面的信息重新重合 else%不进行交叉操作 scro(1,: )=population(slen (1),: ); scro(2,: )=population(slen (2),: ); end end%%%%%判断遗传运算是否需要进行交叉或变异%%%%%% %mutORcro为交叉,变异发生的概率 %根据mutORcro决定是否进行相应的操作,产生1的概率是mutORcro,产生0的概率为1-mutORcrofunctionpcc=IfCroIfMut(mutORcro); test(1: 100)=0;%1*100的行向量1=round(100*mutORcro); %产生一个数为100*mutORcro,round为取靠近的整数test(1: 1)=1n=round(rand*99)+1; pcc=test(n); end %%%%%%%新种群变异操作%%%%%%%%%% %snew为一个个体functionsnew=mutation(snew,pmutation); BitLength=size(snew,2); snnew=snew; pmm=IfCroIfMut(pmutation);%根据变异概率决定是否进行变异操作,1则是,0则否 ifpmm==1 chb=round(rand*(BitLength-1))+1;%在[1,BitLength]范围内随机 产生一个变异位 snnew(chb)=abs(snew(chb)-1; %0变成1,1变成0 endend%%%%%%%%新种群选择操作%%%%%%%%选择两个个体,返回个体的序号,有可能两个序号相同functionseln=slection(population,cumsump); %从种群中选择两个个体 fori=1: 2 r=rand;%产生一个随机数 prand=cumsump-r;%求出cumsump中第一个比r大的元素 j=1; whileprand(j)<0 j=j+1; end seln(i)=j;%选中个体的序号 end end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 遗传 算法 函数