问题描述
我对这个 python 有点陌生。我正在尝试学习如何修改函数。在这种情况下,我在网上找到了下面的代码。我想学习如何使其仅以概率 = 0.9 工作。也就是说,如果我有两个像 ('1001001010001','100000001100') 这样的二进制字符串,我只想以 0.9 的概率交换它们的一半。
那将是概率为 0.9 的代码将原始字符串切成两半,如 ('1 | 2','3 | 4') 并交换它们如 [1 | 4,3 | 2]。
这是我目前的代码:
def crossover(i1,i2):
assert len(i1) == len(i2)
n = len(i1); split_index = random.randint(0+1,n-1)
return '{}{}'.format(i1[:split_index],i2[split_index:]),\
'{}{}'.format(i1[split_index:],i2[:split_index])
## in: ('00010','11000') out: ('00|000','010|11') with split at 2.
我是这么想的。尽管它有效,但它看起来一点也不优雅。任何帮助了解其他人会如何做?非常感谢您的帮助!!
def crossover(i1,i2,threshold):
assert len(i1) == len(i2)
n = len(i1); split_index = random.randint(0+1,i2[:split_index]) \
if random.uniform(0,1) <= threshold \
else '{}{}'.format(i1[:split_index],i1[split_index:]),\
'{}{}'.format(i2[split_index:],i2[:split_index]) \
## in: ('00010','010|11') with split at 2.
解决方法
你的逻辑没问题,但你为什么用 format
做简单的连接?
另外,在非交换情况下,为什么要拆分每个字符串然后恢复其原始状态?
if random.uniform(0,1) <= threshold:
return (i1[:split_index] + i2[split_index:],i1[split_index:] + i2[:split_index])
else:
return (i1,i2)