2016-11-09 122 views
1

我目前在Python中使用DEAP进行遗传算法。我想创建一个长度为no_sensors的初始人群。我的问题是,由于random.choice(nodes)函数,一些节点最终是相同的,并且最初的长度结束小于no_sensors。我在想,如果有解决这个问题的方式:DEAP遗传算法

creator.create("FitnessMax", base.Fitness, weights=(2.0, -1.0)) 
creator.create("Individual", set, fitness=creator.FitnessMax) 

toolbox = base.Toolbox() 
toolbox.register("attr_item", random.choice, nodes) 
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, n=no_sensors) 
toolbox.register("population", tools.initRepeat, list, toolbox.individual) 

基本上,我需要的独特的物品固定长度从列表nodes。我正在考虑使用random.sample(nodes, no_sensors),但我似乎无法将其纳入代码而不会产生错误

您可以查看其他示例here

回答

0

经过一番思考,我想出了这个解决办法:

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

toolbox = base.Toolbox() 
toolbox.register("attr_item", random.sample, nodes, no_sensors) 
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_item, n=1) 
toolbox.register("population", tools.initRepeat, list, toolbox.individual) 

这是一个有点难看不过,因为每次你要访问的内容individualIndividual类型,你必须打电话individual[0]并重复individual[0]这似乎是相当多余的内容。

0

您可以使用functools.partialrandom.sample

from functools import partial 
import random 
no_sensors = 5 
mysample = partial(random.sample,k=no_sensors) 
toolbox.register("attr_item", mysample, nodes) 
+0

但问题是,如果random.choice选择两次相同的值,我希望它算作一个。基本上,我需要列表中的固定长度的唯一项目:节点。我正在考虑使用random.sample(nodes,no_sensors),但我似乎无法将其纳入代码而不会产生错误。 – meraxes

+0

一个集合不能包含列表,因为它们是可变的,因此不可哈希.'set([[1,2,3],3]) TypeError:不可能的类型:'list'' –

+0

哦,对!我将个人的基础改为列表。即使如此,列表中的列表看起来也是多余的。 – meraxes