问题描述
我目前有一个可以在 [1,1500] 中取整数值的基因。
我不喜欢 1500 的上限,它就像一个神奇的数字。每个整数都可以统一选择,但是在探索时我觉得从 1 到 2 的变化与从 1001 到 1002 的变化不同(但两者的概率相同)。
是否有一种常见/已知的方式:
- 非均匀地选择一个值,概率降低:比如说“小”值(例如“5”)作为比中等值(例如“200”)更高的被选择概率,以及“中等” ' 值比高值(例如'1000')有更高的概率被选中,'更高'需要以某种方式定义......
- 探索没有边界的完整整数范围,但避免从一开始就拥有疯狂的高值(可能类似于有界演化范围)
解决方法
您是否考虑过随机分布,例如正态分布?
对于正态分布,您可以指定随机值的中心以及标准偏差的宽度。由这种正态分布生成的随机数在指定中心附近的可能性要高得多,而不是在 1、2 或 3 个标准差之外的值区域。正态分布的值分布如下所示:
您可以在维基百科 [2] [3] 上阅读有关正态分布或标准差的更多信息
如果您不喜欢这个特定的概率分布,因为您认为它太平坦或太阶梯,那么还有很多其他分布可供选择。
在代码中,这可以用 Numpy 实现:
import numpy as np
rng = np.random.default_rng()
gene_value = int(np.abs(rng.normal(loc=0,scale=500)))
这利用了 Numpy 随机法线生成器 [4]。中心设置为 0,标准差设置为 500,使得值更接近 0 的可能性更大,而接近 1500 或更高的值的可能性很小。
[2] https://en.wikipedia.org/wiki/Normal_distribution
[3] https://en.wikipedia.org/wiki/Standard_deviation
[4] https://numpy.org/doc/stable/reference/random/generated/numpy.random.Generator.normal.html