[Evolutionary Algorithm] 进化算法简介


  进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”。进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编码,种群初始化,交叉变异算子,经营保留机制等基本操作。与传统的基于微积分的方法和穷举方法等优化算法(具体介绍见博客[Math] 常见的几种最优化方法中的其他数学优化方法)相比,进化计算是一种 成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织、自适应、自学习的特性,能够不受问题性质的限制,有效地处理传统优化算法难以解决的复杂问题(比如NP难优化问题)。

除了上述优点以外,进化算法还经常被用到多目标问题的优化求解中来,我们一般称这类进化算法为进化多目标优化算法(MOEAs)。目前进化计算的相关算法已经被广泛用于参数优化、工业调度、资源分配、复杂网络分析等领域。

1. 遗传算法(Genetic Algorithm,GA)

遗传算法(Genetic Algorithm,简称GA)是一种最基本的进化算法,它是模拟达尔文生物进化理论的一种优化模型,最早由J.Holland教授于1975年提出。遗传算法中种群分每个个体都是解空间上的一个可行解,通过模拟生物的进化过程,从而在解空间内搜索最优解。

遗传算法的基本操作可以用下图来描述:

在这里插入图片描述
  个体的编码方式确定以后,针对上图操作的具体描述如下:

Step 1 种群初始化:根据问题特性设计合适的初始化操作(初始化操作应尽量简单,时间复杂度不易过高)对种群中的N个个体进行初始化操作;

Step 2 个体评价:根据优化的目标函数计算种群中个体的适应值(fitness value);

Step 3 迭代设置:设置种群最大迭代次数gmax,并令当前迭代次数g=1;

Step 4 个体选择:设计合适的选择算子来对种群P(g)个体进行选择,被选择的个体将进入交配池中组成父代种群FP(g),用于交叉变换以产生新的个体。选择策略要基于个体适应值来进行,假如要优化的问题为最小化问题,那么具有较小适应值的个体被选择的概率相应应该大一些。常用的选择策略有轮盘赌选择,锦标赛选择等。

Step 5 交叉算子:根据交叉概率pm(预先指定,一般为0.9)来判断父代个体是否需要进行交叉操作。交叉算子要根据被优化问题的特性来设计,它是整个遗传算法的核心,它被设计的好坏将直接决定整个算法性能的优劣。

Step 6 变异算子:根据变异概率pc(预先指定,一般为0.1)来判断父代个体是否需要进行变异操作。变异算子的主要作用是保持种群的多样性,防止种群陷入局部最优,所以其一般被设计为一种随机变换。

通过交叉变异操作以后父代种群FP(g)生成了新的子代种群P(g+1),令种群迭代次数g=g+1,进行下一轮的迭代操作(跳转到Step 4),直至迭代次数达到最大的迭代次数。

为了更形象说明交叉操作的作用,我们以下图为例来深入理解一下交叉操作的作用:

在这里插入图片描述

通过交叉操作,原始的两个个体组合生成了两个新的个体组合,这就相当于在解空间进行搜索,每个个体都是解空间的一个可行解。

遗传算法matlab代码如下:

主函数main.m

% This example is used to explain the GA.
%  max f(x1, x2) = 21.5 + x1·sin(4pi*x1) + x2·sin(20pi*x2)
%  s.t.    -3.0 <=  x1 <= 12.1
%           4.1 <=  x2 <= 5.8
clc; clear all;
M = 40;N = 33;
generation = 1000;
it = 1;
pm = 0.05;%变异概率
pc = 0.8;%交叉概率
maxdata = -200;
pop = round(rand(M,N));%初始化矩阵,产生初始种群                      
x1 = decode_x1(pop(:,1:18));  %对x1 x2进行解码
x2 = decode_x2(pop(:,19:end));
fitness = 21.5 + x1.*sin(4*pi*x1) +x2.*sin(20*pi*x2);%适应度函数
while it < generation
    [B] = seclection(fitness,pop);%轮盘赌选择
    [newpop] = crossover(pc,B);%交叉
    [B] = mutation(pm,newpop);%变异操作
    pop = B;
    x1 = decode_x1(pop(:,1:18));
    x2 = decode_x2(pop(:,19:end));
    fitness = 21.5 + x1.*sin(4*pi*x1) +x2.*sin(20*pi*x2);%计算适应度
    [fit_best,index] = max(fitness);%本代中的最优目标值
    if fit_best >= maxdata
        maxdata = fit_best;
        verter = pop(index,:);
        x_1 = decode_x1(verter(1:18));
        x_2 = decode_x2(verter(19:end));
    end
    num(it) = maxdata;
    it = it + 1;
end
disp(sprintf('max_f=:%.6f',num(it-1)));%输出最优解
disp(sprintf('x_1=:%.5f  x_2=:%.5f',x_1,x_2));%最优解对应的x1 x2的值
figure(1)   
plot(num,'k');%绘制图形

变量x1的编码函数:decode_x1.m

function x1= encode(code)
[M,N] = size(code);
sum = zeros(N);
for i=1:M
    for j=1:N
        sum(i)=sum(i)+code(i,j)*2^(N-j);
    end
    x1(i) = -3.0 + sum(i)*(12.1-(-3.0))/(2^N - 1);
end

变量x2的编码函数:decode_x2.m

function x2=encode_x2(code)
[M,N] = size(code);
sum = zeros(N);
for i=1:M
    for j=1:N
        sum(i)=sum(i)+code(i,j)*2^(N-j);
    end
    x2(i) = 4.1 + sum(i)*(5.8 - 4.1)/(2^N - 1);
end

轮盘赌选择函数:seclection.m

%轮盘赌选择

    function [B]=seclection(fitness,A)
        [M,N]=size(A);
        fit_sum = sum(fitness);
        for i = 1:M
            probability(i) = fitness(i)/fit_sum;
        end
        for i = 2:M
            probability(i) =probability(i) + probability(i-1);
        end
        for j = 1:M
            p = rand();
            i = 1;
            while p > probability(i)
                  i = i+1;
            end
            B(j,:) = A(i,:);
        end

个体交叉算子:crossover.m

%交叉
function [newpop]=crossover(pc,A)
newpop=A;
[M,N]=size(A);
    for i= 1:2:M-1
        if rand < pc
            p = ceil(rand()*N);
            for j= p:N
                ch = A(i,j);
                newpop(i,j) = A(i+1,j);
                newpop(i+1,j) = ch;
            end
        end
    end

个体变异算子:mutation.m

%变异

function [newpop]=mutation(pm,A)
[M,N]=size(A);
newpop=A;
W = rand(M,N)<pm;
    for i=1:M
        for j=1:N
            if W(i,j) ==1
               if A(i,j)~=1
                  newpop(i,j)= 1;
               else
                  newpop(i,j) = 0;
               end
           end
       end
    end

2. 文化基因算法(Memetic Algorithm,MA)

文化基因算法(Memetic Algorithm,简称MA),也被称为是“密母算法”,它是由Mpscato在1989年提出的。文化基因算法是一种基于种群的全局搜索和基于个体的局部启发式搜索的结合体,它的本质可以理解为:

Memetic = GA + Local Search

即memetic算法实质上为遗传算法加上一个局部搜索(Local Search)算子。局部搜索算子可以根据不同的策略进行设计,比如常用的爬山机制、模拟退火、贪婪机制、禁忌搜索等。

3. 进化多目标优化算法(Multi-Objective Evolutionary Algorithm,MOEA)

对于一个优化问题而言,如果其只有一个目标方程,那么我们称之为单目标优化问题;而一旦方程个数达到两个或者两个以上,那么它被相应的称之为多目标优化问题(Multi-objective Optimization Problems,简称为MOPs)。

对于一个多目标优化问题而言,问题的最优解可能不止一个,而应该是一组,我们通常称这组最优解为相应多目标优化问题的一个非支配解集,或者称为是Pareto解集,其中的每一个解我们称之为Pareto解(Pareto是引自一个经济学的术语)。求解多目标优化问题的解法有很多,比如常见的目标规划方法,目标分解方法,目标化多为少方法(将多个目标表示为一个)等。进化算法在解决多目标问题上有着天然的优势,对于一个进化多目标优化算法而言,它可以对多个目标函数同时进行优化,而且输出一组非支配的Pareto解集,从而可以有效地求解多目标问题。

下图为一个具有两目标的多目标优化问题的Pareto解集示意图:

在这里插入图片描述
  常用的进化多目标优化算法有Deb提出基于拥挤度距离度量的NSGA-II,张青富老师提出的基于分解思想的MOEA/D算法,以及西电公老师提出的基于免疫克隆机制的NNIA算法等。最近,Deb等人在NSGA-II的基础上又提出一种针对2~16个目标函数同时优化的高维问题的NSGA-III算法,对进化多目标优化感兴趣的博友可以深入的看看相关的参考文献,这方面的内容还是很有意思的。

4. 参考文献

[1] 进化多目标优化算法研究,软件学报,2009.

[2] Messy genetic algirithms: Motivation, analysis, and first results. Complex systems, 1989.

[3] Genetic algorithms in search, optimization, and mechine learning. Addion wesley, 1989.

[4] A fast and elitist multiobjective genetic algorithm: NSGA-II. IEEE Transaction on Evolutionary Computation, 2002.

  • 26
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和你在一起^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值