DEAP Example: One Max Problem
目录
- Setting Things Up
- Creator
- Toolbox
- The Evaluation Function
- The Genetic Operators
- Evolving the Population
- 完整代码
本文是一个十分简单的入门任务。这个任务是求一个元素为0或1构成的数组的和的最大值。显然当元素全部为1的时候,数组的和有最大值,即为其长度。
Setting Things Up
首先,导入一些模块
import random
from deap import base
from deap import creator
from deap import tools
Creator
creator是一个类工厂,可以在运行是构建新类。第一个参数是新类名称,第二个参数是所继承的基类,之后的参数是新类的属性。
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
首先,定义一个FitnessMax类。它继承于deap.base模块的Fitness类。其还包含一个额外的属性weights。weights是一个元组(1.0,),意思是我们将最大化单一的目标值。
然后,定义一个Individual类。它继承list类并且使fitness这个属性等于之前我们定义的fitnessMax。要注意的是,所有在creator容器创建的类都可以直接调用。
Toolbox
现在,我们自定义一些类来创建个体和种群。
我们将使用到的,如个体、种群、函数、操作符、参数等等,都是在Toolbox里面存储。添加和删除分别为register()和unregister()。
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0, 1)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
第一句创建一个toolbox类。
然后注册一个生成函数toolbox.attr_bool()。该函数被调用的时候,会随机产生为0或1。接下来的两个函数就是个体和种群的实例。
新函数在toolbox中注册只将别名与已经存在的函数相关联,并冻结部分参数。例如attr_bool(),它与randint()关联并设定里面两个参数a=0和b=1,意思是返回 a≤n≤b a