【遗传算法简介】

news2024/11/14 11:15:06

遗传算法:原理与实战

简介

遗传算法是一种模拟达尔文生物进化论的自然选择以及遗传学机制的搜索算法,由 John Holland 在20世纪70年代提出。它们在各种搜索、优化和机器学习任务中已被广泛应用。

遗传算法原理

1. 编码

遗传算法的第一步是将问题的可能解表示为一种称为染色体(或基因)的数据结构。这个过程称为编码。在简单的遗传算法中,这种表示通常是一个二进制字符串,但也可以是其他数据类型,如整数或实数。

2. 初始种群

初始种群由多个随机生成的染色体组成。种群大小是预先设定的,并且可以根据问题的具体需求进行调整。

3. 适应度函数

适应度函数是评估染色体(即解)质量的函数。它取决于我们试图解决的特定问题。适应度函数返回的值(适应度分数)越高,染色体的质量越好。

4. 选择

选择过程旨在从当前种群中选择出将参与产生新解的染色体。一般来说,适应度越高的染色体被选择的概率越大。这样可以保证优良的解得以保留,同时还能保持种群的多样性。

5. 交叉(配对)

交叉是一种模拟生物中的性繁殖的运算。它从两个父染色体中创建一个或两个后代。交叉运算符根据预先设定的交叉概率进行操作。

6. 变异

变异是对新生成的后代进行随机修改的过程,以引入新的特征并保持种群的多样性。变异通过改变染色体的一部分来进行。

7. 迭代

新的种群(即新的解集)现在准备好通过适应度函数进行评估,并进入下一轮的选择、交叉和变异过程。这个过程将持续进行,直到达到预设的停止条件。

遗传算法的应用

遗传算法已经在各种领域找到了广泛的应用,包括但不限于:

  1. 优化问题:例如旅行商问题、背包问题、作业调度问题等。
  2. 机器学习:遗传算法可以用于特征选择、神经网络训练、超参数优化等。
  3. 生物信息学:在基因识别、蛋白质折叠、生物网络设计等方面使用遗传算法。

实战:使用Python和遗传算法解决旅行商问题

旅行商问题(Travelling Salesman Problem,TSP)是一种经典的优化问题,它的目标是找到一条访问所有城市并返回原点的最短路径。

安装相关库

在开始之前,我们需要安装一些必要的Python库。我们将使用DEAP库(Distributed Evolutionary Algorithms in Python)进行遗传算法的实现,matplotlib库进行结果的可视化。

pip install deap matplotlib

代码实现

在开始编写代码之前,我们先导入必要的库:

import random
from deap import creator, base, tools, algorithms
import matplotlib.pyplot as plt

在我们的问题中,染色体可以表示为城市的访问顺序,例如 [0, 1, 2, 3, ..., n-1] 表示先访问第0个城市,然后是第1个城市,以此类推。我们可以随机生成一个初始种群,并定义一个适应度函数来计算路径的总长度。

# 定义城市坐标
CITIES = [
    (60, 200), (180, 200), (80, 180), (140, 180),
    (20, 160), (100, 160), (200, 160), (140, 140),
    (40, 120), (100, 120), (180, 120), (60, 80),
    (120, 80), (180, 80), (20, 40), (100, 40),
    (200, 40), (20, 20), (60, 20), (160, 20)
]

# 定义适应度函数
def distance(individual):
    total = 0
    size = len(individual)
    for i in range(size):
        city1 = CITIES[individual[i]]
        city2 = CITIES[individual[(i+1) % size]]
        total += ((city1[0]-city2[0])**2 + (city1[1]-city2[1])**2)**0.5
    return total,

# 确定问题的目标是最小化或最大化
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

toolbox = base.Toolbox()
# Attribute generator
toolbox.register("indices", random.sample, range(len(CITIES)), len(CITIES))
# Structure initializers
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# Operator registering
toolbox.register("mate", tools.cxPartialyMatched)
toolbox.register("mutate", tools.mutShuffleIndexes, indpb=0.05)
toolbox.register("

select", tools.selTournament, tournsize=3)
toolbox.register("evaluate", distance)

def main():
    pop = toolbox.population(n=300)
    hof = tools.HallOfFame(1)
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", numpy.mean)
    stats.register("std", numpy.std)
    stats.register("min", numpy.min)
    stats.register("max", numpy.max)

    pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.7, mutpb=0.2, ngen=40, 
                                   stats=stats, halloffame=hof, verbose=True)
    return pop, log, hof

通过迭代,我们可以观察到解的适应度在逐步改善。

结果可视化

我们可以使用matplotlib库将最优路径可视化,以更好地理解遗传算法的结果。

def plot_path(individual):
    plt.figure()
    for i in range(len(individual)):
        city1 = CITIES[individual[i-1]]
        city2 = CITIES[individual[i]]
        plt.plot([city1[0], city2[0]], [city1[1], city2[1]], 'b-')
    plt.plot([CITIES[i][0] for i in individual], [CITIES[i][1] for i in individual], 'ro')
    plt.show()

pop, log, hof = main()
best_ind = hof[0]
plot_path(best_ind)

运行上面的代码,最短路径在地图上的表示。

在这里插入图片描述

总结

遗传算法是一种强大且灵活的优化工具,通过模拟自然选择和遗传的过程,它可以处理各种复杂的搜索和优化问题。

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

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

相关文章

Andriod开发 Room 数据库处理框架

1.Room框架 Room是Android Jetpack组件库中的一部分,它是一个SQLite数据库的抽象层,提供了更简单的API和更好的性能,适合于中大型应用程序。 2.Room的使用 使用Room和之前使用SQLite搭建数据库的过程类似,但是更加简单了。 1&…

JAVA网络编程(一)

一、什么是网络编程 定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 应用场景:即时通信,网游,邮件等 不管什么场景,都是计算机与计算机之间通过网络在进行数据传输 java提供一…

软件测试必会:cookie、session和token的区别

今天就来说说session、cookie、token这三者之间的关系!最近这仨玩意搞得头有点大🤣 01、为什么会有它们三个 我们都知道 HTTP 协议是无状态的,所谓的无状态就是客户端每次想要与服务端通信,都必须重新与服务端链接,意…

穿针引线之 AsyncLocalStorage

在 Node.js 中,如何更优雅地获取请求上下文一直是一个问题,看一下下面的例子。 背景 const http require(http); function handler1(req, res) {console.log(req.url); }function handler2(req, res) {console.log(req.url); }http.createServer((req…

【react全家桶】react-Hook (下)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 15【react-Hook &#xff08;下&#x…

进程控制(Linux)

进程控制 fork 在Linux中&#xff0c;fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a; 在子进程中返回0&#xff0c;父进程中返回子进程的PID&#xff0c;子进程创建失败返回-1。 …

Spring - BeanFactory与ApplicationContext介绍

文章目录 Spring Bean一、BeanFactory 快速入门1.1 BeanFactory 开发步骤1.2 DI依赖注入 二、ApplicationContext快速入门2.1 入门2.2 BeanFactory 与 ApplicationContext关系2.3 BeanFactory 继承体系2.4 ApplicationContext 继承体系 Spring Bean 之前也了解过Spring Bean&a…

高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression)

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 高斯过程回归 | Matlab实现高斯过程回归多输入单输出预测(Gaussian Process Regression) 研究内容 高斯过程回归(Gaussian Process Regression,GPR)是一种基于概率模型的非参数回归方法,可以用于

mybatisplus数据权限插件学习初探 动态表名更换插件

文章目录 学习链接 mybatisplus数据权限插件学习初探前言案例建表用户表订单表 环境准备UserUserMapperUserMapper.xmlOrdersOrdersMapperOrdersMapper.xml 配置UserTypeEnumUserContextHolderCustomizeDataPermissionHandlerMybatisPlusConfig 测试测试类bossdeptManagerclerk…

Zinx框架学习 - 消息封装

Zinx - V0.5 消息封装 之前我们使用Request来保存服务器的数据&#xff0c;很显然使用[]byte来接收数据&#xff0c;没有长度也没有消息类型&#xff0c;接下来就要针对这个消息进行封装 创建消息类型 定义一个基本的message包&#xff0c;会包含消息ID、数据、数据长度三个…

路径规划算法:基于探路者优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于探路者优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于探路者优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

涉及float和double

文章目录 涉及float和double的问题&#xff1a;它们的存储方式&#xff1a;有效位&#xff1f; 链式结构 涉及float和double的问题&#xff1a; 它们的存储方式&#xff1a; 它们会分成小数部分和指数部分分别存储。小数部分的有效位数越多&#xff0c;精度就越高&#xff0c;…

NLP超详细新手快速入门上手篇(1)常用函数

前言 自然语言处理(NLP)是机器学习的应用之一&#xff0c;用于分析、理解和生成自然语言&#xff0c;以便人类与计算机&#xff0c;人类与人类更好的交流。自然语言处理按照任务类型可以分为分类、匹配、翻译、结构化预测、与序贯决策过程这五类。 本篇参考自TensorFlow官方文…

MyBatis 查询数据库

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 MyBatis 是什么&#xff1f;第⼀个MyBatis查询创建数据库和表添加MyBatis框架支持设置 MyBatis 配置信息添加业务代码 查询操…

【VBA】实现批量生成二维码

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

Nginx - ​一个高性能、灵活可靠的开源Web服务器

Nginx是什么&#xff1f; Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1…

idea使用native-image打包springboot项目

native-image简介 native-image 是一个用于将 Java 程序编译为本地可执行文件的工具。它是 GraalVM 的一部分&#xff0c;GraalVM 是一个高性能的通用虚拟机&#xff0c;支持多种语言。 使用步骤 下载GraalVM 安装 GraalVM&#xff1a;首先&#xff0c;你需要安装 GraalVM。…

20230603-周六随笔

周六闲来无事&#xff0c;给新电脑装下开发环境&#xff0c;记录一下遇到的问题 git下载代码报错 报错1&#xff1a;schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)解决方法&#xff1a;执行git config --system http.sslbackend openssl命令 报错2&#xff1a;SSL certifica…

【Java 8 新特性】获取对象列表中的某个属性组成的列表

文章目录 获取对象列表中的某个属性组成的列表1、用法示例2、详细案例 附录&#xff1a;Java 8 Stream 基本用法1、map2、filter3、forEach4、limit5、sorted6、并行&#xff08;parallel&#xff09;程序7、Collectors8、统计 获取对象列表中的某个属性组成的列表 1、用法示例…

高完整性系统工程(十一):Fault Tolerant Design

目录 1. INTRODUCTION TO FAULT TOLERANCE 1.2 Definitions 1.3 Two Kinds of Faults 1.4 Hardware vs Software Faults 1.4.1 Failure Curve for Hardware 1.4.2 Hardware and Software Failures 1.5 Causes of Failures 1.6 3 Ways to Class Failures 1.6.1 Tempora…