进化算法------微生物进化算法(MGA)

前言

该文章写在GA算法之后:GA算法

遗传算法 (GA)的问题在于没有有效保留好的父母 (Elitism), 让好的父母不会消失掉. Microbial GA (后面统称 MGA) 就是一个很好的保留 Elitism 的算法.

一句话来概括: 在袋子里抽两个球, 对比两个球, 把球大的放回袋子里, 把球小的变一下再放回袋子里, 这样在这次选着中,
大球不会被改变任何东西, 就被放回了袋子, 当作下一代的一部分.

算法思想

在这里插入图片描述
每次在进化的时候, 我们会从这个 pop 中随机抽 2 个 DNA 出来, 然后对比一下他们的 fitness, 我们将 fitness 高的定义成 winner, 反之是 loser. 我们不会去动任何 winner 的 DNA, 我们只对 loser, 比如对 loser 的DNA进行修改,进行 crossovermutate. 之后将 winnerloser 一同放回 pop 中.

通过这样的流程, 我们就不用担心有时候变异着变异着, 那些原本好的 pop 流失掉了, 有了这个 MGA 算法, winner 总是会被保留下来的. GA 中的 Elitism 问题通过这种方法巧妙解决了.

示例

我们以曲线寻找最大值为例子
在这里插入图片描述

本算法与GA算法的区别在于交叉时,我们将选择的两个个体,一个winner一个loser,我们将winner的部分DNA复制给loser
代码如下:

 def crossover(self, loser_winner):  # mating process (genes crossover)"""交叉配对:param parent::param pop::return:"""# 生成一个长度DNA_size的布尔类型的数组  布尔值来选择相应的交叉点进行交叉操cross_idx = np.empty((self.DNA_size,)).astype(np.bool_)for i in range(self.DNA_size):cross_idx[i] = True if np.random.rand() < self.cross_rate else False# 将winner的DNA和loser的DNA交叉,重新赋值给loserloser_winner[0, cross_idx] = loser_winner[1, cross_idx]return loser_winner

其次是变异操作,我们进行交叉操作之后,我们对loser的DNA进行变异操作
代码如下:

 def mutate(self, loser_winner):"""变异操作:param loser_winner::return:"""# 生成要变异的结点mutation_idx = np.empty((self.DNA_size,)).astype(np.bool_)for i in range(self.DNA_size):mutation_idx[i] = True if np.random.rand() < self.mutate_rate else False  # mutation index# 进行变异loser_winner[0, mutation_idx] = ~loser_winner[0, mutation_idx].astype(np.bool_)return loser_winner

最后就是算法核心,GA算法是对种群进行select,而我们的MGA算法就是选择多次的loserwinner,这样适应度好的个体会一直保留在种群当中,而不会被替代
代码如下:

    def evolve(self, n):"""微生物进化算法:param n::return:"""# 从种群中取n次的 loser_winnerfor _ in range(n):# 获取两个个体的下标sub_pop_idx = np.random.choice(np.arange(0, self.pop_size), size=2, replace=False)# 得到两个个体sub_pop = self.pop[sub_pop_idx]# 获取适应度product = F(self.translateDNA(sub_pop))fitness = self.get_fitness(product)# 根据适应度对两个个体进行排序,适应度低的在第一个即loserloser_winner_idx = np.argsort(fitness)   #返回排序后的索引loser_winner = sub_pop[loser_winner_idx]  # the first is loser and second is winnerloser_winner = self.crossover(loser_winner)loser_winner = self.mutate(loser_winner)self.pop[sub_pop_idx] = loser_winnerDNA_prod = self.translateDNA(self.pop) # y轴pred = F(DNA_prod)   # x轴return DNA_prod, pred

完整代码如下

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import timeimport numpy as np
import matplotlib.pyplot as pltDNA_SIZE = 10            # DNA length  DNA长度
POP_SIZE = 20           # population size  种群大小
CROSS_RATE = 0.6         # mating probability (DNA crossover)  交叉配对的概率
MUTATION_RATE = 0.01    # mutation probability  编译的概率
N_GENERATIONS = 200     #   代数
X_BOUND = [0, 5]         # x upper and lower bounds   x轴范围def F(x):"""定义一个函数,就是图像中的线条:param x::return:"""return np.sin(10*x)*x + np.cos(2*x)*x     # to find the maximum of this functionclass MGA():def __init__(self, DNA_size, DNA_bound, cross_rate, mutation_rate, pop_size):self.DNA_size = DNA_sizeDNA_bound[1] += 1self.DNA_bound = DNA_boundself.cross_rate = cross_rateself.mutate_rate = mutation_rateself.pop_size = pop_size# initialize the pop DNA   s生成0-1的POP_SIZE行 DNA_SIZE列的种群self.pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE))def get_fitness(self,pred):"""获取个体的适用度:param pred::return:"""return pred + 1e-3 - np.min(pred)  # 防止适应度为负数def translateDNA(self,pop):"""将0 1 DNA序列翻译成范围在(0, 5)的数字:param pop::return:"""return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * X_BOUND[1]def crossover(self, loser_winner):  # mating process (genes crossover)"""交叉配对:param parent::param pop::return:"""# 生成一个长度DNA_size的布尔类型的数组  布尔值来选择相应的交叉点进行交叉操cross_idx = np.empty((self.DNA_size,)).astype(np.bool_)for i in range(self.DNA_size):cross_idx[i] = True if np.random.rand() < self.cross_rate else False# 将winner的DNA和loser的DNA交叉,重新赋值给loserloser_winner[0, cross_idx] = loser_winner[1, cross_idx]return loser_winnerdef mutate(self, loser_winner):"""变异操作:param loser_winner::return:"""# 生成要变异的结点mutation_idx = np.empty((self.DNA_size,)).astype(np.bool_)for i in range(self.DNA_size):mutation_idx[i] = True if np.random.rand() < self.mutate_rate else False  # mutation index# 进行变异loser_winner[0, mutation_idx] = ~loser_winner[0, mutation_idx].astype(np.bool_)return loser_winnerdef evolve(self, n):"""微生物进化算法:param n::return:"""# 从种群中取n次的 loser_winnerfor _ in range(n):# 获取两个个体的下标sub_pop_idx = np.random.choice(np.arange(0, self.pop_size), size=2, replace=False)# 得到两个个体sub_pop = self.pop[sub_pop_idx]# 获取适应度product = F(self.translateDNA(sub_pop))fitness = self.get_fitness(product)# 根据适应度对两个个体进行排序,适应度低的在第一个即loserloser_winner_idx = np.argsort(fitness)   #返回排序后的索引loser_winner = sub_pop[loser_winner_idx]  # the first is loser and second is winnerloser_winner = self.crossover(loser_winner)loser_winner = self.mutate(loser_winner)self.pop[sub_pop_idx] = loser_winnerDNA_prod = self.translateDNA(self.pop) # y轴pred = F(DNA_prod)   # x轴return DNA_prod, predif __name__ == '__main__':plt.ion()  # something about plotting# x轴x = np.linspace(*X_BOUND, 200)plt.plot(x, F(x))# 初始化算法ga = MGA(DNA_size=DNA_SIZE, DNA_bound=[0, 1], cross_rate=CROSS_RATE, mutation_rate=MUTATION_RATE, pop_size=POP_SIZE)# 迭代N_GENERATIONS次for _ in range(N_GENERATIONS):# 进行进化算法DNA_prod, pred = ga.evolve(5)# 得到图像上的y值F_values = F(ga.translateDNA(ga.pop))# 获取每一个个体的适应度fitness = ga.get_fitness(F_values)# 获取最好适用度的个体下标i = np.argmax(fitness)print("最优DNA", ga.pop[i, :])# something about plottingif 'sca' in globals(): sca.remove()sca = plt.scatter(DNA_prod, pred, s=200, lw=0, c='red', alpha=0.5);plt.pause(0.05)plt.ioff()plt.show()

总结

MGA算法与GA算法的本质区别在于,MGA算法对适应度较好的个体进行了保留,并将适应度较好的个体的DNA复制给较差的DNA个体并进行变异操作

参考

莫烦Python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARMv5架构对齐访问异常问题

strh非对齐访问 在ARMv5架构中&#xff0c;对于strh指令&#xff08;Store Halfword&#xff09;&#xff0c;通常是要求对地址进行对齐访问的。ARMv5架构对于半字&#xff08;Halfword&#xff09;的存储操作有对齐要求&#xff0c;即地址必须是2的倍数。 如果尝试使用strh指…

2024北京国际光刻设备及光掩膜技术展览会

2024北京国际光刻设备及光掩膜技术展览会 Beijing Photolithography Equipment and Mask Application Technology Exhibition2024 基本信息 时间&#xff1a;2024年7月24-26日 地点&#xff1a;北京国家会议中心 展会简介 微电子技术的发展一直是光刻设备和技术变革的动力&…

二、使用DockerCompose部署RocketMQ

使用DockerCompose进行部署 RocketMQ的部署方式以及各自的特点 单master模式 只有一个 master 节点&#xff0c;如果master节点挂掉了&#xff0c;会导致整个服务不可用&#xff0c;线上不宜使用&#xff0c;适合个人学习使用。 多master模式 和kafka不一样&#xff0c;Rocke…

vue3 状态管理pinia

1. 什么是Pinia Pinia 是 Vue 的专属的最新状态管理库 &#xff0c;是 Vuex 状态管理工具的替代品 特点优势: 提供更加简单的API(去掉了mutation)提供符合组合式风格的API(和Vue3新语法统一)去掉modules的概念,每一个store都是一个独立的模块配合TypeScript更加友好,提供可靠的…

网站的常见攻击与防护方法

在互联网时代&#xff0c;几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误&#xff0c;也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何&#xff0c;网络攻击者的主要动机通常是谋求经济利益。这意味着无论您经营的是电子商务项目还是小型商业网站…

【Redis】Set集合相关的命令

目录 命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREMSINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令 SADD 将⼀个或者多个元素添加到set中。注意&#xff0c;重复的元素⽆法添加到set中。 SADD key member [member ...]SMEMBERS 获取⼀个set中的所有元素&#xff0…

vector Autosar someip和vsomeip协议调试总结

someip是现代车辆通信的主流通信协议知一&#xff1b; someip的主要涉及模型以及协议结构&#xff0c;我就不做多的做介绍了&#xff0c;如有需要请读者自行进行百度学些&#xff1b; 虽然someip协议已经基本成熟&#xff0c;但有多个实现版本&#xff0c;现在使用较多的主要…

④. GPT错误:导入import pandas as pd库,存储输入路径图片信息存储错误

꧂ 问题最初꧁ 用 import pandas as pd 可是你没有打印各种信息input输入图片路径 print图片尺寸 大小 长宽高 有颜色占比>0.001的按照大小排序将打印信息存储excel表格文件名 表格路径 图片大小 尺寸 颜色类型 占比信息input输入的是文件就处理文件 是文件夹&#x1f4c…

数据结构与算法—单链表

目录 一、链表 1、链表的概念及结构 2、分类 二、实现单向链表 1、声明链表结构体 2、输出 3、头插&尾插 4、头删尾删 5、查找 6、指定位置插入 7、删除指定节点 8、删除指定节点的后一个节点 9、单链表的销毁 完整版 LList.h LList.c text.c 一、链表 …

spring中事务相关面试题(自用)

1 什么是spring事务 Spring事务管理的实现原理是基于AOP&#xff08;面向切面编程&#xff09;和代理模式。Spring提供了两种主要的方式来管理事务&#xff1a;编程式事务管理和声明式事务管理。 声明式事务管理&#xff1a; Spring的声明式事务管理是通过使用注解或XML配置来…

LocalDateTime与时间戳

众所周知&#xff0c;如果想把 LocalDateTime 转为时间戳&#xff0c;需要先指定时区&#xff0c;然后才能转为时间戳&#xff0c;例如&#xff1a; LocalDateTime localDateTime LocalDateTime.now(); ZonedDateTime zonedDateTime localDateTime.atZone(ZoneId.systemDe…

BI工具:让数据分析井然有序一望而知

BI&#xff08;Business Intelligence&#xff09;工具是一类专门用于数据分析和决策支持的软件工具。 它们能够将企业内部和外部的数据进行整合、处理和可视化&#xff0c;帮助用户从海量数据中获取有价值的见解和洞察&#xff0c;并以直观、易懂的方式展示给决策者和相关人员…

ios app开发环境搭建

Xcode是Apple iOS的应用市场app store移动应用的开发工具&#xff0c;支持不同设备、不同应用场景的开发&#xff0c;本文主要描述xcode开发工具开发环境的搭建。 如上所示&#xff0c;在macos中&#xff0c;使用app store安装xcode开发工具 如上所示&#xff0c;在macos中&…

【网络协议】聊聊ifconfig

我们知道在linux是ifconfig查看ip地址&#xff0c;但是ip addr也可以查看 IP 地址是一个网卡在网络世界的通讯地址&#xff0c;相当于我们现实世界的门牌号码。 从IP地址的划分来看&#xff0c;C类地址只可以容纳254个&#xff0c;而B类6W多&#xff0c;那么又没有一种折中的…

design compiler中的drc规则详解

design compiler中的drc规则详解 DRC是什么&#xff1f;DRC分类各个DRC的含义写在最后 DRC是什么&#xff1f; 本文讨论的DRC即是Design Rule Constraint,而不是Design Rule Check&#xff0c;后者是物理端或者后端的一个关键步骤。 DRC分类 DRC为DC中的一个约束大类&#x…

设计模式——21. 中介者模式

1. 说明 中介者模式(Mediator Pattern)是一种行为设计模式,它允许对象之间通过一个中介者对象进行通信,而不是直接相互引用。这种模式有助于减少对象之间的直接关联,从而提高系统的可维护性和松耦合性。中介者模式将对象之间的交互集中在一个中介者对象中,该对象负责协调…

windows DOM 命令手册

Windows 打开windows中特定程序 win R > cmd > Enter # 打开 dos 窗口 win R > devmgmt.msc > Enter # 打开设备管理器 win R > services.msc > Enter # 打开服务管理器 基础命令 help-查看某个命令帮助信息 # 查看…

自动化办公篇之python

1、如果没有安装xlwings库&#xff0c;先在控制台pip install xlwings,然后点击运行&#xff0c;创建四个空excel表 。 import xlwings as xw app xw.App(visibleTrue,add_bookFalse) for dept in ["技术部","销售部","运营部","财务部&q…

74.C++ STL stack容器

目录 1.什么是stack 2.stack的构造函数 3.赋值操作 4.数据存取操作 5.大小操作 1.什么是stack stack 是 C 标准库中的容器适配器&#xff0c;它提供了一个堆栈&#xff08;栈&#xff09;数据结构的封装&#xff0c;用于管理元素的插入和移除。栈是一种后进先出的数据结构…

GaN器件的工作原理

目录 AlGaN/GaNHEMT 器件工作原理&#xff08;常开-耗尽型器件&#xff09;常关 AlGaN/GaN 功率晶体管&#xff08;增强型器件&#xff09;HD-GIT与SP-HEMT AlGaN/GaNHEMT 器件工作原理&#xff08;常开-耗尽型器件&#xff09; 来源&#xff1a;毫米波GaN基功率器件及MMIC电路…