Python遗传算法框架使用实例(一)使用Geatpy实现句子匹配

在前面几篇文章中,我们已经介绍了高性能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.

# Attention: you had better put the aim-function in another file.
def aim(Phen, LegV): # define the aim function
    real = words
    diff = np.sum((Phen - real)**2, 1)
    return [np.array([diff]).T, LegV]

if __name__ == "__main__":
    AIM_M = __import__('main') # get the handle of aim-function
    # variables setting
    ranges = np.vstack([32 * np.ones((1, len(words))), 122 * np.ones((1, len(words)))]) # ranges of variables
    borders = np.vstack([np.ones((1, len(words))), 122 * np.ones((1, len(words)))]) # borders of variables
    FieldDR = ga.crtfld(ranges, borders) # create FieldDR
    # call the GEA algorithm template
    [pop_trace, var_trace, times] = ga.sga_new_real_templet(AIM_M, 'aim', None, None, FieldDR, problem = 'I', maxormin = 1, MAXGEN = 2000, NIND = 50, SUBPOP = 1, GGAP = 0.9, selectStyle = 'etour', recombinStyle = 'xovdprs', recopt = 0.9, pm = None, distribute = True, drawing = 1)
    # output results
    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

运行结果如下:

《Python遗传算法框架使用实例(一)使用Geatpy实现句子匹配》

最优的目标函数值为:0.0
最优的控制变量值为:
84.0

46.0
最优的一代是第1624代

时间已过4.467496871948242秒

Tom is a little boy.

Geatpy的sga_new_real_templet算法模板实现了一个改进的遗传算法。采用精英保留策略,使算法的收敛性大大增强。由本例可见,使用Geatpy框架实现遗传算法非常简单。Geatpy的强大之处初现。

在上面的代码中,我们设置了selectStyle = ‘etour’,表示采用精英锦标赛选择算子’etour’来进行种群子代的选择,这让算法的收敛速度大大增强。

倘若需要匹配的句子很长,那么则需要更大的进化代数。我认为对于句子匹配问题,可以把它转化成一个高维多目标优化问题去解决,或者是用多种群独立进化的方式,这样效率或许会更高。

下一篇文章将讲述我使用Geatpy解决多目标优化问题以及跟Matlab遗传算法工具箱进行对比学习。

https://blog.csdn.net/qq_33353186/article/details/82082053

在后面的文章中我们将对更多的编程案例进行详解。欢迎继续跟进,感谢!

 

    原文作者:遗传算法
    原文地址: https://blog.csdn.net/qq_33353186/article/details/82047692
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞