我要我的算法做什么
我想有一堆随机的词作为我的人口中的个体,谁的健康被比作一个“最佳”的词。如果单词的长度相等,则表示适合+1。对于每个相同的字符,它的适应度也是+1,如果它在同一索引中,则是+1.1。
不幸的是,我有一个真正的时间了解主任文件。这是我到目前为止所做的尝试。
尝试的代码
from deap import creator
from deap import tools
import random
import time
from create_random_string import get_random_word
ans = "hot"
creator.create("FitnessMax", base.Fitness, weights=(len(ans)+2,))
creator.create("Individual", str, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("individual",tools.initRepeat,creator.Individual,get_random_word, n=1)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
def evalOneMax(individual):
fitness = 0
if(len(ans)==len(individual)):
fitness+=1
for i in range(0,len(ans)):
if(ans[i]==individual[i]):
fitness+=1.1
for i in range(0,len(ans)):
if individual.find(ans[i]) != -1:
fitness+=1
return (fitness,)
#----------
# Operator registration
#----------
# register the goal / fitness function
toolbox.register("evaluate", evalOneMax)
# register the crossover operator
toolbox.register("mate", tools.cxTwoPoint)
# register a mutation operator with a probability to
# flip each attribute/gene of 0.05
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
# operator for selecting individuals for breeding the next
# generation: each individual of the current generation
# is replaced by the 'fittest' (best) of three individuals
# drawn randomly from the current generation.
toolbox.register("select", tools.selTournament, tournsize=3)
#----------
if __name__== '__main__':
random.seed(64)
pop = toolbox.population(n=50)
# CXPB is the probability with which two individuals
# are crossed
#
# MUTPB is the probability for mutating an individual
CXPB, MUTPB = 0.5, 0.2
print("Start of evolution")
fitnesses = list(map(toolbox.evaluate, pop))
for ind, fit in zip(pop, fitnesses):
ind.fitness.values = fit
代码解释(据我所知)
替代方案
我尝试了另一种方法,将单词作为变量保存在单独的类中,就像这样,但是这对于我正在使用的其他deaps函数来说确实不太好。用这种方法,我得到了deap给出的交叉算子的误差。我宁愿不必创建自己的交叉运算符。
creator.create("FitnessMax", base.Fitness, weights=(len(ans),))
creator.create("Individual", str, fitness=creator.FitnessMax, word=get_random_word(True,0))
toolbox = base.Toolbox()
toolbox.register("individual",creator.Individual)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
编辑
更具体地说,如果我在evalOneMax中放一个“print(individual)”行
功能it输出
<generator object initRepeat.<locals>.<genexpr> at 0x1076ffe60>
如何访问映射的随机词以及个人的适合性