当前位置:首页 > 变异概率自适应调整的遗传算法GA程序
变异概率自适应调整的遗传算法算例
一:优化函数:f?x??x*sin?10*x??2,x?[?1,?2]A.变异概率自适应调整公式:
B.遗传算法参数
Pm1?Pm2??fmax?f???,f?favg?Pm1?fmax?favgPm???P,f?favg?m1(1)种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异; (2)交叉概率0.7,变异概率0.01; (3)最大进化代数为100代,保优操作。 C.程序框图
位串解码得参数 计算目标函数值 函数值向适应值映射 适应值调整 选择、交叉、自适应变异
1
开始 确定实际问题参数对参数集进行编码 初始化群体P(t) 群体评价 群体P(t+1)(更新) 满足停止准则 遗传操作 结束 图 1 程序流程框图
二:程序及运行结果
(1)%变异概率自适应调整的GA程序
%优化函数为f=x*sin(10*x)+2,其中,-1= %种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异。 %交叉概率0.7,变异概率0.01 %最大进化代数为100代,保优操作。 %**********************%主函数***************************************** function main() global chrom lchrom oldpop newpop varible fitness popsize sumfitness %定义全局变量 global pcross pmutation temp bestfit maxfit gen bestgen global maxgen po pp mp np lchrom=12; %染色体长度 popsize=80; %种群大小 pcross=0.7; %交叉概率 pmutation=0.01; %变异概率 maxgen=100; %最大代数 po=0.1; %淘汰概率 pp=0.1; %保护概率 mp=floor(pp*popsize); %保护的个数 np=floor(po*popsize); %淘汰的个数 initpop; % 初始化种群 for gen=1:maxgen objfun; %计算适应度值 pp_po; %执行保优操作 select; %选择操作 selfmutation; %自变异操作 crossover; %交叉操作 end best bestfit % 最佳个体适应度值输出 2 bestgen % 最佳个体所在代数输出 figure gen=1:maxgen; plot(gen,maxfit(1,gen)); % 进化曲线 hold on; plot(bestgen,bestfit); xlabel('Generation'); ylabel('Fitness'); %********************** 产生初始种群 ************************************ function initpop() global lchrom oldpop popsize chrom for i=1:popsize chrom=rand(1,lchrom); % lchrom=12 染色体长度 for j=1:lchrom if chrom(1,j)<0.5 chrom(1,j)=0; else chrom(1,j)=1; end end oldpop(i,1:lchrom)=chrom; end %************************%计算适应度值************************************ function objfun() global lchrom oldpop fitness popsize chrom maxfit gen varible avgfiness savgfitness % a=0;b=3; a=0;b=10; for i=1:popsize chrom=oldpop(i,:); c=decimal(chrom); varible(1,i)=a+c*(b-a)/(2.^lchrom-1); %对应变量值 fitness(1,i)=varible(1,i)*sin(10*varible(1,i))+2; 3 end avgfitness=sum(fitness)/popsize; lsort; % 个体排序 maxfit(1,gen)=max(fitness); %求本代中的最大适应度值maxfit %************************二进制转十进制********************************** function c=decimal(chrom) global lchrom popsize c=0; for j=1:lchrom c=c+chrom(1,j)*2.^(lchrom-j); end %************************* 个体从小到大排序 ************************ function lsort() global popsize fitness oldpop for i=1:popsize j=i+1; while j<=popsize if fitness(1,i)>fitness(1,j) tf=fitness(1,i); % 适应度值 tc=oldpop(i,:); % 基因代码 fitness(1,i)=fitness(1,j); % 适应度值互换 oldpop(i,:)=oldpop(j,:); % 基因代码互换 fitnescs(1,j)=tf; oldpop(j,:)=tc; end j=j+1; end end %*************************保优操作***************************** function pp_po() global popsize oldpop np i=np+1; % np=floor(po*popsize); %淘汰的个数np 4
共分享92篇相关文档