随机翻转二进制列表中的一位

Randomly flip one bit in a binary list

我正在使用 python-3.x,我正在尝试对二进制字符串进行突变,该字符串将随机翻转元素的一位,从 0 到 1 或 1 到 0,我尝试了一些方法但没有用我不知道问题出在哪里:

x=[0, 0, 0, 0, 0]

def mutation (x, muta):
    for i in range(len(x)):
        if random.random() < muta:
            x[i] = type(x[i])(not x[i])
    return x,
print (x)

例如输出应该是 x=[0, 0, 0, 1, 0] 或 x=[1, 0, 0, 0, 0] 等等....

另外,我试过这个:

MUTATION_RATE = 0.5
CHROMO_LEN = 6
def mutate(x):
    x = ""
    for i in range(CHROMO_LEN):
        if (random.random() < MUTATION_RATE):
            if (x[i] == 1):
                x += 0
            else:
                x += 1
        else:
            x += x[i]
    return x
print(x)

如有任何建议或建议,我们将不胜感激

你确定你在打印之前调用函数吗x:

def mutation(x):
    # your code without the trailing comma

mutation(x)
print(x)

在 Python 中,创建新列表通常比修改旧列表更可取。我会这样写你的第一个函数(我将整数转换为布尔值,因为你只是翻转它们:

x = [False, False, False, False]


def mutation(x, muta):
    return [not e if random.random() < muta else e
            for e in x]

通过再次分配给它更改 x:

x = mutation(x, .5)

如果您删除 return:

后的逗号,您的原始功能将正常运行
def mutation(x, muta):
    for i in range(len(x)):
        if random.random() < muta:
            x[i] = type(x[i])(not x[i])
    return x
x = [False, False, False, False]


mutation(x, .5)
Out[8]: [False, False, True, False]

mutation(x, .5)
Out[9]: [True, True, True, False]

您还可以使用 python 的 XOR operator 来翻转位,这将在“1”和“0”之间翻转:

x[1] = x[1] ^ 1

另请参阅: