变异概率自适应调整的遗传算法GA程序资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
变异概率自适应调整的遗传算法算例
一:优化函数:()()*sin 10*2,[1,2]
f x x x x =+∈-+
A.变异概率自适应调整公式:
B.遗传算法参数 (1)种群规模设为80,遗传算子分别为轮盘法选择,多点点交叉和多点自适应变异;
(2)交叉概率0.7,变异概率0.01;
(3)最大进化代数为100代,保优操作。
C.程序框图
图 1 程序流程框图
()()12max 1max 1
,,m m m avg avg m m avg P P f f P f f f f P P f f --⎧-≥⎪-=⎨⎪<⎩ 开始 确定实际问题参数对参数集进行编码 初始化群体P(t) 群体P(t+1)(更新) 位串解码得参数 计算目标函数值 函数值向适应值映射 适应值调整 选择、交叉、自适应变异
群体评价 遗传操作 满足停止准则 结束
二:程序及运行结果
(1)%变异概率自适应调整的GA程序
%优化函数为f=x*sin(10*x)+2,其中,-1=<x<=2
%编码长度为12位
%种群规模设为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 % 最佳个体适应度值输出
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;
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
while i<=popsize %将(np+1)~popsize的个体放在toldpop中,共(popsize-np)个 toldpop(j,:)=oldpop(i,:);
j=j+1;
i=i+1;
end
for i=1:(popsize-np) %从小到大顺序排列,将前面np个淘汰
oldpop(i,:)=toldpop(i,:); % 适应度是否也要互换?
end
%*************************转轮法选择操作********************************** function select()
global fitness popsize sumfitness oldpop temp mp np
sumfitness=0; %个体适应度之和
for i=1:(popsize-np-mp) % 仅计算(popsize-np-mp)个个体的选择概率
sumfitness=sumfitness+fitness(1,i);
end
for i=1:(popsize-mp-np) % 仅计算(popsize-np-mp)个个体的选择概率
p(1,i)=fitness(1,i)/sumfitness; % 个体染色体的选择概率
end
q=cumsum(p); % 个体染色体的累积概率(内部函数),共(popsize-np-mp)个
b=sort(rand(1,(popsize-mp))); % 产生(popsize-mp)个随机数,并按升序排列。
mp为保护个体数
j=1;
k=1;
while j<=(popsize-mp) % 从(popsize-mp-np)中选出(popsize-mp)个个体,并放入temp(j,:)中;
if b(1,j)<q(1,k)
temp(j,:)=oldpop(k,:);
j=j+1;
else
k=k+1;
end
end
j=popsize-np-mp+1; % 从统一挪过来的(popsize-np-mp)以后个体——优秀个体中选择for i=(popsize-mp+1):popsize % 将mp个保留个体放入交配池temp(i,:),以保证群体数popsize
temp(i,:)=oldpop(j,:);
j=j+1;
end
%*********************%自适应变异操作************************************* function selfmutation()
global i popsize lchrom pmutation temp newpop oldpop mp fitness avgfitness maxfitness
m=lchrom*(popsize-mp); % 总的基因数
pm1=pmutation;
pm2=0.005;
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; %目标函数
if(fitness(1,i)>=avgfitness)
pmutatio = pm1-(pm1-pm2)*(fitness(1,i)-avgfitness)/(maxfitness-avgfitness);
else
pmutation = pm1;
end
end
n=round(pmutation*m); % 变异发生的次数
for i=1:n % 执行变异操作循环
k=round(rand*(m-1))+1; %确定变异位置(四舍五入取整)
j=ceil(k/lchrom); % 确定个体编号(取整)
l=rem(k,lchrom); %确定个体中变位基因的位置(求余)if l==0
temp(j,lchrom)=~temp(j,lchrom); % 取非操作
else
temp(j,l)=~temp(j,l); % 取非操作
end
end
for i=1:popsize
newpop(i,:)=temp(i,:); %产生新的个体
oldpop(i,:)=newpop(i,:);
end
%**************************%交叉操作*************************************** function crossover()
global temp popsize pcross lchrom mp
n=floor(pcross*(popsize-mp)); %交叉发生的次数(向下取整)
if rem(n,2)~=0 % 求余
n=n+1; % 保证为偶数个个体,便于交叉操作
end
j=1;
m=0;
% 对(popsize-mp)个个体将进行随机配对,满足条件者将进行交叉操作(按顺序选择要交叉的对象)
for i=1:(popsize-mp)
p=rand; % 产生随机数
if p<pcross % 满足交叉条件
parent(j,:)=temp(i,:); % 选出1个父本
k(1,j)=i;
j=j+1; % 记录父本个数
m=m+1; % 记录杂交次数
if(j==3)&(m<=n) % 满足两个父本(j==3),未超过交叉次数(m<=n) pos=round(rand*(lchrom-1))+1; % 确定随机位数(四舍五入取整)for i=1:pos
child1(1,i)=parent(1,i);
child2(1,i)=parent(2,i);
end
for i=(pos+1):lchrom
child1(1,i)=parent(2,i);
child2(1,i)=parent(1,i);
end
i=k(1,1);
j=k(1,2);
temp(i,:)=child1(1,:);
temp(j,:)=child2(1,:);
j=1;
end
end
end
%*********************%最佳个体******************************************** function best()
global maxfit bestfit gen maxgen bestgen
bestfit=maxfit(1,1);
gen=2;
while gen<=maxgen
if bestfit<maxfit(1,gen)
bestfit=maxfit(1,gen);
bestgen=gen;
end
gen=gen+1;
end
0102030405060708090100
024681012Generation F i t n e s s (2)运行结果
A.程序运行结果:最优适应值解为bestfit= 11.4862 最优个体所在代数bestgen= 33
B.程序运行结果图
图2 程序运行结果图。