1

我对这条蟒蛇有点陌生。我正在尝试学习如何修改函数。在这种情况下,我在网上找到了下面的代码。我想学习如何使它仅在概率 = 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, n-1)
    return '{}{}'.format(i1[:split_index], i2[split_index:]), \
           '{}{}'.format(i1[split_index:], 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', '11000') out: ('00|000', '010|11') with split at 2.
4

1 回答 1

1

Your logic is fine, but why are you using format to do simple concatenation? Also, in the non-swap case, why do you split each string and then restore its original state?

if random.uniform(0, 1) <= threshold:
    return (i1[:split_index] + i2[split_index:],
            i1[split_index:] + i2[:split_index])
else:
    return (i1, i2)
于 2021-03-08T06:39:55.967 回答