睿智的智能优化算法3——利用遗传算法实现字符串配对

2023-11-07

好久都没有用过遗传算法了,觉得需要重新复习一下,而且考虑到遗传算法应该有其它作用,所以我又来了!关于什么是遗传算法,及其实现方式,大家可以关注我的另一篇博文睿智的智能优化算法2——遗传算法的python实现
在这里插入图片描述

字符串配对

字符串配对的过程就是指定一条字符串,通过遗传算法的不断尝试,使其复现出这条字符串。
其实现过程大概如下所示(思路来自于莫烦python不过我的实现方式与其有一定的不同):

century: 0 get: RJSc-a
century: 1 get: QBy4WX
century: 2 get: n{Qs\X
……

century: 21 get: XJi2WX
century: 22 get: XAQ2WX
century: 23 get: XJQ2WX
[6, 'XJQ2WX']

求解过程

1、编码方式

首先假设一个字符串,本文使用的例子是"XJQ2WX"。
其对应的ASCII如图所示:
在这里插入图片描述
本文使用8位1、0来编码每个字符。编码方式如下:

# 该部分用于将字符对应的编码[1,0,1....,1,0]转换成对应的数字
def binarytodecimal(self,binary):
    total = 0
    for j in range(len(binary)):
        total += binary[j] * (2**j)
    total = np.int8(total * 94 / 255 + 32)
    return total

如X对应的ASCII码是88,其编码后的结果就是10011000。
在这里插入图片描述
XJQ2WX对应的编码长度就是56位,每个个体的长度为56位,每个个体可以分为7段,每段8位,每段对应一个字符。

def pop_translate(self):
    pop_translate = []
    # 对每个个体进行转换
    # pop_size代表个体数量
    for i in range(self.pop_size):
        unit = []
        # 读出一个个体基因中每一段对应的数字
        # gene_size代表字符的个数
        # unit_length代表每个字符对应的编码长度
        for j in range(self.gene_size):
            low,high = j*self.unit_length,(j+1)*self.unit_length
            after = self.binarytodecimal(self.pop[i,low:high])
            unit.append(after)
        # 存入到转换后的种群中
        pop_translate.append(unit)
    return np.array(pop_translate,dtype = np.int8) 

2、计算适应度

本文首先通过pop_translate函数得到转换成数字组形式的种群,再通过对比转换后的种群与目标字符串对应的ASCII码,计算出适应度,实现方式如下:

# 计算适应度
def count_fitness(self):
    # 首先获取转换后的种群
    self.pop_t = self.pop_translate()
    # 将转换后的种群与目标字符串对应的ASCII码比较,计算出适应度
    fitness = (self.pop_t == TARGET_ASCII).sum(axis=1)
    return np.array(fitness)

3、自然选择

自然选择依然采用轮盘赌的方式实现,通过np.random.choice函数实现相比于之前的方法更加简单:

# 自然选择
def selection(self):
    self.fit_value = self.count_fitness()
    [bestindividual, bestfit] = self.best()
    # 利用np.random.choice实现轮盘赌
    idx = np.random.choice(np.arange(self.pop_size), 
    	size=self.pop_size, replace=True, 
    	p=self.fit_value/self.fit_value.sum())
    self.pop = self.pop[idx]
    return [bestindividual, bestfit]

4、基因突变

在每次突变进行时,对每一个个体的每一段进行判断,如果某一段满足突变条件,则该段突变,实现方式如下:

def mutation(self):
    # 判断每一条染色体是否需要突变
    for i in range(self.pop_size):
        for j in range(self.gene_size):
            if (np.random.rand() < self.mutation_rate):
                low,high = j*self.unit_length,(j+1)*self.unit_length
                self.pop[i,low:high] = np.random.randint(0,2,size=self.unit_length)

5、个体杂交

杂交方式与之前相同,判断每一个个体是否满足杂交条件,是的话随机选择杂交点,然后交换对应点的基因。

# 杂交
def crossover(self):
    # 按照一定概率杂交
    for i in range(self.pop_size):
        # 判断是否达到杂交几率
        if (np.random.rand() < self.cross_rate):
            # 随机选取杂交点,然后交换结点的基因
            individual_size = self.gene_size*self.unit_length
            # 随机选择另一个个体进行杂交
            destination = np.random.randint(0,self.pop_size)
            # 生成每个基因进行交换的结点
            crosspoint = np.random.randint(0,2,size = individual_size).astype(np.bool) 
            # 进行赋值
            self.pop[i,crosspoint] = self.pop[destination,crosspoint]

实现代码

本次实现代码与上次相比最大的不同是通过类class的方式实现。

import numpy as np
import math
import random

TARGET_PHRASE = 'XJQ2WX'            # 目标字符串
POP_SIZE = 300                      # 种群数量
CROSS_RATE = 0.4                    # 杂交几率
MUTATION_RATE = 0.01                # 突变几率
N_GENERATIONS = 1000                # 繁殖代数

GENE_SIZE = len(TARGET_PHRASE)      # 获取字符串长度
TARGET_ASCII = np.fromstring(TARGET_PHRASE, dtype=np.uint8)  # 从字符串转换到数字

class GA():
    def __init__(self,gene_size,unit_length,cross_rate,mutation_rate,pop_size):
        # 基因长度代表字符串的长度
        self.gene_size = gene_size
        # 种群的大小代表种群中有几个个体
        self.pop_size = pop_size
        # 单位长度代表字符串每个字符所对应的编码长度
        self.unit_length = unit_length
        # 杂交几率
        self.cross_rate = cross_rate
        self.mutation_rate = mutation_rate
        self.pop = self.init_pop()

    # 初始化种群
    def init_pop(self):
        pop = []
        for _ in range(self.pop_size):
            pop.append(np.random.randint(0,2,size = self.gene_size*self.unit_length)) 
        return np.array(pop)
    
    # 将种群从[1,0,1....,1,0]编码转化成对应的数字
    def pop_translate(self):
        pop_translate = []
        for i in range(self.pop_size):
            unit = []
            # 读出一个个体基因中每一段对应的数字
            for j in range(self.gene_size):
                low,high = j*self.unit_length,(j+1)*self.unit_length
                after = self.binarytodecimal(self.pop[i,low:high])
                unit.append(after)
            # 存入到转换后的种群中
            pop_translate.append(unit)
        return np.array(pop_translate,dtype = np.int8) 

    # 该部分用于将字符对应的编码[1,0,1....,1,0]转换成对应的数字
    def binarytodecimal(self,binary):
        total = 0
        for j in range(len(binary)):
            total += binary[j] * (2**j)
        total = np.int8(total * 94 / 255 + 32)
        return total

    # 计算适应度
    def count_fitness(self):
        # 首先获取转换后的种群
        self.pop_t = self.pop_translate()
        # 将转换后的种群与目标字符串对应的ASCII码比较,计算出适应度
        fitness = (self.pop_t == TARGET_ASCII).sum(axis=1)
        return np.array(fitness)

    # 自然选择
    def selection(self):
        self.fit_value = self.count_fitness()
        [bestindividual, bestfit] = self.best()
        # 利用np.random.choice实现轮盘赌
        idx = np.random.choice(np.arange(self.pop_size), size=self.pop_size, replace=True, p=self.fit_value/self.fit_value.sum())
        self.pop = self.pop[idx]
        return [bestindividual, bestfit]

    # 选出最大value对应的索引,取出个体与对应的适应度
    def best(self): 
        index = np.argmax(self.fit_value)
        bestfit = self.fit_value[index]
        print(self.pop[index])
        bestindividual = self.pop_t[index].tostring().decode('ascii')
        return [bestindividual, bestfit]

    # 杂交
    def crossover(self):
        # 按照一定概率杂交
        for i in range(self.pop_size):
            # 判断是否达到杂交几率
            if (np.random.rand() < self.cross_rate):
                # 随机选取杂交点,然后交换结点的基因
                individual_size = self.gene_size*self.unit_length
                # 随机选择另一个个体进行杂交
                destination = np.random.randint(0,self.pop_size)
                # 生成每个基因进行交换的结点
                crosspoint = np.random.randint(0,2,size = individual_size).astype(np.bool) 
                # 进行赋值
                self.pop[i,crosspoint] = self.pop[destination,crosspoint]

    # 基因突变
    def mutation(self):
        # 判断每一条染色体是否需要突变
        for i in range(self.pop_size):
            for j in range(self.gene_size):
                if (np.random.rand() < self.mutation_rate):
                    low,high = j*self.unit_length,(j+1)*self.unit_length
                    self.pop[i,low:high] = np.random.randint(0,2,size=self.unit_length)

    def evolve(self):
        [bestindividual, bestfit] = self.selection()
        self.mutation()
        self.crossover()
        return [bestindividual, bestfit]

# 初始化类
test1 = GA(gene_size = GENE_SIZE,unit_length = 8,cross_rate = CROSS_RATE,
    mutation_rate = MUTATION_RATE,pop_size = POP_SIZE)

results = []

for i in range(N_GENERATIONS):
    [bestindividual, bestfit] = test1.evolve()
    results.append([bestfit,bestindividual])
    print("century:",i,"get:",bestindividual)
    if(bestindividual == TARGET_PHRASE):
        break
results.sort()	
print(results[-1]) #打印使得函数取得最大的个体,和其对应的适应度

实现结果为(实现的century次数不定):

century: 0 get: RJSc-a
century: 1 get: QBy4WX
century: 2 get: n{Qs\X
……

century: 21 get: XJi2WX
century: 22 get: XAQ2WX
century: 23 get: XJQ2WX
[6, 'XJQ2WX']

GITHUB下载连接

https://github.com/bubbliiiing/Optimization_Algorithm

希望得到朋友们的喜欢。
有问题的朋友可以提问噢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

睿智的智能优化算法3——利用遗传算法实现字符串配对 的相关文章

  • 遗传算法的matlab实现

    遗传算法 Genetic Algorithm GA 是20世纪70年代初兴起的一门新兴学科 遗传算法的基本思想来源于达尔文的进化论和孟德尔的遗传学说 它通过模拟生物进化的过程来求解问题 生物中的基因对应优化问题中的变量组合 一个解则代表了一
  • 经典遗传算法及MATLAB实例

    经典遗传算法及简单实例 MATLAB 1 遗传算法简单介绍 1 1 理论基础 1 2 算法要点 1 1 编码 1 2 适应度函数 1 3 基本流程 2 代码实例 MATLAB 2 1 代码汇总 2 1 初始化种群 2 2 计算适应度 2 3
  • 基于遗传算法的BP神经网络优化算法(matlab实现)

    1 理论基础 1 1 BP神经网络概述 BP网络是一类多层的前馈神经网络 它的名字源于在网络训练的过程中 调整网络的权值的算法是误差的反向传播的学习算法 即为BP学习算法 BP算法是Rumelhart等人在1986年提出来的 由于它的结构简
  • 遗传算法的概念和python实现

    遗传算法是一个非常经典的智能算法 主要用于解决优化问题 本文主要简单介绍一些原理 同时给出一个基于python实现的 用于解决实数内优化问题的模板 本文参考 原理 遗传算法入门详解 知乎 简单介绍 遗传算法就是借鉴生物学中的遗传 首先生成若
  • 遗传算法简介

    遗传算法简介1 美国Michigan大学的Holland教授及其学生收到生物模拟技术的启发 创造出了一种基于生物遗传和进化机制的适合与复杂系统优化的自适应概率优化技术 遗传算法 1967年 Holland的学生Bagley在其博士论文中首次
  • 融合黄金正弦,十种混沌映射,搞定!把把最优值,本文思路可用于所有智能算法的改进...

    上一期的2023年最新优化算法之减法优化器算法 SABO 效果已经相当不错了 而且由于其十分简单的公式原理 更适用于刚接触智能优化算法的小伙伴 今天这篇文章为大家带来 融合黄金正弦的减法优化器 GSABO 本文会讲解一下改进思路 为各位小伙
  • 数学建模常用算法:人工鱼群算法(AFAS)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制小鱼游动过程】

    一 代码 鱼类 package com dam heuristic afas test import java io Serializable import java util Random 人工鱼 public class Fish im
  • 使用遗传算法解决多变量函数优化问题!

    很多朋友在碰到多变量值优化的问题的时候不能很好的将问题转化 利用有效编码的方法将解的个数 解的编码很好的很合理的进行设计 因此不能利用遗传算法进行问题的求解 其实 简单的来说 就是将多个变量的数值编码编排进去 进行组合 只需要增长基因个体的
  • 利用遗传算法求解函数极值

    1 利用遗传算法求解函数极值 例1 利用遗传算法求函数 f x 11sin 6x 7cos 5x x 的最大值点 解 在MATLAB中编制绘制函数曲线的代码 运行得到题中函数的曲线图如下图所示 从下图中可以看出 该函数有多个极值点 如果使用
  • 遗传算法求解TSP及其变式

    刚刚接触遗传算法 主要学习的是以下几位老师的文章 抱拳 链接附上 https blog csdn net u010451580 article details 51178225 https blog csdn net wangqiuyun
  • 基于遗传算法的多目标优化算法(matlab实现)

    1 理论基础 1 1 多目标优化及Pareto最优解 多目标优化问题可以描述如下 其中 f x 为待优化的目标函数 x为待优化的变量 Ib和ub分别为变量x的下限和上限约束 Aeq x beq为变量x的线性等式约束 A x b为变量x的线性
  • 智能优化算法 — 蜣螂优化算法(Dung beetle optimizer,DBO)

    引言 小时候 蜣螂还是比较多见的 还顽皮地将粪球给它弄走 或者给它来点障碍 现在放牛的几乎看不到了 蜣螂没东西可推了 也慢慢从我们的视线中消失了 DBO介绍 2022年11月27日 东华大学沈波教授团队 继麻雀搜索算法 Sparrow Se
  • 【遗传算法】【处理图像类问题】

    文章目录 一 前言 二 问题描述 三 算法介绍 四 其他知识点 Reference 一 前言 近期感兴趣的算法 以前没这么好奇过一个算法 时间没想象的焦虑 认真做一些事情 算法入门篇 二 问题描述 从前 一群扇贝在海岸边悠哉游哉地生活着 它
  • 基于遗传算法二维下料问题/矩形件排样/matlab程序

    基于遗传算法的二维板材切割下料优化问题 matlab程序 关键词 遗传算法 二维板材切割 matlab 引言 二维板材切割问题在实际的工程中有很多的应用 该问题基本等同于矩形件优化排样 具体是指将若干尺寸不相同的矩形零件在给定的矩形板材上以
  • Fuch混沌映射

    一 Fuch混沌映射 Fuch混沌映射公式如下 该映射具有对初值不敏感 遍历均衡和收敛较快等优点 且在初值不为0的情形下均能产生混沌 二 Fuch混沌映射代码 x 1 rand for i 2 2000 x i cos 1 x i 1 2
  • 蜣螂优化算法(DBO)优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码

    蜣螂优化算法是华大学沈波教授团队 继麻雀搜索算法 Sparrow Search Algorithm SSA 之后 于2022年11月27日又提出的一种全新的群体智能优化算法 已有很多学者将算法用于实际工程问题中 今天咱们用蜣螂优化算法优化一
  • 睿智的智能优化算法2——遗传算法的python实现

    睿智的智能优化算法2 遗传算法的python实现 什么是遗传算法 求解过程 整体代码分解 1 编码解码部分 2 求取适应度部分 3 自然选择部分 4 组合交叉 5 基因突变 实现代码 GITHUB下载连接 睿智的智能优化算法小课堂再次开课啦
  • 如何理解遗传算法中的编码与解码?以二进制编码为例

    文章目录 前言 编码 解码 补充 前言 遗传算法的编码方法各种各样 但二进制串编码方式是最经典的一种 那么它的编码和解码该如何进行呢 或许本博客能给你一个具有参考价值的答案 编码 经典遗传算法中使用 染色体 来代指个体 它由二进制串组成 如
  • 进化计算-遗传算法之史上最全选择策略

    获取更多资讯 赶快关注上面的公众号吧 文章目录 第十九章 遗传算法 史上最全选择策略 19 1 轮盘赌选择 Roulette wheel selection 19 2 锦标赛选择 Tournament selection 19 3 截断选择
  • 单目标应用:基于蛇群优化算法(SO)的无人机(UAV)三维路径规划(提供MATLAB代码)

    一 蛇群优化算法SO 蛇群优化算法 Snake Optimizer SO 由Fatma A Hashim和Abdelazim G Hussien于2022年提出 该算法思路新颖 快速高效 模拟了蛇的觅食和繁殖行为 SO具体原理参考如下链接

随机推荐

  • vue踩坑之H5页面在ios的webview里面,长时间放到后台按钮失灵

    使用的前端技术栈是vue2 运行环境是在webview里面 具体的现象 在ios真机中 如果应用在后台运行几分钟再切回去 页面中的所有跳转按钮会失灵 并且报以下图片显示的错误 chunk是build之后的文件 从报错的信息来看是打包的某些文
  • 深入Java微服务之网关系列2:常见Java网关实现方案对比

    什么是服务网关 前文我们已经了解了构建微服务的基础springboot 同时也能使用springboot构建服务 接下来我们就基于springboot聊一下springcloud 这个springcloud并不是一个特定的技术 它指的是微服
  • this关键字和super关键字异同

    this关键字 1 在同一类中成员变量和局部变量名称相同时 区分两者和调用成员变量解决两者冲突问题 2 同一类中调用调用构造方法 3 指明成员方法 super关键字 1 在父类和子类中有相同变量时 调用父类变量 2 调用父类构造方法 必须放
  • 国内时间同步 ntp服务器地址

    国内时间同步 ntp服务器地址 ntp sjtu edu cn 202 120 2 101 上海交通大学网络中心NTP服务器地址 s1a time edu cn 北京邮电大学 s1b time edu cn 清华大学 s1c time ed
  • mysql8安装和驱动jar包下载

    方式一 基于docker安装 下拉镜像 docker pull mysql 8 0 21 启动镜像 docker run p 3307 3306 name mysql e MYSQL ROOT PASSWORD hadoop d mysql
  • 路由ui-router

    路由ui router Angular ngRoute针对于单视图 而ui router可用于多视图 这里说的视图是指在页面内我们可控制的 可变化的区域 比如我们点击了一个link 我们需要在视图中跳转到指定的一个页面 那么ngRoute已
  • 【Electron-vue】构建桌面应用(30)- child_proccess多次输出结果

    使用child process启动子进程 并与子进程通信的时候 发现会有多条打印结果 其原因是 不同的操作会触发stdin write操作 而每一个操作都需要通过stdout on来监听返回结果 如果使用stdout on来监听返回结果 那
  • 千聊视频的爬取

    import requests import random import os filedir 摩羯座周期下的黄金市场 if not os path exists filedir os makedirs filedir print 目录创建
  • 【BZOJ 2219】【超详细题解】数论之神

    2219 数论之神 Time Limit 3 Sec Memory Limit 259 MB Submit 365 Solved 33 Submit Status Discuss Description 在ACM DIY群中 有一位叫做 傻
  • 电机控制学习之路:simulink仿真之速度环、电流环PI参数设计

    前言 首先声明 笔者在电机控制之路也只是一个新手 撰写本文主要是为了对自己学习内容做一个总结和记录 网上FOC双闭环控制时的PI调参方法种类繁多 笔者在看的眼花缭乱之后以德州仪器的InstaSPIN FOC and InstaSPIN MO
  • 英语专栏——shell account

    shell account 外壳账号 A class of cheap but restricted internet dial up access Instead of connecting the computer directly t
  • ensp模拟器中云设备的使用及相关问题解决办法

    ensp模拟器中云设备的使用及相关问题解决办法 eNSP工具中的云代表通过各种网络技术连接起来的计算机网络环境 目前可实现的功能包括 仿真设备之间建立映射关系 绑定网卡与仿真设备之间进行通信 以及通过开放UDP端口方式与外部程序进行通信 基
  • Oracle-SQL脚本记录

    多字段匹配关键词查询 旧写法 where email like abc or address like abc 组合查询写法 where concat email address like abc
  • c语言练习题 ATM机流程

    自学c语言自娱自乐的 看到有的练习题上有模拟ATM机流程的练习就试着写了一个 include
  • 开源的杀毒软件

    开源的杀毒软件 有 免费的午餐 我们为什么不吃呢 杀毒软件一定要购买或用D版吗 先别忙着下结论 请耐心看完本文 然后再告诉我你是怎么想的 一 ClamWin Free Antivirus 开源反病毒软件 GPL协议 SourceForge页
  • Vmware 分辨率设置

    1 点击查看 2 点击自动调整大小 3 选择自动适应客户机即可
  • 简单怕忘笔记

    1 and REGEXP LIKE 字段名 匹配串1 匹配串2 全模糊匹配 2 and REGEXP LIKE 字段名 匹配串1 匹配串2 右模糊匹配 3 and REGEXP LIKE 字段名 匹配串1 匹配串2 左模糊匹配 4 LTRI
  • GNSS精密单点定位(PPP)基本原理(进阶篇)

    上节介绍了精密单点定位的基本原理 本文继续在精密单点定位的基础上进行更深层次的介绍 一 精密单点定位的函数模型 上节说过 在精密单点定位之前 也有一种绝对定位技术 那就是伪距单点定位 伪距单点定位靠的伪距进行单点定位 但是伪距的精度较差 主
  • 字符串转int数据类型的三种方式

    方法一 Integer valueOf 它将返回一个包装器类型 Integer 当然可以通过自动拆箱的方式将其转成 int 类型 String a 100 String b 50 int A Integer valueOf a int B
  • 睿智的智能优化算法3——利用遗传算法实现字符串配对

    睿智的智能优化算法3 利用遗传算法实现字符串配对 字符串配对 求解过程 1 编码方式 2 计算适应度 3 自然选择 4 基因突变 5 个体杂交 实现代码 GITHUB下载连接 好久都没有用过遗传算法了 觉得需要重新复习一下 而且考虑到遗传算