我有一个随机生成的0和1的列表。我需要选择一个位并将其翻转到相反的位置:从0到1或从1到0。
按位非运算符仅适用于整数和长整数,而xor(^
)运算符适用于两个整数。
Enter a population size: 4
Enter an organism length: 2
[[1, 1], [0, 1], [0, 0], [0, 0]]
[[[1, 1], [0, 1]]]
上面的代码是一个简短的用户输入程序的一部分,用户输入弹出的大小和长度。该程序打印一个随机生成的数字列表,其中包括弹出大小和长度,并占据前50%,这是第二个打印列表。现在我需要从第二个列表中选择一个随机位并将其翻转为零或一个。然而,不是整个清单。
非常感谢链接和解释,我希望改进。
答案 0 :(得分:2)
您可以使用randint
为索引生成随机整数,然后使用例如^1
来翻转它,例如:
from random import randint
pop = [[1, 1], [0, 1], [0, 0], [0, 0]]
individual = pop[1] # select the second individual
individual[randint(0,len(individual)-1)] ^= 1 # flip the bit
我跑了之后,我获得了:
>>> pop
[[1, 1], [0, 0], [0, 0], [0, 0]]
所以它翻了第二位。但它也可能是第一个。通过使用len(individual)
,我们保证如果个人的位数增加,它仍将有效。
有人说在列表中将比特编码为0-1,效率不高。您可以在Python中使用int
作为位列表(int
在python-3.x中具有任意长度。)
修改强>
如果你想翻转 per 个体(对于每个人,它可以是不同的位),你可以使用for
循环:< / p>
for individual in pop: # iterate over population
individual[randint(0,len(individual)-1)] ^= 1 # flip a random bit
如果我按照给定的初始人口计算,我得到:
>>> pop
[[0, 1], [1, 1], [0, 1], [1, 0]]
因此每个人都只有一个位翻转,而不是全部相同。当然它是随机的,所以在某次运行中,随机数发生器可能会为每个人选择相同的位。
答案 1 :(得分:1)
要翻转单个位,请使用逻辑参数。
int(not 0) = 1
int(not 1) = 0
如果你必须在每个人群中只翻一点,我建议:
chrom = random.choice(pop)
j = random.randrange(len(chrom))
chrom[j] = int(not chrom[j])