DEAP遗传算法
问题描述:
我目前在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。
答
经过一番思考,我想出了这个解决办法:
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)
这是一个有点难看不过,因为每次你要访问的内容individual
的Individual
类型,你必须打电话individual[0]
并重复individual[0]
这似乎是相当多余的内容。
答
您可以使用functools.partial
和random.sample
:
from functools import partial
import random
no_sensors = 5
mysample = partial(random.sample,k=no_sensors)
toolbox.register("attr_item", mysample, nodes)
但问题是,如果random.choice选择两次相同的值,我希望它算作一个。基本上,我需要列表中的固定长度的唯一项目:节点。我正在考虑使用random.sample(nodes,no_sensors),但我似乎无法将其纳入代码而不会产生错误。 – meraxes
一个集合不能包含列表,因为它们是可变的,因此不可哈希.'set([[1,2,3],3]) TypeError:不可能的类型:'list'' –
哦,对!我将个人的基础改为列表。即使如此,列表中的列表看起来也是多余的。 – meraxes