遗传算法(Python) #5 用DEAP框架解决OneMax问题

遗传算法(Python) #5 用DEAP框架解决OneMax问题

遗传算法系列的第三期介绍了如何不用任何框架从零开始解决OneMax问题,第四期介绍了DEAP框架的基本用法。若读者对下文中定义或术语不熟悉,可以查看本系列的前几篇文章。本期文章将介绍如何使用DEAP解决OneMax问题。

1.OneMax问题(OneMax problem)

OneMax问题是遗传算法的入门问题,其内容是:如何使一段长度固定的二进制字符串所有位置上数字之和最大。

让我们用一个长度为5的二进制字符串为例:

  • 10010 -> 和为2
  • 00111 -> 和为3
  • 11111 -> 和为5(最大值)

对一般人,显而易见,当所有位数都为1时,该字符串的和最大,但在我们用遗传算法解决该问题时,算法本身并不具备这样的知识。

2.问题的解决思路

首先,我们得把这个问题转换成一个遗传算法问题,即:我们得定义个体、种群,选择、杂交、突变方法、适应度函数等。假设有一个长度为100的字符串,我们可以做出以下定义:

  • 个体:个体即为问题的解,这个问题中个体可以直观的定义为一个长度为100列表(List),列表上每个元素为0或1.
  • 种群:种群即所有个体的合集,我们可以把种群定义为所有个体组成的列表。
  • 选择:使用锦标赛法(Tournament Selection)
  • 杂交:使用单点杂交法(Singe-Point Crossover)
  • 突变:使用位翻转突变法(Flip Bit Mutation)
  • 适应度函数: 我们的目标是使字符串上所有数字之和最大,适应度函数可以直观的定义为列表中所有数字之和。

若对上述定义不太了解的,可以回看遗传算法系列的第二期。

3.用DEAP框架实现遗传算法

以下将分步骤解释每一部分的代码,完整代码在本文的最后可见。

3.1. 准备工作

# 1.load modules
from deap import base,creator,tools,algorithms
import random
import numpy as np
import matplotlib.pyplot as plt
toolbox = base.Toolbox()

首先我们需要导入遗传算法所必须的模组:

  • base,creator,tools,algorithms: 这四个模组是DEAP框架内最常用的模组
  • random: 用以生成随机数
  • numpy:我们将用到 numpy 中的 mean 和 max 方程。
  • matplotlib: 用以绘图
  • toolbox:DEAP框架中的核心,当使用deap.algorithms时,我们需要把遗传算法的运算符存入toolbox内。 同时toolbox.register也是DEAP中最常用的方法。

3.2. 初始化算法参数

# 2.parameters:
INDIVIDUAL_LENGTH = 100  # length of bit string to be optimized
POPULATION_SIZE = 200
P_CROSSOVER = 0.9  # probability for crossover
P_MUTATION = 0.1   # probability for mutating an individual
MAX_GENERATIONS = 50
random.seed(39)
  • INDIVIDUAL_LENGTH:个体的“长度”,即二进制字符串的长度
  • POPULATION_SIZE: 种群中个体的数目
  • P_CROSSOVER: 个体间交杂的概率
  • P_MUTATION: 个体突变的概率
  • MAX_GENERATIONS: 算法迭代次数上限
  • random.seed:为了保证每次运行的结果相同,设定了随机种子

3.3. 定义个体与种群

# 3.create individual and population
toolbox.register("genBinary", random.randint, 0, 1) # 1
creator.create("FitnessMax", base.Fitness, weights=(1.0,)) # 2
creator.create("Individual", list, fitness=creator.FitnessMax) # 3

toolbox.register("createIndividual", tools.initRepeat, creator.Individual, toolbox.genBinary, INDIVIDUAL_LENGTH) # 4
toolbox.register
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值