基于DEAP库的python进化算法--遗传算法实践--配词问题

一.前言

在非线性函数寻优中,我们看到了编码方式对问题求解的重要性,但是遗传算法的评价函数的设定也对求解有至关重要的作用。如果设定的评价函数不好,可能导致算法无法正确收敛。

二.配词问题

1.问题描述

配词问题(word matching problem)是给定某字符串,以生成同样字符串为目的的问题。

例如对目标短语’to be or not to be’,要求用遗传算法生成该短语。

这里最简单直接的个体编码方式是采用13个ASCII码进行编码(当然用字符编码也是可以的,这里因为探讨的主要问题在于评价函数的选择,因此,不对编码方式做过多探索)。

考虑评价函数时,有两种评价思路:

  • 第一种思路:是将目标函数设定为与给定的字符串的ASCII码差异,此时,配词问题转化为一个目标函数最小化问题。
  • 第二种思路:是将目标函数设定与原文相同的字符个数,此时,配图问题转化为一个目标函数最大化问题。
2.评价方式一 - ASCII码差异

遗传算法操作:

  1. 个体编码:使用ASCII码数字编码,长度为13
  2. 评价函数:与给定的字符串的ASCII码差异的绝对值之和
  3. 育种选择:锦标赛选择
  4. 变异算法:交叉-均匀交叉,变异-乱序突变
  5. 环境选择:精英保留策略
    代码实现
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: ASCII差异.py
@time: 2020/11/28 19:36
"""
import numpy as np
import random
import matplotlib.pyplot as plt
from deap import creator,tools,base,algorithms

# 定义问题
creator.create('FitnessMin',base.Fitness,weights=(-1.0,))
creator.create('Individual',list,fitness = creator.FitnessMin)

# 个体编码-ASCII编码
gen_size = 13
toolbox = base.Toolbox()
# 小写字母“a”到“z”的ASCII码值分别为97到到122
toolbox.register('genASCII',random.randint,97,122)
toolbox.register('Individual',tools.initRepeat,creator.Individual,toolbox.genASCII,n = gen_size)
# 注册种群
toolbox.register('Population',tools.initRepeat,list,toolbox.Individual)

# 评价函数-与给定的字符串的ASCII码差异之和
def eval(ind):
    target  = list('tobeornottobe')
    # ord返回对应ASCII字符串的ASCII数值
    target = [ord(item) for item in target]
    return np.sum(np.abs(np.array(ind) - np.array(target))),

# 注册评价函数
toolbox.register('evaluate',eval)
# 注册遗传算法的操作:选择、交叉、突变
toolbox.register('select',tools.selTournament,tournsize = 2)
toolbox.register('mate',tools.cxUniform,indpb=0.5)
toolbox.register('mutate',tools.mutShuffleIndexes,indpb = 0.3)

# 创建统计学对象
stats = tools.Statistics(key= lambda ind : ind.fitness.values)
stats.register('avg',np.mean)
stats.register('std',np.std)
stats.register('min',np.min)
stats.register('max',np.max)
# 创建日志对象
logbook = tools.Logbook()
logbook.header = 'gen','avg','std','min','max'

# 遗传算法
pop_size =  100
N_GEN = 50
CXPB = 0.8
MUTPB = 0.2

# 生成种群
pop = toolbox.Population(n = pop_size)

# 评价初代种群
invalid_ind = [ind for ind in pop if not ind.fitness.valid]
fitnesses = list(map(toolbox.evaluate,invalid_ind))
for ind,fit 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python的智能算法_Python智能优化算法⼩汇总 最近查了⼀圈python的智能优化算法,发现在python⾥⾯这样的相对⼀些传统的语⾔还真是不太多(⽐如Matlab)。总的看起来似乎起 步都还⽐较晚(个⼈认为有可能是因为智能算法本⾝相对复杂并且过于专业,多数应该还是集中在专业做优化的圈⼦⾥)。 ⽬前总结了以下: 1、DEAP 2、mealpy 3、scikit-opt (国产良⼼) 4、Geatpy2(国产⽤⼼) 5、pygmo2 6、pyswarms 7、SciPy 1、DEAP 安装: pip install deap 优点:起点⾼,发表在Journal of Machine Learning Research ⽤法灵活,所有模块均可⾃定义 缺点:上⼿⿇烦⽐较⿇烦 2、mealpy 安装: pip install meaply 优点:算法丰富,集成了现有的62种算法,⽬测应该还在继续更新添加 上⼿容易,代码简单,⽐如对标准函数的函数进⾏优化: 缺点:整体设计似乎不太规范,⽂档解释不够 语⾔上似乎还存在⼀点⼩问题,英语应⽤不够规范(这可能也是作者没有发表很好的杂志的原因之⼀) 集成了多种算法但未列举参考⽂献,不⽅便论⽂引⽤ 3、scikit-opt (国产良⼼) 安装: pip install scikit-opt 优点:上⼿容易,代码简单,尤其许多⽤法很像Matlab。⽐如官⽅⽂档就提供了⼀些例⼦:使⽤遗传算法进⾏曲线拟合 中⽂⽂档,并且⽂档很全。⼤佬的CSDN主页。(作者 @幼鹰me 曾经是京东算法⼯程师,现在是蚂蚁算法⼯程师,这个也的确感觉得到 ⼀些情怀,⽅便实⽤的感觉) 在使⽤⽅便的基础上,也提供了不少接⼝⽤于⾃⾏修改。尤其可以⾃定义算⼦。 ⼀些较好玩的特性:GPU加速、断点运⾏等。 缺点:⽬前似乎还没有集成⾜够多的⽅法。⼤类有3类,共7种算法算法本⾝的优化似乎还不⾜(未仔细测试) 4、Geatpy2(国产⽤⼼) 安装: pip install geatpy 或者强制版本 pip install geatpy==2.5.1 优点:上⼿容易,实现简单 ⽂档完整,⽰例丰富(中⽂⽂档) 功能齐全,除算法以外也封装了许多实⽤的功能,⽐如数据可视化等 缺点:代码风格诡异 英⽂⽤语不规范,变量命名相对随意,⽐如⼊门⽂档中,将⽬标函数翻译成"aimFunc",变量名称XM?等。 ⽂档开展还显得⽐较稚嫩,⽐如主页⽂档就⽤插件显⽰,官⽹体验还⽋些⽕候 注:这个项⽬得多补充⼏句,⽬测应该是硕⼠⽣写的。总体的设计、DEMO、⽂档上给⼈感觉都远不如上⾯⼏个⽼练(尤其和DEAP相⽐)。 但⼏个学⽣跨校合作,在不长的时间内能够完成如此完整的⼀个⼯作也实⾮易事。也希望他们能够继续进步。综合来看,这个项⽬个⼈认为 属于国产⽤⼼。 5、pygmo2 安装: pip install pygmo 注:安装还依赖如下环境 其它可能会⽤到的环境: 优点:功能丰富 ⽀持并⾏和分布式计算(本⾝运⾏效率也很⾼) ⽤法灵活 感觉测试相对稳定(未仔细测试) 缺点:上⼿相对⿇烦 依赖项较多,尤其要求对应C++版的软件环境 算法有限 注:这个也吐槽⼀句,⽹传很厉害,但真没看出来除了看起来专业以外有何厉害之处。当然通常以C++为底层的东西有可能在⼤量级问题 上的处理更加容易部署,但⼀般的⽤户也⽤不到。 6、pyswarms 安装: pip install pyswarms 优点:简单,易上⼿,基本上也属于⼏⾏代码⼊门型 可视化,尤其动态可视化做得好。(亮点),⽐如画出图形,基本上就是⼀句代码: 缺点:算法少。只有基于PSO的各类问题算法(本质上其实就只是⼀个算法) 灵活度不够。 起点低。发表的论⽂既没进⼊CCF推荐,也没进⼊SCI。同时虽然号称有许多研究论⽂⽤过,但仔细看级别都不⾼(基本都属于三⽆型) 7、SciPy(想不到吧) 安装(当然其实当你装上Python的时候它就在了): pip install scipy 特别说明: scipy作为⼀个相对严谨和'传统'的数值计算,基本上常⽤的数值计算⽅法都有涉及。当然数值计算型的通常都不会把智 能优化(启发式算法)作为重点。它集成了⼗分有限的⼏种优化算法:差分进化、模拟退⽕等。但它仍然有不少优点: 优点:作为严谨的数值计算,它的正确性和稳定性值得信赖(超过800个contributor,其中有不少是名校的教师、博⼠等) 使⽤⽅便、简单 scipy也可以⾃定义优化算法 缺点:⾃然就是算法太少了 虽然可以⾃定义,但⿇烦程度⼏乎相当于完全⾃⼰造轮⼦ 后续如果再发现好⽤的我们会继续更新,如果⼤家有好的建议也欢迎评论补充! 写在后⾯没想到这么个⼩破⽂章居然招来了两位作者( @幼鹰me @秋宏 )的亲⾃

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值