admin 发表于 2022-6-5 20:58:40

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]
查看完整版本: matlab 遗传算法