代码之家  ›  专栏  ›  技术社区  ›  sf8193

Python Deap库,如何访问initRepeat映射

  •  0
  • sf8193  · 技术社区  · 8 年前

    我要我的算法做什么

    我想有一堆随机的词作为我的人口中的个体,谁的健康被比作一个“最佳”的词。如果单词的长度相等,则表示适合+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>
    

    如何访问映射的随机词以及个人的适合性

    0 回复  |  直到 6 年前