基本遗传算法(GA)的算法原理、步骤、及Matlab实现

来源:互联网 发布:java split 编辑:程序博客网 时间:2024/05/09 08:40

算法原理

遗传算法可以用来求函数的极值。
(1)用二进制编码来离散自变量,码长根据离散精度来确定。码长为log2[maxmin)/+1]
(2)交叉方法采用单点交叉
(3)变异是根据变异概率反转子代某个位的值
(4)选择策略采用轮盘赌策略,令PPi=ij=1pi,PP0=0,其中PPi为累计概率,pi为个体的选择概率,公式为:pi=fitness(xi)NPi=1fitness(xi),其中fitnessxi为个体的适应度,共轮转NP次,每次轮转时,产生随机数r,当PPi1<=r<PPi时选择个体i

算法步骤

基本遗传算法的基本步骤是:

  1. 随机产生种群,
  2. 用轮盘赌策略确定个体的适应度,判断是否符合优化准则,若符合,输出最佳个体及其最优解,结束,否则,进行下一步
  3. 依据适应度选择再生个体,适应度高的个体被选中的概率高,适应度低的个体被淘汰
  4. 按照一定的交叉概率和交叉方法,生成新的个体
  5. 按照一定的变异概率和变异方法,生成新的个体
  6. 由交叉和变异产生新一代种群,返回步骤2

算法的实现

%基本遗传算法,一维无约束优化function [ xv,fv ] = mGA( fitness,a,b,NP,NG,Pc,Pm,eps )% 待优化的目标函数:fitness% 自变量下界:a% 自变量上界:b% 种群个体数:NP% 最大进化代数:NG% 杂交常数:Pc% 变异常数:Pm% 自变量离散精度:eps% 目标函数取最大值是的自变量值:xv% 目标函数的最小值:fvL=ceil(log2((b-a)/eps+1)); %码长x=zeros(NP,L);for i=1:NP    x(i,:)=Initial(L);    fx(i)=fitness(Dec(a,b,x(i,:),L));endfor k=1:NG    sumfx=sun(fx);    Px=fx/sumfx;    PPx=0;    PPx(1)=Px(1);    for i=2:NP  %根据轮盘赌确定父亲        PPx(i)=PPx(i-1)+PPx(i);    end    for i=1:NP        sita=rand();        for n=1:NP            if sita <= PPx(n)                SelFather = n;                break;            end        end        Selmother=floor(rand()*(NP-1))+1;   %随机选择母亲        posCut=floor(rand()*(L-2))+1;   %随机确定交叉点        r1=rand();        if r1<=Pc            nx(i,1:posCut)=x(SelFather,1:posCut);            nx(I,(posCut+1):L)=x(Selmother,(posCut+1):L);            r2=rand();            if r2<=Pm    %变异                posMut=round(rand()*(L-1)+1);                nx(i,posMut)=~nx(i,posMut);            end        else            nx(i,:)=x(SelFather,:);        end    end    x=nx;    for i=1:NP        fx(i)=fitness(Dec(a,b,x(i,:),L);    endendfv=-inf;for i=1:NP    fitx=fitness(Dec(a,b,x(i,:),L));    if fitx > fv        fv=fitx;        xv=Dec(a,b,x(i,:),L);    endendendfunction result=Initial(length)     %初始化函数    for i=1:length        r=round();        result(i)=round(r);    endendfunction y=Dec(a,b,x,L)     %二进制转十进制    base=2.^((L-1):-1:0);    y=dot(base,x);    y=a+y*(b-1)/(2^L-1)'end
1 0