一 : 遗传算法matlab程序
遗传算法遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法,它最初由美国Michigan大学J.Holland教授于1975年首先提出来的,并出版了颇有影响的专著《Adaptationin Natural and ArtificialSystems》,GA这个名称才逐渐为人所知,J.Holland教授所提出的GA通常为简单遗传算法(SGA)。
遗传算法的MATLAB程序%遗传算法程序:说明:fga.m 为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择,均匀交叉,变异操作,而且还引入了倒位操作!
function[BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options)
%[BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation)
% Finds a??maximum of afunction of several variables.
% fmaxga solves problemsof the form:
% max F(X) subject to:LB <= X <=UB
%BestPop - 最优的群体即为最优的染色体群
% Trace -最佳染色体所对应的目标函数值
% FUN - 目标函数
% LB -自变量下限
% UB -自变量上限
%eranum -种群的代数,取100--1000(默认200)
%popsize -每一代种群的规模;此可取50--200(默认100)
%pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8)
%pmutation -初始变异概率,一般取0.05-0.2之间较好(默认0.1)
%pInversion -倒位概率,一般取0.05-0.3之间较好(默认0.2)
%options -1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编码,option(2)设定求解精度(默认1e-4)
T1=clock;
ifnargin<3, error('FMAXGA requires at least threeinput arguments'); end
if nargin==3,eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==4,popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==5,pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==6,pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==7,pInversion=0.15;options=[0 1e-4];end
iffind((LB-UB)>0)
error('数据输入错误,请重新输入(LB<UB):');
end
s=sprintf('程序运行需要约%.4f秒钟时间,请稍等......',(eranum*popsize/1000));
disp(s);
global m n NewPopchildren1 children2 VarNum
bounds=[LB;UB]';bits=[];VarNum=size(bounds,1);
precision=options(2);%由求解精度确定二进制编码长度
bits=ceil(log2((bounds(:,2)-bounds(:,1))'./ precision));%由设定精度划分区间
[Pop]=InitPopGray(popsize,bits);%初始化种群
[m,n]=size(Pop);
NewPop=zeros(m,n);
children1=zeros(1,n);
children2=zeros(1,n);
pm0=pMutation;
BestPop=zeros(eranum,n);%分配初始解空间BestPop,Trace
Trace=zeros(eranum,length(bits)+1);
i=1;
whilei<=eranum
for j=1:m
value(j)=feval_r(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度
end
[MaxValue,Index]=max(value);
BestPop(i,:)=Pop(Index,:);
Trace(i,1)=MaxValue;
Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits);
[selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非线性排名选择
[CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum));%采用多点交叉和均匀交叉,且逐步增大均匀交叉的概率
round(unidrnd(eranum-i)/eranum)
[MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%变异
[InversionPop]=Inversion(MutationPop,pInversion);%倒位
Pop=InversionPop;%更新
pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4);
%随着种群向前进化,逐步增大变异率至1/2交叉率
p(i)=pMutation;
i=i+1;
end
t=1:eranum;
plot(t,Trace(:,1)');
title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)');
[MaxFval,I]=max(Trace(:,1));
X=Trace(I,(2:length(bits)+1));
holdon;??plot(I,MaxFval,'*');
text(I+5,MaxFval,['FMAX='num2str(MaxFval)]);
str1=sprintf('进化到 %d 代,自变量为 %s 时,得本次求解的最优值%f\n对应染色体是:%s',I,num2str(X),MaxFval,num2str(BestPop(I,:)));
disp(str1);
%figure(2);plot(t,p);%绘制变异值增大过程
T2=clock;
elapsed_time=T2-T1;
ifelapsed_time(6)<0
elapsed_time(6)=elapsed_time(6)+60;elapsed_time(5)=elapsed_time(5)-1;
end
ifelapsed_time(5)<0
elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;
end %像这种程序当然不考虑运行上小时啦
str2=sprintf('程序运行耗时 %d小时 %d 分钟 %.4f秒',elapsed_time(4),elapsed_time(5),elapsed_time(6));
disp(str2);
%初始化种群
%采用二进制Gray编码,其目的是为了克服二进制编码的Hamming悬崖缺点
function[initpop]=InitPopGray(popsize,bits)
len=sum(bits);
initpop=zeros(popsize,len);%Thewhole zero encoding individual
fori=2:popsize-1
pop=round(rand(1,len));
pop=mod(([0 pop]+[pop 0]),2);
%i=1时,b(1)=a(1);i>1时,b(i)=mod(a(i-1)+a(i),2)
%其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)
initpop(i,:)=pop(1:end-1);
end
initpop(popsize,:)=ones(1,len);%Thewhole one encoding individual
%解码
function [fval] =b2f(bval,bounds,bits)
% fval - 表征各变量的十进制数
% bval - 表征各变量的二进制编码串
% bounds -各变量的取值范围
% bits - 各变量的二进制编码长度
scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1);%The range of the variables
numV=size(bounds,1);
cs=[0cumsum(bits)];
fori=1:numV
a=bval((cs(i)+1):cs(i+1));
fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);
end
%选择操作 %采用基于轮盘赌法的非线性排名选择
%各个体成员按适应值从大到小分配选择概率:
%P(i)=(q/1-(1-q)^n)*(1-q)^i,??其中P(0)>P(1)>...>P(n),sum(P(i))=1
function[selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits)
global mn
selectpop=zeros(m,n);
fit=zeros(m,1);
fori=1:m
fit(i)=feval_r(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应值做排名依据
end
selectprob=fit/sum(fit);%计算各个体相对适应度(0,1)
q=max(selectprob);%选择最优的概率
x=zeros(m,2);
x(:,1)=[m:-1:1]';
[yx(:,2)]=sort(selectprob);
r=q/(1-(1-q)^m);%标准分布基值
newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率
newfit=cumsum(newfit);%计算各选择概率之和
rNums=sort(rand(m,1));
fitIn=1;newIn=1;
whilenewIn<=m
ifrNums(newIn)<newfit(fitIn)
selectpop(newIn,:)=pop(fitIn,:);
newIn=newIn+1;
else
fitIn=fitIn+1;
end
end
%交叉操作
function[NewPop]=CrossOver(OldPop,pCross,opts)
%OldPop为父代种群,pcross为交叉概率
global m nNewPop
r=rand(1,m);
y1=find(r<pCross);
y2=find(r>=pCross);
len=length(y1);
iflen>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数
y2(length(y2)+1)=y1(len);
y1(len)=[];
end
iflength(y1)>=2
for i=0:2:length(y1)-2
ifopts==0
[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
else
[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
end
end
end
NewPop(y2,:)=OldPop(y2,:);
%采用均匀交叉
function[children1,children2]=EqualCrossOver(parent1,parent2)
global n children1children2
hidecode=round(rand(1,n));%随机生成掩码
crossposition=find(hidecode==1);
holdposition=find(hidecode==0);
children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因
children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因
children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因
children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因
%采用多点交叉,交叉点数由变量数决定
function[Children1,Children2]=MultiPointCross(Parent1,Parent2)
global n Children1Children2 VarNum
Children1=Parent1;
Children2=Parent2;
Points=sort(unidrnd(n,1,2*VarNum));
fori=1:VarNum
Children1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));
Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));
end
%变异操作
function[NewPop]=Mutation(OldPop,pMutation,VarNum)
global m nNewPop
r=rand(1,m);
position=find(r<=pMutation);
len=length(position);
iflen>=1
for i=1:len
k=unidrnd(n,1,VarNum);%设置变异点数,一般设置1点
forj=1:length(k)
ifOldPop(position(i),k(j))==1
OldPop(position(i),k(j))=0;
else
OldPop(position(i),k(j))=1;
end
end
end
end
NewPop=OldPop;
%倒位操作
function[NewPop]=Inversion(OldPop,pInversion)
global m nNewPop
NewPop=OldPop;
r=rand(1,m);
PopIn=find(r<=pInversion);
len=length(PopIn);
iflen>=1
for i=1:len
d=sort(unidrnd(n,1,2));
ifd(1)~=1&d(2)~=n
NewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1);
NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1));
NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n);
end
end
end
%遗传算法程序:说明: fga.m为遗传算法的主程序; 采用二进制Gray编码,采用基于轮盘赌法的非线性排名选择,均匀交叉,变异操作,而且还引入了倒位操作!
function[BestPop,Trace]=fga(FUN,LB,UB,eranum,popsize,pCross,pMutation,pInversion,options)
%[BestPop,Trace]=fmaxga(FUN,LB,UB,eranum,popsize,pcross,pmutation)
% Finds a??maximum of afunction of several variables.
% fmaxga solves problemsof the form:
% max F(X) subject to:LB <= X <=UB
%BestPop - 最优的群体即为最优的染色体群
% Trace -最佳染色体所对应的目标函数值
% FUN - 目标函数
% LB -自变量下限
% UB -自变量上限
%eranum -种群的代数,取100--1000(默认200)
%popsize -每一代种群的规模;此可取50--200(默认100)
%pcross - 交叉概率,一般取0.5--0.85之间较好(默认0.8)
%pmutation -初始变异概率,一般取0.05-0.2之间较好(默认0.1)
%pInversion -倒位概率,一般取0.05-0.3之间较好(默认0.2)
%options -1*2矩阵,options(1)=0二进制编码(默认0),option(1)~=0十进制编码,option(2)设定求解精度(默认1e-4)
T1=clock;
ifnargin<3, error('FMAXGA requires at least threeinput arguments'); end
if nargin==3,eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==4,popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==5,pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==6,pMutation=0.1;pInversion=0.15;options=[01e-4];end
if nargin==7,pInversion=0.15;options=[0 1e-4];end
iffind((LB-UB)>0)
error('数据输入错误,请重新输入(LB<UB):');
end
s=sprintf('程序运行需要约%.4f秒钟时间,请稍等......',(eranum*popsize/1000));
disp(s);
global m n NewPopchildren1 children2 VarNum
bounds=[LB;UB]';bits=[];VarNum=size(bounds,1);
precision=options(2);%由求解精度确定二进制编码长度
bits=ceil(log2((bounds(:,2)-bounds(:,1))'./ precision));%由设定精度划分区间
[Pop]=InitPopGray(popsize,bits);%初始化种群
[m,n]=size(Pop);
NewPop=zeros(m,n);
children1=zeros(1,n);
children2=zeros(1,n);
pm0=pMutation;
BestPop=zeros(eranum,n);%分配初始解空间BestPop,Trace
Trace=zeros(eranum,length(bits)+1);
i=1;
whilei<=eranum
for j=1:m
value(j)=feval_r(FUN(1,:),(b2f(Pop(j,:),bounds,bits)));%计算适应度
end
[MaxValue,Index]=max(value);
BestPop(i,:)=Pop(Index,:);
Trace(i,1)=MaxValue;
Trace(i,(2:length(bits)+1))=b2f(BestPop(i,:),bounds,bits);
[selectpop]=NonlinearRankSelect(FUN,Pop,bounds,bits);%非线性排名选择
[CrossOverPop]=CrossOver(selectpop,pCross,round(unidrnd(eranum-i)/eranum));%采用多点交叉和均匀交叉,且逐步增大均匀交叉的概率
round(unidrnd(eranum-i)/eranum)
[MutationPop]=Mutation(CrossOverPop,pMutation,VarNum);%变异
[InversionPop]=Inversion(MutationPop,pInversion);%倒位
Pop=InversionPop;%更新
pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4);
%随着种群向前进化,逐步增大变异率至1/2交叉率
p(i)=pMutation;
i=i+1;
end
t=1:eranum;
plot(t,Trace(:,1)');
title('函数优化的遗传算法');xlabel('进化世代数(eranum)');ylabel('每一代最优适应度(maxfitness)');
[MaxFval,I]=max(Trace(:,1));
X=Trace(I,(2:length(bits)+1));
holdon;??plot(I,MaxFval,'*');
text(I+5,MaxFval,['FMAX='num2str(MaxFval)]);
str1=sprintf('进化到 %d 代,自变量为 %s 时,得本次求解的最优值%f\n对应染色体是:%s',I,num2str(X),MaxFval,num2str(BestPop(I,:)));
disp(str1);
%figure(2);plot(t,p);%绘制变异值增大过程
T2=clock;
elapsed_time=T2-T1;
ifelapsed_time(6)<0
elapsed_time(6)=elapsed_time(6)+60;elapsed_time(5)=elapsed_time(5)-1;
end
ifelapsed_time(5)<0
elapsed_time(5)=elapsed_time(5)+60;elapsed_time(4)=elapsed_time(4)-1;
end %像这种程序当然不考虑运行上小时啦
str2=sprintf('程序运行耗时 %d小时 %d 分钟 %.4f秒',elapsed_time(4),elapsed_time(5),elapsed_time(6));
disp(str2);
%初始化种群
%采用二进制Gray编码,其目的是为了克服二进制编码的Hamming悬崖缺点
function[initpop]=InitPopGray(popsize,bits)
len=sum(bits);
initpop=zeros(popsize,len);%Thewhole zero encoding individual
fori=2:popsize-1
pop=round(rand(1,len));
pop=mod(([0 pop]+[pop 0]),2);
%i=1时,b(1)=a(1);i>1时,b(i)=mod(a(i-1)+a(i),2)
%其中原二进制串:a(1)a(2)...a(n),Gray串:b(1)b(2)...b(n)
initpop(i,:)=pop(1:end-1);
end
initpop(popsize,:)=ones(1,len);%Thewhole one encoding individual
%解码
function [fval] =b2f(bval,bounds,bits)
% fval - 表征各变量的十进制数
% bval - 表征各变量的二进制编码串
% bounds -各变量的取值范围
% bits - 各变量的二进制编码长度
scale=(bounds(:,2)-bounds(:,1))'./(2.^bits-1);%The range of the variables
numV=size(bounds,1);
cs=[0cumsum(bits)];
fori=1:numV
a=bval((cs(i)+1):cs(i+1));
fval(i)=sum(2.^(size(a,2)-1:-1:0).*a)*scale(i)+bounds(i,1);
end
%选择操作 %采用基于轮盘赌法的非线性排名选择
%各个体成员按适应值从大到小分配选择概率:
%P(i)=(q/1-(1-q)^n)*(1-q)^i,??其中P(0)>P(1)>...>P(n),sum(P(i))=1
function[selectpop]=NonlinearRankSelect(FUN,pop,bounds,bits)
global mn
selectpop=zeros(m,n);
fit=zeros(m,1);
fori=1:m
fit(i)=feval_r(FUN(1,:),(b2f(pop(i,:),bounds,bits)));%以函数值为适应值做排名依据
end
selectprob=fit/sum(fit);%计算各个体相对适应度(0,1)
q=max(selectprob);%选择最优的概率
x=zeros(m,2);
x(:,1)=[m:-1:1]';
[yx(:,2)]=sort(selectprob);
r=q/(1-(1-q)^m);%标准分布基值
newfit(x(:,2))=r*(1-q).^(x(:,1)-1);%生成选择概率
newfit=cumsum(newfit);%计算各选择概率之和
rNums=sort(rand(m,1));
fitIn=1;newIn=1;
whilenewIn<=m
ifrNums(newIn)<newfit(fitIn)
selectpop(newIn,:)=pop(fitIn,:);
newIn=newIn+1;
else
fitIn=fitIn+1;
end
end
%交叉操作
function[NewPop]=CrossOver(OldPop,pCross,opts)
%OldPop为父代种群,pcross为交叉概率
global m nNewPop
r=rand(1,m);
y1=find(r<pCross);
y2=find(r>=pCross);
len=length(y1);
iflen>2&mod(len,2)==1%如果用来进行交叉的染色体的条数为奇数,将其调整为偶数
y2(length(y2)+1)=y1(len);
y1(len)=[];
end
iflength(y1)>=2
for i=0:2:length(y1)-2
ifopts==0
[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=EqualCrossOver(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
else
[NewPop(y1(i+1),:),NewPop(y1(i+2),:)]=MultiPointCross(OldPop(y1(i+1),:),OldPop(y1(i+2),:));
end
end
end
NewPop(y2,:)=OldPop(y2,:);
%采用均匀交叉
function[children1,children2]=EqualCrossOver(parent1,parent2)
global n children1children2
hidecode=round(rand(1,n));%随机生成掩码
crossposition=find(hidecode==1);
holdposition=find(hidecode==0);
children1(crossposition)=parent1(crossposition);%掩码为1,父1为子1提供基因
children1(holdposition)=parent2(holdposition);%掩码为0,父2为子1提供基因
children2(crossposition)=parent2(crossposition);%掩码为1,父2为子2提供基因
children2(holdposition)=parent1(holdposition);%掩码为0,父1为子2提供基因
%采用多点交叉,交叉点数由变量数决定
function[Children1,Children2]=MultiPointCross(Parent1,Parent2)
global n Children1Children2 VarNum
Children1=Parent1;
Children2=Parent2;
Points=sort(unidrnd(n,1,2*VarNum));
fori=1:VarNum
Children1(Points(2*i-1):Points(2*i))=Parent2(Points(2*i-1):Points(2*i));
Children2(Points(2*i-1):Points(2*i))=Parent1(Points(2*i-1):Points(2*i));
end
%变异操作
function[NewPop]=Mutation(OldPop,pMutation,VarNum)
global m nNewPop
r=rand(1,m);
position=find(r<=pMutation);
len=length(position);
iflen>=1
for i=1:len
k=unidrnd(n,1,VarNum);%设置变异点数,一般设置1点
forj=1:length(k)
ifOldPop(position(i),k(j))==1
OldPop(position(i),k(j))=0;
else
OldPop(position(i),k(j))=1;
end
end
end
end
NewPop=OldPop;
%倒位操作
function[NewPop]=Inversion(OldPop,pInversion)
global m nNewPop
NewPop=OldPop;
r=rand(1,m);
PopIn=find(r<=pInversion);
len=length(PopIn);
iflen>=1
for i=1:len
d=sort(unidrnd(n,1,2));
ifd(1)~=1&d(2)~=n
NewPop(PopIn(i),1:d(1)-1)=OldPop(PopIn(i),1:d(1)-1);
NewPop(PopIn(i),d(1):d(2))=OldPop(PopIn(i),d(2):-1:d(1));
NewPop(PopIn(i),d(2)+1:n)=OldPop(PopIn(i),d(2)+1:n);
end
end
end
二 : MATLAB.遗传算法和粒子群算法程序设计及实例应用
1
计算智能程序设计
遗传算法和群智能算法程序设计及实例应用
天天向尚磊 lei_tech@ www.61k.com
摘要
本文主要包含以下内容:
遗传算法和粒子群算法的程序设计的一般结构。[www.61k.com)主要介绍两类算法的程序设计中的主要思想。
介绍在Matlab编程中一些需要注意的细节。在实际编程实现中,结合Matlab语言的特色,可以将程序效率发挥到极致。
一个遗传算法实例和一个粒子群算法实例。
目录
一、 遗传算法和粒子群算法 ............................................................................................................................. 2
1.1 遗传算法 ................................................................................................................................................. 2
1.1.1算法 .................................................................................................................................................... 2
1.1.2注意事项 ............................................................................................................................................ 2
1.1.3Matlab编程注意事项 ......................................................................................................................... 2
1.2粒子群算法 ................................................................................................................................................... 3
1.2.1算法 .................................................................................................................................................... 3
1.2.2注意事项 ............................................................................................................................................ 3
1.2.3Matlab编程注意事项 ......................................................................................................................... 3
二、遗传算法和粒子群算法编程实例 ..................................................................................................................... 3
2.1遗传算法实例 ............................................................................................................................................... 3
2.1.1解决的问题 ........................................................................................................................................ 4
2.1.2Matlab程序主体构成 ......................................................................................................................... 4
2.1.3程序运行示例 .................................................................................................................................... 5
2.2粒子群算法实例 ........................................................................................................................................... 6
2.2.1解决的问题 ........................................................................................................................................ 6
2.2.2Matlab程序主体构成 ......................................................................................................................... 6
2.2.3程序运行示例 .................................................................................................................................... 7
三、参考文献 ............................................................................................................................................................. 8
附录 ............................................................................................................................................................................. 8
1遗传算法Matlab程序调用子函数 ................................................................................................................. 8
2粒子群算法Matlab程序调用子函数 ........................................................................................................... 10
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
2
一、 遗传算法和粒子群算法
1.1 遗传算法
对于遗传算法,本文主要是介绍简单遗传算法的主体思想。(www.61k.com)
1.1.1算法
1.1.2注意事项
针对遗传算法下面作几点说明:
1. 适应度与编码
针对具体问题,遗传算法首要面对的是:编码方式的选择和适应度函数的选择。两者的影响主要有两方面:一是对结果好坏的影响;二是对计算复杂度的影响。
2. 概率常数设置
接下来就是概率常数的设置。一是染色体杂交时所设置的概率,二是染色体变异时所设置的概率。概率设置的不同对算法的收敛快慢影响比较大,针对一类问题,可以根据经验获取经验参数。
3. 迭代终止条件的选取
上述算法时采取的既定迭代次数停止作为终止,另外还可以设置迭代多少次适应度值改变不大而跳出循环,也可设置达到预定使用度值即可跳出循环。即一类是既定次数停止,一类是根据适应度值停止,根据具体问题可自定义设置迭代终止条件,以避免死循环。
1.1.3Matlab编程注意事项
1.适应度函数选取
适应度函数的选取要作到在对结果影响预估不会太大的情况下,尽量选择简单的函数,即计算量小的函数。其原因在于,Matlab在执行遗传算法时,函数的计算量占据了很大一部分时间。
扩展:粒子群算法matlab实例 / matlab遗传算法实例 / matlab中遗传算法实例
1. 分多文档保存各部分程序
分多个文档可提高程序运行效率,另外也可将各部分职能更加清晰的呈现,也使得程序的
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
3
调试简化。(www.61k.com)
2. 编码
若是用遗传算法求解函数优化问题,Matlab中有自带的二进制字符串和十进制之间的转换函数。编码多用向量或矩阵计算,因此特别注意尽量多的采用向量或者矩阵的方式计算,而不是采用循环,Matlab中循环结构效率并不高。即便是采用循环也尽量做到列优先。
1.2粒子群算法
粒子群算法相对于上节的遗传算法在编程实现上简单。在某些注意事项上和遗传算法相同之处。
1.2.1算法
1.2.2注意事项
1. 领域拓扑结构选取
即粒子之间互换信息的单位或结构,思路最简单的即以整个群为一个互换信息单位,互换信息主要涉及到适应度函数值的计算,另外,结构的选取,直接关系到每一步粒子位置和速度的更新情况。因此,它一方面影响收敛速度,一方面对计算复杂度和计算量有很大影响。
2. 在参数设置和适应度函数选择上和遗传算法类似。
1.2.3Matlab编程注意事项
1. 适应度函数的计算
在粒子群间信息互换时,主要涉及到的计算量就是适应度函数值的计算,可采取向量化计算。即每个粒子信息交换的最小单位的适应度函数值可实现一次性计算,这就极大的提高了程序的效率。
此处涉及的向量化计算优势将在后面的实例中得到淋漓精致的体现。
2. 另外,适应度函数可单独编写function或者采用匿名函数。其余事项和遗传算法类似。
二、遗传算法和粒子群算法编程实例
2.1遗传算法实例
本例选自《计算智能》2.2的案例作为编程实现对象。
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
4
2.1.1解决的问题
????????(??1,??2)=21.5+??1sin(4????1)+??2sin?(20????2),
?3.0≤??1≤12.1,
4.1≤??2≤5.8.
程序设计中选择的二进制编码,种群规模二20,染色体杂交时的概率为0.25,变异时概率为0.01,适应度函数为函数本身,终止条件为达到预定最大迭代次数。[www.61k.com)
2.1.2Matlab程序主体构成
Objective function .................................................................................................................... 4
Initial group ............................................................................................................................... 4
Loop for better result ................................................................................................................ 5
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
5
2.1.3程序运行示例
4.559407s。(www.61k.com]
后面几乎是浪费时间。由此看来,并不是迭代次数越多越好,同时也体现了遗传算法的随机性。因此,选择好的终止条件还是需要的,以避免无谓的计算量。
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
6
2.2粒子群算法实例
本例选自《计算智能》7.3实例。[www.61k.com)
2.2.1解决的问题
????????(??1,??2)=0.5+(1+0.001(??+??)), 122+??2?0.5??????2√??12?100≤??1,??2≤100.
此问题的最优解是已知的,其解为??(??1,??2)=0,最优解为(0,0)。
种群规模为20,适应度函数取目标函数,领域结构采取全局领域结构,惯性权重为0.9,??1=??2=2,最大速度为3。
2.2.2Matlab程序主体构成
下面的程序可设置迭代次数和种群规模,默认迭代为1000次,种群为20。
Initial Setting ............................................................................................................................. 7
Initial Group .............................................................................................................................. 7
Loop for Result .......................................................................................................................... 7
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
7
2.2.3程序运行示例
开计算适应度值的,其计算时间达到了10s以上,差距是很大的。[www.61k.com]所以,注意结合Matlab的语言特色提高程序效率是很必要的。
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
8
三、参考文献
黄竞伟等. 计算智能. 北京. 科学出版社. 2010
附录
1遗传算法Matlab程序调用子函数
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
9
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
10
2粒子群算法Matlab程序调用子函数
遗传算法实例 MATLAB.遗传算法和粒子群算法程序设计及实例应用
11
扩展:粒子群算法matlab实例 / matlab遗传算法实例 / matlab中遗传算法实例
三 : 遗传算法原理,概念,程序
第一章遗传算法的基本原理与算法
4.1 基本概念
4.2 基本遗传算法?
4.3遗传算法应用举例
4.4遗传算法的特点与优势
4.1基本概念
1.个体与种群?
●个体就是模拟生物个体而对问题中的对象(一般就是问题的解)的一种称呼,一个个体也就是搜索空间中的一个点。
●种群(population)就是模拟生物种群而由若干个体组成的群体, 它一般是整个搜索空间的一个很小的子集。
2.适应度与适应度函数?
●适应度(fitness)就是借鉴生物个体对环境的适应程度,而对问题中的个体对象所设计的表征其优劣的一种测度。
●适应度函数(fitnessfunction)就是问题中的全体个体与其适应度之间的一个对应关系。它一般是一个实值函数。该函数就是遗传算法中指导搜索的评价函数。
3.染色体与基因?
染色体(chromosome)就是问题中个体的某种字符串形式的编码表示。字符串中的字符也就称为基因(gene)。
例如:
个体
9----染色体1001
(2,5,6)----010101110
4.遗传操作?
亦称遗传算子(geneticoperator),就是关于染色体的运算。遗传算法中有三种遗传操作:●选择-复制(selection-reproduction)
●交叉(crossover,亦称交换、交配或杂交)●变异(mutation,亦称突变)
选择-复制通常做法是:对于一个规模为N的种群S,按每个染色体xi∈S的选择概率P(xi)所决定的选中机会,分N次从S中随机选定N个染色体,并进行复制。
这里的选择概率P(xi)的计算公式为
P(xi)?f(xi)
N?f(x)j
j?1
交叉就是互换两个染色体某些位上的基因例如,设染色体s1=01001011, s2=10010101, 交换后4位基因, 即
s1′=01000101,s2′=10011011可以看做是原染色体s1和s2的子代染色体
。
变异就是改变染色体某个(些)位上的基因。
例如, 设染色体s=11001101
将其第三位上的0变为1, 即
s→s′。
s′也可以看做是原染色体s的子代染色体
4.2 基本遗传算法
算法中的一些控制参数:
■种群规模
■最大换代数
交叉率(crossoverrate)就是参加交叉运算的染色体个数占全体染色体总数的比例,记为Pc,取值范围一般为0.4~0.99。?■
变异率(mutationrate)是指发生变异的基因位数所占全体染色体的基因总位数的比例,记为Pm,取值范围一般为0.0001~0.1。■
基本遗传算法
步1在搜索空间U上定义一个适应度函数f(x),给定种群规模N,交叉率Pc和变异率Pm,代数T;
步2随机产生U中的N个个体s1,s2,…,sN,组成初始种群S={s1,s2,…,sN},置代数计数器t=1;
步3计算S中每个个体的适应度f();
步4若终止条件满足,则取S中适应度最大的个体作为所求结果,算法结束。
步5 按选择概率P(xi)所决定的选中机会,每次从S中随机选定1个个体并将其染色体复制,共做N次,
然后将复制所得的N个染色体组成群体S1;
步6 按交叉率Pc所决定的参加交叉的
染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得
群体S2;
步7按变异率Pm所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;
步8 将群体S3作为新一代种群,即用S3代替S,
t = t+1,转步3;
4.3 遗传算法应用举例
例4.1利用遗传算法求解区间[0,31]上的二次函数y=x2的最大值。
分析
原问题可转化为在区间[0, 31]中搜索能使y取最大值的点a的问题。那么,[0, 31]中的点x就是个体, 函数值f(x)恰好就可以作为x的适应度,区间[0, 31]就是一个(解)空间。这样, 只要能给出个体x的适当染色体编码, 该问题就可以用遗传算法来
解决。
解?
(1)设定种群规模,编码染色体,产生初始种群。将种群规模设定为4;用5位二进制数编码染色体;取下列个体组成初始种群S1:
s1=13(01101),s2=24(11000)
s3=8(01000),
(2)定义适应度函数,
取适应度函数:f(x)=x2s4=19(10011)
(3) 计算各代种群中的各个体的适应度, 并对其染色体进行遗传操作,直到适应度最高的个体(即31(11111))出现为止。?
首先计算种群S1中各个体s1= 13(01101), s2= 24(11000)s3= 8(01000), s4= 19(10011)
的适应度f (si) 容易求得
2 f (s1) = f(13) = 13= 169
f (s2) = f(24) = 242 = 576
f (s3) = f(8) = 82 = 64f (s4) = f(19) = 192 = 361
再计算种群S1中各个体的选择概率。选择概率的计算公式为
P(xi)?f(xi)
?f(x)j
j?1N
P(s1) = P(13) = 0.14P(s2) = P(24) = 0.49 P(s3) = P(8) = 0.06P(s4) = P(19) = 0.31
●赌轮选择法
赌轮选择示意
在算法中赌轮选择法可用下面的子过程来模拟:?①在[0,1]区间内产生一个均匀分布的随机数r。
②若r≤q1,则染色体x1被选中。?
③若qk-1<r≤qk(2≤k≤N),则染色体xk被选中。其中的qi称为染色体xi(i=1,2,…,n)的积累概率,其计算公式为
qi??P(xj)
j?1i
选择-复制
设从区间[0, 1]中产生4个随机数如下:
r1 = 0.450126, r2 = 0.110347 r3 = 0.572496, r4 = 0.98503
染色体适应度
169
576
64
361选择概率0.140.490.060.31积累概率0.140.630.691.00选中次数1201s1=01101s2=11000s3=01000s4=10011
于是,经复制得群体:
s1’=11000(24), s2’=01101(13)s3’=11000(24), s4’=10011(19)
交叉
设交叉率pc=100%,即S1中的全体染色体都参加交叉运算。
设s1’与s2’配对,s3’与s4’配对。分别交换后两位基因,得新染色体:
s1’’=11001(25), s2’’=01100(12)s3’’=11011(27), s4’’=10000(16)
变异
设变异率pm=0.001。
这样,群体S1中共有
5×4×0.001=0.02位基因可以变异。
0.02位显然不足1位,所以本轮遗传操作不做变异。
于是,得到第二代种群S2:
s1=11001(25), s2=01100(12)s3=11011(27), s4=10000(16)
第二代种群S2中各染色体的情况
染色体适应度
625
144
729
256选择概率0.360.080.410.15积累概率0.360.440.851.00估计的选中次数1021s1=11001s2=01100s3=11011s4=10000
假设这一轮选择-复制操作中,种群S2的4个染色体被选中,则得到群体
s1’=11001(25), s2’= 01100(12)s3’=11011(27), s4’= 10000(16)
做交叉运算,让s1’与s2’,s3’与s4’分别交换三位基因,得
s1’’=11100(28), s2’’= 01001(9)s3’’=11000(24), s4’’= 10011(19)
这一轮仍然不会发生变异
于是,得第三代种群S3:s1=11100(28), s2=01001(9)s3=11000(24), s4=10011(19)
第三代种群S3中各染色体的情况
染色体适应度
784
81选择概率0.440.04积累概率0.440.48估计的选中次数20s1=11100s2=01001
s3=11000
s4=100115763610.320.200.801.0011
设这一轮的选择-复制结果为:
s1’=11100(28), s2’=11100(28)s3’=11000(24), s4’=10011(19)
做交叉运算,让s1’与s4’,s2’与s3’分别交换后两位基因,得s1’’=11111(31), s2’’=11100(28)
s3’’=11000(24), s4’’=10000(16)
这一轮仍然不会发生变异
于是,得第四代种群S4:s1=11111(31), s2=11100(28)s3=11000(24), s4=10000(16)
显然,在这一代种群中已经出现了适应度最高的染色体s1=11111。于是,遗传操作终止,将染色体“11111”作为最终结果输出。
然后,将染色体“11111”解码为表现型,即得
所求的最优解:31。
将31代入函数y=x2中,即得原问题的解,即函数
2y=x的最大值为961。
第二代种群及其适应度第三代种群及其适应度第四代种群及其适应度
4.4 遗传算法的特点与优势
遗传算法的主要特点?
——遗传算法一般是直接在解空间搜索,而不像图搜索那样一般是在问题空间搜索,最后才找到解。
——遗传算法的搜索随机地始于搜索空间的一个点集,而不像图搜索那样固定地始于搜索空间的初始节点或终止节点,所以遗传算法是一种随机搜索算法。
——遗传算法总是在寻找优解, 而不像图搜索那样并非总是要求优解, 而一般是设法尽快找到解,
所以遗传算法又是一种优化搜索算法。
——遗传算法的搜索过程是从空间的一个点集(种群)到另一个点集(种群)的搜索,而不像图搜索那样一般是从空间的一个点到另一个点地搜索。因而它实际是一种并行搜索, 适合大规模并行计算,而且这种种群到种群的搜索有能力跳出局部最优解。
——遗传算法的适应性强,除需知适应度函数外,几乎不需要其他的先验知识。?
——遗传算法长于全局搜索,它不受搜索空间的限制性假设的约束,不要求连续性,能以很大的概率从离散的、多极值的、含有噪声的高维问题中找到全局最优解
遗传算法的应用
遗传算法在人工智能的众多领域便得到了广泛应用。例如,机器学习、聚类、控制(如煤气管道控制)、规划(如生产任务规划)、设计(如通信网络设计、布局设计)、调度(如作业车间调度、机器调度、运输问题)、配置(机器配置、分配问题)、组合优化(如TSP、背包问题)、函数的最大值以及图像处理和信号处理等等。
另一方面,人们又将遗传算法与其他智能算法和技术相结合,使其问题求解能力得到进一步扩展和提高。例如,将遗传算法与模糊技术、神经网络相结合,已取得了不少成果。
本文标题:
遗传算法matlab程序-遗传算法matlab程序 本文地址:
http://www.61k.com/1122148.html