收藏 分享(赏)

matlab遗传算法实例.doc

上传人:scg750829 文档编号:7626261 上传时间:2019-05-22 格式:DOC 页数:16 大小:46KB
下载 相关 举报
matlab遗传算法实例.doc_第1页
第1页 / 共16页
matlab遗传算法实例.doc_第2页
第2页 / 共16页
matlab遗传算法实例.doc_第3页
第3页 / 共16页
matlab遗传算法实例.doc_第4页
第4页 / 共16页
matlab遗传算法实例.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、% 下面举例说明遗传算法 % % 求下列函数的最大值 % % f(x)=10*sin(5x)+7*cos(4x) x0,10 % % 将 x 的值用一个 10 位的二值形式表示为二值问题,一个 10 位的二值数提供的分辨率是每为 (10-0)/(210-1)0.01 。 % % 将变量域 0,10 离散化为二值域 0,1023, x=0+10*b/1023, 其中 b 是 0,1023 中的一个二值数。 % % % %-% %-% % 编程 %- % 2.1 初始化(编码) % initpop.m 函数的功能是实现群体的初始化,popsize 表示群体的大小,chromlength 表示染色体

2、的长度(二值数的长度 ), % 长度大小取决于变量的二进制编码的长度(在本例中取 10 位)。 %遗传算法子程序 %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength); % rand 随机产生每个单元为 0,1 行数为popsize,列数为 chromlength 的矩阵, % roud 对矩阵的每个单元进行圆整。这样产生的初始种群。 % 2.2 计算目标函数值 % 2.2.1 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: deco

3、debinary.m %产生 2n 2(n-1) . 1 的行向量,然后求和,将二进制转化为十进制 function pop2=decodebinary(pop) px,py=size(pop); %求 pop 行和列数 for i=1:py pop1(:,i)=2.(py-i).*pop(:,i); end pop2=sum(pop1,2); %求 pop1 的每行之和 % 2.2.2 将二进制编码转化为十进制数(2) % decodechrom.m 函数的功能是将染色体(或二进制编码)转换为十进制,参数 spoint 表示待解码的二进制串的起始位置 % (对于多个变量而言,如有两个变量,采

4、用 20 为表示,每个变量 10 为,则第一个变量从 1 开始,另一个变量从 11 开始。本例为 1), % 参数 1ength 表示所截取的长度(本例为 10)。 %遗传算法子程序 %Name: decodechrom.m %将二进制编码转换成十进制 function pop2=decodechrom(pop,spoint,length) pop1=pop(:,spoint:spoint+length-1); pop2=decodebinary(pop1); % 2.2.3 计算目标函数值 % calobjvalue.m 函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化

5、问题予以修改。 %遗传算法子程序 %Name: calobjvalue.m %实现目标函数的计算 function objvalue=calobjvalue(pop) temp1=decodechrom(pop,1,10); %将 pop 每行转化成十进制数 x=temp1*10/1023; %将二值域 中的数转化为变量域 的数 objvalue=10*sin(5*x)+7*cos(4*x); %计算目标函数值 % 2.3 计算个体的适应值 %遗传算法子程序 %Name:calfitvalue.m %计算个体的适应值 function fitvalue=calfitvalue(objvalue

6、) global Cmin; Cmin=0; px,py=size(objvalue); for i=1:px if objvalue(i)+Cmin0 temp=Cmin+objvalue(i); else temp=0.0; end fitvalue(i)=temp; end fitvalue=fitvalue; % 2.4 选择复制 % 选择或复制操作是决定哪些个体可以进入下一代。程序中采用赌轮盘选择法选择,这种方法较易实现。 % 根据方程 pi=fi/fi=fi/fsum ,选择步骤: % 1) 在第 t 代,由(1 )式计算 fsum 和 pi % 2) 产生 0,1 的随机数 ra

7、nd( .),求 s=rand( .)*fsum % 3) 求 fis 中最小的 k ,则第 k 个个体被选中 % 4) 进行 N 次 2)、3)操作,得到 N 个个体,成为第 t=t+1 代种群 %遗传算法子程序 %Name: selection.m %选择复制 function newpop=selection(pop,fitvalue) totalfit=sum(fitvalue); %求适应值之和 fitvalue=fitvalue/totalfit; %单个个体被选择的概率 fitvalue=cumsum(fitvalue); %如 fitvalue=1 2 3 4,则 cumsum

8、(fitvalue)=1 3 6 10 px,py=size(pop); ms=sort(rand(px,1); %从小到大排列 fitin=1; newin=1; while newinbestfit bestindividual=pop(i,:); bestfit=fitvalue(i); end end % 2.8 主程序 %遗传算法主程序 %Name:genmain05.m clear clf popsize=20; %群体大小 chromlength=10; %字符串长度(个体长度) pc=0.6; %交叉概率 pm=0.001; %变异概率 pop=initpop(popsize,

9、chromlength); %随机产生初始群体 for i=1:20 %20 为迭代次数 objvalue=calobjvalue(pop); %计算目标函数 fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度 newpop=selection(pop,fitvalue); %复制 newpop=crossover(pop,pc); %交叉 newpop=mutation(pop,pc); %变异 bestindividual,bestfit=best(pop,fitvalue); %求出群体中适应值最大的个体及其适应值 y(i)=max(bestfi

10、t); n(i)=i; pop5=bestindividual; x(i)=decodechrom(pop5,1,chromlength)*10/1023; pop=newpop; end fplot(10*sin(5*x)+7*cos(4*x),0 10) hold on plot(x,y,r*) hold off z index=max(y); %计算最大值及其位置 x5=x(index)%计算最大值对应的 x 值 y=z 【问题】求 f(x)=x 10*sin(5x) 7*cos(4x)的最大值,其中 0=x=9 【分析】选择二进制编码,种群中的个体数目为 10,二进制编码长度为 20,

11、交叉概率为0.95,变异概率为 0.08 【程序清单】 %编写目标函数 functionsol,eval=fitness(sol,options) x=sol(1); eval=x 10*sin(5*x) 7*cos(4*x); %把上述函数存储为 fitness.m 文件并放在工作目录下 initPop=initializega(10,0 9,fitness);%生成初始种群,大小为 10 x endPop,bPop,trace=ga(0 9,fitness,initPop,1e-6 1 1,maxGenTerm,25,normGeomSelect,. 0.08,arithXover,2,n

12、onUnifMutation,2 25 3) %25 次遗传迭代 运算借过为:x = 7.8562 24.8553(当 x 为 7.8562 时,f (x)取最大值 24.8553) 注:遗传算法一般用来取得近似最优解,而不是最优解。 遗传算法实例 2 【问题】在5=Xi=5,i=1,2 区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.2 x2.2)-exp(0.5*(cos(2*pi*x1) cos(2*pi*x2) 22.71282 的最小值。 【分析】种群大小 10,最大代数 1000,变异率 0.1,交叉率 0.3 【程序清单】 源函数的 matla

13、b 代码 function eval=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.2)/numv)-exp(sum(cos(2*pi*x)/numv) 22.71282; %适应度函数的 matlab 代码 function sol,eval=fitness(sol,options) numv=size(sol,2)-1; x=sol(1:numv); eval=f(x); eval=-eval; %遗传算法的 matlab 代码 bounds=ones(2,1)*-5 5; p,endPop,bes

14、tSols,trace=ga(bounds,fitness) 注:前两个文件存储为 m 文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 大家可以直接绘出 f(x)的图形来大概看看 f(x)的最值是多少,也可是使用优化函数来验证。matlab 命令行执行命令: fplot(x 10*sin(5*x) 7*cos(4*x),0,9) evalops 是传递给适应度函数的参数, opts 是二进制编码的精度,termops 是选择maxGenTerm 结束函数时传递个 maxGenTerm 的参数,即遗传代数。xoverops 是传递给交叉函数的参数。mutop

15、s 是传递给变异函数的参数。 【问题】求 f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中 0=x=9 【分析】选择二进制编码,种群中的个体数目为 10,二进制编码长度为 20,交叉概率为0.95,变异概率为 0.08 【程序清单】 %编写目标函数 functionsol,eval=fitness(sol,options) x=sol(1); eval=x+10*sin(5*x)+7*cos(4*x); %把上述函数存储为 fitness.m 文件并放在工作目录下 initPop=initializega(10,0 9,fitness);%生成初始种群,大小为 10 x e

16、ndPop,bPop,trace=ga(0 9,fitness,initPop,1e-6 1 1,maxGenTerm,25,normGeomSelect,. 0.08,arithXover,2,nonUnifMutation,2 25 3) %25 次遗传迭代 运算借过为:x = 7.8562 24.8553(当 x 为 7.8562 时,f (x)取最大值 24.8553) 注:遗传算法一般用来取得近似最优解,而不是最优解。 遗传算法实例 2 【问题】在5=Xi=5,i=1,2 区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.2+x2.2)-exp(0.

17、5*(cos(2*pi*x1)+cos(2*pi*x2)+22.71282 的最小值。 【分析】种群大小 10,最大代数 1000,变异率 0.1,交叉率 0.3 【程序清单】 源函数的 matlab 代码 function eval=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.2)/numv)-exp(sum(cos(2*pi*x)/numv)+22.71282; %适应度函数的 matlab 代码 function sol,eval=fitness(sol,options) numv=size(s

18、ol,2)-1; x=sol(1:numv); eval=f(x); eval=-eval; %遗传算法的 matlab 代码 bounds=ones(2,1)*-5 5; p,endPop,bestSols,trace=ga(bounds,fitness) 注:前两个文件存储为 m 文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 大家可以直接绘出 f(x)的图形来大概看看 f(x)的最值是多少,也可是使用优化函数来验证。matlab 命令行执行命令: fplot(x+10*sin(5*x)+7*cos(4*x),0,9) evalops 是传递给适应度函

19、数的参数, opts 是二进制编码的精度,termops 是选择maxGenTerm 结束函数时传递个 maxGenTerm 的参数,即遗传代数。xoverops 是传递给交叉函数的参数。mutops 是传递给变异函数的参数 matlab 遗传算法工具箱函数及实例讲解核心函数: (1)function pop=initializega(num,bounds,eevalFN,eevalOps,options)-初始种群的生成函数【输出参数】 pop-生成的初始种群【输入参数】 num-种群中的个体数目 bounds-代表变量的上下界的矩阵 eevalFN-适应度函数 eevalOps-传递给适应

20、度函数的参数 options-选择编码形式(浮点编码或是二进制编码)precision F_or_B,如 precision-变量进行二进制编码时指定的精度 F_or_B-为 1 时选择浮点编码,否则为二进制编码, 由 precision 指定精度) (2)function x,endPop,bPop,traceInfo = ga(bounds,evalFN,evalOps,startPop,opts,. termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)-遗传算法函数【输出参数】 x-求得的最优解 endPop

21、-最终得到的种群 bPop-最优种群的一个搜索轨迹【输入参数】 bounds-代表变量上下界的矩阵 evalFN-适应度函数 evalOps-传递给适应度函数的参数 startPop-初始种群 optsepsilon prob_ops display-opts(1:2)等同于 initializega 的 options 参数,第三个参数控制是否输出,一般为 0。如1e-6 1 0 termFN-终止函数的名称,如maxGenTerm termOps-传递个终止函数的参数,如100 selectFN-选择函数的名称,如normGeomSelect selectOps-传递个选择函数的参数,如0

22、.08 xOverFNs-交叉函数名称表,以空格分开,如arithXover heuristicXover simpleXover xOverOps-传递给交叉函数的参数表,如2 0;2 3;2 0 mutFNs-变异函数表,如 boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation mutOps-传递给交叉函数的参数表 ,如4 0 0;6 100 3;4 100 3;4 0 0注意】matlab 工具箱函数必须放在工作目录下【问题】求 f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中 0=x=9

23、 【分析】选择二进制编码,种群中的个体数目为 10,二进制编码长度为 20,交叉概率为0.95,变异概率为 0.08 【程序清单】 %编写目标函数 functionsol,eval=fitness(sol,options) x=sol(1); eval=x+10*sin(5*x)+7*cos(4*x); %把上述函数存储为 fitness.m 文件并放在工作目录下 initPop=initializega(10,0 9,fitness);%生成初始种群,大小为 10 x endPop,bPop,trace=ga(0 9,fitness,initPop,1e-6 1 1,maxGenTerm,2

24、5,normGeomSelect,. 0.08,arithXover,2,nonUnifMutation,2 25 3) %25 次遗传迭代运算借过为:x = 7.8562 24.8553(当 x 为 7.8562 时,f(x)取最大值 24.8553) 注:遗传算法一般用来取得近似最优解,而不是最优解。遗传算法实例 2 【问题】在5=Xi=5,i=1,2 区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.2+x2.2)-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)+22.71282 的最小值。【分析】种群大小10,最大代数 1000,

25、变异率 0.1,交叉率 0.3 【程序清单】 源函数的 matlab 代码 function eval=f(sol) numv=size(sol,2); x=sol(1:numv); eval=-20*exp(-0.2*sqrt(sum(x.2)/numv)-exp(sum(cos(2*pi*x)/numv)+22.71282; %适应度函数的 matlab 代码 function sol,eval=fitness(sol,options) numv=size(sol,2)-1; x=sol(1:numv); eval=f(x); eval=-eval; %遗传算法的 matlab 代码 bo

26、unds=ones(2,1)*-5 5; p,endPop,bestSols,trace=ga(bounds,fitness) 注:前两个文件存储为 m 文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 大家可以直接绘出 f(x)的图形来大概看看 f(x )的最值是多少,也可是使用优化函数来验证。matlab 命令行执行命令: fplot(x+10*sin(5*x)+7*cos(4*x),0,9) evalops 是传递给适应度函数的参数, opts 是二进制编码的精度,termops 是选择maxGenTerm 结束函数时传递个 maxGenTerm 的参数,即遗传代数。xoverops 是传递给交叉函数的参数。mutops 是传递给变异函数的参数。

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报