在前面几篇文章中,我们已经介绍了高性能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
在后面的文章中我们将对更多的编程案例进行详解。欢迎继续跟进,感谢!