2

我在 Python 中使用DEAP工具箱进行遗传算法。

toolbox.register("attr_bool", random.randint, 0, 1)是一个为 GA 中的总体随机选择 0 和 1 的函数。我想强制 GA 随机选择 0 和 1,但例如 80% 为 1,其余为 0。

我认为srng.binomial(X.shape, p=retain_prob)是一种选择,但我想使用random.randint功能。想知道我们如何做到这一点?

4

3 回答 3

2

的参数toolbox.register必须是一个函数,并且在运行它时要传递给该函数的参数

因为0 if random.randint(0, 4) == 0 else 1它不是一个函数(它是一个随机数),所以你得到了一个错误。解决方法是将此表达式打包在一个可以传递给的函数中toolbox.register

# returns 1 with probability p and 0 with probability 1-p
def bernoulli(p):
    if random.random() < p:
        return 1
    else:
        return 0

toolbox.register("attr_bool", bernoulli, 0.8)
于 2016-06-15T02:20:33.390 回答
2

一种自然的方法是使用表达式

1 if random.random() <= 0.8 else 0

您可以将其抽象为一个函数:

def bernoulli(p): return 1 if random.random() <= p else 0

然后bernoulli(0.8)将给出具有必要概率的 1 或 0。我不熟悉您正在使用的 GA 库,但bernoulli()它是可调用的,因此它应该可以工作。

于 2016-06-15T01:54:13.420 回答
1

random.randint不提供此类功能,但如果您想留在random包中,可以使用random.choice([0] * 1 + [1] * 4).

numpy.random还通过np.random.choice([0, 1], p=[0.2, 0.8]).

于 2016-06-15T01:46:10.907 回答