遗传算法Matlab源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 (LB=bounds(:,1),UB=bounds(:,2))

% X - 最优个体对应自变量值

% MaxFval - 最优个体对应函数值

% BestPop - 最优的群体即为最优的染色体群

% Trace - 每代最佳个体所对应的目标函数值

% FUN - 目标函数

% bounds - 自变量范围

% MaxEranum - 种群的代数,取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=150;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

% 定义全局变量

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;

H=waitbar(0,'Please wait...');

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);%得到每一代最大适应值

Meanfit(eranum)=mean(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

相关文档
最新文档