Python DEAP 库,使用随机词作为个体

Python DEAP library, using random words as individuals

我正在尝试更好地处理 DEAP。我想制作一个遗传算法,将单词作为个体作为一个群体,它通过检查这些单词与给定 "maximal word" 的距离(阅读:拼写)有多远来最大化这一点。到目前为止,这是我按照文档中的示例所做的

import random
from randomwordgenerator import randomwordgenerator

from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMax", base.Fitness, weights=("hot",))
creator.create("Individual", str, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_str", randomwordgenerator.generate_random_words)
toolbox.register("individual", tools.initRepeat, creator.Individual,
                 toolbox.attr_str, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

ind = toolbox.individual()
print(ind)

我感到困惑的地方是当我打印(ind)时得到这个输出

<generator object initRepeat.<locals>.<genexpr> at 0x10407d888>

然而,当我将代码更改为示例代码时(如下所示)

import random

from deap import base
from deap import creator
from deap import tools

IND_SIZE = 5

creator.create("FitnessMin", base.Fitness, weights=(-1.0, -1.0))
creator.create("Individual", list, fitness=creator.FitnessMin)

toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual,
                 toolbox.attr_float, n=IND_SIZE)

ind1 = toolbox.individual()
print(ind1)

这是输出

[0.6047278872004169, 0.8976450330325899, 0.9795210255969901, 0.5752663675034192, 0.8511975930513275]

我真的很困惑为什么我的例子不只是打印一个字符串,有人能对此有所了解吗?不幸的是,他们没有使用字符串作为个体的示例,所以我试图自己调试它,但遇到了困难。感谢任何帮助

经过多次争论,这里解释为什么它不起作用。 Individual 是使用基数 class str 声明的,这对您的意图和目的来说很好。但是,当您在工具箱中注册 individual 方法时,您会使用 tools.initRepeat 提供生成器作为容器的参数。对于基于 list class 的个人来说,这很好,因为随后会评估生成器并将其存储在列表中。然而,由于你的是基于 str,python 执行的隐式转换只是 returns 字符串“”,而不是通过生成器的内容来填充你的个人。由于 DEAP 提供的工具似乎不适合您的问题,我建议您编写自己的脚本来生成人口 and/or 个人。以下应回答您的限制:

from randomwordgenerator.randomwordgenerator import generate_random_words

from deap import base
from deap import creator
from deap import tools

POP_SIZE = 10

creator.create("FitnessMax", base.Fitness, weights=(1,))
creator.create("Individual", str, fitness=creator.FitnessMax)

toolbox = base.Toolbox()
toolbox.register("attr_str", generate_random_words, n=1)

ind = creator.Individual(toolbox.attr_str())
pop = [creator.Individual(toolbox.attr_str()) for _ in range(POP_SIZE)]

print(ind)
print(pop)

这将生成 list 随机词的总体,然后您可以对其进行评估。