当前位置: 首页 > news >正文

路径规划 | 图解遗传(GA)算法(附ROS C++仿真)

目录

  • 0 专栏介绍
  • 1 从进化论说起
  • 2 遗传算法基本概念
  • 3 遗传算法流程
  • 4 遗传算法ROS实现

0 专栏介绍

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


在这里插入图片描述

1 从进化论说起

从仿生学的角度来看,遗传算法(Genetic Algorithm, GA)是模拟自然界中生物进化过程的一种计算方法。它借鉴了达尔文的进化论中的许多概念,并将这些概念应用到解决优化问题上,例如

  • 基因编码: 在遗传算法中,问题的解被编码成为一串基因序列,类似于生物体的染色体。这种编码方式可以直接映射到生物体的基因结构,每个基因对应于解空间中的一个特定参数或变量。
  • 种群与个体: 遗传算法通过维护一个包含多个个体(解)的种群来模拟自然种群的概念。每个个体都代表了解决问题的一个可能方案,类似于自然界中的个体生物。
  • 适应度评估: 遗传算法中的适应度评估类似于生物体在自然选择过程中的适应度。每个个体根据其解决方案在问题空间中的表现被赋予一个适应度分数,用于评价其优劣。
  • 选择与交叉: 通过选择和交叉操作,遗传算法模拟了生物繁殖过程中的自然选择和基因交换。适应度较高的个体更有可能被选择为父代,并且它们的基因会通过交叉操作进行组合,产生新的后代个体。
  • 变异: 变异操作在遗传算法中引入了个体基因的随机变化,类似于自然界中的基因突变。这种变异可以增加种群的多样性,从而有助于避免陷入局部最优解。

在这里插入图片描述

从这些角度来看,遗传算法可以被视为一种模仿生物进化过程的计算方法,它通过模拟生物体的繁殖、变异和适应度评估等过程,来寻找问题空间中的最优解。这种仿生学的视角不仅帮助我们理解遗传算法的原理,也为我们提供了一种全新的优化问题求解思路。

2 遗传算法基本概念

遗传算法的基本概念如下:

  • M M M:种群数量;
  • x \boldsymbol{x} x:染色体,其对应可行域中的一个可行解,染色体分量 称为基因片段,基因片段是发生交叉、变异的基本单位;
  • f i t ( ⋅ ) fit\left( \cdot \right) fit():个体适应度函数,使目标函数越小的染色体对应的适应度越高;
  • 选择算子:通过适应度从当前种群中筛选较优的染色体集合,并将其特性遗传到下一代种群,实现“优胜劣汰”的进化机制,筛选算法有轮盘赌筛选、精英筛选、排序筛选等,本文采用分层筛选法;
  • 交叉算子:以一定的概率将两个匹配染色体中的部分基因片段互换,产生两个新的染色体,实现“同源染色体交叉互换”的进化特征,提高算法搜索能力,交叉算法有:均匀交叉、单点交叉、多点交叉等,本文采用多点交叉;
  • 变异算子:以一定的概率将染色体的部分基因进行突变,产生新染色体,实现“基因突变”的进化特征,增强种群遗传因子多样性,缓解算法进入局部最优的概率,变异算法有:高斯变异、基本位变异、均匀变异等,本文采用基本位变异。

3 遗传算法流程

遗传算法基本原理如下所示

在这里插入图片描述

4 遗传算法ROS实现

核心代码如下所示

bool GA::plan(const Node& start, const Node& goal, std::vector<Node>& path, std::vector<Node>& expand)
{// variable initializationdouble init_fitness;Genets best_genet;PositionSequence init_positions;std::vector<Genets> genets_swarm;std::vector<Genets> genets_parent;std::vector<Genets> genets_children;// Generate initial position of genets swarminitializePositions(init_positions, start, goal, init_mode_);// genets initializationfor (int i = 0; i < n_genets_; ++i){std::vector<std::pair<int, int>> init_position;if ((i < n_inherited_) && (inherited_genets_.size() == n_inherited_))init_position = inherited_genets_[i].best_pos;elseinit_position = init_positions[i];// Calculate fitnessinit_fitness = calFitnessValue(init_position);if ((i == 0) || (init_fitness > best_genet.fitness)){best_genet.fitness = init_fitness;best_genet.position = init_position;}// Create and add genets objects to containersgenets_swarm.emplace_back(init_position, init_fitness);}// random datastd::random_device rd;std::mt19937 gen(rd());// Iterative optimizationfor (size_t iter = 0; iter < max_iter_; iter++){selection(genets_swarm, genets_parent);genets_children = genets_parent;std::rotate(genets_children.begin(), genets_children.begin() + 1, genets_children.end());std::vector<std::thread> genets_list = std::vector<std::thread>(genets_parent.size());for (size_t i = 0; i < genets_parent.size(); ++i)genets_list[i] = std::thread(&GA::optimizeGenets, this, std::cref(genets_parent[i]), std::ref(genets_children[i]),std::ref(best_genet), i, std::ref(gen), std::ref(expand));for (size_t i = 0; i < genets_parent.size(); ++i)genets_list[i].join();// Copy the elements from genets_parent and genets_children to genets_swarmstd::copy(genets_children.begin(), genets_children.end(), genets_swarm.begin());std::copy(genets_parent.begin(), genets_parent.end(), genets_swarm.begin() + genets_children.size());}// Generating Paths from Optimal Genets...return !path.empty();
}

在这里插入图片描述

完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关文章:

  • 传神论文中心|第11期人工智能领域论文推荐
  • RPG Maker MZ中被你忽略的干货操作——独立开关和“开关”在事件页中的关系
  • Web前端魂斗罗:深度剖析前端技术的奇幻之旅
  • flutter实现UDP发送魔法包唤醒主机
  • 碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测
  • 【Unity回调函数】创建自己的外部回调函数——以按钮点击为例
  • 静态工厂方法替代构造器
  • 【ai】Omniverse 微服务架构及NVIDIA Omniverse™ Launcher
  • 【C语言】32个关键字
  • 软件版本号的管理
  • 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版9(附带项目源码)
  • 自动求导实现与可视化
  • 算法训练营day56
  • MT2096 数列分段
  • 六种图算法的python实现
  • [case10]使用RSQL实现端到端的动态查询
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • iOS 颜色设置看我就够了
  • Linux中的硬链接与软链接
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SQL 难点解决:记录的引用
  • TCP拥塞控制
  • XForms - 更强大的Form
  • 编写高质量JavaScript代码之并发
  • 程序员最讨厌的9句话,你可有补充?
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 聊聊directory traversal attack
  • 前端临床手札——文件上传
  • 使用common-codec进行md5加密
  • 数组大概知多少
  • 我的业余项目总结
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 优化 Vue 项目编译文件大小
  • ​【已解决】npm install​卡主不动的情况
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #Java第九次作业--输入输出流和文件操作
  • #pragma data_seg 共享数据区(转)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1) caustics\
  • (12)目标检测_SSD基于pytorch搭建代码
  • (done) Go 语言:三种多文件协作方式
  • (poj1.3.2)1791(构造法模拟)
  • (void) (_x == _y)的作用
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)大型网站的系统架构
  • .NET Core中如何集成RabbitMQ
  • .net 简单实现MD5
  • .net 无限分类
  • .Net7 环境安装配置
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)