一. 遗传算法简介:
遗传算法是以自然选择和遗传理论为基础,将生物进化过程中适者生存规则与群体内部染色体的随机信息交换机制相结合的高效全局寻优搜索算法。
这样解释对于广大的初学者而言是既神秘又高大上的。实际上,我们可以这样理解:遗传算法可以解决传统的目标优化问题,但是,它摒弃了传统的搜索方式(如遍历搜索、枚举搜索等等),取而代之地采用一种基于搜索目标的“进化”搜索,即模拟了生物变异的随机性、遗传性,使得每一代的“搜索”跟前一代相比,既可能有共性(遗传),又可能有新的特征(变异)。遗传算法的搜索是“一代一代”地进行的,经过一定次数的搜索后,可以得出接近于搜索目标的结果(自然选择)。
二. Python上的遗传算法框架:
遗传算法十分强大,但想很好地驾驭它,除了在深入研究其原理的阶段外,平常的使用中我们应该使用框架去实现。Python上有个比较好用的遗传和进化算法框架:geatpy。相关的用法参见https://blog.csdn.net/qq_33353186/article/details/82014986
三. 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