本节将展示如何通过creator创建类型以及如何使用toolbox进行初始化。
1、Fitness
已经提供的Fitness类是一个抽象类,它需要weight来使得它成为一个函数。一个最小化的适应度是通过负权重构建的,而一个最大化适应度则需要正权重。
creator.create("FitnessMin",base.Fitness,weights=(-1.0,))
creat()函数至少需要两个元素,一个是别名,另一个是它基于的类(在上例中为“FitnessMin”和“base.Fitness”)。任何序列元素都会对类的属性产生影响。在具体的Fitness文档中,weights属性一定是一个元组,这样才可以使得多目标和单目标适应度可以保持一致。
2、Individual
主要说明如何使用creator创建一些个体并且使用Toolbox对它们进行初始化。
2.1、 List of Floats
我们要创建的第一个个体将是一个简单的包含float的list。为了去产生这种个体,我们需要创建一个Individual class,使用creator将会与标准list类型建立联系,并且将会与fitness建立联系(每个individual对应其fitness)。
下面介绍一个新的register对象,它用于将deap包中所带方法与要编写的演化算法进行“固定”(包括初始化、操作方法以及适应度函数的计算)。register存在于base.Toolbox中。因此在使用时首先要调用base.Toolbox(),然后再对register进行调用。
register()至少需要两个参数,一个alias和一个分配到alias的函数。任何的序列参数会被叫做functools.partial()进行传递到函数当中。在toolbox中创造了两个alias,第一个重定向到random.random()函数,第二个是一个initRepeat()函数,将它容器中的元素填充到creator.Individual class中,它对toolbox.attr_float()函数的func参数根据IND_SIZE(这里的n)进行重复。
穿插介绍initRepeat() 重复调用函数func n次,并在容器类型的容器中返回结果
deap.tools.
initRepeat
(container, func, n)
Parameters: |
|
---|---|
Returns: | An instance of the container filled with data from func. |
穿插介绍initIterate
() 调用函数容器,将可迭代项作为其唯一参数。迭代必须由方法或对象生成器返回。
Parameters: |
|
---|---|
Returns: | An instance of the container filled with data from the generator. |
2.2、Permutation(排列)
排列表示的个体几乎类似于一般列表个体。事实上,它们都继承自基本列表类型。唯一的区别是,我们需要生成一个随机排列,并将该排列提供给个体,而不是用一系列浮点来填充列表。
解释说明:random.sample随机采样函数,距离,random.sample([1,2,4,6,7],1)就是从列表中随机采1个样本出来。那这里的列表本身为【0,1,2...IND_SIZE】共计IND_SIZE个数,这里需要一次性随机采样取出IND_SIZE个,意味着是列表中的所有元素需要全部取出,故而形成随机打乱的一个排序。
注解:register的individual其中,individual为别名,tools.initIterate为分配到individual的函数,其中tools.initIterate为种群初始化函数,已在上述介绍,这个函数同样可以有2个参数,一个为容器container,一个为生成器generator。刚好对应上。
以下的类型还有很多,大家可以自行学习。