遗传算法(Genetic Algorithm)

遗传算法(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)j)
        gbest(j,:)=pop(j,:);
        fitnessgbest(j)=fitness(j);
        end
        %群体最优更新
        if fitness(j)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
    end
end
individuals=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
    end
ret=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,:));
    end
end
ret=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)i,1)||code(i)>bound(i,2)
        flag=0;
    end
end

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

你可能感兴趣的:(算法优化)