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

2024-06-12 13:36

本文主要是介绍路径规划 | 图解遗传(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深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

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

这篇关于路径规划 | 图解遗传(GA)算法(附ROS C++仿真)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054358

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注