一. 遗传算法简介:
官网:http://www.geatpy.com/tutorials
遗传算法是以自然选择和遗传理论为基础,将生物进化过程中适者生存规则与群体内部染色体的随机信息交换机制相结合的高效全局寻优搜索算法。
这样解释对于广大的初学者而言是既神秘又高大上的。实际上,我们可以这样理解:遗传算法可以解决传统的目标优化问题,但是,它摒弃了传统的搜索方式(如遍历搜索、枚举搜索等等),取而代之地采用一种基于搜索目标的“进化”搜索,即模拟了生物变异的随机性、遗传性,使得每一代的“搜索”跟前一代相比,既可能有共性(遗传),又可能有新的特征(变异)。遗传算法的搜索是“一代一代”地进行的,经过一定次数的搜索后,可以得出接近于搜索目标的结果(自然选择)。
二. Python上的遗传算法框架:
遗传算法十分强大,但想很好地驾驭它,除了在深入研究其原理的阶段外,平常的使用中我们应该使用框架去实现。
Python上有一个简单易学的高性能遗传算法库:Geatpy,其用法跟Matlab的gatbx基本相同,很容易上手。同时支持gatbx所不支持的多目标优化,支持更多的遗传和进化算法的算子,使用C内核和MKL高性能矩阵库,性能上比Matlab高两个数量级。相关的介绍参见https://blog.csdn.net/qq_33353186/article/details/82014986以及github:https://github.com/geatpy-dev/geatpy,
经过全面改版后,新版Geatpy2目前由华南农业大学、暨南大学、华南理工等本硕博学生联合团队开发及维护。是一款权威的高性能实用型遗传和进化算法工具箱。官网:http://www.geatpy.com
三. Matlab遗传算法工具箱:
matlab本身自带一个遗传算法工具箱,但其影响性和简易性不及Sheffield大学推出的Gatbx遗传算法工具箱。而这个工具箱事实上已经过时了,效率低、效果差,但这里还是稍微讲一下:
工具箱的主要函数及功能简介如下:
| 函数 | 功能 |
创建种群 | crtbase | 创建基向量 |
crtbp | 创建任意离散随机种群 | |
crtrp | 创建实值初始种群 | |
适应度计算 | ranking | 常用的基于秩的适应度计算 |
scaling | 比率适应度计算 | |
选择函数 | reins | 一致随机和基于适应度的重插入 |
rws | 轮盘选择 | |
select | 高级选择例程 | |
sus | 随机遍历采样 | |
变异算子 | mut | 离散变异 |
mutate | 高级变异函数 | |
mutbga | 实值变异 | |
交叉算子 | recdis | 离散重组 |
recint | 中间重组 | |
reclin | 线性重组 | |
recmut | 具有变异特征的线性重组 | |
recombin | 高级重组算子 | |
xovdp | 两点交叉算子 | |
xovdprs | 减少代理的两点交叉 | |
xovmp | 通常多点交叉 | |
xovsh | 洗牌交叉 | |
xovshrs | 减少代理的洗牌交叉 | |
xovsp | 单点交叉 | |
xovsprs | 减少代理的单点交叉 | |
子种群的支持 | migrate | 在子种群间交换个体 |
实用函数 | bs2rv | 二进制串到实值的转换 |
rep | 矩阵的复制 |
gatbx工具箱的较为详细的用法可以参考《matlab遗传算法工具箱及应用》一书。下面先来介绍如何安装该工具箱:
gatbx工具箱下载链接:http://download.csdn.net/download/qq_33353186/10252240
安装步骤:把gatbx.rar解压至matlab安装目录下的toolbox文件夹里。运行matlab,在设置路径里添加该gatbx工具箱即可。
测试代码:
%% matlab_gatbx_test.m
%遗传算法求f(x)=x*sin(10*pi*x)+2.0,在[-1,2]上的最大值
figure(1);
fplot(@(variable)variable.*sin(10*pi*variable)+2.0,[-1,2]); %画出函数曲线
%定义遗传算法参数
NIND=40; %个体数目(Number of individuals)
MAXGEN=25; %最大遗传代数(Maximum number of generations)
PRECI=20; %变量的二进制位数(Precision of variables)
GGAP=0.9; %代沟(Generation gap)说明子代与父代的重复率为0.1
trace=zeros(MAXGEN,2); %寻优结果的初始值
FieldD=[20;-1;2;1;0;1;1]; %区域描述器(Build field descriptor),第2、3行为自变量的下界和上界
Chrom=crtbp(NIND, PRECI); %定义初始种群
gen=0; %代计数器
variable=bs2rv(Chrom, FieldD); %计算初始种群的十进制转换
ObjV=shang(variable); %计算目标函数值
while gen<MAXGEN %进化MAXGEN代
FitnV=ranking(-ObjV); %分配适应度值(Assign fitness values)ranking函数的功能就是目标值越小的分配值越大,
%本例求解最大值,应该要是他的适应度值更大,故必须使得ranking内的数越小,这样分配的适应度值才能大
SelCh=select('sus', Chrom, FitnV, GGAP); %选择,使用sus方式,也可以改用rws方式
SelCh=recombin('xovsp', SelCh, 0.7); %重组,选用xovsp方式
SelCh=mut(SelCh); %变异
variable=bs2rv(SelCh, FieldD); %子代个体的十进制转换,把染色体变为十进制
ObjVSel=shang(variable); %计算子代的目标函数值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新种群
variable=bs2rv(Chrom, FieldD); %子代个体的十进制转换,转为十进制
gen=gen+1; %代计数器增加
%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
[Y, I]=max(ObjV);hold on;
plot(variable(I), Y, 'ro');
trace(gen,1)=max(ObjV); %遗传算法性能跟踪,把当代的最优值放入trace矩阵的第一行第目前代数列
trace(gen,2)=sum(ObjV)/length(ObjV); %把当代种群目标函数的均值,放入trace矩阵的第二行第目前代数列
end
variable=bs2rv(Chrom, FieldD); %最优个体的十进制转换,转回十进制,以便输出
hold on;
grid on;
plot(variable,ObjV,'b*');
figure(2);
plot(trace(:,1)); %把trace矩阵的第一列画出来(记录的是每一代的最优值)
hold on;
plot(trace(:,2),'-.');grid %把trace矩阵的第2列画出来(记录的是每一代种群目标函数均值)
legend('解的变化','种群均值的变化')
function z=shang(x) % 目标函数的核心部分(即缺省了优化目标的纯函数)
z=x.*sin(10*pi*x)+2.0;
end
%运行结果:
gatbx工具箱(直接可用版)下载链接:http://download.csdn.net/download/qq_33353186/10252240
事实上,gatbx早已在2003年就被国外淘汰了。gatbx的核心作者在gatbx的基础上进一步写成了GEATbx遗传算法工具箱。该工具箱更加全面地支持遗传算法,同时支持多目标优化。然而,该工具箱是闭源的,金额昂贵,因此也只兴起了5年左右,作者就停止对其的后续支持了。建议大家就不要再入坑了。
在AI时代、工业4.0时代,还是极力推荐使用Python。
Python的Geatpy是高性能的,由于MKL矩阵库和C内核的加持,其性能远高于matlab遗传算法工具箱及类似的诸如gatbx、GEATbx、gaot等第三方工具箱。尤其适合需要应用遗传或其他进化算法求解建模问题、与当前的其他项目结合、抑或是需要一个平台来从事进化算法研究与实验的用户。
Geatpy官网:http://www.geatpy,com
项目及源码:https://github.com/geatpy-dev/geatpy
相关博客:
https://blog.csdn.net/qq_33353186/article/details/82014986
https://blog.csdn.net/qq_33353186/article/details/82020507(待更新)
https://blog.csdn.net/qq_33353186/article/details/82021750(待更新)
https://blog.csdn.net/qq_33353186/article/details/82047692(待更新)