遗传算法工具箱
一. 遗传算法简介:
官网:http://www.geatpy.com/tutorials
遗传算法是以自然选择和遗传理论为基础,将生物进化过程中适者生存规则与群体内部染色体的随机信息交换机制相结合的高效全局寻优搜索算法。
这样解释对于广大的初学者而言是既神秘又高大上的。实际上,我们可以这样理解:遗传算法可以解决传统的目标优化问题,但是,它摒弃了传统的搜索方式(如遍历搜索、枚举搜索等等),取而代之地采用一种基于搜索目标的“进化”搜索,即模拟了生物变异的随机性、遗传性,使得每一代的“搜索”跟前一代相比,既可能有共性(遗传),又可能有新的特征(变异)。遗传算法的搜索是“一代一代”地进行的,经过一定次数的搜索后,可以得出接近于搜索目标的结果(自然选择)。
遗传算法十分强大,但想很好地驾驭它,除了在深入研究其原理的阶段外,平常的使用中我们应该使用框架去实现。
Python上有一个简单易学的高性能遗传算法库:Geatpy,其用法跟Matlab的gatbx基本相同,很容易上手。同时支持gatbx所不支持的多目标优化,支持更多的遗传和进化算法的算子,使用MKL高性能矩阵库,性能上比Matlab高近一个数量级。相关的介绍参见https://blog.csdn.net/qq_33353186/article/details/82014986以及github:https://github.com/geatpy-dev/geatpy,
Geatpy由华南理工大学、华南农业大学、德州奥斯汀公立大学学生团队联合开发,是一款权威的高性能实用型遗传和进化算法库。官网:http://www.geatpy.com
三. Matlab遗传算法工具箱:
这里matlab本身自带一个遗传算法工具箱,但其影响性和简易性不及Sheffield大学推出的Gatbx遗传算法工具箱。而这个工具箱事实上已经过时了,效率低,而且支持的算法极少,推荐使用Python的Geatpy。
工具箱的主要函数及功能简介如下:
函数 |
功能 |
|
创建种群 |
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 inpiduals)
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年左右,作者就停止对其的后续支持了。
鉴于众多著名的人工智能库都对Python语言有更好的支持,其权威性和实用性远比Matlab好,覆盖面也更广。最重要的是开源免费。此外,Python的numpy矩阵库的相关语法跟Matlab极为类似,并且,Python写的程序更容易与正在进行的其他项目相结合,比如C++调用Python、java调用Python,或者是其他工程设计软件调用Python脚本等等,远比Matlab写遗传算法来应用到其他项目要方便。
因此,一支由华南理工大学、华南农业大学、德州奥斯汀公立大学的学生联合团队,研发出Python上权威的遗传和进化算法库——Geatpy。其代码风格、库函数命名及相关用法与大家熟悉的gatbx工具箱类似,可以无缝过渡到使用Python的Geatpy来进行遗传算法的学习、研究和应用。Geatpy的内核同样是mkl高性能矩阵库,相关测试表明Geatpy在性能上有出色的表现。
更重要的是,Geatpy提供简单实用的进化算法框架,用户可以调用内置的进化算法模板,也可以自定义模板来实现新的改进的进化算法。下面展示使用Geatpy的单目标优化算法解决一个约束优化问题:
问题抽象成模型描述如下:
根据博客 https://blog.csdn.net/qq_33353186/article/details/82917477,我们采用降维的方法处理这个含等式约束条件的问题模型。我们利用x3 = 1 - x1 - x2实现降维。此时成功将等式约束条件转化成了x1 + x2 <= 1这个不等式约束条件,此时由于x3 = 1 - x1 - x2 必定小于1,因此降维后模型是等价于原模型的。
使用Python的Geatpy遗传算法库解决上述问题极为简单:
# -*- coding: utf-8 -*-
"""Geatpy使用实例-main.py"""
import numpy as np
import geatpy as ga
# 定义目标函数
def aimfuc(Phen):
x1 = Phen[:, [0]]
x2 = Phen[:, [1]]
x3 = 1 - x1 - x2 # 将x1 + x2 + x3 = 1的等式约束降维化处理
f = 4 * x1 + 2 * x2 + x3
return f
# 定义罚函数
def punishing(Phen, FitnV):
x1 = Phen[:, [0]]
x2 = Phen[:, [1]]
x3 = 1 - x1 - x2
# 约束条件
idx1 = np.where(2 * x1 + x2 > 1)[0]
idx2 = np.where(x1 + 2 * x3 > 2)[0]
idx3 = np.where(x1 + x2 > 1)[0]
# 惩罚
FitnV[idx1] = 0
FitnV[idx2] = 0
FitnV[idx3] = 0
exIdx = np.unique(np.hstack([idx1, idx2, idx3])) # 得到非可行解在种群中的下标
return [FitnV, exIdx]
# 执行脚本
if __name__ == "__main__":
AIM_M = __import__('main') # 获取目标函数地址
PUN_M = __import__('main')# 获取罚函数地址
# 变量设置
x1 = [0, 1] # 自变量1的范围
x2 = [0, 1] # 自变量2的范围
b1 = [1, 1] # 自变量1是否包含下界
b2 = [1, 1] # 自变量2是否包含上界
ranges = np.vstack([x1, x2]).T # 生成自变量的范围矩阵
borders = np.vstack([b1, b2]).T # 生成自变量的边界矩阵
precisions = [2] * 2 # 自变量的编码精度,由于控制变量是连续型的,并且算法模板中使用实值编码,因此这里设置成大于0的任意值即可
FieldDR = ga.crtfld(ranges, borders, precisions) # 生成区域描述器
# 调用编程模板
[pop_trace, var_trace, times] = ga.sga_new_real_templet(AIM_M, 'aimfuc', PUN_M,'punishing', FieldDR, problem = 'R', maxormin = -1, MAXGEN = 100, NIND = 50, SUBPOP = 1, GGAP = 0.9, selectStyle = 'tour', recombinStyle = 'xovdprs', recopt = 0.9, pm = 0.3)
执行结果如下:
最优的目标函数值为:2.5
最优的控制变量值为:
0.5
0.0
最优的一代是第 45, 代
时间已过 0.7719943523406982, 秒
更多Geatpy的案例详见https://github.com/geatpy-dev/geatpy/tree/master/geatpy/demo
Geatpy是高性能的,其性能远高于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
相关阅读
Photoshop所有版本中,最经典的版本就是CS6了,本教程着重讲解Photoshop CS6版本安装及破解详细步骤,并给出Photoshop CS6,如需要可在下
广告系统设计与实现(九) 9.1 Kafka 基础知识 9.1.1 消息系统 点对点消息系统:生产者发送一条消息到queue,一个queue可以有很
实现自动化安装操作系统我们仍需要插入光盘来引导,现在很多服务器已经没有光驱,那么此时我们就无法用光盘引导,如果要实现光盘引导安
教程 ios 4 以上安装mobile terminal的最简单方法
这个版本在ios 4 以上使用很稳定,不会出现闪退现象~下面是怎么修改密码:(更改Mobile 权限 )输入指令 passwdold password : alpine
参考链接:Ubuntu 16.04安装QQ国际版图文详细教程 安装包下载: 链接: https://pan.baidu.com/s/19Pf7T1X_Kucj-C