以下内容都是个人浅薄的理解以及一些note
遗传算法顾名思义是按照自然选择生物通过自身繁衍以及突变最后产生适合生存环境的新物种。
遗传算法通过自然进化来寻求最优解,模仿自然过程来编写代码时,第一步就是需要用特定的符号或者数字来表达某一种生物特征,在这里我选择了最简单的将字符串转换成二进制数字来表征他本身。
遗传算法的第二部就是评估个体是否适应了当前的环境,如果适应环境了就产生了新的物种,如果不适应就要继续进行选择,交叉,变异。在这里,我使用的交叉方法是将父类与母类的二进制编码进行比较,如果有不同的地方,将其互换,如1001和1010互换后得到1010和1011(只是交换了,应该考虑与非或者是与或),然后利用随机数的方法生成一个值,在这个值的位置实现基因突变,既1变0,0变1。最后将得到的二进制转换成字符。
import random
class GA(object):
def __init__(self,PARENT_A, PARENT_B):
self.parent_a = PARENT_A
self.parent_b = PARENT_B
def replace_char(self, string, char, index):
string = list(string)
string[index] = char
return ''.join(string)
def encode(self, x, y):
x = ' '.join([bin(ord(c)).replace('0b', '') for c in x])
y = ' '.join([bin(ord(c)).replace('0b', '') for c in y])
return x, y
def decode(self, x, y):
a = ''.join([chr(i) for i in [int(b, 2) for b in x.split(' ')]])
b = ''.join([chr(i) for i in [int(b, 2) for b in y.split(' ')]])
return a, b
# def enter(self):
# x = input('请输入除苹果外一种水果的英文:')
# y = input('请输入除苹果外一种水果的英文:')
# return x, y
def fitness(self, son_a, son_b):
target = 'c'
target = ' '.join([bin(ord(c)).replace('0b', '') for c in target])
count = 0
i = 0
l = min(len(son_a), len(son_b), len(target))
for i in range(0, l):
if son_a[i] == target[i]:
count = count + 1
else:
continue
if count > l - 1:
count = 1
else:
count = 0
return count, son_a, son_b
def crossover(self, a, b):
# list = []
# list = self.encode(x, y)
# a = list[0]
# b = list[1]
i = 0
if len(a) > len(b):
while i < len(b):
if a[i] != b[i]:
temp = a[i]
a = self.replace_char(a, b[i], i)
b = self.replace_char(b, temp, i)
# a.replace(a[i], b[i])
# b.replace(b[i], temp)
i = i + 1
else:
i = i + 1
else:
while i < len(a):
if a[i] != b[i]:
temp = a[i]
# a.replace(a[i], b[i])
# b.replace(b[i], temp)
a = self.replace_char(a, b[i], i)
b = self.replace_char(b, temp, i)
i = i + 1
else:
i = i + 1
return a, b
def mutate(self, a, b):
idx_a = random.randrange(0, len(a))
idx_b = random.randrange(0, len(b))
if a[idx_a] == '0':
a = self.replace_char(a, '1', idx_a)
else:
a = self.replace_char(a, '0', idx_a)
if b[idx_b] == '0':
b = self.replace_char(b, '1', idx_b)
else:
b = self.replace_char(b, '0', idx_b)
return a, b
if __name__ == '__main__':
x = input('请输入除c外一个字母:')
y = input('请输入除c外一个字母:')
ga = GA(x, y)
son_a = ga.encode(x, y)[0]
son_b = ga.encode(x, y)[1]
while ga.fitness(son_a, son_b)[0] != 1:
ga.crossover(son_a, son_b)
son_a = ga.crossover(son_a, son_b)[0]
son_b = ga.crossover(son_a, son_b)[1]
ga.mutate(son_a, son_b)
son_a = ga.mutate(son_a, son_b)[0]
son_b = ga.mutate(son_a, son_b)[1]
print(ga.decode(son_a, son_b))