进化算法介绍及实现(遗传算法)

进化算法也可以称为遗传算法。进化算法的求解过程是模拟大自然生物进化的过程,通过“适者生存,劣者 淘汰”的规则不断进化,直到找到最优解或者达到终止条件。详细的介绍可以百度或者查看论文在这不做过多的介绍
进化算法的实现可以想象为“上帝”,通过控制种群的选择,杂交,变异策略,不断优化种群的过程。


文章目录

  • 进化算法介绍及实现(遗传算法)
  • 一、进化计算的简介
  • 二、进化计算的基本要素
    • 1. 个体的编码
    • 2.适应值函数
    • 3.父代选择策略
    • 4.变化算子
    • 5.新一代的种群选择
    • 6.种群的初始化
    • 7.终止条件
  • 三、进化算法的实现
    • 1. Matlab代码实现框架
    • 2. 测试结果

一、进化计算的简介

进化计算的详细介绍大家可以百度或者查看知网论文了解,这个只大致介绍。以下为进化算法的基本框架的流程图:

二、进化计算的基本要素

进化计算的结构尽管比较简单,但每一部分的不同处理方式,都会影响算法 的效率和最终结果,进化算法有以下 7 个主要的要素。

1. 个体的编码

常见的编码方式有二进制编码和实数编码,本文的采用的就是实数编码。

2.适应值函数

在进化算法中,适应函数是用于评价种群中的每个个体,是进行父代种群选 择的依据,也是选择新一代种群的依据,适应度函数会影响种群多样性和算法的

3.父代选择策略

父代选择的目的是希望较好的父代个体进行杂交和变异操作后,期望能够得 到更好的后代。不同的父代选择方式会影响到算法的收敛速度;若是每次都选择 最好的个体作为父代,算法容易陷入局部最优。而如果选择压力过小,即个体较 好的较少被选择成为父代,虽然可以保持种群的多样性,增加算法收敛到最优的 概率,但算法的收敛速度会缓慢,可能在达到终止条件时也求不出最优解[7]。 所以保持一个适当的选择父代的压力是一个重要问题。一般来说,算法的初 始阶段宜采用较低的选择压力,这有利于扩展搜索空间,而在算法的后期,宜采 用较大的选择压力,这有利于算法找到更好的解。 常见的父代选择方式有轮盘赌选择,锦标赛选择,基于排名的选择方式等等。

4.变化算子

变化算子主要有:杂交算子和变异算子。
(1)杂交算子 杂交算子是将两个个体的信息进行组合,产生一个或者多个后代。杂交算子 是期望通过重组较好的父代的信息得到更好的后代。一般是通过两个父代之间进 行杂交产生两个新的个体。杂交的方式有多种,采用不同的杂交方式对算法的收 敛和算法的效率也同样有很大的影响。
(2)变异算子 变异算子是改变一个个体的某个染色体的信息,得到一个新的个体,其目的 是通过引入一个新的信息增加种群的多样性,扩大搜索空间,避免让算法陷入局 部最优。

5.新一代的种群选择

新一代种群选择的作用是从当代的种群和父代所产生的后代中选择出一组 个体以形成新一代种群。一般新一代种群选择是通过适应值比较,按照当代种群 中所有个体的适应值排序,然后选取最好的个体形成下一代。

6.种群的初始化

种群的初始化可以在可行域的空间中随机生成,或者通过佳点集策略在可行 域中生成均匀分布的种群,也可以使用启发式方法初始化种群,使算法可以更快 的得到相对较优的解。

7.终止条件

一般算法的终止条件有以下几种[7]:
(1) 算法的执行时间达到预先指定的最大运行时间。
(2) 算法计算个体的适应值的总数达到预先指定的最大次数。
(3) 算法的进化次数达到预先指定的最大代数。
(4) 在算法连续若干代以后,个体适应值没有明显的变化。
(5) 种群的多样性降到某个预先指定的阈值。
算法的实际终止条件可能是上述的若干条件的析取,但最常用是预先指定一 个最大的代数。

三、进化算法的实现

这里进化算法的实现采用MATLAB,测试函数采用Hedar库的测试函数——求解函数最小值。实现方法比较简单,可以当做一个参考内容,并没有考虑太多的优化效果。
Hedar test set中的测试函数,参见
链接: http://www-optima.amp.i.kyoto-u.ac.jp/member/student/hedar/Hedar_files/TestGO_files/Page364.htm.

这里放两张函数的三维模型看看:


1. Matlab代码实现框架

因为这里是求解函数的最小值,编码规则就选择实数编码。

1. 种群初始化
简单点,这里选择随机初始化种群的方法。

%初始化种群大小
% 种群大小popsize:设置种群大小
% 维度dim:个体的维度
% 取值范围bounds:每个个体每一维的取值范围
function pop=initpop(popsize,dim,bounds)
p = rand(popsize,dim); %随机生成popsize*dim的0-1矩阵
for i = 1:dimp(:,i) = p(:,i)*(bounds(i,2)-bounds(i,1))+bounds(i,1);
end
pop = p;
end

2. 计算个体适应值

%计算函数适应值,先对函数值进行求倒,为了防止函数值为0的情况,先加上0.001,最后对进行归一化处理
function [fitvalue] = calfitvalue(objvalue)
value = 1./(objvalue+0.001);
Max = max(value);
Min = min(value);
fitvalue = (value-Min)/(Max-Min);
end

3. 父代个体的选择
这里采用最简单的方式选择父代个体,选择适应值最大的前N个个体为父代种群,进行后续的杂交和变异。这样做的一个优点是可以加快种群的进化速度,缺点是容易陷入局部最优,要做到一个更好的优化效果建议采用其他策略。

function [newpop] = selection(pop,fitvalue)
%pop:种群
%fitvalue:种群每个个体对应的适应值
[~,index]= sort(fitvalue,'descend');
[x,y] = size(pop);
newpop = zeros(x,y);
for i = 1:ceil(x/1.2) newpop(i,:) = pop(index(i),:);
end
end

4. 个体杂交方法
个体杂交方式也采用比较简单的方案,在父代种群中随机选择两个个体进行杂交,根据杂交概率是否进行杂交。生成一个杂交因子n,父代1乘以n加上父代2乘以(1-n);第二个子代交换顺序相乘。最后将父代和子代合并称为一个新的种群,进行下一步的变异。

%交叉变换
% pop:种群
% pc:杂交概率,用于决定所选的两个个体是否进行交叉变换--杂交
function [newpop] = crossover(pop,pc)
[px,~] = size(pop);
newpop = pop;
childpop = [];
for i = 1:pxx = ceil(rand(1,2)).*px;  %生成两个随机数选择个体进行交换生成新个体if(rand<pc) n = rand;newpop1 = pop(x(1),:).*n+pop(x(2),:)*(1-n);newpop2 = pop(x(1),:).*(n-1)+pop(x(2),:)*n;  childpop = [childpop ;newpop1; newpop2];end
end
newpop = [newpop;childpop];%和并父代种群和子代个体
end

5. 个体变异方法
遍历每一个个体,遍历个体的的每一个基因(维度),根据变异概率决定该基因是否变异。

%变异算子
% pop:种群
% pc:变异概率,个体单个基因(维度)变异的概率
function [newpop] = mutation(pop,pm,bounds)
[px,py] = size(pop);
newpop = pop;
for i = 1:pxfor j = 1:pyif(rand<pm) % 小于pm,变异,变异为取值范围内的随机值newpop(i,j) = rand * (bounds(j,2)-bounds(j,1))+bounds(j,1);endend
end
end

6. 新一代种群选择
在当前种群中根据适应值排序选择新一代种群

function [newpop] = updatepop(pop,popsize,fitvalue)
[px,py] = size(pop);
if px<=popsizenewpop = pop;return;
end
newpop = zeros(popsize,py);
[~,index]= sort(fitvalue,'descend');
for i = 1:popsizenewpop(i,:) = pop(index(1),:);
end
end

7. 计算函数值

在这里就不计算所有的Hedar库的所有函数了,Hedar共有27个函数,有些函数有多个不同维度可以计算。在这里就随便几个函数和对应的维度测试。

function y = calfun(x)
global  fvals nfev nprob  %用于保存函数值历史和计算次数
switch nprobcase 1y = ackley(x); %2dcase 2y = ackley(x); %5dcase 3y = ackley(x); %10dcase 4y = ackley(x); %20dcase 5y = beale(x);case 6y = bh1(x);case 7y = bh2(x);case 8y = bh3(x);case 9y = booth(x); %case 10y = branin(x);end
nfev = nfev + 1;%保存计算次数

8. 最佳个体计算函数

function [bestindividual,bestfit] = best(pop,fitvalue,bestindividual,bestfit)
[px,~] = size(pop);
if isempty(bestindividual) % 初始种群bestindividual = pop(1,:);bestfit = fitvalue(1);
end
for i = 1:pxif fitvalue(i)<bestfit % 最小化问题bestindividual = pop(i,:);bestfit = fitvalue(i);end
end
end

8. 主函数

function bestfit = myGA_2(bounds,popsize,pc,pm)
% bounds 搜索区域
% popsize 种群大小
% pc 杂交概率
% pm 变异概率
global nfev maxnfev  % 函数值计算次数、最大函数值计算次数
if nargin<2popsize = 200; % 种群大小
end
if nargin<3pc = 0.8;%杂交概率
end
if nargin<4pm = 0.05;%变异概率
end[dim,~] = size(bounds);
pop = initpop(popsize,dim,bounds);%初始种群
objvalue = zeros(popsize,1);
bestindividual = [];
bestfit = [];
while nfev<maxnfevfor j=1:size(pop,1)objvalue(j) = calfun(pop(j,:));% 评估种群适应值endfvalue = calfitvalue(objvalue);%寻找最优解[bestindividual,bestfit] = best(pop,objvalue,bestindividual,bestfit);%更新种群[newpop,newfvalue] = updatepop(pop,popsize,fvalue);%选择操作pop = selection(newpop,newfvalue);%交叉操作newpop = crossover(pop,pc);%变异操作pop = mutation(newpop,pm,bounds);
end
end

9. 测试函数

function [H] = testMyGA()
% H : 算法求解Hedar库的测试结果,只保存最佳结果。如果有需要保存其他数据,请自行添加,改造函数
% N : 问题维数向量
% c: 描述要比较的算法编号global nfev nprob maxnfev  %用于计算次数、问题编号、最大函数值计算次数maxnfev = 50000;  % 最大函数值计算次数
nfev = 0;       % 函数值计算次数初值
maxnp = 10;     % 测试函数个数
maxrun = 2;    % 运行多少次算法,适用于随机算法;随机算法,每次计算的结果都不一致。
H = ones(maxrun ,maxnp);
for nprob=1:maxnpfprintf('Begin to test the %3d th problem\n',nprob);bounds = getbounds(nprob);popsize = 100;pc = 0.6; pm = 0.05;for r = 1:maxrunbestfit = myGA_2(bounds,popsize,pc,pm);nfev = 0;     H(r,nprob) = bestfit;end
end
clear global
end%每个问题的取值范围
function [bounds] = getbounds(nprob)
switch nprobcase 1bounds = [-15*ones(2,1) 30*ones(2,1)];case 2  bounds = [-15*ones(5,1) 30*ones(5,1)];case 3bounds = [-15*ones(10,1) 30*ones(10,1)];case 4bounds = [-15*ones(20,1) 30*ones(20,1)];case 5bounds = [-4.5*ones(2,1) 4.5*ones(2,1)];case 6bounds = [-80*ones(2,1) 125*ones(2,1)]; % 与hedar的界不同,左边乘以0.8,右边除以0.8case 7bounds = [-80*ones(2,1) 125*ones(2,1)]; % 与hedar的界不同,左边乘以0.8,右边除以0.8case 8bounds = [-80*ones(2,1) 125*ones(2,1)]; % 与hedar的界不同,左边乘以0.8,右边除以0.8case 9bounds = [-10*ones(2,1) 10*ones(2,1)];case 10bounds = [-5 10;0 15];
end
end

2. 测试结果

这个测试结果是函数计算次数才5W次,运行一次所得的结果,由于结果我只保存小数点后四位,基本上只有第5,9,10函数与最优解有一定的差距,想要缩短差距,可以设置更大函数计算次数,计算多次以及改进进化策略。

函数名 维度 最优解 测试结果
ackley 2 0 0
ackley 5 0 0
ackley 10 0 0
ackley 20 0 0
beale 2 0 0.0060
bh1 2 0 0
bh2 2 0 0
bh3 2 0 0
booth 2 0 0.0066
branin 2 0.397887 0.3991

进化算法框架的介绍及Matlab实现(遗传算法)相关推荐

  1. Python遗传和进化算法框架(二)Geatpy库函数和数据结构

    上一篇讲了Geatpy的快速入门:https://blog.csdn.net/qq_33353186/article/details/82014986 但是光是几个例子是远远不能熟练掌握python遗 ...

  2. Python遗传算法库和进化算法框架(二)Geatpy库函数和数据结构

    (转载自https://blog.csdn.net/qq_33353186/article/details/82020507) 上一篇讲了Geatpy的快速入门:https://blog.csdn.n ...

  3. 遗传算法 python 简书_基于DEAP库的Python进化算法从入门到入土—(二)简单遗传算法实现...

    前言 在上一篇中,我们已经介绍了如何在DEAP中实现进化算法的基本操作,在这一篇中我们试图将各个操作组装起来,用进化算法解决一个简单的一元函数寻优问题. 进化算法实例 - 一元函数寻优 问题描述与分析 ...

  4. C语言 | 卡尔曼滤波器算法1——应用介绍(Matlab simulink)

    github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================== ...

  5. 基于思维进化算法优化BP神经网络(Matlab代码实现)

  6. 【数据处理】合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)(Matlab代码实现)

  7. 【图像压缩】基于matlab香农熵和差分进化算法多级图像阈值图像压缩【含Matlab源码 2035期】

    一.差分进化算法简介 1 前言 在遗传.选择和变异的作用下,自然界生物体优胜劣汰,不断由低级向高级进化和发展.人们注意到,适者生存的进化规律可以模式化,从而构成一些优化算法:近年来发展的进化计算类算法 ...

  8. MATLAB差分进化算法求解超市物流配送选址问题实例

    差分进化算法编程问题实例: MATLAB差分进化算法求解超市物流配送中心选址问题代码实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要 ...

  9. 算法代码_Python进化算法之多目标优化与代码实战

    前言 自从上三篇博客详细讲解了Python遗传和进化算法工具箱及其在带约束的单目标函数值优化中的应用.利用遗传算法求解有向图的最短路径.利用进化算法优化SVM参数之后,这篇不再局限于单一的进化算法工具 ...

最新文章

  1. 4.html 头部随笔
  2. WaitForSingleObject和WaitForMultipleObjects用法
  3. Apache架构师的30条设计原则!
  4. 解决gpg failed to sign the data fatal: failed to write commit object解决方案
  5. 安装了vmware tools后,自动调整大小-自动适应客户机仍为灰色(终极解决方案)
  6. c++ 纯虚函数导出
  7. iPhone 15 Pro有望实现屏下面容识别 三星已在研发相关技术
  8. python中对象和类的关系_Python面向对象之类与类之间的关系
  9. matlab自带优化工具箱,二元一次函数
  10. 出外旅游,应该如何换汇最划算——人民币兑换外币手续费成本最低经验谈,如美元澳元日元欧元英镑新元港币...
  11. 电脑热点的连接问题(基于现有IPhone12)
  12. android手游直播怎么推流,安卓手机直播,Total Control手游投屏教程
  13. 【论文写作】——懒人怎么进行论文排版?文献引用怎么引?图表题注怎么加?怎么一键更新全文?如何添加目录、图录、表录?
  14. C++:this指针的简单理解
  15. org.apache.http.NoHttpResponseException: failed to respond-服务端响应异常
  16. ICP是什么意思?ICP备案和ICP证有什么不同?
  17. 当前DOS用户界面的设计
  18. Zabbix监控理论详解
  19. Adobe 产品注册机
  20. 易优cms安装环境要求

热门文章

  1. JavaScript面向对象和ES6笔记
  2. MySQL去重字段后查询所有信息
  3. 英语论文夹注以及文献格式
  4. Linux: security: Selinux
  5. Solr的自动完成/自动补充实现介绍(第三部分)
  6. 正则匹配 符合以什么开头以什么结尾的
  7. 前端(一)html、css-学习笔记整理
  8. 有电脑就可以干的工作有哪些?试试这些项目
  9. 云会议发展势如破竹 谁会成为最大赢家
  10. go语言需要web服务器么,使用Go开发web服务器