遗传算法matlab程序实例.docx

上传人:b****2 文档编号:2247189 上传时间:2022-10-28 格式:DOCX 页数:29 大小:43.63KB
下载 相关 举报
遗传算法matlab程序实例.docx_第1页
第1页 / 共29页
遗传算法matlab程序实例.docx_第2页
第2页 / 共29页
遗传算法matlab程序实例.docx_第3页
第3页 / 共29页
遗传算法matlab程序实例.docx_第4页
第4页 / 共29页
遗传算法matlab程序实例.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

遗传算法matlab程序实例.docx

《遗传算法matlab程序实例.docx》由会员分享,可在线阅读,更多相关《遗传算法matlab程序实例.docx(29页珍藏版)》请在冰豆网上搜索。

遗传算法matlab程序实例.docx

遗传算法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)

%Findsamaximumofafunctionofseveralvariables.

%fmaxgasolvesproblemsoftheform:

%maxF(X)subjectto:

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('FMAXGArequiresatleastthreeinputarguments');end

ifnargin==3,eranum=200;popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end

ifnargin==4,popsize=100;pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end

ifnargin==5,pCross=0.8;pMutation=0.1;pInversion=0.15;options=[01e-4];end

ifnargin==6,pMutation=0.1;pInversion=0.15;options=[01e-4];end

ifnargin==7,pInversion=0.15;options=[01e-4];end

iffind((LB-UB)>0)

error('数据输入错误,请重新输入(LB

');

end

s=sprintf('程序运行需要约%.4f秒钟时间,请稍等......',(eranum*popsize/1000));

disp(s);

globalmnNewPopchildren1children2VarNum

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

forj=1:

m

value(j)=feval(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);%Thewholezeroencodingindividual

fori=2:

popsize-1

pop=round(rand(1,len));

pop=mod(([0pop]+[pop0]),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);%Thewholeoneencodingindividual

%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%解码

function[fval]=b2f(bval,bounds,bits)

%fval-表征各变量的十进制数

%bval-表征各变量的二进制编码串

%bounds-各变量的取值范围

%bits-各变量的二进制编码长度

scale=(bounds(:

2)-bounds(:

1))'./(2.^bits-1);%Therangeofthevariables

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)

globalmn

selectpop=zeros(m,n);

fit=zeros(m,1);

fori=1:

m

fit(i)=feval(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

ifrNum

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1