matlab 遗传算法
function =GA(FUN,MaxT,popsize,pCross,pMutation)D=10;
NP=popsize;
%% 初始化种群
=InitPop_GA(NP,D); %初始化种群
%% 最好值初始化
Fit_best=inf; % 适应值
X_best=[]; % 解
%% 循环代数
NC=1;
while NC<=MaxT
% NC
%% 求所有个体适应值
value=feval(FUN,XPop);
%% 更新全局最优解
=min(value);
if f_best<Fit_best
Fit_best=f_best;
X_best=XPop(index,:);
end
% Fit_best
%% 遗传操作
=NonlinearRankSelect(XPop,value); %选择
=CrossOver(SelectPop,pCross); %交叉
=Mutation(CrossPop,pMutation); %变异
%pMutation=pm0+(i^4)*(pCross/3-pm0)/(eranum^4); %随着种群向前进化,逐步增大变异率至1/2交叉率
%%
XPop=MutationPop; %更新种群
NC=NC+1;
end
Result=Fit_best;
'GA'
Result
Solution=X_best;
end
%% 选择
%采用基于轮盘赌法的非线性排名选择
%各个体成员按适应值从大到小分配选择概率:
%P(i)=(q/1-(1-q)^n)*(1-q)^i,其中 P(0)>P(1)>...>P(n), sum(P(i))=1
function =NonlinearRankSelect(pop,value)
=size(pop);
selectpop=zeros(m,n);
fit=value;
%
selectprob=1-fit/sum(fit); %计算各个体相对适应度(0,1)??????(最小化)
q=min(selectprob); %选择最优的概率
x=zeros(m,2);
x(:,1)='; %名次
=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;
while newIn<=m
if rNums(newIn)<newfit(fitIn)
selectpop(newIn,:)=pop(fitIn,:);
newIn=newIn+1;
else
fitIn=fitIn+1;
end
end
end
%% 交叉
function =CrossOver(OldPop,pCross)
%OldPop为父代种群,pcross为交叉概率
=size(OldPop);
NewPop=zeros(m,n); %交叉后种群
%
r=rand(1,m);
A=find(r<pCross); %用于交叉
B=find(r>=pCross);
len=length(A); % 用于交叉的染色体的条数
if len>2&&mod(len,2)==1 %如果用来进行交叉的染色体的条数为奇数,将其调整为偶数
B(length(B)+1)=A(len); %B 多一个
A(len)=[];
len=len-1;
end
if len>=2
for i=1:2:(len-1)
%opts=unidrnd(2);
opts=1;
if opts==1
=CrossOver_1(OldPop(A(i),:),OldPop(A(i+1),:));
elseif opts==2
=CrossOver_2(OldPop(A(i),:),OldPop(A(i+1),:));
end
end
end
NewPop(B,:)=OldPop(B,:);
end
页:
[1]