遗传算法(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