计算智能----遗传算法

    遗传算法(Genetic algorithm)是一种随即自适应全局搜索算法,遗传算法吸收了生命科学与工程科学的理论成果,用于解决复杂优化问题。

     在遗传算法中,每个问题的解被称为染色体,染色体的具体形式是一种使用特定编码方式生成的编码串,编码串中的每一个编码单元称为基因。遗传算法通过比较染色体的适应值来区分优劣,适应值越大的染色体越优秀。

     评估函数用来计算染色体的适应值。

     选择算子按照一定的规则对群体的染色体进行选择,得到父代种群。一般的,越优秀的染色体被选中的次数越多。

     交配算子作用于每两个成功交配的染色体,染色体交换各自部分基因,产生两个子代染色体。子代染色体取代父代染色体进入新种群,没有交配的染色体直接进入新种群。

     变异算子使新种群进行小概率变异。染色体发生变异的基因改变数值,得到新的染色体。经过变异的新种群进入下一次进化。 

     遗传算法的基本要素:

    群体:问题搜索空间的一组有效解

    种群:经过选择产生的新群体

    染色体:问题有效解的编码串

    基因:染色体的一个编码单元

    适应能力:染色体的适应值

    交配:两个染色体交换部分基因得到新的染色体

    变异:染色体某些基因的数值发生改变

    进化结束:算法满足终止条件时结束,输出全局最优解

    遗传算法的实现主要包含以下七个问题:

   1、染色体编码问题----怎样对问题的解进行编码

   2、群体的初始化

   3、适应值的评价----评估函数一般为待优化函数,但是结束条件若无明确约束则为迭代次数

   4、选择种群----根据适应值来进行种群的选择,要考虑选择压力的问题,避免快速收敛,再多变量多目标问题选择压力的影响中尤为明显

   5、种群交配

   6、种群变异

   7、算法流程

   这几个问题中尤其是选择算子、交配算子、变异算子的具体实现与算法全局搜索最优解密切相关。在处理不同问题时,对上述三个算子有不同的策略。

    染色体编码:目前有格雷码编码、字母编码、多参数交叉编码。两种常用的编码是二进制编码和浮点数编码。

    二进制编码需要知道问题的解空间的最大值Umax和最小值Umin,采用L位二进制编码的精度为(Umax-Umin)/(2^L-1),L为编码长度,要采用较高精度时需要增加编码长度,但由此也带来计算量的增大。

    浮点数编码,染色体长度等于问题定义解的变量个数,染色体的每一位基因等于解的每一维变量。

    群体初始化:一般群体初始化采用取随机值进行初始化。

    选择算子:种群选择操作一般有轮盘赌选择方法和锦标赛选择方法。轮盘赌能够大概率的选中适应值优的染色体,锦标赛则是保留最优方法,二选一。

    交配算子:每个染色体能否交配由交配概率决定,Pc一般取值0.4~0.99之间。随机选择交配位置。

    变异算子:变异也由变异概率决定,采用生成随机数来判断,随机选择变异位置。

    matlab的具体实现:

    计算智能----遗传算法_第1张图片

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Name:   genetic algorithm
% Author: yang fang jian 17888841302 
% Time:   2018 09 15
% Version: beta
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
% initial index
CrossRate = 0.88;
Mutation = 0.05;
nm = 20;
count = 0;
popsize = 20;
% initial population
max_generation = 10000;
x = rand(popsize,7);
pro_x =x;
while count < max_generation
    count = count+1;
g = 200*((x(:,3)-0.5).^2+ (x(:,4)-0.5).^2 + (x(:,5)-sin(0.5.*x(:,1).*pi).*sin(0.5.*x(:,2).*pi)).^2 + (x(:,6)-0.5).^2 + (x(:,7)-0.5).^2);
f = (cos(0.5.*x(:,1).*pi).*cos(0.5.*x(:,2).*pi)).^4.*(1+g);
% evaluate
best = min(f);
seq = find(f==min(f));
x_best = x(seq(1),:);
% computing accumulate probability
Sum_f = sum(f);
for i=1:1:popsize
    p(i)=1-(f(i)/Sum_f);
end
%selection 
for j =1:1:popsize
    r = rand();
    m = 0;
    for i = 1:1:popsize
        m = m + p(i);
        if m > r
            selection(j) = i;
            break;
        end
    end
end
%Crossover
for i = 1:1:popsize
    cross = rand();
    if cross > 1-CrossRate
        m(i) = 1;
    else
        m(i) = 0;
    end
end
temp = find(m==1);
max_cross = max(temp);
if mod(max_cross,2) == 1
    max_cross = max_cross-1;
end
for i = 1:1:max_cross
    if m(i) == 1
       position(i)=floor(rand()*6);
       for j = i:1:popsize
           if m(j) == 1
              new_x(i,:)=x(i,:);
              for k =7-position(i):1:7
                  x(i,k)=x(j,k);
                  x(j,k)=new_x(i,k);
              end
              i = j;
              break;
            end
        end
     end
end 
%mutation

for i = 1:1:popsize
    cross = rand();    
    if cross < CrossRate
        u = rand();
        pos=floor(rand()*6)+1;
        delta1 = (x(i,pos)-min(x(i,:)))/(max(x(i,:))-min(x(i,:)));
        delta2 = (pro_x(i,pos)-x(i,pos))/(max(x(i,:))-min(x(i,:)));
        if u < 0.5
           delta = (2*u+(1-u)*(1-delta1).^nm).^(1/(1+nm))-1;
        else
           delta = 1-(2*(1-u)+2*(u-0.5)*(1-delta2).^(nm+1)).^(1/(1+nm));
        end
        x(i,pos)=x(i,pos)+delta*(max(x(i,:))-min(x(i,:)));
    end
    pro_x = x;
end
plot(count,best,'r*')
hold on;
grid on;
end

 

你可能感兴趣的:(遗传算法matlab实现)