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

原文地址:https://www.cnblogs.com/semen/p/6903795.html