Как я могу создать список со случайными числами в разных диапазонах для пакета deap в Python

Я использую пакет DEAP в Python, чтобы написать программу для оптимизации с эволюционным алгоритмом специально с Genetic.

Мне нужно создать хромосомы, используя тип списка в Python. Эта хромосома должна иметь пять флоат-генов (аллелей) в разных диапазонах.

Моя главная проблема - создать такую ​​хромосому. Однако было бы лучше, если бы я мог использовать для этого функцию tools.initRepeat из пакета deap.

Для случаев, когда все гены находятся в одном диапазоне, мы могли бы использовать следующий код:

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)

Это я получил отсюда.

1 ответ

Я нашел хорошую рекомендацию здесь.

def genFunkyInd(icls, more_params):
    genome = list()
    param_1 = random.uniform(...)
    genome.append(param_1)
    param_2 = random.randint(...)
    genome.append(param_2)
    # Many more parameter initialization

    return icls(genome)

The icls  (standing for individual class) parameter should receives the type created with the creator, while all other parameters configuring your ranges can be passed like the more_params argument or with defined constants in your script. Here is how it is registered in the toolbox.

toolbox.register('individual', genFunkyInd, creator.Individual, more_params)

Он вручную создает класс для хромосомы. Я не знаю, является ли это лучшим выбором, но его можно использовать для решения моей проблемы.

Чтобы создать особей с пятью плавающими генами в пяти разных диапазонах, вы можете сделать следующее:

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()
Другие вопросы по тегам