php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 605|回复: 0

matlab 遗传算法

[复制链接]

3138

主题

3148

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7946
贡献
0
注册时间
2021-4-14
最后登录
2024-11-21
在线时间
763 小时
QQ
发表于 2022-6-5 20:58:40 | 显示全部楼层 |阅读模式
[mw_shl_code=applescript,true]function [Result,Solution]=GA(FUN,MaxT,popsize,pCross,pMutation)

D=10;
NP=popsize;


%% 初始化种群
[XPop]=InitPop_GA(NP,D);                   %初始化种群

%% 最好值初始化
Fit_best=inf;        % 适应值
X_best=[];           % 解

%% 循环代数
NC=1;
while NC<=MaxT                       
    % NC
    %% 求所有个体适应值
    value=feval(FUN,XPop);        
    %% 更新全局最优解
    [f_best,index]=min(value);           
    if f_best<Fit_best
        Fit_best=f_best;               
        X_best=XPop(index,;               
    end
   % Fit_best     
    %% 遗传操作
    [SelectPop]=NonlinearRankSelect(XPop,value);            %选择
    [CrossPop]=CrossOver(SelectPop,pCross);               %交叉
    [MutationPop]=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)>(1)>...>(n), sum(P(i))=1
function [selectpop]=NonlinearRankSelect(pop,value)

[m,n]=size(pop);
selectpop=zeros(m,n);
fit=value;
%
selectprob=1-fit/sum(fit);                      %计算各个体相对适应度(0,1)??????(最小化)
q=min(selectprob);                              %选择最优的概率
x=zeros(m,2);
x(:,1)=[m:-1:1]';                            %名次
[y,x(:,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;
while newIn<=m
    if rNums(newIn)<newfit(fitIn)
        selectpop(newIn,=pop(fitIn,;
        newIn=newIn+1;
    else
        fitIn=fitIn+1;
    end
end
end

%% 交叉
function [NewPop]=CrossOver(OldPop,pCross)
%OldPop为父代种群,pcross为交叉概率

[m,n]=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:2len-1)
       %opts=unidrnd(2);
       opts=1;
       if opts==1
           [NewPop(A(i),,NewPop(A(i+1),]=CrossOver_1(OldPop(A(i),,OldPop(A(i+1),);         
       elseif opts==2
           [NewPop(A(i),,NewPop(A(i+1),]=CrossOver_2(OldPop(A(i),,OldPop(A(i+1),:));
       end
   end     
end
NewPop(B,:)=OldPop(B,:);

end
[/mw_shl_code]

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-22 04:02 , Processed in 0.284186 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表