zoukankan      html  css  js  c++  java
  • ga算法

    ga算法是模拟生物进化过程中,适者生存,优胜劣汰规则的一种算法,ga算子有选择,交叉,变异,个体对环境的适应度用适应度函数来衡量,每个个体对应一个适应度值,选择算子淘汰劣质个体,交叉和变异产生新个体,个体组成的种群不断进化,直到产生最优个体。

    与普通智能算法不同的是ga算法从多个解开始搜索,对多个值同时进行评估,很少会陷入局部最优解,普通智能算法的缺点就是容易陷入局部最优解,例如粒子群算法,每次都只迭代更新一个个体,一旦陷入局部最小值,很难跳出

    下面是matlab实现的ga算法

    function testga()
    size=20;
    chromelen=8;
    lr=0.8;
    mr=0.1;
    pop=init(size,chromelen);
    pop2=binary2int(pop);
    gim=ones(500,8);
    for i=1:50
        fitvalue=calfitvalue(pop);
        newpop=selection(pop,fitvalue);
        renewpop=crossover(newpop,lr);
        uppop=mutation(renewpop,mr);
        [bestindividual,bestfit]=best(uppop,fitvalue);
        gim(i,:)=bestindividual;
        y(i)=bestfit;
        pop=uppop;
    end
    ymax=find(y==max(y));
    ymax=max(ymax);
    tt=gim(ymax,:);
    xmax=binary2int(tt)*2*pi/1023;
    plot(xmax,ymax,'r*');
    hold on;
    fplot('11*sin(6*x)+7*cos(5*x)',[-pi,pi]);
    end
    
    function pop=init(size,chromelen)
    pop=round(rand(size,chromelen));
    end
    
    function pop2=binary2int(pop)
    [px,py]=size(pop);
    for i=1:py
        pop1(:,i)=2.^(py-i).*pop(:,i);
    end
    pop2=sum(pop1,2);
    end
    
    function fitvalue=calfitvalue(pop)
    temp=binary2int(pop);
    x=temp*2*pi/1023;
    fitvalue=11*sin(6*x)+7*cos(5*x);
    end
    
    function newpop=selection(pop,fitvalue)
    sumfit=sum(fitvalue);
    profit=fitvalue/sumfit;
    cumpro=cumsum(profit);
    [px,py]=size(pop);
    randval=sort(rand(px,1));
    newin=1;
    fitin=1;
    while newin<=px
        if randval(newin)<cumpro(fitin)
            newpop(newin,:)=pop(fitin,:);
            newin=newin+1;
        else
            fitin=fitin+1;
        end
    end
    end
    
    function renewpop=crossover(newpop,lr)
    [px,py]=size(newpop);
    renewpop=ones(size(newpop));
    for i=1:2:px-1
        if rand<lr
            c=round(rand*py);
            renewpop(i,:)=[newpop(i,1:c),newpop(i+1,c+1:py)];
            renewpop(i+1,:)=[newpop(i+1,1:c),newpop(i,c+1:py)];
        else
            renewpop(i,:)=newpop(i,:);
            renewpop(i+1,:)=newpop(i+1,:);
        end
    end
    end
    function uppop=mutation(renewpop,mr)
    [px,py]=size(renewpop);
    uppop=ones(size(renewpop));
    for i=1:px
        if rand<mr
            c=round(rand*py);
            if c<=0
                c=1;
            end
            uppop(i,:)=renewpop(i,:);
            if any(uppop(i,c))==0
                uppop(i,c)=1;
            else
                uppop(i,c)=0;
            end
        else
            uppop(i,:)=renewpop(i,:);
        end
    end
    end
    
    function [bestindividual,bestfit]=best(uppop,fitvalue)
    bestindividual=uppop(1,:);
    bestfit=fitvalue(1);
    [px,py]=size(uppop);
    for i=2:px
        if bestfit<fitvalue(i)
            bestfit=fitvalue(i);
            bestindividual=uppop(i,:);
        end
    end
    end
    
    
    
  • 相关阅读:
    hdu 2647 Reward
    hdu 2094 产生冠军
    hdu 3342 Legal or Not
    hdu 1285 确定比赛名次
    hdu 3006 The Number of set
    hdu 1429 胜利大逃亡(续)
    UVA 146 ID Codes
    UVA 131 The Psychic Poker Player
    洛谷 P2491消防 解题报告
    洛谷 P2587 [ZJOI2008]泡泡堂 解题报告
  • 原文地址:https://www.cnblogs.com/semen/p/6903795.html
Copyright © 2011-2022 走看看