Numpy random - 指定多个边界和步骤

Numpy random - Specify Multiple Bounds & Steps

我需要生成遗传算法的初始种群。考虑以下向量:

[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)

问题是,问题space中的一些染色体步数不同,最大值也不同。元素 0 应为 1-100,步长为 1(So int)。元素 3 应为 0.1-10,步长为 0.1(浮动)。进行这种随机化最简单的方法是什么?

因为你的染色体范围似乎是硬编码的,我建议你只用一个 numpy.random.uniform() 生成所有数字,你需要的范围最小,即你的例子中的 0.1-10 和然后将获得的数字乘以以下比率:

wanted_range/base_range

在您的示例中,您将乘以 10。(请注意,对于此方法,步长和范围之间的比率必须相同)

您没有提供足够的数据来查看较短代码的任何模式。

但是您可以执行以下操作:制作列表列表,其中每个子列表由以下元素组成:bounds = [[low, high, step], ...]

然后初始化一个空的numpy数组,即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])

numpy.vectorize 装饰器允许您轻松定义作用于值数组的函数,一次一个元素。您可以将您的具体案例定义为

@np.vectorize
def vectorized_random(low, high, step):
    # whatever kind of random value you want

可直接用于输入数组。

>>> vectorized_random([1, 1, 0.1], [100, 10, 10], [1, 1, 0.1])
array([...])