Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于给定概率高效地变异二进制字符串中的字符_Python_Genetic Algorithm - Fatal编程技术网

Python 基于给定概率高效地变异二进制字符串中的字符

Python 基于给定概率高效地变异二进制字符串中的字符,python,genetic-algorithm,Python,Genetic Algorithm,我试图根据随机数概率有效地改变二进制字符串中的值。下面是我生成的一段代码,它是有效的,但我相信在处理数千个二进制字符串时,可以更好地减少时间和内存使用 b = '111111' c = [random.random() for x in range(len(b))] for x in range(len(b)): z = list(b) if c[x] <= 0.3: print(x, True) z[x] = '0' b

我试图根据随机数概率有效地改变二进制字符串中的值。下面是我生成的一段代码,它是有效的,但我相信在处理数千个二进制字符串时,可以更好地减少时间和内存使用

b = '111111'
c = [random.random() for x in range(len(b))]

for x in range(len(b)):
    z = list(b)
    if c[x] <= 0.3:
        print(x, True)
        z[x] = '0'
        b = ''.join(z)
    else:
        print(x, False)
b='111111'
c=[random.random()表示范围内的x(len(b))]
对于范围(len(b))内的x:
z=列表(b)

如果c[x]您只需要一个列表理解就可以被
join
方法使用

b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])

您只需要一个列表理解就可以被
join
方法使用

b = ''.join(["1" if random.random() > 0.3 else "0" for _ in b])

完整的数学解决方案仅使用位(和
log2
来计算
b
或更好的“位数”,如注释中所示,
bit\u length
)。这不涉及字符串(除了开始时的解析和最后的打印)


完整的数学解决方案仅使用位(和
log2
来计算
b
或更好的“位数”,如注释中所示,
bit\u length
)。这不涉及字符串(除了开始时的解析和最后的打印)



直接使用整数Jean-Francois Fabre:在我正在构建的模型中,直接使用整数的问题是,从整数到二进制的转换器会生成字符串,反之则需要字符串。除此之外,还有很多二进制连接不能很好地处理整数。然后解析string=>int,生成并转换回stringwork直接处理整数Jean Francois Fabre:在我构建的模型中,直接处理整数的问题是,从整数到二进制的转换器会生成字符串,反过来需要字符串。除此之外,还有很多二进制连接不能很好地处理整数。然后解析string=>int,生成并转换回string,在这里也可以使用列表理解,这将是更快的选择:如果随机数低于某个值,则想法是将
0
变为
1
,或将
1
变为
0
。列表理解在这种情况下仍然有效吗?你不能改变字符串;您所能做的就是基于原始字符串的元素创建一个新字符串。在这里,您可以使用列表理解,它将更快:如果随机数低于某个值,则可以将
0
变为
1
,或将
1
变为
0
。列表理解在这种情况下仍然有效吗?你不能改变字符串;您所能做的就是基于原始字符串的元素创建一个新字符串。您可以使用
b.bit\u length()
而不是log2。今天我学习了
bit\u length()
wow。。。此外,这比“紧凑,所以显然更好”的公认答案更具可读性+1谢谢。根本不使用字符串更重要的是性能问题。我知道很多,所有语言中的字符串都不是我喜欢使用的东西,在Python中它们是对象,所以唯一能让另一个答案不那么慢的可能是(我不太了解缓存本身,但Python肯定会缓存对象)Python解释器使用的字符串值缓冲区和字符串对象缓存。此外,我只是不喜欢OneLiner,因为它们看起来很糟糕,几乎没有解释任何事情,但没关系,至少询问者会印象深刻,复制粘贴很有效……我不同意列表理解不好。一般来说没问题,在这种情况下,简短到可以理解。但你不能一点一点地理解列表。这就是我没有创建它的原因之一。你可以用
b.bit\u length()
代替log2。今天我学习了
bit\u length()
wow。。。此外,这比“紧凑,所以显然更好”的公认答案更具可读性+1谢谢。根本不使用字符串更重要的是性能问题。我知道很多,所有语言中的字符串都不是我喜欢使用的东西,在Python中它们是对象,所以唯一能让另一个答案不那么慢的可能是(我不太了解缓存本身,但Python肯定会缓存对象)Python解释器使用的字符串值缓冲区和字符串对象缓存。此外,我只是不喜欢OneLiner,因为它们看起来很糟糕,几乎没有解释任何事情,但没关系,至少询问者会印象深刻,复制粘贴很有效……我不同意列表理解不好。一般来说没问题,在这种情况下,简短到可以理解。但你不能一点一点地理解列表。这就是我没有创建一个的原因之一。
>>> bin(new_b)
'0b11101'