在前面几篇文章中,我们已经介绍了高性能Python遗传和进化算法框架——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
本篇就一个案例进行展开讲述:
回顾一下Geatpy的安装方法,在上面的第一个链接的文章里也有详细讲解。
pip install geatpy
我们都听过“无限猴子定理”,说的是有无限只猴子用无限的时间会产生特定的文章。在无限猴子定理中,我们“假定”猴子们是没有像人类那样“智能”的,而且“假定”猴子不会自我学习。因此,这些猴子需要“无限的时间"。
而在遗传算法中,由于采用的是启发式的进化搜索,因此不需要”无限的时间“就可以完成类似的工作。当然,需要产生的文章篇幅越长,那么就需要越久的时间才能完成。
下面以产生"Tom is a little boy."的句子为例,讲述如何利用Geatpy实现句子的搜索。之前的文章中我们已经讲述过如何使用Geatpy的进化算法框架实现遗传算法编程。这里就直接用框架。
编写"main.py”执行脚本,写入以下代码:
# -*- coding: utf-8 -*-
""" *****main.py*****
use GA algorithm to search the sentence: Tom is a little boy.
"""
import numpy as np
import geatpy as ga
strs = 'Tom is a little boy.' # define the sentence
words = []
for c in strs:
words.append(ord(c)) # change the words to ascii code.
def aim(Phen): # define the aim function
real = words
diff = np.sum((Phen - real)**2, 1)
return np.array([diff]).T
if __name__ == "__main__":
AIM_M = __import__('main') # 获取函数接口所在文件的地址
# 变量设置
ranges = np.vstack([32 * np.ones((1, len(words))), 122 * np.ones((1, len(words)))]) # 生成自变量的范围矩阵
borders = np.vstack([np.ones((1, len(words))), 122 * np.ones((1, len(words)))]) # 生成自变量的边界矩阵
FieldDR = ga.crtfld(ranges, borders) # 生成区域描述器
# 调用编程模板
[pop_trace, var_trace, times] = ga.sga_new_real_templet(AIM_M, 'aim', None, None, FieldDR, problem = 'I', maxormin = 1, MAXGEN = 5000, NIND = 50, SUBPOP = 1, GGAP = 0.9, selectStyle = 'sus', recombinStyle = 'xovdp', recopt = 0.9, pm = 0.1, drawing = 1)
# 输出结果
for num in var_trace[np.argmin(pop_trace[:, 1]), :]:
print(chr(int(num)), end = '')
代码中调用了Geatpy内置的sga_new_real_templet编程模板,其中参数的含义可以使用help(ga.sga_new_real_templet)查看,也可以参见源码:
https://github.com/geatpy-dev/geatpy/blob/master/geatpy/source-code/templets/sga_new_real_templet.py
运行结果如下:
最优的目标函数值为:0.0
最优的控制变量值为:
84.0
...
46.0
最优的一代是第1624代
时间已过4.467496871948242秒
Tom is a little boy.
Geatpy的sga_new_real_templet编程模板实现了一个改进的遗传算法。采用精英保留策略,使算法的收敛性大大增强。由本例可见,使用Geatpy框架实现遗传算法非常简单。Geatpy的强大之处初现。
倘若需要匹配的句子很长,那么则需要更大的进化代数。我认为对于句子匹配问题,可以把它转化成一个高维多目标优化问题去解决,或者是用多种群独立进化的方式,这样效率或许会更高。
下一篇文章将讲述我使用Geatpy解决多目标优化问题以及跟Matlab遗传算法工具箱进行对比学习。
https://blog.csdn.net/qq_33353186/article/details/82082053
在后面的文章中我们将对更多的编程案例进行详解。欢迎继续跟进,感谢!