关于二进制字符串的变异(遗传算法):二进制字符串的变异(遗传算法) – python-3.x

Mutation on a binary string (genetic algorithm) - python-3.x

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

1
2
3
4
5
6
7
8
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]等等…

我也试过这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

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


您还可以使用python的xor运算符来翻转位,它将在"1"和"0"之间翻转:

埃多克斯1〔3〕

另请参见:python xor首选项:位运算符与布尔运算符


在打印x之前是否确实要调用该函数:

1
2
3
4
5
def mutation(x):
    # your code without the trailing comma

mutation(x)
print(x)

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

1
2
3
4
5
6
x = [False, False, False, False]


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

通过重新分配来更改x

1
x = mutation(x, .5)

如果删除return后面的逗号,则原始函数将正常工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
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]