遗传算法与深度学习实战——生命模拟与进化论

news2024/11/24 12:08:04

遗传算法与深度学习实战——生命模拟与进化论

    • 0. 前言
    • 1. 模拟进化
      • 1.1 代码实现
      • 1.2 代码改进
    • 2. 达尔文进化论
    • 3. 自然选择和适者生存
      • 3.1 适者生存
      • 3.2 进化计算中的生物学
    • 小结
    • 系列链接

0. 前言

生命模拟通过计算机模拟生物体的基本特征、遗传机制、环境互动等,试图模拟和理解生物的演化过程。我们已经学习了如何实现简单的生命模型,为了进一步提升生命模拟需要模拟进化,接下来,通过借鉴达尔文的进化论,构建升级版的生命模拟。

1. 模拟进化

在本节中,我们重用了简单生命模型的大部分代码,并对其进行修改,以模拟进化或细胞传递遗传特征的能力。在本节中,我们不再使用单一特征 strength,而是分配了三个新特征,标记为 abc。除此之外,我们还将健康特征替换为更通用的术语——适应度 (fitness)。

1.1 代码实现

(1) 更新 create_cell 函数,该函数需要接受两个输入细胞来生成一个后代。例如,在模拟开始时,没有父代细胞,则为细胞的特征设置随机值;而在有父代细胞时,子代细胞的每个特征为父代双亲特征的平均值,这种平均机制只是创建子代特征值的一种方式:

import random
import time
import matplotlib.pyplot as plt
from livelossplot import PlotLosses

MUTATE_RNG = 5
MUTATE_RATE = 10

def clamp(num, min_value, max_value):
    return max(min(num, max_value), min_value)

def create_cell(parent1, parent2):
    if parent1 is None or parent2 is None:
        return dict(
            fitness = 0,
            a = random.randint(1, 100),
            b = random.randint(1, 100),
            c = random.randint(1, 100)
        ) 
    else:    
        return dict(
            fitness = 0,
            a = (parent1["a"] + parent2["a"])/2,
            b = (parent1["b"] + parent2["b"])/2,
            c = (parent1["c"] + parent2["c"])/2,
        ) 

(2) 更新 reproduce 函数,首先,按适应度对父代细胞进行排序,然后选择前一半作为父代(选择过程),然后循环遍历所选择的父代两次(假设每个父代双亲有两个孩子),随机选择两个父代双亲进行繁殖,然后将这两个父母传递给 create_cell 函数,使用两个父母的特征获得一个新的子代。最后,通过 mutate 函数对细胞执行突变(有多种选择父代的方式,我们将在后续的学习中看到更多选择方式):

def reproduce(cells): 
    parents = sorted(cells, key=lambda d: d['fitness'])[int(len(cells)/2):]    
    children = [] 
    for i in range(len(parents)*2):
        mates = random.sample(parents, 2) 
        children.append(create_cell(mates[0], mates[1]))
    return mutate(children)

(3) mutate 函数能够随机修改子代特征,通过使用此函数来模拟物理世界中生物体(细胞)可能发生的突变,以获取超越父母的特征。突变是进化的关键因素,也是地球上所有高级生命形式的根源:

def mutate(cells):
    for cell in cells:
        if random.randint(1,100) < MUTATE_RATE:
            cell["a"] = clamp(
                cell["a"] + random.randint(-MUTATE_RNG, MUTATE_RNG), 1, 100)
            cell["b"] = clamp(
                cell["b"] + random.randint(-MUTATE_RNG, MUTATE_RNG), 1, 100)
            cell["b"] = clamp(
                cell["b"] + random.randint(-MUTATE_RNG, MUTATE_RNG), 1, 100)      
    return cells

(4) 更新 evaluate 函数,使用一个简单的方程来评估特征 abc 的值,并输出细胞的适应度。该函数在特征 a 上的权重为 2,在特征 b 上的权重为一个负值,而特征 c 权重为 1。进化生命模拟的目标是优化这些特征,以获取高适应度个体。更高的适应度增加了繁殖的可能性,将鼓励更多优秀特征的传递:

def birth(offspring):
    return [create_cell(None, None) for i in range(offspring)]

def evaluate(cells):
    for cell in cells:
        cell["fitness"] = 2 * cell["a"] - cell["b"] + cell["c"]
    return cells

删除 death 函数,专注于 reproduce 函数。之所以这样做,是因为我们简单地假设在繁殖后,所有的父母都不会进一步保留;因此,无需考虑细胞死亡的情况。因此,我们不再关心种群数量的增长,而是关注种群的繁衍。这个假设简化了模拟的过程我们的过程,当然,我们也可以模拟多代之间的繁殖,保留父代中的优秀个体。

(5) 最后,更新 run_generation 函数,函数首先调用 evaluate 函数,更新细胞的适应度。接下来,调用 reproduce 函数产生下一代繁殖种群。之后,再次调用 evaluate 函数更新新一代的适应度值:

def run_generation(cells):  
    cells = evaluate(cells)
    cells = reproduce(cells) 
    cells = evaluate(cells)
return cells

generations = 25 #@param {type:"slider", min:1, max:25, step:1}
initial_offspring = 10 #@param {type:"slider", min:10, max:1000, step:1}
mutation_rate = 10 #@param {type:"slider", min:1, max:100, step:1}
mutation_range = 20 #@param {type:"slider", min:1, max:100, step:1}

MUTATE_RNG = mutation_range
MUTATE_RATE = mutation_rate
cells = birth(initial_offspring)

groups = {'Generation': ['population','avg_fitness'], 'Attrributes' : ["avg_a", "avg_b", "avg_c"]}
liveloss = PlotLosses(groups=groups)

history = {}
for i in range(generations):  
    cells = run_generation(cells)  
    history["population"] = len(cells)   
    history["avg_fitness"] = sum([cell["fitness"] for cell in cells])/(len(cells)+1)
    history["avg_a"] = sum([cell["a"] for cell in cells])/(len(cells)+1) 
    history["avg_b"] = sum([cell["b"] for cell in cells])/(len(cells)+1) 
    history["avg_c"] = sum([cell["c"] for cell in cells])/(len(cells)+1) 
    liveloss.update(history)
    liveloss.send()

代码输出如下图所示。可以看到,与上一节的模拟相比,适应度显著提高,但人口始终保持为 10 个。并且特征 abc 都得到了明显的优化,特征 a 的值明显增加,特征 b 的值明显减少,这是由于我们在适应度方程中定义的特征权重导致的结果。

模拟结果

通过将进化的概念添加到生命模拟中,可以看到适应度和特征优化之间的强相关性,使得修改后的模拟更加健壮和可扩展。事实上,进化的概念是整个进化算法类的基础。

1.2 代码改进

可以通过完成以下问题进一步理解上示生命模拟过程:

  • 修改 evaluate 函数中的适应度计算方法,重新运行模拟过程观察不同权重的优化结果
  • 在细胞中添加一个新特征 d,并相应修改相关代码
  • 将突变率 MUTATE_RATE 改为介于 01 之间的值,更改后重新运行代码,观察突变对细胞进化的影响

2. 达尔文进化论

从达尔文提出自然选择概念和理论开始,对地球上的生命如何通过遗传学分享和传递选择特征的好奇驱使我们不断探索进化理论。
达尔文于 1859 年发表了《物种起源》,这一开创性的作品颠覆了自然科学,并成为许多自然和生物科学的基础。达尔文将自然选择理论描述为:“导致所有有机生命进步的一般法则,即繁殖、突变,令强者生存、弱者死亡。”
根据这一法则,达尔文构建了他的进化理论,认为生命需要通过将更成功的特征传递给后代来繁衍。虽然他未理解细胞有丝分裂和遗传学过程,但他确实总结了多个物种中特征的选择性传递。直到 1865 年,孟德尔通过观察豌豆植物的七个特征,提出了基因遗传理论。
孟德尔使用特征来描述我们现在称为基因的东西。近 30 年后,他的工作才得到认可,遗传学领域就此诞生,此后,基因学快速发展,包括基因治疗、转基因技术等。

3. 自然选择和适者生存

3.1 适者生存

“适者生存”常常被用来定义进化和进化计算,但这个术语是由早期的自然学家赫伯特·斯宾塞首次提出的。但斯宾塞忽略了一个事实:生存只是变化的结果。达尔文很好地解释了这个概念:“生存下来的不是最强壮或最聪明的,而是对变化最敏感的物种。”进化不是发展最强壮或最适合的物种,而是能够最好地适应变化的物种。这意味着,在实际应用中,虽然我们专注于开发能产生最佳适应度的算法,我们真正的目标是发展进化性变化。
在计算中,通过应用进化性变化,确保不仅是最适合或最优秀的个体能够得以生存,这意味着需要确保种群不仅是最好的,而且是最具多样性的。鼓励多样性的种群通常能够更快地解决问题。

3.2 进化计算中的生物学

进化计算借鉴了生物学和进化理论。与神经网络将深度学习 ( Deep learning, DL) 与大脑进行类比一样,并非所有概念都完全等价。在多数情况下,能够使用类似或匹配生物学等效的概念,但为了便于理解,这些生物学概念已经被大幅简化。

小结

生命模拟利用计算机模拟来模拟生命体的行为、生长和进化过程。这些模拟可以基于简单的规则和算法,通过模拟生物个体的互动和繁殖,探索复杂系统如何从简单规则中产生出自组织和复杂性。在本节中,通过借鉴达尔文的进化论,构建了升级版的生命模拟。

系列链接

遗传算法与深度学习实战——进化深度学习
遗传算法与深度学习实战——生命模拟及其应用

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

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

相关文章

KMZ格式详解,javascript写入读取KMZ示例

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

myeclipse 2020 下载 安装 汉化

1&#xff0c;解压 myeclipse 2020 压缩包到当前目录下&#xff1a; 点击此处蓝色字体下载压缩包 提取码 k3x9 2&#xff0c;鼠标右键 点击 myeclipse 2020.exe 选择 以管理员身份运行 &#xff1a; 3&#xff0c;等待加载&#xff1a; 4&#xff0c;点击 Next &#xff1a; 5…

【数学建模】2024华数杯A题思路(已完成)

视频预览&#xff1a; 2024华数杯A题已完成 作品连接&#xff1a;https://mbd.pub/o/bread/ZpmWmJxu 文章目录 一、题目二、分析三、代码示例 一、题目 机器臂是一种自动化装置&#xff0c;广泛应用于工业生产、精密操作、危险环境作业和物流等领域。关节角路径的优化设计对于…

Transformer在生成细胞数据上的应用

来自&#xff1a;scTranslator: A pre-trained large generative model for translating single-cell transcriptome to proteome 工程地址&#xff1a;https://github.com/TencentAILabHealthcare/scTranslator 在scTranslator中&#xff0c;有3个阶段&#xff1a;paired bu…

【xilinx】XCZU1CG-1SBVA484I FPGA 的 VCC_PSBATT 引脚的正确电压范围是多少?

我正在做一个涉及 XCZU1Cg-1SBVA484I FPGA IC 的项目。对于 PSBATT 部分&#xff0c;根据 DS925 文档&#xff0c;提到 VCC_PSBATT 电压范围为 1.2V ~ 1.5V。但在同一文档中&#xff0c;注释部分规定&#xff1a;Vcc_psbatt 最高可接受 1.89V。 根据 UG1085 文档&#xff0c;使…

HarmonyOS 习题(二)

1、在类Web开发范式自定义组件创建后&#xff0c;加入到Page组件树时&#xff0c;会触发以下哪一项回调。 A&#xff09;Onlnit B&#xff09;OnAttached C&#xff09;OnLayoutReady D&#xff09;OnDetached 答案&#xff1a;B 分析: onlnit:自定义组件初始化生命周期回调&a…

HTML常用标签和CSS的运用

目录 1.HTML标签 1.1 文档结构标签 1.2 文本格式标签 1.3 列表标签 1.4 链接和媒体标签 1.5 表格标签 1.6 表单标签 1.7 分区和布局标签 1.8 元数据标签 2.css样式 2.1 字体样式 2.2 文本样式 2.3 背景样式 2.4 边框样式 2.5 间距样式 2.6 宽度和高度 2.7 显示…

NLP——Transfromer 架构详解

Transformer总体架构图 输入部分&#xff1a;源文本嵌入层及其位置编码器、目标文本嵌入层及其位置编码器 编码器部分 由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 第二个子层连接结构包…

音质提升秘籍:专业音频剪辑软件汇总

现在欣赏传输音频文件比以前简单多了&#xff0c;这些音频的质量也影响了听众的体验与感受。所以使用一些靠谱的音频剪辑工具处理音频能让你的音频文件呈现更好的效果。 1.福昕音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这是一款电脑端软件。别看…

MySQL查询最近7天的分组数据,无则补零

需求是&#xff1a;有个查询最近7天的折线图&#xff0c;这个就要求没有数据就要补0 现在表名为&#xff1a;wo_work_order 时间字段为&#xff1a;create_time SQL如下&#xff1a; SELECTDATE_FORMAT( a.timeDay, %Y-%m-%d ) AS day,IFNULL( b.count, 0 ) AS count FROM(S…

5.怎么使用Element ui来做一个前端登录页面

找到Layout 布局 他通过基础的 24 分栏&#xff0c;迅速简便地创建布局。 找一个对齐方式 这个就不错,找到对应的代码 这个 复制进入idea 引入我们的图片和文字 我这里图片有点问题 然后我再添加一条分割线 加入表单校验 把里面的代码同上加入idea 结果 对表单内容进行调整 …

半导体设备SAP实施的主要特点有哪些?

在半导体这一高度技术密集且竞争激烈的行业中&#xff0c;企业的高效运营和精准管理成为了决胜市场的关键。SAP作为全球领先的企业管理软件提供商&#xff0c;其半导体设备解决方案以其独特的功能和特点&#xff0c;为半导体企业带来了显著的运营优化和竞争力提升。本文将跟大家…

C# 类型转换

隐式&#xff08;implicit&#xff09;类型转换 1.不丢失精度的转换 2.显示&#xff08;explicit&#xff09;类型的转换 有可能丢失精度的转换 使用convert转换 ToString方法&#xff1a;将数值类型转换成字符串型

【Deep-ML系列】Linear Regression Using Normal Equation(正规方程求解线性回归)

题目链接&#xff1a;Deep-ML import numpy as np def linear_regression_normal_equation(X: list[list[float]], y: list[float]) -> list[float]:X np.array(X)y np.array(y).reshape(-1, 1)x_transpose X.Ttheta np.linalg.inv(x_transpose.dot(X)).dot(x_transpose…

K8s部署篇之手动部署二进制高可用集群架构

一、系统环境初始化 一&#xff09;架构设计 所有节点都操作&#xff1a;3个master&#xff08;etcd集群三个节点&#xff09;和2个node 1、K8s服务调用如图 2、各组件说明 1、API Server 供Kubernetes API接口&#xff0c;主要处理 REST操作以及更新ETCD中的对象所有资源增删…

virtualbox7安装centos7.9配置静态ip避坑方案

1.背景 我大概在一年之前安装virtualbox7centos7.9的环境&#xff0c;但看视频说用vagrant启动的窗口可以不用第三方工具(比如xshell、secure等)连接centos7.9&#xff0c;于是尝鲜试了下还可以&#xff0c;导致系统文件格式是vmdk了&#xff08;网上有vmdk转vdi的方法&#xf…

LLaVAR: Enhanced Visual Instruction Tuning for Text-Rich Image Understanding

发表时间&#xff1a;2 Feb 2024 论文链接&#xff1a;https://arxiv.org/pdf/2306.17107 作者单位&#xff1a;Georgia Tech Motivation&#xff1a;指令调整增强了大型语言模型 (LLM) 与人类交互的能力。此外&#xff0c;最近的指令跟踪数据集包括图像作为视觉输入&#xf…

从古代驿站体系看软件安全管控@安全历史04

在古代&#xff0c;车、马都很慢&#xff0c;信息传递很不顺畅&#xff0c;中央的政令又是如何传达至地方的呢&#xff1f;实际上&#xff0c;很多朝代都有专门的驿站制度&#xff0c;可以保障全国各地的信息传递&#xff0c;对于维护统治和稳定有着关键作用。 若将国家比作一个…

jvm方法返回相关指令ireturn,areturn,return等分析

正文 看图&#xff1a; 做的事情如下: 1:弹出当前的方法栈帧 2:获取上一个方法 3:从当前方法的操作数栈中获取执行结果,并推送到上一个方法的操作数栈中对应的伪代码&#xff1a; Override public void execute(Frame frame) {Thread thread frame.thread();Frame curren…

使用Go语言实现基于泛型的Jaccard相似度算法

基本原理 跳表&#xff1a; jaccard相似度&#xff1a; jaccard相似度的代码实现&#xff1a; 时间复杂度分析&#xff1a; 快速jaccard算法&#xff1a; 代码实现&#xff0c;这个要求两个集合都是有序的&#xff1a; Jaccard相似度算法的基本实现 算法&#xf…