您好,欢迎来到九壹网。
搜索
您的当前位置:首页GA程序讲解

GA程序讲解

来源:九壹网
%

% 2008年4月12日修改

%**********************%主函数***************************************** 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=30; %种群大小 pcross=0.6; %交叉概率 pmutation=0.1; %变异概率 maxgen=50; %最大代数 po=0.1; %淘汰概率 pp=0.1; %保护概率

mp=floor(pp*popsize); %保护的个数 np=floor(po*popsize); %淘汰的个数 %

initpop; % 初始种群 %

for gen=1:maxgen generation; end % best;

bestfit % 最佳个体适应度值输出 bestgen % 最佳个体所在代数输出 gen=1:maxgen; figure

plot(gen,maxfit(1,gen)); % 进化曲线 %

%********************** 产生初始种群 ************************************ %

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 generation()

objfun; %计算适应度值

pp_po; %执行保护与淘汰操作 select; %选择操作 crossover; mutation; %

%************************%计算适应度值************************************ %

function objfun()

global lchrom oldpop fitness popsize chrom maxfit gen varible a=0; %b=100; b=30;

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)*varible(1,i);

% fitness(1,i)=20*cos(0.25*varible(1,i))-12*sin(0.33*varible(1,i))+40; %个体适应度函数值 end %

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 j=1;

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)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 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 pj=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 mutation()

global popsize lchrom pmutation temp newpop oldpop mp m=lchrom*(popsize-mp); % 总的基因数 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 best()

global maxfit bestfit gen maxgen bestgen bestfit=maxfit(1,1); gen=2;

while gen<=maxgen

if bestfitgen=gen+1; end

%**************************************************************************

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务