多方式进化遗传算法Matlab源代码【精品毕业设计】(完整版)
- 格式:doc
- 大小:62.50 KB
- 文档页数:9
多方式进化遗传算法Matlab源代码 对于单种群进化,多方式进化是提高全局搜索能力和收敛速度的一种有效策略 该程序采用: 编码:二进制编码、实数编码(默认) 选择:非线性排名选择(主要表现在前期),锦标赛选择(主要表现在后期,含精英保留),由于单纯的转轮盘选择存在诸多弊端,这里没有采用 交叉:二进制编码采用多点交叉和均匀交叉,并逐步增大均匀交叉概率 实数编码采用离散交叉(前期)、算术交叉(中期)、AEA重组(后期)
变异:二进制编码采用随机变异 实数编码采用两种自适应变异和两种随机变异,且尽量采用前者 到位:适当的到位可以提高种群的多样性
function [X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSize,options,pCross,pMutation,pInversion) % [X,MaxFval,BestPop,Trace]=fga(FUN,bounds,MaxEranum,PopSize,options,pCross,pMutation,pInversion) % Finds a maximum of a function of several variables. % fga solves problems of the form: % max F(X) subject to: LB <= X <= UB % BestPop - 最优的群体即为最优的染色体群 % Trace - 每代最佳个体所对应的目标函数值 % FUN - 目标函数 % LB - 自变量下限 % UB - 自变量上限 % eranum - 种群的代数,取50--500(默认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; %检验初始参数 if nargin<2, error('FMAXGA requires at least three input arguments'); end if nargin==2, MaxEranum=100;PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==3, PopSize=100;options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==4, options=[1 1e-4];pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==5, pCross=0.85;pMutation=0.1;pInversion=0.25;end if nargin==6, pMutation=0.1;pInversion=0.25;end if nargin==7, pInversion=0.25;end
if (options(1)==0|options(1)==1)&find((bounds(:,1)-bounds(:,2))>0) error('数据输入错误,请重新输入:'); end %s=sprintf('程序运行需要约%.4f 秒钟时间,请稍等......',(eranum*popsize/1000)); %disp(s);
% 定义全局变量 global m n NewPop children1 children2 VarNum
% 初始化种群和变量 precision = options(2); bits = ceil(log2((bounds(:,2)-bounds(:,1))' ./ precision));%由设定精度划分区间 VarNum = size(bounds,1); [Pop] = InitPop(PopSize,bounds,bits,options);%初始化种群 [m,n] = size(Pop); fit = zeros(1,m); NewPop = zeros(m,n); children1 = zeros(1,n); children2 = zeros(1,n); pm0 = pMutation; BestPop = zeros(MaxEranum,n);%分配初始解空间BestPop,Trace Trace = zeros(1,MaxEranum); Lb = ones(PopSize,1)*bounds(:,1)'; Ub = ones(PopSize,1)*bounds(:,2)';
%二进制编码采用多点交叉和均匀交叉,并逐步增大均匀交叉概率 %浮点编码采用离散交叉(前期)、算术交叉(中期)、AEA重组(后期) OptsCrossOver = [ones(1,MaxEranum)*options(1);... round(unidrnd(2*(MaxEranum-[1:MaxEranum]))/MaxEranum)]';
%浮点编码时采用两种自适应变异和一种随机变异(自适应变异发生概率为随机变异发生的2倍) OptsMutation = [ones(1,MaxEranum)*options(1);unidrnd(5,1,MaxEranum)]';
if options(1)==3 D=zeros(n); CityPosition=bounds; D = sqrt((CityPosition(:, ones(1,n)) - CityPosition(:, ones(1,n))').^2 +... (CityPosition(:,2*ones(1,n)) - CityPosition(:,2*ones(1,n))').^2 ); end
%========================================================================= % 进化主程序 % %========================================================================= eranum = 1; while(eranum<=MaxEranum) for j=1:m if options(1)==1 %eval(['[fit(j)]=' FUN '(Pop(j,:));']);%但执行字符串速度比直接计算函数值慢 fit(j)=feval(FUN,Pop(j,:));%计算适应度 elseif options(1)==0 %eval(['[fit(j)]=' FUN '(b2f(Pop(j,:),bounds,bits));']); fit(j)=feval(FUN,(b2f(Pop(j,:),bounds,bits))); else fit(j)=-feval(FUN,Pop(j,:),D); end end [Maxfit,fitIn]=max(fit);%得到每一代最大适应值 BestPop(eranum,:)=Pop(fitIn,:); Trace(eranum)=Maxfit; if options(1)==1 Pop=(Pop-Lb)./(Ub-Lb);%将定义域映射到[0,1]:[Lb,Ub]-->[0,1] ,Pop-->(Pop-Lb)./(Ub-Lb) end
switch round(unifrnd(0,eranum/MaxEranum))%进化前期尽量使用实行锦标赛选择,后期逐步增大非线性排名选择 case {0} [selectpop]=TournamentSelect(Pop,fit,bits);%锦标赛选择 case {1} [selectpop]=NonlinearRankSelect(Pop,fit,bits);%非线性排名选择 end
[CrossOverPop]=CrossOver(selectpop,pCross,OptsCrossOver(eranum,:));%交叉
[MutationPop]=Mutation(CrossOverPop,fit,pMutation,VarNum,OptsMutation(eranum,:)); %变异 %[MutationPop]=Mutation(selectpop,fit,pMutation,VarNum,OptsMutation(eranum,:)); %变异
[InversionPop]=Inversion(MutationPop,pInversion);%倒位
%更新种群 if options(1)==1 Pop=Lb+InversionPop.*(Ub-Lb);%还原Pop else Pop=InversionPop; end pMutation=pm0+(eranum^3)*(pCross/2-pm0)/(eranum^4); %逐步增大变异率至1/2交叉率 eranum=eranum+1; end
% 格式化输出进化结果和解的变化情况 t=1:MaxEranum; plot(t,Trace); title('函数优化的遗传算法'); xlabel('进化世代数'); ylabel('每一代最优适应度'); [MaxFval,MaxFvalIn]=max(Trace); if options(1)==1|options(1)==3 X=BestPop(MaxFvalIn,:); elseif options(1)==0 X=b2f(BestPop(MaxFvalIn,:),bounds,bits); end X,MaxFval hold on; plot(MaxFvalIn,MaxFval,'*'); text(MaxFvalIn+5,MaxFval,['FMAX=' num2str(MaxFval)]); str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得最优值 %f\n对应个体是:%s',... MaxFvalIn,num2str(X),MaxFval,num2str(BestPop(MaxFvalIn,:))); disp(str1);