我正在尝试更好地处理DEAP。我想做一个遗传算法,将单词作为个体作为总体,并通过检查这些单词与给定“最大单词”的距离(读:拼写)来最大化此算法。到目前为止,这是我按照文档中的示例所做的
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]
我真的很困惑为什么我的示例不仅仅打印字符串,任何人都可以对此有所了解吗?不幸的是,他们没有将字符串作为个人使用的示例,因此我试图自己调试它,但遇到了麻烦。感谢您的帮助
答案 0 :(得分:1)
经过大量辩论,以下是有关为何不起作用的解释。 Individual
是使用基类str
声明的,这对于您的意图和目的都很好。但是,当您在工具箱中注册individual
方法时,然后使用tools.initRepeat
,它提供了一个生成器作为容器的参数。对于基于list
类的个人,这会很好,因为然后会评估生成器并将其存储在列表中。但是,由于您的基于str
,因此python执行的隐式转换仅返回字符串“”,但不会通过生成器的内容来填充您的个人。由于DEAP提供的工具似乎不适合您的问题,因此建议您编写自己的脚本来生成总体和/或个人。以下应该可以解决您的限制:
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
个随机词,然后可以对其进行评估。