基于烟花算法(Fireworks Algorithm,FWA)及三次样条的机器人路径规划,50个场景任意选择,完整MATLAB代码

一、烟花算法

烟花算法(Fireworks Algorithm,FWA)是一种受烟花爆炸产生火星启发的群体智能优化算法,由谭营教授等人于2010年提出。以下是其详细信息:

算法原理

  • 初始化:在可行解空间中随机产生一定数量的烟花,每个烟花代表一个可行解。
  • 适应度计算:计算每个烟花的适应度,适应度越高的烟花表示其位置越优。
  • 爆炸行为:每个烟花根据其适应度产生一定数量的火花,适应度越高的烟花产生的火花数量越多,但爆炸半径越小;反之,适应度越低的烟花产生的火花数量越少,但爆炸半径越大。这样可以在全局和局部之间进行平衡搜索。
  • 变异操作:对部分火花进行高斯变异,以增加种群的多样性,避免算法陷入局部最优。
  • 选择策略:根据适应度选择下一代烟花,保留适应度较高的烟花和火花,淘汰适应度较低的个体。

算法特点

  • 随机性:烟花的位置和火花的产生都具有一定的随机性,这使得算法具有较强的全局搜索能力。
  • 局部性:适应度较高的烟花在较小的范围内产生较多的火花,有利于局部搜索。
  • 爆发性:烟花爆炸时产生大量的火花,能够快速地扩展搜索范围。
  • 隐并行性:多个烟花同时进行爆炸和搜索,具有一定的并行性。
  • 多样性和瞬时性:火花的多样性和烟花的瞬时性使得算法能够不断探索新的解空间。

参考文献:

1\]Tan, Y. and Y. Zhu. Fireworks Algorithm for Optimization. in Advances in Swarm Intelligence. 2010. Berlin, Heidelberg: Springer Berlin Heidelberg. ## 二、路径规划问题的适应度-奖励函数 路径从起点 ( x s , y s ) (x_s, y_s) (xs,ys) 开始,到终点 ( x t , y t ) (x_t, y_t) (xt,yt) 结束,并包括 n n n 个航路点。路径上的每个点表示为 ( x i , y i ) (x_i, y_i) (xi,yi),其中 i i i 从 1(起点)到 n n n(终点)。目标是求解约束优化问题,以找到起点和终点之间的最短安全路径。最短路径最小化连续点之间的总欧几里得距离,这是欧几里得空间中最直接的路线。 除了最小化距离外,路径必须满足两个约束条件。首先,所有路径点必须保持在边界内,即 x min ≤ x i ≤ x max x_{\\text{min}} \\le x_i \\le x_{\\text{max}} xmin≤xi≤xmax 和 y min ≤ y i ≤ y max y_{\\text{min}} \\le y_i \\le y_{\\text{max}} ymin≤yi≤ymax。其次,路径必须避开障碍物,这通过条件 g ( x i , y i , b ) ≥ 0 g(x_i, y_i, b) \\ge 0 g(xi,yi,b)≥0 强制执行,其中 g ( x i , y i , b ) g(x_i, y_i, b) g(xi,yi,b) 是评估与第 b b b 个障碍物碰撞条件的一般约束函数,并确保不发生碰撞。优化问题如下所示: minimize f ( x , y ) = ∑ i = 1 n − 1 ( x i + 1 − x i ) 2 + ( y i + 1 − y i ) 2 \\begin{aligned} \\text{minimize} \\quad \& f(x, y) = \\sum_{i=1}\^{n-1} \\sqrt{(x_{i+1} - x_i)\^2 + (y_{i+1} - y_i)\^2} \\end{aligned} minimizef(x,y)=i=1∑n−1(xi+1−xi)2+(yi+1−yi)2 subject to x min ≤ x i ≤ x max , ∀ i ∈ { 1 , ... , n } y min ≤ y i ≤ y max , ∀ i ∈ { 1 , ... , n } g ( x i , y i , b ) ≥ 0 , ∀ i ∈ { 1 , ... , n } , ∀ b ∈ Obstacles \\begin{aligned} \\text{subject to} \\quad \& x_{\\text{min}} \\le x_i \\le x_{\\text{max}}, \\quad \\forall i \\in \\{1, \\ldots, n\\} \\\\ \& y_{\\text{min}} \\le y_i \\le y_{\\text{max}}, \\quad \\forall i \\in \\{1, \\ldots, n\\} \\\\ \& g(x_i, y_i, b) \\ge 0, \\quad \\forall i \\in \\{1, \\ldots, n\\}, \\quad \\forall b \\in \\text{Obstacles} \\end{aligned} subject toxmin≤xi≤xmax,∀i∈{1,...,n}ymin≤yi≤ymax,∀i∈{1,...,n}g(xi,yi,b)≥0,∀i∈{1,...,n},∀b∈Obstacles 适应度(成本)函数通过考虑路径的总距离和与障碍物碰撞产生的任何惩罚来评估给定路径的质量。惩罚包括两个部分:点惩罚(路径点与障碍物之间的碰撞)和线段惩罚(连续航路点之间的线段与障碍物之间的碰撞)。此公式确保路径既短又安全,有效指导优化过程。 线段惩罚对于识别点惩罚无法检测到的问题至关重要。即使所有航路点都位于障碍物外部,个别路径线段仍可能与障碍物相交;因此,线段惩罚对于捕捉这些点惩罚会遗漏的违规行为至关重要。虽然线段惩罚足以检测障碍物碰撞,但也会执行点检查以评估或惩罚各个航路点。任何位于障碍物内的航路点都表明严重违规,因为该航路点无法到达,从而使路径不可行。 相比之下,如果所有航路点都位于障碍物外部,但连接它们的某些线段与障碍物相交,则该路径仍可被视为候选路径。这些路径通常只需要在后续迭代中进行 minor 优化即可消除交点。这种惩罚组合确保对不可达航路点的路径施加更严厉的惩罚,而对 minor 问题的路径仍可进行优化。此外,点惩罚允许快速初步检查,帮助跳过不必要的线段惩罚计算,当路径因航路点位于障碍物内而明显无效时,这降低了计算复杂性。 成本函数由两个主要部分组成:路径长度 L L L 和总惩罚 p T p\^T pT,如下所示。路径长度 L L L 表示路径上所有点之间的欧几里得距离,定义如下: L = ∑ i = 1 n − 1 ( x i + 1 − x i ) 2 + ( y i + 1 − y i ) 2 L = \\sum_{i=1}\^{n-1} \\sqrt{(x_{i+1} - x_i)\^2 + (y_{i+1} - y_i)\^2} L=i=1∑n−1(xi+1−xi)2+(yi+1−yi)2 总惩罚 p T p\^T pT 考虑碰撞情况,并按权重 β \\beta β 缩放,权重设为 100 以优先考虑安全性,对不安全路径施加严厉惩罚。对于无障碍物的路径,总成本等于路径长度 L L L,代表可实现的最小成本。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8cddd467e97d4bbc947dde0c1a166ba3.png) 总惩罚 p T p\^T pT 表示所有障碍物的平均惩罚,包括基于点和线段的惩罚,如下所示,其中 B B B 是障碍物的总数。对于每个障碍物 b b b,惩罚包括两个项: ∑ i = 1 n p i b \\sum_{i=1}\^{n} p_i\^b ∑i=1npib,评估涉及 n n n 个路径点 ( x i , y i ) (x_i, y_i) (xi,yi) 的碰撞惩罚;以及 ∑ j = 1 n − 1 p line , j b \\sum_{j=1}\^{n-1} p_{\\text{line}, j}\^b ∑j=1n−1pline,jb,评估涉及 n − 1 n-1 n−1 个线段 L j = \[ ( x j , y j ) , ( x j + 1 , y j + 1 ) \] L_j = \[(x_j, y_j), (x_{j+1}, y_{j+1})\] Lj=\[(xj,yj),(xj+1,yj+1)\] 的碰撞惩罚。惩罚通过除以 B B B(障碍物总数)进行归一化,以确保惩罚反映碰撞的总体分布和严重程度。 cost = L × ( 1 + β p T ) \\text{cost} = L \\times (1 + \\beta p\^T) cost=L×(1+βpT) 对于基于网格的障碍物,两个组件 p i b p_i\^b pib 和 p line , j b p_{\\text{line}, j}\^b pline,jb 使用网格表示进行计算。搜索空间表示为基于网格的环境,网格由其原点 ( x g , y g ) (x_g, y_g) (xg,yg) 和分辨率 ( x res , y res ) (x_{\\text{res}}, y_{\\text{res}}) (xres,yres) 定义。x 坐标从 x min x_{\\text{min}} xmin 到 x max x_{\\text{max}} xmax 以 x res x_{\\text{res}} xres 为步长进行离散化,y 坐标同样从 y min y_{\\text{min}} ymin 到 y max y_{\\text{max}} ymax 以 y res y_{\\text{res}} yres 为步长进行离散化。路径上的每个点 ( x i , y i ) (x_i, y_i) (xi,yi) 被映射到网格中的一个对应单元格,索引为 ( x c i , y c i ) (xc_i, yc_i) (xci,yci),计算方法如下: x c i = round ( x i − x o g x res ) , y c i = round ( y i − y o g y res ) xc_i = \\text{round}\\left( \\frac{x_i - x_{og}}{x_{\\text{res}}} \\right), \\quad yc_i = \\text{round}\\left( \\frac{y_i - y_{og}}{y_{\\text{res}}} \\right) xci=round(xresxi−xog),yci=round(yresyi−yog) 网格中的每个单元格被分配一个成本 M ( x c i , y c i ) M(xc_i, yc_i) M(xci,yci),其中 0 表示空闲单元格,100 表示完全被占据的单元格,如 SLAM 等映射算法所确定。对于基于点的惩罚 p i p_i pi,对应于点 ( x i , y i ) (x_i, y_i) (xi,yi) 的单元格的成本 M ( x c i , y c i ) M(xc_i, yc_i) M(xci,yci) 通过除以 100 进行归一化,得到范围为 \[ 0 , 1 \] \[0, 1\] \[0,1\] 的惩罚,如下所示: p i = M ( x c i , y c i ) 100 p_i = \\frac{M(xc_i, yc_i)}{100} pi=100M(xci,yci) 线段惩罚 p line , j p_{\\text{line}, j} pline,j 通过确定由两个连续航路点连接的线段 L j L_j Lj 相交的所有网格单元格来计算。使用 Bresenham 线算法确定这些单元格,其中 n j n_j nj 是这些单元格的数量。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b907f76be32f42f6b0032974116f264f.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/34267af6dfc84b21a905de76a145b6b2.png) 上图展示了线段与网格单元格之间的相交情况。然后通过对这些相交单元格的归一化占用成本进行平均来聚合惩罚,如下所示: p line , j = 1 n j ∑ k = 1 n j M ( x c k , y c k ) 100 p_{\\text{line}, j} = \\frac{1}{n_j} \\sum_{k=1}\^{n_j} \\frac{M(xc_k, yc_k)}{100} pline,j=nj1k=1∑nj100M(xck,yck) 方程 被修改为在基于网格的环境中计算总体路径惩罚 p T p\^T pT,如下所示,其中成本直接从网格中获得。 p T = ∑ i = 1 n p i + ∑ j = 1 n − 1 p line , j p\^T = \\sum_{i=1}\^{n} p_i + \\sum_{j=1}\^{n-1} p_{\\text{line}, j} pT=i=1∑npi+j=1∑n−1pline,j 成本函数支持多种障碍物类型,重点在于基于网格的障碍物,关于与圆形和矩形障碍物相关的 p i b p_i\^b pib 和 p line , j b p_{\\text{line}, j}\^b pline,jb 的详细公式以及这些类型之间的转换机制详细参考文献。 参考文献: \[1\]Reda, M., Onsy, A., Haikal, A.Y. et al. A novel reinforcement learning-based multi-operator differential evolution with cubic spline for the path planning problem. Artif Intell Rev 58, 142 (2025). https://doi.org/10.1007/s10462-025-11129-6 ## 三、部分MATLAB及结果 50个椭圆或矩阵障碍物场景任意选择 ```bash clear; clc; close all; warning off all; AlgorithmName='';%算法名称 N=40;%选择地图-可以选择1-50; 1-16 椭圆障碍物,17-50 矩形障碍物 SearchAgents_no=50; %种群大小 Max_iteration=200; %最大迭代次数 [lb,ub,dim,fobj,Fobj,model] = Get_F(N);%获取参数 [Best_score,Best_pos,cg_curve]=(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);%算法求解 GlobalBest=Fobj(Best_pos);%计算最优个体的详细路径 ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/06412210c6294f65a85bacfcdbc9ee54.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/de3b6e3dc5fc428987fcf7b0b9932a6b.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9e1ea20940834f47b266a729729e867e.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6741b6c8101f4df9bc554041d19dfb8b.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6c2673c94f2d4b10b6e33f080f32b123.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/76ac84d24d4048dfaf47c777aa99b231.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/66d78c5959d64ff7b21ca5fca1eb0a6f.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f2129df069e84beb9ce28c816a59fd87.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/79d4d4b8d8f94da6b61927ff67ab7cf3.jpeg) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/42090f815cc046bcabffe59be9adbb54.jpeg)

相关推荐
天天扭码3 分钟前
面试算法题 | 合并区间(Javascript版)
前端·算法·面试
云格~4 分钟前
L1-7 矩阵列平移
开发语言·c++·算法·职场和发展·矩阵
嗯嗯嗯哈哈哈28 分钟前
qt.tlsbackend.ossl: Failed to load libssl/libcrypto.
开发语言·qt·html5
SRC_BLUE_1730 分钟前
[Java · 铢积寸累] 基础函数 — 生成随机数 - Math.random() 详解
java·开发语言·python
想不明白的过度思考者30 分钟前
Java从入门到“放弃”(精通)之旅——继承与多态⑧
java·开发语言
补三补四41 分钟前
蓝耘平台介绍:算力赋能AI创新的智算云平台
人工智能·嵌入式硬件·深度学习·机器学习·visual studio
溟洵1 小时前
【Qt】控件的理解 和 基础控件 QWidget 属性详解(通俗易懂+附源码+思维导图框架)
c语言·开发语言·前端·c++·windows·qt
一叶飘零晋1 小时前
[特殊字符]【Qt自定义控件】创意开关按钮 - 丝滑动画+自定义样式+信号交互 | 附完整源码
开发语言·qt·交互
Dovis(誓平步青云)1 小时前
【数据结构】励志大厂版·初级(二刷复习)双链表
c语言·数据结构·经验分享·笔记·学习·算法·学习方法
国科安芯2 小时前
高安全低功耗MCU:机器人控制系统的智能化与可靠性提升
单片机·安全·机器人