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([...])
我需要生成遗传算法的初始种群。考虑以下向量:
[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([...])