关于遗传算法的个人理解与尝试

该博客介绍了如何运用遗传算法来模拟生物进化过程,寻找字符串的最优解。通过将字符串转换为二进制编码,然后进行选择、交叉和变异操作,以适应目标字符。在交叉过程中,通过比较父代二进制编码并交换不同位,再用随机数生成器进行基因突变,最终将二进制编码转回字符。通过不断迭代,遗传算法能够逐步优化输入的字符直至接近目标字符。
摘要由CSDN通过智能技术生成

以下内容都是个人浅薄的理解以及一些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))


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值