遗传算法(Genetic Algorithm)

来源:互联网 发布:网站整站优化方案 编辑:程序博客网 时间:2024/05/18 15:28

遗传算法(Genetic Algorithm)是借鉴生物界的进化规律(适者生存,优胜劣汰)演化而来的随机优化搜寻算法。
主要特点:
1 GA从由很多的个体组成的一个初始化群体开始最优化的搜索过程.
2 遗传算法的选择,交叉,变异等运算都是以一种概率的方式进行的
3 具有并行的特点,适合大规模复杂问题的优化

主要算法:

1. 种群的创建. 这个是最开始需要做的. 定义一个种群包括多少个体,一个个体包含多少的染色体,个体的适应度(fitness). 这步骤之后,需要选择全局最优适应度和个体最佳适应度(这个群体本身).

popsize=100; %种族规模(个体的数量,表示有100个染色体)lenchrom=7;  %变量字符串长度,一个个体染色体数量%染色体的取值范围popmax=50;popmin=0;bound=[popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax;popmin popmax];%产生1个群体,群体还有100个个体for i=1:popsize    GApop(i,:)=Code(lenchrom,bound);   %随机产生个体    fitness(i)=fun(GApop(i,:));        %染色体的适应度end
function ret=Code(lenchrom,bound)%将变量编码为染色体,随机初始化一个群体flag=0;while flag==0    pick=rand(1,lenchrom);    ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick;     flag=test_here(lenchrom,bound,ret);end
%初始化%找到最好的染色体[bestfitness bestindex]=min(fitness);zbest=GApop(bestindex,:); %全局最优gbest=GApop;              %个体最佳fitnessgbest=fitness;     %个体最佳适应值(最优的一个个体)fitnesszbest=bestfitness; %全局最佳适应度值(最优的一个整体)

2.迭代寻优.定义了种群进化的次数,每一次进化,个体的选择,染色体的交叉和变异就会出现。每一次的迭代寻优,个体最佳适应值和全局最佳适应值就会被计算和筛选.

%迭代寻优,对100个种群,迭代100次maxgen=100;  %进化次数for i=1:maxgen    i    %种群的更新,GA选择更新    GApop=Selection(GApop,fitness,popsize);    %交叉操作GA    GApop=CrossGA(pc,lenchrom,GApop,popsize,bound);    %变异操作GA变异    GApop=Mutation(pm,lenchrom,GApop,popsize,[i,maxgen],bound);    pop=GApop;    %适应值判断    for j=1:popsize        if 0.072*pop(j,1)+0.063*pop(j,2)++0.057*pop(j,3)+0.05*pop(j,4)+0.032*pop(j,5)+0.0442*pop(j,6)+0.0675*pop(j,7)<=264.4       if 128*pop(j,1)+78.1*pop(j,2)++64.1*pop(j,3)+43*pop(j,4)+58.1*pop(j,5)+36.9*pop(j,6)+50.5*pop(j,7)<=69719                fitness(j)=fun(pop(j,:));            end        end        %个体最优更新,保存所有最优的个体到一个群体中        if fitness(j)<fitnessgbest(j)        gbest(j,:)=pop(j,:);        fitnessgbest(j)=fitness(j);        end        %群体最优更新        if fitness(j)<fitnesszbest            zbest=pop(j,:);            fitnesszbest=fitness(j);        end    end    y(i)=fitnesszbest;     end

3种群的更新GA,选择更新.对每个种群,都会筛选个体根据个体的适应性。一个个体的适应性越高,被选择的机会越大和次数越多.

function ret=Selection(individuals, fitness, sizepop)%对每一代个体进行选择,已进行后面的交叉和变异fitness=1./fitness;sumfitness=sum(fitness);sumf=fitness./sumfitness;index=[];%转100次转盘,选择个体for i=1:sizepop    pick=rand;    while pick==0;        pick=rand;    end    for j=1:sizepop        pick=pick-sumf(j);        if pick<0            index=[index j];            %落入区间的个体被选择和可能重复的选择某些个体。            break;        end    endendindividuals=individuals(index,:);fitness=fitness(index);ret=individuals;

4交叉操. 让两个个体的染色体的交换,从而改变个体的适应性.

pc=0.7;      %交叉概率function ret=CrossGA(pcross,lenchrom,chrom, sizepop, bound)    for i=1:sizepop    %随机选择两个个体的染色体进行交叉        pick=rand(1,2);        if prod(pick)==0            pick=rand(1,2);        end        index=ceil(pick.*sizepop);        %决定是否交叉        pick=rand;        while pick==0            pick=rand;        end        if pick>pcross %(小于交叉函数,交叉)           continue;        end        flag=0;        while flag==0            pick=rand;            while pick==0                pick=rand;            end            %选交叉的位置,对于两个个体的染色体,交叉位置相同            pos=ceil(pick*lenchrom);            pick=rand;            v1=chrom(index(1),pos);            v2=chrom(index(2),pos);                   chrom(index(1),pos)=pick*v2+(1-pick)*v1;            chrom(index(2),pos)=pick*v1+(1-pick)*v2;            flag1=test_here(lenchrom,bound, chrom(index(1),:));%检验交叉的可行性            flag2=test_here(lenchrom,bound, chrom(index(2),:));            if flag1*flag2==0%不可行,重新交叉                flag=0;            else flag=1;            end        end    endret=chrom;

5 变异操作. 让个体的染色体的变异,从而改变个体的适应性.

pm=0.3;      %变异概率function ret=Mutation(pmutation, lenchrom, chrom, sizepop,pop,bound)%本函数完成变异操作for i=1:sizepop    pick=rand;    while pick==0        pick=rand;    end    pick=rand;    if pick>pmutation%变异概率是否进行        continue;%变异概率不进行    end    %变异概率进行    flag=0;    while flag==0        pick=rand;        while pick==0            pick=rand;        end        %随机选择位置        pos=ceil(pick*lenchrom);        v=chrom(i,pos);%获得当前群体的的第i个体的第pos位置        v1=v-bound(pos,1);        v2=bound(pos,2)-v;        pick=rand;        %变异        if pick >0.5            delta=v2*(1-pick^((1-pop(1)/pop(2))^2));            chrom(i,pos)=v+delta;        else             delta=v1*(1-pick^((1-pop(1)/pop(2))^2));            chrom(i,pos)=v-delta;        end        flag=test_here(lenchrom, bound, chrom(i,:));    endendret=chrom;
%%可行性检验function flag=test_here(lenchrom, bound, code)[n,m]=size(code);flag=1;[n,m]=size(code);for i=1:n    if code(i)<bound(i,1)||code(i)>bound(i,2)        flag=0;    endend

Reference
MATLAB 智能算法超级学习手册

1 0
原创粉丝点击