进化算法------微生物进化算法(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指…

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…

④. 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 一、链表 …

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;那么又没有一种折中的…

自动化办公篇之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电路…

Mybatis学习笔记注解/xml映射/动态SQL%%%Mybatis教程

介绍 Mybatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 的开发 MyBatis中文网 Mybatis 入门 快速入门 步骤 创建 SpringBoot 工程、数据库表 user、实体类 User引入 Mybatis 相关依赖&#xff0c;配置 Mybatis&#xff08;数据库连接信息&#xff09;编写 SQL 语…

Scraping 和Crawling的区别与联系

在互联网时代&#xff0c;获取网页上的数据对于许多人来说已经成为一种常态。在这个过程中&#xff0c;我们经常会听到两个词&#xff1a;Web Scraping&#xff08;网页抓取&#xff09;和Web Crawling&#xff08;网络爬虫&#xff09;&#xff0c;它们看似相似&#xff0c;但…

大语言模型之十七-QA-LoRA

由于基座模型通常需要海量的数据和算力内存&#xff0c;这一巨大的成本往往只有巨头公司会投入&#xff0c;所以一些优秀的大语言模型要么是大公司开源的&#xff0c;要么是背后有大公司身影公司开源的&#xff0c;如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…

Idea使用技巧——导包优化,新版idea界面取消,界面字体放大缩小

导包优化 on the fly 翻译为立刻 第一个表示&#xff0c;如果导入的包没有冲突&#xff0c;会自动帮你导入。如果输入List 无需手动altenter 第二个表示&#xff0c;没有引用的包&#xff0c;会自动删除。这个对于代码整洁尤其适用。相当于ctrlalto的功能 新版idea的界面取消 …

【RWKV】如何新增一个自定义的Tokenizer和模型到HuggingFace

0x0. 前言 RWKV社区在Huggingface上放了rwkv-4-world和rwkv-5-world相关的一系列模型&#xff0c;见&#xff1a;https://huggingface.co/BlinkDL/rwkv-4-world & https://huggingface.co/BlinkDL/rwkv-5-world &#xff0c;然而这些模型的格式是以PyTorch的格式进行保存的…

spark中使用flatmap报错:TypeError: ‘int‘ object is not subscriptable

1、背景描述 菜鸟笔者在运行下面代码时发生了报错&#xff1a; from pyspark import SparkContextsc SparkContext("local", "apple1012")rdd sc.parallelize([[1, 2], 3, [7, 5, 6]])rdd1 rdd.flatMap(lambda x: x) print(rdd1.collect())报错描述如…

【Proteus仿真】【51单片机】智能语音家居陪护机器人

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用OLED液晶、按键、蜂鸣器、DS18B20温度传感器、人体红外传感器、语音识别模块、继电器、风扇、LED等。 主要功能&#xff1a; 系统运行后&#xff0…

自定义jenkins镜像提示FontConfiguration.head错误

系统使用&#xff1a;Debian12&#xff0c;jdk17 提示问题&#xff1a;缺少字体 找一台jdk8的环境&#xff0c;在lib文件夹中找到fontconfig.bfc find / -name *fontconfig* 复制到jenkins目标服务器中&#xff0c;jdk目录的lib中 再次启动jenkins服务正常