如何为 python 中的 deap 包创建一个包含不同范围随机数的列表
How can I create a list with random numbers in different ranges for deap package in python
我正在使用 Python 中的 DEAP 包来编写一个程序,用于使用遗传算法特别是遗传算法进行优化。
我需要在 python 中使用列表类型创建染色体。这条染色体应该有五个不同范围的浮动基因(等位基因)。
我的主要问题是创建这样一个染色体。但是,如果我可以为此使用 deap 包的 tools.initRepeat 功能会更好。
对于所有基因都在同一范围内的情况,我们可以使用以下代码:
import random
from deap import base
from deap import creator
from deap import tools
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
IND_SIZE=10
toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_float, n=IND_SIZE)
我从 here.
那里得到的
我找到了一个很好的推荐here。
def genFunkyInd(icls, more_params):
genome = list()
param_1 = random.uniform(...)
genome.append(param_1)
param_2 = random.randint(...)
genome.append(param_2)
# etc...
return icls(genome)
icls
(代表个人 class)参数应接收创建者创建的类型,而配置范围的所有其他参数都可以像 more_params
参数一样传递或在脚本中定义常量。这是它在工具箱中的注册方式。
toolbox.register('individual', genFunkyInd, creator.Individual, more_params)
它手动为染色体创建一个class。我不知道这是否是最好的选择,但它可以用来解决我的问题。
要创建在五个不同范围内具有五个浮动基因的个体,您可以执行以下操作
low = [1, 0, 0, -10, 3] #lower bound for each of the ranges
high = [1234, 1024, 1, 0, 42] #upper bound for each of the ranges
functions = []
for i in range(5):
def fun(_idx=i):
return random.uniform(low[_idx], high[_idx])
functions.append(fun)
toolbox.register("individual", tools.initCycle, creator.Individual,
functions,
n=1)
toolbox.individual()
我正在使用 Python 中的 DEAP 包来编写一个程序,用于使用遗传算法特别是遗传算法进行优化。
我需要在 python 中使用列表类型创建染色体。这条染色体应该有五个不同范围的浮动基因(等位基因)。
我的主要问题是创建这样一个染色体。但是,如果我可以为此使用 deap 包的 tools.initRepeat 功能会更好。
对于所有基因都在同一范围内的情况,我们可以使用以下代码:
import random
from deap import base
from deap import creator
from deap import tools
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
IND_SIZE=10
toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_float, n=IND_SIZE)
我从 here.
那里得到的我找到了一个很好的推荐here。
def genFunkyInd(icls, more_params):
genome = list()
param_1 = random.uniform(...)
genome.append(param_1)
param_2 = random.randint(...)
genome.append(param_2)
# etc...
return icls(genome)
icls
(代表个人 class)参数应接收创建者创建的类型,而配置范围的所有其他参数都可以像 more_params
参数一样传递或在脚本中定义常量。这是它在工具箱中的注册方式。
toolbox.register('individual', genFunkyInd, creator.Individual, more_params)
它手动为染色体创建一个class。我不知道这是否是最好的选择,但它可以用来解决我的问题。
要创建在五个不同范围内具有五个浮动基因的个体,您可以执行以下操作
low = [1, 0, 0, -10, 3] #lower bound for each of the ranges
high = [1234, 1024, 1, 0, 42] #upper bound for each of the ranges
functions = []
for i in range(5):
def fun(_idx=i):
return random.uniform(low[_idx], high[_idx])
functions.append(fun)
toolbox.register("individual", tools.initCycle, creator.Individual,
functions,
n=1)
toolbox.individual()