Случайный Numpy - Укажите несколько границ и шагов - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно сгенерировать начальную популяцию генетического алгоритма. Рассмотрим следующий вектор:

[20, 2, 20, 1.5, 5, 20, 5, 0.5, -0.5, 5, 20, 5, 3, 14, 70, 30, 10, 5, 5, 20, 8, 20, 2.5]

Я бы сделал это:

new_population = numpy.random.uniform(low=0.1, high=50.0, size=pop_size)

Проблема в том, что некоторые хромосомы в проблемном пространстве имеют разные шаги и разные максимальные значения. Элемент 0 должен быть 1-100 с шагом 1 (So int). Элемент 3 должен быть 0,1-10 с шагом 0,1 (Float). Какой самый простой способ сделать эту рандомизацию?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Вы не дали достаточно данных, чтобы увидеть какой-либо шаблон для более короткого кода.

Однако вы можете сделать следующее: Составьте список списков, в котором каждый подсписок состоит из следующих элементов: bounds = [[low, high, step], ...]

Затем инициализируйте пустой массив с нулевыми значениями, т.е. new_population = np.empty(23) И после этого вы можете просто пройти через границы с помощью цикла for и сгенерировать каждый элемент:

for i, value in enumerate(bounds):
    new_population[i] = np.random.uniform((low=value[0], high=value[1], size=value[2])
1 голос
/ 08 апреля 2019

Поскольку кажется, что диапазоны для ваших хромосом жестко запрограммированы, я предлагаю вам сгенерировать все числа только с одним numpy.random.uniform () с наименьшим диапазоном, который вам нужен, т.е. 0,1-10 в вашем примере, а затем выумножьте полученное число на следующее соотношение:

wanted_range / base_range

В вашем примере вы умножите на 10. (обратите внимание, что соотношения между шагами и диапазонами должны быть одинаковыми для этогометод)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...