
- 特 征
- 有穷性 确切性 输入 输出 可行
- 常 用
- 计算、数据处理和自动推理
- 外文名
- Algorithm
- 中文名
- 算法
- 学 科
- 数学 计算机
-
2019-10-21 12:11:41
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。
一、算法最最基础
1、时间复杂度
2、空间复杂度
一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。
文章推荐:
二、基础数据结构
1、线性表
- 列表(必学)
- 链表(必学)
- 跳跃表(知道原理,应用,最后自己实现一遍)
- 并查集(建议结合刷题学习)
不用说,链表、列表必须,不过重点是链表。
2、栈与队列
- 栈(必学)
- 队列(必学)
- 优先队列、堆(必学)
- 多级反馈队列(原理与应用)
特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。可以通过博客来学习。相关文章:
3、哈希表(必学)
- 碰撞解决方法:开放定址法、链地址法、再次哈希法、建立公共溢出区(必学)
- 布隆过滤器(原理与应用)
哈希表相关的,推荐通过博客来学习,推荐文章:
4、树
- 二叉树:各种遍历(递归与非递归)(必学)
- 哈夫曼树与编码(原理与应用)
- AVL树(必学)
- B 树与 B+ 树(原理与应用)
- 前缀树(原理与应用)
- 红黑树(原理与应用)
- 线段树(原理与应用)
树相关是知识还是挺多的,建议看书,可以看《算法第四版》。相关文章:
高频面试题:什么是B树?为啥文件索引要用B树而不用二叉查找树?
5、数组
- 树状数组
- 矩阵(必学)
树状数组其实我也没学过,,,,
三、各种常见算法
1、十大排序算法
- 简单排序:插入排序、选择排序、冒泡排序(必学)
- 分治排序:快速排序、归并排序(必学,快速排序还要关注中轴的选取方式)
- 分配排序:桶排序、基数排序
- 树状排序:堆排序(必学)
- 其他:计数排序(必学)、希尔排序
对于十大算法的学习,假如你不大懂的话,那么我还是挺推荐你去看书的,因为看了书,你可能不仅仅知道这个算法怎么写,还能知道他是怎么来的。推荐书籍是《算法第四版》,这本书讲的很详细,而且配了很多图演示,还是挺好懂的。
推荐文章:
必学十大经典排序算法,看这篇就够了(附完整代码/动图/优质文章)(修订版)
2、图论算法
- 图的表示:邻接矩阵和邻接表
- 遍历算法:深度搜索和广度搜索(必学)
- 最短路径算法:Floyd,Dijkstra(必学)
- 最小生成树算法:Prim,Kruskal(必学)
- 实际常用算法:关键路径、拓扑排序(原理与应用)
- 二分图匹配:配对、匈牙利算法(原理与应用)
- 拓展:中心性算法、社区发现算法(原理与应用)
图还是比较难的,不过我觉得图涉及到的挺多算法都是挺实用的,例如最短路径的计算等,图相关的,我这里还是建议看书的,可以看《算法第四版》。
更多算法的学习,欢迎关注我的公众号『帅地玩编程』
3、搜索与回溯算法
- 贪心算法(必学)
- 启发式搜索算法:A*寻路算法(了解)
- 地图着色算法、N 皇后问题、最优加工顺序
- 旅行商问题
这方便的只是都是一些算法相关的,我觉得如果可以,都学一下。像贪心算法的思想,就必须学的了。建议通过刷题来学习,leetcode 直接专题刷。
4、动态规划
- 树形DP:01背包问题
- 线性DP:最长公共子序列、最长公共子串
- 区间DP:矩阵最大值(和以及积)
- 数位DP:数字游戏
- 状态压缩DP:旅行商
我觉得动态规划是最难的一个算法思想了,记得当初第一次接触动态规划的时候,是看01背包问题的,看了好久都不大懂,懵懵懂懂,后面懂了基本思想,可是做题下不了手,但是看的懂答案。一气之下,再leetcdoe专题连续刷了几十道,才掌握了动态规划的套路,也有了自己的一套模板。不过说实话,动态规划,是考的真他妈多,学习算法、刷题,一定要掌握。这里建议先了解动态规划是什么,之后 leetcode 专题刷,反正就一般上面这几种题型。后面有时间,我也写一下我学到的套路,有点类似于我之前写的递归那样,算是一种经验。也就是我做题时的模板,不过感觉得写七八个小时,,,,,有时间就写。之前写的递归文章:为什么你学不会递归?告别递归,谈谈我的一些经验
5、字符匹配算法
- 正则表达式
- 模式匹配:KMP、Boyer-Moore
我写过两篇字符串匹配的文章,感觉还不错,看了这两篇文章,我觉得你就差不多懂 kmp 和 Boyer-Moore 了。
字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?
更多算法的学习,欢迎关注我的公众号『苦逼的码农』
6、流相关算法
- 最大流:最短增广路、Dinic 算法
- 最大流最小割:最大收益问题、方格取数问题
- 最小费用最大流:最小费用路、消遣
这方面的一些算法,我也只了解过一些,感兴趣的可以学习下。
总结
对于上面设计到的算法,我都提供了感觉还不错的文章,建议大家收藏,然后可以利用零碎的时间进行阅读,有些人可能会觉得上面的算法太多,说实话,我觉得不多,特别是对于在校生的,上面涉及到的算法可以不用很懂,但至少得了解。至于书籍的话,如果你连基本数据结构都还不懂的,建议看《数据结构与算法》相关书籍,例如《大话数据结构》、《数据结构与算法分析》。如果你有一定的基础,例如知道链表,栈,队列,那么可以看《算法第四版》,不过这本书是用 Java 实现的,不过我觉得你只要学过 C,那么可以看的懂。
这些算法的学习,虽然你觉得学了没有什么用,但还是那些话,它对你的影响是潜意识的,它可以给你打下很深厚的基础内功,如果你想走的更远,那么我推荐学习,标注必学的,那么我觉得,你是真的需要抽时间来学习下,标注原理与应用的,代表你可以不知道怎么用代码实现,但是必得知道它的实现原理以及应用,更多算法的学习,可以持续关注我的微信公众号勒。
作为一个非常注重计算机基础以及算法学习的程序员,一路自学走来,看过挺多不错的优质书籍,在这里推荐给大家,全都是自己看过滴。
最后,很多人问我都是怎么学习的,那我干脆就把我看过的优质书籍贡献出来:
计算机基础入门推荐:《程序是怎样跑起来的》、《网络是怎样连接的》、《计算机是怎样工作的》
进一步认识计算机网络:《计算机网络:自顶向下》、《图解http》
数据结构+算法入门:《数据结构与算法分析:C语言描述版》,《大话数据结构》、《阿哈算法》
算法进阶:《算法第四版》、《编程之美》、《编程珠玑》
由于我是Java技术栈的,顺便推荐基本Java的书籍,从左到由的顺序看到
Java:《Java核心技术卷1》、《编程思想》、《深入理解Java虚拟机》、《Java编程艺术》
数据库:《mysql必知必会》、《MySQL技术内幕:InnoDB存储引擎》
就先介绍这么多,这些都是最基础最核心滴,希望对那些不知道看什书的同学有所帮助
对了,我介绍的这些书籍,我顺便帮你整理好了,你可以在我的原创微信公众号『帅地玩编程』回复『书籍』获取哦
另外,帅地把公众号的精华文章整理成了一本电子书,共 630页!目录如下
现在免费送给大家,在我的公众号帅地玩编程回复程序员内功修炼即可获取。有收获?希望老铁们来个三连击,给更多的人看到这篇文章
1、老铁们,关注我的原创微信公众号「帅地玩编程」,专注于写算法 + 计算机基础知识(计算机网络+ 操作系统+数据库+Linux),保存让你看完有所收获,不信你打我。
2、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。
作者info
作者:帅地,一位热爱写作的小伙
原创公众号:『帅地玩编程』,已写了150多篇文章,专注于写 算法、计算机基础知识等提升你内功的文章,期待你的关注。
转载说明:务必注明来源(注明:来源于公众号:苦逼的码农, 作者:帅地)更多相关内容 -
粒子群算法求解函数极值 matlab
2018-06-27 14:46:08粒子群算法 求函数最小值,matlab代码。链接是讲解粒子群算法 https://blog.csdn.net/zyqblog/article/details/80829043 。 我用ubuntu下matlab编写的代码,你在windows下可能有中文乱码,不过都是注释,你可以去... -
完整视频-coursera公开课 普林斯顿算法 ⅠⅡ部分
2015-01-17 16:43:04相关主题有:深度优先搜索,宽度优先搜索,拓扑排序,Kosaraju-Sharir算法,Kruskal算法,Prim算法,Dijkistra算法,Bellman-Ford算法, Ford-Fulkerson算法, LSD radix sort算法, MSD radix sort算法, 3-way radix ... -
DBSCAN聚类算法matlab代码
2017-03-22 01:34:59DBSCAN聚类算法matlab代码,内包含测试数据,下载可以直接运行。 -
遗传算法matlab源代码
2015-08-28 19:10:24遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。遗传算法可以解决多种优化问题,如:TSP问题、生产调度问题、... -
智能优化算法:麻雀搜索算法-附代码
2020-09-27 16:34:002020智能优化算法:麻雀搜索算法-附代码 文章目录2020智能优化算法:麻雀搜索算法-附代码1.算法原理2.算法结果3.参考文献4.Matlab代码 摘要:麻雀搜索算法(Sparrow Search Algorithm, SSA)是于2020年提出的。SSA ...2020智能优化算法:麻雀搜索算法
摘要:麻雀搜索算法(Sparrow Search Algorithm, SSA)是于2020年提出的。SSA 主要是受麻雀的觅食行为和反捕食行为的启发而提出的。该算法比较新颖,具有寻优能力强,收敛速度快的优点1.算法原理
建立麻雀搜索算法的数学模型,主要规则如下所述:
- 发现者通常拥有较高的能源储备并且在整个种群中负责搜索到具有丰富食物的区域,为所有的加入者提供觅食的区域和方向。在模型建立中能量储备的高低取决于麻雀个体所对应的适应度值(Fitness Value)的好坏。
- 一旦麻雀发现了捕食者,个体开始发出鸣叫作为报警信号。当报警值大于安全值时,发现者会将加入者带到其它安全区域进行觅食。
- 发现者和加入者的身份是动态变化的。只要能够寻找到更好的食物来源,每只麻雀都可以成为发现者,但是发现者和加入者所占整个种群数量的比重是不变的。也就是说,有一只麻雀变成发现者必然有另一只麻雀变成加入者。
- 加入者的能量越低,它们在整个种群中所处的觅食位置就越差。一些饥肠辘辘的加入者更有可能飞往其它地方觅食,以获得更多的能量。
- 在觅食过程中,加入者总是能够搜索到提供最好食物的发现者,然后从最好的食物中获取食物或者在该发现者周围觅食。与此同时,一些加入者为了增加自己的捕食率可能会不断地监控发现者进而去争夺食物资源。
- 当意识到危险时,群体边缘的麻雀会迅速向安全区域移动,以获得更好的位置,位于种群中间的麻雀则会随机走动,以靠近其它麻雀。
在模拟实验中,我们需要使用虚拟麻雀进行食物的寻找,由n只麻雀组成的种群可表示为如下形式:
X = [ x 1 1 x 1 2 . . . x 1 d x 2 1 x 2 2 . . . x 2 d . . . . . . . . . . . . x n 1 x n 2 . . . x n d ] (1) X=\left[\begin{matrix} x_1^1&x_1^2&...&x_1^d\\ x_2^1&x_2^2&...&x_2^d\\ ...&...&...&... \\ x_n^1&x_n^2&...&x_n^d\\ \end{matrix}\right]\tag{1} X=⎣⎢⎢⎡x11x21...xn1x12x22...xn2............x1dx2d...xnd⎦⎥⎥⎤(1)
其中, d d d 表示待优化问题变量的维数, n n n 则是麻雀的数量。那么,所有麻雀的适应度值可以表示为如下形式:
F x = [ f ( [ x 1 1 x 1 2 . . . x 1 d ] ) f ( [ x 2 1 x 2 2 . . . x 2 d ] ) . . . f ( [ x n 1 x n 2 . . . x n d ] ) ] (2) F_x =\left[\begin{matrix} f([x_1^1&x_1^2&...&x_1^d])\\ f([x_2^1&x_2^2&...&x_2^d])\\ ... f([x_n^1&x_n^2&...&x_n^d]) \end{matrix}\right]\tag{2} Fx=⎣⎡f([x11f([x21...f([xn1x12x22xn2.........x1d])x2d])xnd])⎦⎤(2)
其中,f 表示适应度值。在 SSA 中,具有较好适应度值的发现者在搜索过程中会优先获取食物。此外,因为发现者负责为整个麻雀种群寻找食物并为所有加入者提供觅食的方向。因此,发现者可以获得比加入者更大的觅食搜索范围。根据规则(1)和规则(2),在每次迭代的过程中,发现者的位置更新描述如下:
X i , j t + 1 = { X i , j . e x p ( − i α . i t e r m a x ) , i f R 2 < S T X i , j + Q . L , i f R 2 ≥ S T (3) X_{i,j}^{t+1}=\begin{cases} X_{i,j}.exp(-\frac{i}{\alpha.iter_{max}}),if\, R_2<ST\\ X_{i,j} + Q.L,if\, R_2\geq ST \end{cases}\tag{3} Xi,jt+1={Xi,j.exp(−α.itermaxi),ifR2<STXi,j+Q.L,ifR2≥ST(3)
其中, t t t 代表当前迭代数, j = 1 , 2 , 3 , . . . , d j =1, 2, 3, . . . , d j=1,2,3,...,d。 i t e m m a x item_{max} itemmax
是一个常数,表示最大的迭代次数。 X i j X_{ij} Xij表示第 i i i 个麻雀在第 j j j 维中的位置信息。 α ∈ ( 0 , 1 ] α∈(0, 1] α∈(0,1]是一个随机数。 R 2 ( R 2 ∈ [ 0 , 1 ] ) R_2(R_2∈[0,1]) R2(R2∈[0,1])和 S T ( S T ∈ [ 0.5 , 1 ] ) ST(ST∈[0.5,1]) ST(ST∈[0.5,1])分别表示预警值和安全值。 Q Q Q 是服从正态分布的随机数。 L L L 表示一个 1 × d 1×d 1×d 的矩阵,其中该矩阵内每个元素全部为 1。当 R 2 < S T R2< ST R2<ST 时,这意味着此时的觅食环境周围没有捕食者,发现者可以执行广泛的搜索操作。如果 R 2 ≥ S T R2≥ ST R2≥ST,这表示种群中的一些麻雀已经发现了捕食者,并向种群中其它麻雀发出了警报,此时所有麻雀都需要迅速飞到其它安全的地方进行觅食。
对于加入者,它们需要执行规则(3)和规则(4)。如前面所描述,在觅食过程中,一些加入者会时刻监视着发现者。一旦它们察觉到发现者已经找到了更好的食物,它们会立即离开现在的位置去争夺食物。如果它们赢了,它们可以立即获得该发现者的食物,否则需要继续执行规则(4)。加入者的位置更新描述如下:
X i , j t + 1 = { Q . e x p ( X w o r s t − X i , j t i 2 ) , i f i > n / 2 X P t + 1 + ∣ X i , j − X P t + 1 ∣ . A + . L , o t h e r w i s e (4) X_{i,j}^{t+1}=\begin{cases} Q.exp(\frac{X_{worst}-X_{i,j}^t}{i^2}),if\, i>n/2\\ X_P^{t+1}+ |X_{i,j} - X_P^{t+1}|.A^{+}.L,otherwise \end{cases}\tag{4} Xi,jt+1={Q.exp(i2Xworst−Xi,jt),ifi>n/2XPt+1+∣Xi,j−XPt+1∣.A+.L,otherwise(4)
其中, X p X_p Xp是目前发现者所占据的最优位置, X w o r s t X_{worst} Xworst则表示当前全局最差的位置。 A A A表示一个 1 × d 1×d 1×d 的矩阵,其中每个元素随机赋值为 1 或-1,并且 A + = A T ( A A T ) − 1 A^+=A^T(AA^T)^{-1} A+=AT(AAT)−1。当i >n/2 时,这表明,适应度值较低的第 i 个加入者没有获得食物,处于十分饥饿的状态,此时需要飞往其它地方觅食,以获得更多的能量。在模拟实验中,我们假设这些意识到危险的麻雀占总数量的 10% 到 20%。这些麻雀的初始位置是在种群中随机产生的。根据规则(5),其数学表达式可以表示为如下形式:
X i , j t + 1 = { X b e s t t + β . ∣ X i , j t − X b e s t t ∣ , i f f i > f g X i , j t + K . ( ∣ X i , j t − X w o r s t t ∣ ( f i − f w ) + ε ) , i f f i = f g (5) X_{i,j}^{t+1}=\begin{cases} X_{best}^t + \beta.|X_{i,j}^t - X_{best}^t|,if\, f_i>f_g\\ X_{i,j}^t + K.(\frac{|X_{i,j}^t - X_{worst}^t|}{(f_i -f_w)+\varepsilon}), if\, f_i =f_g \end{cases}\tag{5} Xi,jt+1={Xbestt+β.∣Xi,jt−Xbestt∣,iffi>fgXi,jt+K.((fi−fw)+ε∣Xi,jt−Xworstt∣),iffi=fg(5)
其中,其中 X b e s t X_{best} Xbest是当前的全局最优位置。 β β β 作为步长控制参数,是服从均值为 0,方差为 1 的正态分布的随机数。 K ∈ [ − 1 , 1 ] K∈[-1,1] K∈[−1,1]是一个随机数,fi则是当前麻雀个体的适应度值。 f g f_g fg和 f w f_w fw分别是当前全局最佳和最差的适应度值。 ε \varepsilon ε 的常数,以避免分母出现零。为简单起见,当 f i > f g f_i >f_g fi>fg表示此时的麻雀正处于种群的边缘,极其容易受到捕食者的攻击。 X b e s t X_{best} Xbest表示这个位置的麻雀是种群中最好的位置也是十分安全的。 f i = f g f_i = f_g fi=fg时,这表明处于种群中间的麻雀意识到了危险,需要靠近其它的麻雀以此尽量减少它们被捕食的风险。 K K K 表示麻雀移动的方向同时也是步长控制参数。
算法流程
Step1: 初始化种群,迭代次数,初始化捕食者和加入者比列。
Step2:计算适应度值,并排序。
Step3:利用式(3)更新捕食者位置。
Step4:利用式(4)更新加入者位置。
Step5:利用式(5)更新警戒者位置。
Step6:计算适应度值并更新麻雀位置。
Step7:是否满足停止条件,满足则退出,输出结果,否则,重复执行Step2-6;
2.算法结果
3.参考文献
[1] Xue J , Shen B . A novel swarm intelligence optimization approach: sparrow search algorithm[J]. Systems ence & Control Engineering An Open Access Journal, 2020, 8(1):22-34.
4.Matlab代码
麻雀搜索算法
改进算法:名称 说明或者参考文献 基于反向策略的麻雀搜索算法 原创 基于Tent混沌映射的麻雀搜索算法 原创 基于Logistic混沌映射的麻雀搜索算法 原创 基于Circle混沌映射的麻雀搜索算法 原创 基于Piecewise混沌映射的麻雀搜索算法 原创 基于Chebyshev混沌映射的麻雀搜索算法 原创 基于Sine混沌映射的麻雀搜索算法 原创 基于Singer混沌映射的麻雀搜索算法 原创 基于迭代混沌映射的麻雀搜索算法 原创 基于Sinusoidal混沌映射的麻雀搜索算法 原创 基于随机游走改进的麻雀搜索算法 原创 基于萤火虫改进的麻雀搜索算法 原创 基于精英反向策略的麻雀搜索算法1 原创 基于精英反向策略的麻雀搜索算法2 原创 基于levy飞行改进的麻雀搜索算法 原创 基于自适应t分布的麻雀算法 原创 混沌麻雀 [1]吕鑫,慕晓冬,张钧,王震.混沌麻雀搜索优化算法[J/OL].北京航空航天大学学报:1-10[2020-11-16].https://doi.org/10.13700/j.bh.1001-5965.2020.0298. 融合柯西变异和反向学习的改进麻雀算法 [1]毛清华,张强.融合柯西变异和反向学习的改进麻雀算法[J/OL].计算机科学与探索:1-12[2020-12-16].http://kns.cnki.net/kcms/detail/11.5602.tp.20201203.1601.006.html. 混合正弦余弦算法和Lévy飞行的麻雀算法(ISSA) [1]毛清华,张强,毛承成,柏嘉旋.混合正弦余弦算法和Lévy飞行的麻雀算法[J/OL].山西大学学报(自然科学版):1-6[2021-04-09].https://doi.org/10.13451/j.sxu.ns.2020135. 基于 Sobol 序列和纵横交叉策略的麻雀搜索算法(SSASC) [1]段玉先,刘昌云.基于 Sobol 序列和纵横交叉策略的麻雀搜索算法[J/OL].计算机应用. https://kns.cnki.net/kcms/detail/51.1307.TP.20210525.1453.002.html 融合正余弦和柯西变异的麻雀搜索算法(SCSSA) [1]李爱莲,全凌翔,崔桂梅,解韶峰.融合正余弦和柯西变异的麻雀搜索算法[J/OL].计算机工程与应用:1-11[2021-09-09].http://kns.cnki.net/kcms/detail/11.2127.TP.20210806.0937.008.html. 多策略融合的改进麻雀搜索算法(ISSA) [1]付华,刘昊.多策略融合的改进麻雀搜索算法及其应用[J/OL].控制与决策:1-10[2021-09-09].https://doi.org/10.13195/j.kzyjc.2021.0582. 基于Logistic回归麻雀算法(MSSA) [1]陈刚,林东,陈飞,陈祥宇.基于Logistic回归麻雀算法的图像分割[J/OL].北京航空航天大学学报:1-14[2021-09-26].https://doi.org/10.13700/j.bh.1001-5965.2021.0268. 自适应变异麻雀搜索优化算法(AMSSA) [1]唐延强,李成海,宋亚飞,陈晨,曹波.自适应变异麻雀搜索优化算法[J/OL].北京航空航天大学学报:1-14[2021-09-27].https://doi.org/10.13700/j.bh.1001-5965.2021.0282. 混合策略改进的麻雀搜索算法(MSSA) [1]张伟康,刘升,任春慧.混合策略改进的麻雀搜索算法[J/OL].计算机工程与应用:1-12[2021-08-05].http://kns.cnki.net/kcms/detail/11.2127.TP.20210721.0848.002.html. 融合多策略的改进麻雀搜索算法(ISSA) [1]张晓萌,张艳珠,刘禄,张硕,熊夫睿.融合多策略的改进麻雀搜索算法[J/OL].计算机应用研究:1-8[2021-12-17].https://doi.org/10.19734/j.issn.1001-3695.2021.09.0412. 自适应t分布与黄金正弦改进的麻雀搜索算法(tGSSA) [1]张伟康,刘升.自适应t分布与黄金正弦改进的麻雀搜索算法及其应用[J/OL].微电子学与计算机:1-8[2021-12-17].https://doi.org/10.19304/J.ISSN1000-7180.2020-0026. 分数阶麻雀搜索算法(FDSSA) [1]江妍,马瑜,梁远哲,王原,李光昊,马鼎.基于分数阶麻雀搜索优化OTSU肺组织分割算法[J].计算机科学,2021,48(S1):28-32. 螺旋探索与自适应混合变异的麻雀搜索(SHSSA) [1]陈功,曾国辉,黄勃,刘瑾.螺旋探索与自适应混合变异的麻雀搜索算法[J/OL].小型微型计算机系统:1-12[2021-12-24].http://kns.cnki.net/kcms/detail/21.1106.tp.20211214.1828.006.html. 改进搜索机制的单纯形法引导麻雀搜索算法(SMSSA) [1]刘成汉,何庆.改进搜索机制的单纯形法引导麻雀搜索算法[J/OL].计算机工程与科学:1-9[2021-12-24].http://kns.cnki.net/kcms/detail/43.1258.TP.20211223.0930.002.html. 基于逐维高斯变异的混沌麻雀优化算法(ISSA) [1]楚哲宇,唐秀英,谭庆,张清君.基于逐维高斯变异的混沌麻雀优化算法[J].自动化应用,2021(08):60-63.DOI:10.19769/j.zdhy.2021.08.019. 基于莱维飞行扰动策略的麻雀搜索算法(ISSA) [1]马卫,朱娴.基于莱维飞行扰动策略的麻雀搜索算法[J].应用科学学报,2022,40(01):116-130. 算法相关应用matlab代码:
名称 说明或者参考链接 麻雀优化的BP神经网络(预测) https://blog.csdn.net/u011835903/article/details/112149776 基于Tent混沌映射改进的麻雀搜索算法SSA优化BP神经网络(预测) - 基于Sine混沌映射改进的麻雀搜索算法SSA优化BP神经网络(预测) - 基于Logistic混沌映射改进的麻雀搜索算法SSA优化BP神经网络(预测) - 麻雀优化的BP神经网络(分类) https://blog.csdn.net/u011835903/article/details/112149394 基于麻雀搜索算法优化概率神经网络PNN的分类预测 https://blog.csdn.net/u011835903/article/details/111496232 基于麻雀搜索算法优化的Elman神经网络数据预测 https://blog.csdn.net/u011835903/article/details/111411127 基于麻雀搜索算法的极限学习机(ELM)分类算法 https://blog.csdn.net/u011835903/article/details/111177850 基于麻雀搜索算法的极限学习机(ELM)回归预测 https://blog.csdn.net/u011835903/article/details/111073635 基于麻雀算法优化的相关向量机RVM的分类算法 https://blog.csdn.net/u011835903/article/details/119005293 基于麻雀算法优化的相关向量机RVM回归预测算法 https://blog.csdn.net/u011835903/article/details/118998966 基于麻雀算法优化的核极限学习机(KELM)的分类算法 https://blog.csdn.net/u011835903/article/details/116851164 基于麻雀算法优化的核极限学习机(KELM)回归预测 https://blog.csdn.net/u011835903/article/details/116849032 基于麻雀搜索算法优化的广义回归神经网络(GRNN)预测 https://blog.csdn.net/u011835903/article/details/110941139 基于麻雀搜索算法优化的SVM数据分类预测 https://blog.csdn.net/u011835903/article/details/110523352 基于麻雀搜索的PID神经网络解耦控制算法 https://blog.csdn.net/u011835903/article/details/110437852 基于麻雀搜索优化K-means图像分割算法 https://blog.csdn.net/u011835903/article/details/109404281 基于麻雀算法优化的二维最大熵图像阈值分割 https://blog.csdn.net/u011835903/article/details/108214713 基于麻雀算法优化的最大熵多阈值分割 https://blog.csdn.net/u011835903/article/details/108203775 基于麻雀算法的二维Otsu图像阈值分割 https://blog.csdn.net/u011835903/article/details/108023193 麻雀算法优化的otsu多阈值分割 https://blog.csdn.net/u011835903/article/details/108019744 麻雀算法优化脉冲耦合神经网络的图像自动分割 https://blog.csdn.net/u011835903/article/details/112909060 基于麻雀算法优化的Tsallis相对熵图像多阈值分割 https://blog.csdn.net/u011835903/article/details/113755585 基于麻雀搜索算法与双伽马校正的图像自适应增强算法 https://blog.csdn.net/u011835903/article/details/109330643 基于麻雀搜索算法与非完全beta函数的自适应图像增强算法 https://blog.csdn.net/u011835903/article/details/109313513 基于麻雀搜索算法PID参数优化 https://blog.csdn.net/u011835903/article/details/109306387 基于麻雀搜索算法的TSP问题求解 https://blog.csdn.net/u011835903/article/details/109587929 基于麻雀搜索算法无线传感器网络(WSN)覆盖优化 https://blog.csdn.net/u011835903/article/details/109262039 基于麻雀搜索算法的3D无线传感器网络(WSN)覆盖优化 https://blog.csdn.net/u011835903/article/details/113834323 基于麻雀搜索的LMS自适应滤波算法 https://blog.csdn.net/u011835903/article/details/110529694 基于麻雀搜索的路径规划算法 https://blog.csdn.net/u011835903/article/details/109100220 基于麻雀搜搜算法的积分计算算法 https://blog.csdn.net/u011835903/article/details/114330697 基于麻雀搜索算法的工程优化案例(3种) https://blog.csdn.net/u011835903/article/details/114106139 基于麻雀算法改进的随机森林回归预测算法(SSA-RF) https://blog.csdn.net/u011835903/article/details/121860633 基于麻雀算法改进的随机森林分类算法(SSA-RF) https://blog.csdn.net/u011835903/article/details/121860734 麻雀算法改进的深度极限学习机DELM的预测(SSA-DELM) https://blog.csdn.net/u011835903/article/details/123115147 麻雀算法改进的深度极限学习机DELM的分类(SSA-DELM) https://blog.csdn.net/u011835903/article/details/123091238 基于麻雀算法优化的Renyi熵图像多阈值分割 https://blog.csdn.net/u011835903/article/details/108276355 原理一样只是优化算法部分原理为麻雀 基于麻雀算法优化的指数熵图像多阈值分割 https://blog.csdn.net/u011835903/article/details/108263933 原理一样只是优化算法部分原理为麻雀 基于麻雀算法优化的灰度熵图像多阈值分割 https://blog.csdn.net/u011835903/article/details/108243596 原理一样只是优化算法部分原理为麻雀 基于麻雀算法优化的对称交叉熵图像多阈值分割 https://blog.csdn.net/u011835903/article/details/108241032 原理一样只是优化算法部分原理为麻雀 基于麻雀算法优化的最小交叉熵图像多阈值分割 https://blog.csdn.net/u011835903/article/details/108240562 原理一样只是优化算法部分原理为麻雀 基于麻雀算法优化的二维最大熵图像阈值分割 https://blog.csdn.net/u011835903/article/details/108214713 原理一样只是优化算法部分原理为麻雀 基于麻雀算法的二维Otsu图像阈值分割 https://blog.csdn.net/u011835903/article/details/108023193 原理一样只是优化算法部分原理为麻雀 基于麻雀搜索算法的同步优化特征选择 https://blog.csdn.net/u011835903/article/details/121103001 基于麻雀算法的投影寻踪模型(SSA-PP) https://blog.csdn.net/u011835903/article/details/121120392 基于麻雀算法改进的无线传感器网络Dv-hop定位算法 https://blog.csdn.net/u011835903/article/details/121334401 基于麻雀算法的无人机航迹规划 https://blog.csdn.net/u011835903/article/details/122926764 5.Python代码
麻雀搜索算法
改进算法:名称 说明或者参考文献 基于反向策略的麻雀搜索算法 原创 基于Tent混沌映射的麻雀搜索算法 原创 基于Logistic混沌映射的麻雀搜索算法 原创 基于Circle混沌映射的麻雀搜索算法 原创 基于Piecewise混沌映射的麻雀搜索算法 原创 基于Chebyshev混沌映射的麻雀搜索算法 原创 基于Sine混沌映射的麻雀搜索算法 原创 基于Singer混沌映射的麻雀搜索算法 原创 基于迭代混沌映射的麻雀搜索算法 原创 基于Sinusoidal混沌映射的麻雀搜索算法 原创 基于随机游走改进的麻雀搜索算法 原创 基于萤火虫改进的麻雀搜索算法 原创 基于精英反向策略的麻雀搜索算法1 原创 基于精英反向策略的麻雀搜索算法2 原创 基于levy飞行改进的麻雀搜索算法 原创 基于自适应t分布的麻雀算法 原创 混沌麻雀 [1]吕鑫,慕晓冬,张钧,王震.混沌麻雀搜索优化算法[J/OL].北京航空航天大学学报:1-10[2020-11-16].https://doi.org/10.13700/j.bh.1001-5965.2020.0298. 混合正弦余弦算法和Lévy飞行的麻雀算法(ISSA) [1]毛清华,张强,毛承成,柏嘉旋.混合正弦余弦算法和Lévy飞行的麻雀算法[J/OL].山西大学学报(自然科学版):1-6[2021-04-09].https://doi.org/10.13451/j.sxu.ns.2020135. 算法相关应用Python代码:
名称 说明或者参考文献 基于麻雀算法的SVM分类(SSA-SVM) https://blog.csdn.net/u011835903/article/details/110523352 基于麻雀算法的SVM回归预测(SSA-SVM) https://blog.csdn.net/u011835903/article/details/110630270 基于麻雀搜索算法的极限学习机(ELM)分类算法(SSA-ELM) https://blog.csdn.net/u011835903/article/details/111177850 基于麻雀搜索算法的极限学习机(ELM)回归预测算法(SSA-ELM) https://blog.csdn.net/u011835903/article/details/111073635 基于麻雀算法的无线传感器网(WSN)覆盖优化(SSA-WSN) https://blog.csdn.net/u011835903/article/details/109262039 基于麻雀算法改进的随机森林分类算法(SSA-RF) https://blog.csdn.net/u011835903/article/details/121860734 基于麻雀算法改进的随机森林回归预测算法(SSA-RF) https://blog.csdn.net/u011835903/article/details/121860633 -
「 英雄哪里出来 」算法博客阅读指引
2021-11-27 20:37:56」 2、「 算法零基础每日打卡 」 五、算法进阶 1、「 画解数据结构 」 2、「 算法进阶50讲 」 3、「 LeetCode算法题集汇总 」 4、「 夜深人静写算法 」 六、社区活动 1、「 结对编程排位赛 」 2、「 明年今日 」 3、...文章目录
前言
很多人看到我的博客,太多专栏不知道从何学起,为了广大人民群众的根本利益,我决定写一个阅读指引,按照这个指引进行学习,多加练习,假以时日,势必能够……算了,还是看你自己能学多少以及能够坚持到哪里了。加油吧,少年!坚持就是胜利!迈出第一步就成功了一半!
最新版本请见: 「 英雄哪里出来 」算法博客阅读指引专栏 定位 适宜人群 「 光天化日学C语言 」 「 入门 」 没有任何语言基础 「 LeetCode零基础指南 」 「 初级 」 零基础快速上手力扣 「 C语言入门100例 」 「 中级 」 零基础持续C语言练习教程 「 算法零基础100讲 」 「 高级 」 零基础持续算法练习教程 「 画解数据结构 」 「 高级 」 「 推荐 」 数据结构动图教程 「 算法进阶50讲 」 「 资深 」 进阶持续算法练习教程 「 LeetCode算法题集汇总 」 「 资深 」 全面的力扣算法题练习集锦 「 夜深人静写算法 」 「 资级 」 竞赛高端算法集锦
一、语言基础
1、「 光天化日学C语言 」
学习算法,还是需要有一门语言作为基础的,推荐用 C语言,并且可以看下这个专栏,了解一些简单的 C语言语法。虽然没有更新完,但是只要看前五节内容,就能够对 C语言 的语法大体有一个了解。
🌞《光天化日学C语言》🌞
(01)- 初始 C 语言 (02)- 配本地环境 (03)- 变量初体验 (04)- 格式化输出 (05)- 格式化输入
读完这五节,基本能够了解 C语言 的输入输出 了。对于初学者来说,可以先看这么几节,然后我们继续看下面的内容,等遇到相关知识点时再回来翻开即可。
二、刷题必读
光看不练肯定是不行的,所以主要还是要刷题,我这里推荐的是 LeetCode,主要原因是因为现在一些大厂面试的时候基本都是在 牛客 或者 LeetCode 上找的题,而 LeetCode 上的题更加系统,如果这里的题能够掌握大部分,那面试刷题这快肯定是不慌了。当然,对于竞赛选手,这个难度肯定是远远不够的。不过,这是后话了,我们先来看简单的。
1、「 LeetCode零基础指南 」
一开始刷题的时候,一定要刷水题。刷水题是为了让你养成刷题的习惯,一开始就刷难题很容易被劝退。刚开是的时候,建立信心是很重要的事情。
建立信心的过程是需要逐渐培养的,通过不断刷题,把题目数量提上来,才能不断的建立信心。所以,很多时候,如果遇到题目告诉你一定要用某个方法来做,但是你又想不出来的时候,你就想办法先把它过掉再说。
例如,下面这道题:实现一个函数
multiply
,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。int multiply(int A, int B){ // (1) return A * B; // (2) }
-
(
1
)
(1)
(1) 这里
int
是C/C++中的一种类型,代表整数,即 Integer,传入参数是两个整数; -
(
2
)
(2)
(2) 题目要求返回两个整数的乘积,并且要求不能用
*
,那如果我用了会怎么样?答案是并不会怎么样,因为平台不会去对它做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。作为你接触算法的第一道题,其实这些条件都无所谓的,能过就行,他只检测输入输出,不检测你实际代码。
对于新人来说,把问题过掉比问题本身更重要,题数的增加,是信心的增加,信心比什么都重要,有了信心,你才能继续往下走,只要你能往下推进,你就能继续学习,继续学习你迟早会学到相应的算法。好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后再来用题目要求的方法来过了它。
这个专栏主要讲解了一些 LeetCode 刷题时的一些难点和要点,主要分为以下几个章节,并且会持续补充一些方法论的文章。文章有试读,可以简单先看一看试读文章。
🍠《LeetCode零基础指南》🍠
(第一讲)导读 (第二讲)函数 (第三讲)循环 (第四讲)数组 (第五讲)指针 (第六讲)排序 (第七讲)贪心 (第八讲)矩阵 (第九讲)二级指针 (第十讲)简单递归
2、「 九日集训每日打卡 」
「 九日集训 」是博主推出的一个能够白嫖付费专栏「 LeetCode零基础指南 」的活动。通过 「 专栏中的联系方式 」 或者 「 本文末尾的联系方式 」 联系博主,进行报名即可参加。九日一个循环,第二期计划 「 2021.12.02 」 开启。
玩法很简单,每天会开启一篇试读文章,要求有三点:
1)阅读完文章后,课后习题 「 全部刷完 」(都能在文中找到解法,需要自己敲一遍代码);
2)写 「 学习报告 」 并发布社区 九日集训(每日打卡) 频道
3)在 「 打卡帖 」 提交 「 学习报告 」 链接;完成以上三点后方可晋级到下一天,所有坚持到 9天 的同学,会成为 「 英雄算法联盟合伙人 」 群成员,只限500个名额,优胜劣汰,和精英在一起,无论是沟通,学习,都能有更好的发展,你接触到的人脉也都是不一样的,等找工作的时候,我也会为大家打通 hr 和猎头,让你前程无忧~
详细规则参见:九日集训规则详解。
目前第一轮「 九日集训 」已经进行到第七天,即将开启第二轮。
三、语言入门
1、「 C语言入门100例 」
这个专栏的目的是加深对 C语言 的理解,通过看题做题,不断加深每个语法以及简单算法的作用。
🧡《C语言入门100例》🧡
该专栏每个算法都会提供例题,并且要求玩家实现一个函数,主函数需要自己写,示例如下:
#include <stdio.h> // (1) 标准输入输出库 int add(int a, int b) { return a + b; // (2) 这就是一个最简单的算法:加法算法 } int main() { int a = add(1, 3); // (3) 算法输入两个参数,输出一个参数; printf("%d\n", a); // (4) 将算法结果输出到屏幕上来验证结果 return 0; }
试读文章如下,可以看下是否满足自身需要:
【第01题】A + B | 基础输入输出,开启学习C语言打卡的序章 【第02题】给定 n,求 1 + 2 + 3 + .... n-1 + n 的和 | 四种解法
2、「 C语言每日打卡 」
「 C语言每日打卡 」是博主推出的一个能够白嫖付费专栏「 C语言入门100例 」的活动。通过 「 专栏中的联系方式 」 或者 「 本文末尾的联系方式 」 联系博主,即可参加。
玩法很简单,每天会开启一篇试读文章,要求有三点:
1)阅读完文章后,课后习题 「 挑一道刷 」;
2)写 「 学习报告 」 并发布社区 C语言(每日打卡) 频道
3)在 「 打卡帖 」 提交 「 学习报告 」 链接;
四、算法入门
1、「 算法零基础100讲 」
🌌《算法零基础100讲》🌌
如果你只是想学会写代码,或许 「 算法与数据结构 」 并不是那么重要,但是,想要进一步发展自己的事业,「 算法与数据结构 」 是必不可少的。
现在一些主流的大厂,诸如:字节、网易、腾讯、阿里、美团、京东、滴滴 等等,在面时都会让候选人写一道 「 算法题 」 ,如果你敲不出来,可能你的 「 offer 」 年包就打了骨折,或者直接与 「 offer 」 失之交臂,都是有可能的。
当然,它不能完全代表你的 「 编码能力 」 ,因为有些算法确实是很巧妙,加上紧张的面试氛围,想不出来其实也是正常的,但是你能确保面试官是这么想的吗?我们要做的是 「 十足的准备 」 ,既然决定出来, 「 offer 」 当然是越高越好,毕竟大家都要养家糊口,房价又这么贵,如果能够在算法这一块取得先机,也不失为一个 「 捷径 」 。
所以,你问我算法和数据结构有什么用?我可以很明确的说,和你的年薪息息相关。当然,面试中 「算法与数据结构」 知识的考察只是面试内容的一部分。其它还有很多面试要考察的内容,当然不是本文主要核心内容,这里就不做展开了。试读内容如下:导读 (第1讲) 幂和对数 (第2讲) 数列
本专栏适宜对算法没有什么概念,但是对某一门语言有一些简单基础的同学,如果语言基础较为薄弱,建议先选择一门语言学习一段时间。当然,如果直接开始学算法,也不是不可以,只要坚持把该专栏的 100 讲 攻克完毕,基本上语言那关也可以过了。
2、「 算法零基础每日打卡 」
「 算法零基础每日打卡 」是博主推出的一个能够白嫖付费专栏「 算法零基础100讲 」的活动。通过 「 专栏中的联系方式 」 或者 「 本文末尾的联系方式 」 联系博主,即可参加。
玩法很简单,每天会开启一篇试读文章,要求有三点:
1)阅读完文章后,课后习题 「 挑三道刷 」;
2)写 「 学习报告 」 并发布社区 算法零基础(每日打卡) 频道
3)在 「 打卡帖 」 提交 「 学习报告 」 链接;五、算法进阶
1、「 画解数据结构 」
以动图的形式,更加生动形象的阐释每个数据结构的思想和实现。
🌳《画解数据结构》🌳
线性表 和 树 的内容已经大致更新完毕,图相关的内容目前还未更新。已更新内容如下:
顺序表 链表 栈 队列 双端队列 哈希表 树 二叉树 二叉搜索树 平衡二叉树 堆 2、「 算法进阶50讲 」
🌌《算法进阶50讲》筹备中🌌
3、「 LeetCode算法题集汇总 」
这一部分主要是给有大块时间,并且想自学成才的同学准备的,里面的题集也在不断完善整理中。
🌌《算法入门指引》🌌
4、「 夜深人静写算法 」
这个专栏是我五年前写的,有一定难度,但是对于竞赛的同学是个不错的选择。
💜《夜深人静写算法》💜
《夜深人静写算法》总纲
以下是几篇优质文章的试读:夜深人静写算法(十九)- 背包总览 夜深人静写算法(二十三)- 最短路 夜深人静写算法(二十六)- 记忆化搜索
六、社区活动
1、「 结对编程排位赛 」
当你觉得自己已经有一定能力,可以加入到「 结对编程 」的行列中来,和队友一起组队刷题,感受团队的力量。提前学习团队融入和团队协作,对日后的 项目开发、工作等都是有百利而无一害。
可提前添加博主,备注「 结对编程 」,寒假开启,疯狂刷题!2、「 明年今日 」
由于【付费专栏】购买后,只有一年的阅读权限,很多用户反馈不知道,为了维护消费者的利益,回馈广大用户,作者打算将付费文章制作成 pdf,并且在 【明年今日】(2022.11.11日) 将 一年内过期的文章通过文件的形式开放出来。
由于制作过程会比较繁琐,而且需要各种的查错纠正,较为烧脑,具体细则如下:【用户范围】今日购买的付费专栏的用户直接享有对应的专栏精装版 pdf(在这之前,已经购买过对应付费专栏需要添加作者后提供凭据);
【专栏范围】《LeetCode零基础指南》《C语言入门100例》《算法零基础100讲》《画解数据结构》《夜深人静写算法》。3、「 三年之约 」
作者在此承诺!只要你不舍,我不弃,你我同心协力,以三年为期,引万人之势气,共筑未来美好三年!三年之后,算法刷满 1000 题,你我字节见,你不来,我不走!
4、「 英雄算法联盟合伙人 」
「 万人千题 」社区,打造 「 英雄算法联盟合伙人 」,让天下没有难学的算法。以下是我未来十年的愿景,以求志同道合者,共勉。
带领 10000 人刷满一千道算法题
内推 1000 人进大厂
带领 100 人成功打造个人IP
与 10 人一起财务自由七、配套赠送福利
语言入门:《光天化日学C语言》(示例代码)
语言训练:《C语言入门100例》试用版
数据结构:《画解数据结构》源码
算法入门:《算法入门》指引
算法进阶:《夜深人静写算法》算法模板👇🏻 添加 博主 获取资料验证码👇🏻 -
(
1
)
(1)
(1) 这里
-
路径规划算法
2021-11-14 10:20:44文章目录前言一、传统路径规划算法1.Dijkstra算法2.A*算法3.D*算法4.人工势场法二、基于采样路径规划算法1.PRM算法2.RRT算法三、智能仿生算法1.神经网络算法2.蚁群算法3.遗传算法 前言 随着机器人技术、智能控制...文章目录
前言
随着机器人技术、智能控制技术、硬件传感器的发展,机器人在工业生产、军事国防以及日常生活等领域得到了广泛的应用。而作为机器人行业的重要研究领域之一,移动机器人行业近年来也到了迅速的发展。移动机器人中的路径规划便是重要的研究方向。移动机器人的路径规划方法主要分为传统的路径规划算法、基于采样的路径规划算法、智能仿生算法。传统的路径规划算法主要有A算法、Dijkstra算法、D算法、人工势场法,基于采样的路径规划算法有PRM算法、RRT算法,智能仿生路径规划算法有神经网络算法、蚁群算法、遗传算法等。
一、传统路径规划算法
1.Dijkstra算法
Dijkstra算法是Edsger Wybe Dijkstra在1956年提出的一种用来寻找图形中结点之间最短路径的算法。Dijkstra算法的基本思想是贪心思想,主要特点是以起始点为中心向外层层扩展,直到扩展到目标点为止。Dijkstra算法在扩展的过程中,都是取出未访问结点中距离该点距离最小的结点,然后利用该结点去更新其他结点的距离值。
Dijkstra算法流程:1. 将初始点s放入到集合S中,初始时集合S中只有s; 2. 无自环的初始点s到自己的最短路径为0; 3. For(目标点ei不在集合S中): 4. 计算集合S中以外的所有结点到集合S中结点的最短距离,即从s出发,到达所有结点且只允许通过初始点s的最短路径。如果没有直达的通路,那么就设置为无穷,意味着暂时到达不了的结点。 5. While(集合V-S不是空集): 6. 选出第一次for循环之后在集合V-S中,且相对于集合S的最短路径中距离最短的目标点ej。 7. 将该目标点ej并入到集合S中。 8. 将目标点ej并入集合S之后会对V-S以外的顶点相对于集合S的最短路径长度产生影响。 9. For(更新S中的结点路径) 10. If(dist[s,ej]+wj,i < dist[s,ei]) 11. dist[s,ei] = dist[s,ej]+wj,i
注:该算法不允许图中存在负权边。
优点:
1) 如果最优路径存在,那么一定能找到最优路径
缺点:
1) 有权图中可能是负边
2) 扩展的结点很多,效率低2.A*算法
A算法发表于1968年,A算法是将Dijkstra算法与广度优先搜索算法(BFS)二者结合而成,通过借助启发式函数的作用,能够使该算法能够更快的找到最优路径。A算法是静态路网中求解最短路径最有效的直接搜索方法。
A算法的启发式函数:f(n)=g(n)+h(n)
f(n)表示结点的综合优先级,在选择结点时考虑该结点的综合优先级;
g(n)表示起始点到当前结点的代价值;
h(n)表示当前结点到目标点的代价估计值,启发式函数。
当h(n)趋近于0时,此时算法退化为Dijkstra算法,路径一定能找到,但速度比较慢;当g(n)趋近于0时,算法退化为BFS算法,不能保证一定找到路径,但速度特别快。我们可以通过调节h(n)的大小来调整算法的精度与速度。
在A*算法中,采用最多的是欧几里得距离,即dist = srqt((y2-y1)2+(x2-x1)2)。A*算法流程:
1. 将起始点s加入到开启列表openlist中 2. 重复以下过程: a) 遍历开启列表openlist,寻找F值最小的结点,并将其作为当前要处理的结点 b) 将要处理的结点移到关闭列表closelist c) 对当前结点的8个相邻结点的每个结点: i. 如果他是不可抵达的或者已经在关闭列表closelist中,忽略; ii. 如果他不在开启列表openlist中,将其加入openlist,并把当前结点设置为其父节点,记录当前结点的F、G、H值; iii. 如果他已经在开启列表openlist中,检查这条路径(即经由当前结点到达相邻结点)是否更好,用G值做参考,更小的G值表示这个更好的路径,如果是这样,将其父节点设置为当前结点,并重新计算他的G值和F值,如果开启列表openlist是按F值进行排序,改变后需要重新排序。 d) 停止,当 i. 终点加入到了开启列表openlist中,此时路径已经找到 ii. 查找重点失败,并且开启列表openlist中是空的,此时没有路径 3. 保存路径,从终点开始,每个结点沿着其父节点移动直到起点。
优点:
1) 利用启发式函数,搜索范围小,提高了搜索效率
2) 如果最优路径存在,那么一定能找到最优路径
缺点:
1) A算法不适用于动态环境
2) A算法不太适合于高维空间,计算量大
3) 目标点不可达时会造成大量性能消耗3.D*算法
D算法是卡耐基梅隆机器人中心的Stentz在1994年提出的主要用于机器人探路,并且美国火星探测器上就是应用的D路径规划算法。A算法适用于在静态路网中寻路,在环境变化后,往往需要replan,由于A不能有效利用上次计算的信息,故计算效率较低。D算法由于储存了空间中每个点到终点的最短路径信息,故在重规划时效率大大提升。A是正向搜索,而D特点是反向搜索,即从目标点开始搜索过程。在初次遍历时候,与Dijkstra算法一致,它将每个节点的信息都保存下来。
D*算法流程:1. 先用Dijkstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h)原OPEN和CLOSE中节点信息保存。 2. 机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijkstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值C(X,Y)+X的原实际值h(X)。X为下一节点(到目标点方向Y->X->G),Y是当前点。K值去h值变化前后的最小。 3. 用A*或其他算法计算,这里假设用A*算法,遍历Y的子节点,放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:用A*或者其他算法计算,这里假设用A*算法,遍历Y的子节点,放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下: while() { 从OPEN表中取k值最小的节点Y; 遍历Y的子节点a,计算a的h值 h(a)=h(Y)+Y到子节点a的权重C(Y,a) { if(a in OPEN) 比较两个a的h值 if( a的h值小于OPEN表a的h值 ) { 更新OPEN表中a的h值;k值取最小的h值 有未受影响的最短路经存在 break; } if(a in CLOSE) 比较两个a的h值 //注意是同一个节点的两个不同路径的估价值 if( a的h值小于CLOSE表的h值 ) { 更新CLOSE表中a的h值; k值取最小的h值;将a节点放入OPEN表 有未受影响的最短路经存在 break; } if(a not in both) 将a插入OPEN表中; //还没有排序 } 放Y到CLOSE表; OPEN表比较k值大小进行排序; }
优点:
1)适用于动态环境的路径规划,搜索效率高
缺点:
1) 不适用于高维空间,计算量大
2) 不太适用于在距离较远的最短路径上发生变化的场景4.人工势场法
人工势场法是由Khatib在1985年提出的一种基于虚拟力场的局部路径规划算法,该算法的基本思想是当机器人在周围环境中运动时,将环境设计成一种抽象的人造引力场,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过二者的合力来控制移动机器人的运动。应用人工势场法规划出来的路径一般是比较平滑并且安全的,但是存在着局部最优的问题。
利用势场函数U来建立人工势场,势场函数是一种可微函数,空间中某点处势场函数值的大小,代表了该点的势场强度。我们采用引力势场函数与斥力势场函数,用U(q)表示二者之和。
引力势场函数:
e表示引力增益,p(q,qgoal)表示当前点到目标点的距离;
斥力势场函数:
n表示斥力增益,p(q,qgoal)表示当前点到障碍物的距离,p0表示障碍物作用距离阈值。
优点:
1) 规划出的路径一般是比较平滑且安全
2) 人工势场法是一种反馈控制策略,具有一定的鲁棒性
缺点:
1) 容易陷入局部最优的问题
2) 距离目标点较远时,引力特别大,斥力相对较小,可能会发生碰撞
3) 当目标点附近有障碍物时,斥力非常大,引力较小,很难到达目标点二、基于采样路径规划算法
1.PRM算法
随机路线图(PRM)算法是一种基于图搜索的算法,可以将连续状态空间转换成离散状态空间,在利用A*等搜索算法在路线图上寻找路径,提高搜索效率。PRM算法是概率完备且不是最优的算法。
PRM算法流程:1. 初始化,设G(V,E)为一个无向图,其中顶点集V代表无碰撞的状态点,连线集E代表无碰撞的路径。初始状态为空。 2. 状态点采样,在状态空间中采样无碰撞的状态点加入到无碰撞的状态点V中。 3. 邻域计算,定义距离p,对于已经存在于无碰撞的状态点V中的点,如果他与无碰撞的点的距离小于p,则将其称作无碰撞状态点的邻域点。 4. 边线连接,将无碰撞的状态点与其邻域相连,生成连线。 5. 碰撞检测,检测连线是否与障碍物发生碰撞,如果无碰撞,则将其加入到连线集E中。 6. 结束条件,当所有采样点均已完成上述步骤后结束,否则重复2~5。 7. 最后使用A*算法在路线图上寻找最优路径。
优点:
1) 适用于高维空间和复杂约束的路径规划问题
2) 搜索效率高,搜索速度快
缺点:
1)概率完备但不是最优2.RRT算法
RRT算法是适用于高维空间,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,较好的处理带有非完整约束的路径规划问题,有效的解决了高维空间和复杂约束的路径规划问题。该算法是概率完备但不是最优的算法。
RRT算法以初始点qinit作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当目标点位于随机扩展树上时,能够找到一天初始点到目标点的路径。首先,需要从状态空间中随机选择一个采样点qrand,然后从随机树中选择一个距离qrand最近的结点qnearest,从qnearest向qrand扩展一个步长的距离,得到一个新的结点qnew,如果qnew与障碍物发生碰撞,则返回空;否则,将qnew加入到随机树中,重复上述步骤直到qnearest和qgoal距离小于一个阈值。
优点:
1) 搜索效率比较高,搜索速度比较快
2) 适用于高维空间,不会产生维度灾难的问题
3) 只需对状态空间采样点进行碰撞检测,避免了对空间的建模
缺点:
1) 规划出的路径质量一般,可能存在棱角、不够光滑
2) RRT算法不太适用于存在狭长空间的环境
3) 规划出的路径可能不是最优路径
4) 不适用于动态环境的路径规划三、智能仿生算法
1.神经网络算法
随着机器人自主性的不断提高,使其具有环境感知以及环境学习的能力,许多学者提出了深度强化学习算法来解决移动机器人处于动态复杂环境中路径规划的问题。深度强化学习算法充分利用了深度学习的感知能力与强化学习的决策能力,通过机器人与环境的交互过程不断试错,通过环境评价性的反馈,实现系统更加智能的决策控制,帮助移动机器人在某些复杂未知的环境中实现一定程度的自主化与智能化。
路径规划就是一个标准的MDP问题,强化学习可以通过值迭代等方法建立一个表格,用以存储状态s到动作a的映射。但是在复杂环境中会产生维度灾难的问题,因此神经网络可以解决维度灾难的问题。以DQN算法为例,来讲解神经网络算法在路径规划中的应用。DQN算法是Q-Learning算法与卷积神经网络(CNN)二者进行结合。DQN算法是由两个网络结构、初始参数相同的结构组成,一个是估计网络,用来输出估计值函数;另一个是目标网络,用来输出目标值函数。通过强化学习使机器人与环境进行交互得到样本(s,a,r,s’),将所有的样本集放入到经验回放池中。神经网络进行训练时,随机的从经验回放池中抽取batchsz数量的样本,将样本输入进神经网络,利用神经网络的非线性拟合能力,拟合出非线性函数来表达我们的Q值,利用e-greedy策略来进行选择智能体的动作。智能体执行完相应的动作之后,环境会反馈一个状态和奖励值,最后经过神经网络模型的训练和优化得到网络的训练参数,得到相对准确的动作输出。
其中w表示估计网络的参数, w-表示目标网络的参数。优点:
1) 适合于动态复杂环境
2) 适用于高维空间,避免维度灾难的问题
缺点:
1) 对硬件的要求比较高
2) 参数调节比较困难2.蚁群算法
蚁群算法(Ant Colony Optimization,ACO)是Dorigo在1992年提出的一种用来寻找优化路径的概率型算法,是由一群无智能或有轻微智能的个体通过相互写作而表现出智能行为,为求解复杂问题提供了一个新的可能性。该算法的主要思想是蚂蚁在寻找食物过程中发现路径的行为。该算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。
蚁群算法的基本原理是利用蚂蚁在觅食过程中会释放信息素。1. 初始时刻,路径没有任何信息素,蚂蚁会以一定的随机性选择任意方向 2. 更新信息素矩阵,当有信息素时,蚂蚁会优先选择信息素浓度高的路径 3. 那么在相同时间内,信息素的浓度与路径长度成反比,越短的路径会有更多的信息素,那么后续的蚂蚁会选择信息素浓度高的路径,最优路径上的信息素浓度会越来越高 4. 随着时间的推移,信息素会自行挥发 5. 最终,能选择出一条最优路径即信息素浓度高的路径
影响蚁群算法的因素:
1) 信息素如何撒播
2) 信息素如何挥发
3) 以何种方式让蚂蚁选择运动方向,减少盲目性和不必要性
4) 给予蚂蚁和环境一定的记忆能力能够帮助减少搜索空间
个体分布越均匀,种群多样性就越好,得到全局最优解的概率就越大,但是寻优时间就越长;个体分布越集中,种群多样性就越差,不利于发挥算法的探索能力。正反馈加快了蚁群算法的收敛速度,却使算法较早地集中于部分候选解,因此正反馈降低了种群的多样性,也不利于提高算法的全局寻优能力。
优点:
1) 蚁群算法的鲁棒性强
2) 采用正反馈机制,能够逼近最优解
3) 易与其他算法进行结合
缺点:
1) 盲目的随机搜索,搜索时间较长,搜索速度慢
2) 蚁群算法容易陷入局部最优
3) 蚁群算法参数的选择依赖于经验或试错3.遗传算法
遗传算法(Genetic Algorithm,GA)是由John Holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的,来模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
遗传算法的流程:1.评估每条染色体所对应个体的适应度 While(未找到满意的解): 2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方 3.抽取父母双方的染色体,进行交叉,产生子代 4.对子代的染色体进行变异
优点:
1) 遗传算法具有广泛的应用领域
2) 遗传算法具有群体搜索的特性
3) 遗传算法基于概率规则,搜索更为灵活
4) 遗传算法直接以目标函数作为搜索信息,不涉及目标函数值求微分的过程
缺点:
1) 遗传算法效率比较低
2) 遗传算法容易过早收敛
3) 遗传算法在编码时容易出现不规范不准确的问题
更多内容请关注微信公众号:深度学习与路径规划 -
优化算法综述
2021-06-30 21:21:03依据 分类 具体算法 分类名 全局优化 遗传算法(GA)、帝国竞争算法(ICA)、 粒子群优化(PSO) 局部优化 模拟退火(SA)、贪婪算法(Greedy)、 邻域搜索(NS) 是否精确算法 精确算法 ... -
机器人避障航路规划蚁群算法MATLAB仿真代码合集
2017-09-08 20:46:47机器人避障航路规划蚁群算法MATLAB仿真代码合集,里面有17个关于机器人自动避障的算法,和无人机航路规划代码,还有蚁群遗传因子算法的具体MATLAB仿真代码,A*算法,RTT算法等很适合做数学建模比赛使用。 -
算法设计技巧与分析
2016-04-26 21:49:18《算法设计技巧与分析》是国际著名算法专家李德财教授主编的系列丛书Lecture Notes Series on Computing中的一本。《算法设计技巧与分析》涵盖了绝大多数算法设计中的一般技术,在表达每一种技术时,阐述它的应用... -
DCT水印算法实现MATLAB
2015-10-26 20:28:14基于DCT的水印算法实现,MATLAB版。附带实验图片,可以直接运行。 -
DES加密算法—实现(C语言)
2016-09-22 09:55:48用vs2012写的,可以直接运行想要代码的话,都在一个cpp文件中 -
智能优化算法:灰狼优化算法-附代码
2020-07-31 16:31:41智能算法:灰狼优化算法-附代码 摘要:受 灰 狼 群 体 捕 食 行 为 的 启 发,Mirjalili等[1]于 2014年提出了一种新型群体智能优化算法:灰狼优化算法。GWO通过模拟灰狼群体捕食行为,基于狼群群体协作的机制来达到... -
协同过滤推荐算法java实现
2014-05-14 20:55:30本资源是推荐系统中最基本且最精但的协同过滤推荐算法实现,包括数据集,以及算法的评价指标MAE的计算,数据集采用MovieLens中两个数据集进行测试,需要别的数据集可以根据自己需要添加,只需修改Base.java文件中的... -
种子填充算法,扫描线填充算法,带报告
2012-01-15 13:07:49用种子填充算法和扫描线填充算法等任意两种算法实现指定多边形的区域填充。 实验步骤 1. 复习有关算法,明确实验目的和要求; 2. 依据算法思想,绘制程序流程图(指定填充多边形); 3. 设计程序界面,要求操作方便... -
java数据结构和算法(第二版)
2012-11-29 21:12:37数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类... -
java算法大全
2015-01-21 10:10:43开发健壮的软件需要高效的算法,然而程序员们往往直至问题发生之时,才会去求助于算法。本书讲解了许多现有的算法,可用于解决各种问题。通过阅读它,你可以学会如何选择和实现正确的算法,来达成自己的目标。另外,... -
算法如何学习?别想太多,两个字
2022-02-24 07:20:59文章目录 前言 一、语言基础 1、「 光天化日学C语言 」 二、刷题必读 1、「 LeetCode零基础指南 」 2、「 九日集训每日打卡 」 三、语言入门 1、「 C语言入门100例 」 四、算法入门 1、「 算法零基础100讲 」 五、... -
《算法设计与分析》期末不挂科
2021-06-16 19:50:43考前知识点整理算法分析基础算法的定义算法正确性算法的性质程序的定义程序与算法的区别算法设计和分析的步骤复杂度分析算法的时间复杂性算法渐近复杂性渐近分析的记号渐近上界记号渐近下界记号非紧上界记号非紧下界... -
智能优化算法:鲸鱼优化算法-附代码
2020-07-24 13:29:56智能算法:鲸鱼优化算法-附代码 文章目录智能算法:鲸鱼优化算法-附代码1.算法原理1.1包围猎物1.2 狩猎行为1.3 搜索猎物1.4 算法流程2. 算法结果:参考文献: 摘要:鲸鱼优化算法 (whale optimization algorithm,WOA... -
算法设计与分析基础( Anany Levitin第3版)课后答案
2016-07-18 14:51:40目前互联网上的中文答案不是最新版的,题目不全,包括百度文库中的,这个虽然是英文的,但是比较齐全。 -
算法设计与分析——排序算法:比较排序算法的下界
2021-09-04 23:28:21我们在《排序算法》系列的开头介绍了几种能在O(nlgn)O(n\lg n)O(nlgn)时间内排序nnn个数的算法。归并排序和堆排序达到了最坏情况下的上界;快速排序在平均情况下达到该上界。而且,对于这些算法中的每个,我们都能... -
[算法学习]模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记---附...
2020-06-30 16:53:401. 退火算法 优点是 局部搜索能力强,运行时间较短; 缺点 是全局搜索能力差,容易受参数的影响. 2. 遗传算法 遗传算法基本原理和方法 选择算子的c语言实现 遗传算法-课本 2.1 本质 是适应算法,应用最多的是系统最... -
最优化算法之粒子群算法(PSO)
2018-08-03 10:26:45一、粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的... -
智能优化算法:蝴蝶优化算法-附代码
2020-08-07 09:58:08智能优化算法:蝴蝶优化算法-附代码 文章目录智能优化算法:蝴蝶优化算法-附代码1.算法原理2.算法流程:3.算法结果4.参考文献:5.MATLAB代码 摘要:蝴蝶优化算法 (Butterfly optimization algorithm,BOA)是由 ... -
遗传算法和BP人工神经网络算法C++实现代码
2014-09-22 15:18:01遗传算法和BP人工神经网络算法C++实现代码是通过c++来 完成两个算法,里面有详细的注释说明,希望对你有用 -
智能算法|以动物命名的算法
2020-02-10 20:18:11黄梅时节家家雨,青草池塘处处蛙。 有约不来过夜半,闲敲棋子落灯花。 鱼群算法?鸟群算法?蝙蝠算法?蚁群算法?病毒算法?...这些是什么沙雕算法?...启发式算法:一个基于直观或经验构造的算法,在可接受的花费... -
机器学习算法系列(十八)-随机森林算法(Random Forest Algorithm)
2022-02-23 09:32:48机器学习算法系列(十八)-随机森林算法(Random Forest Algorithm) -
群蚁算法、遗传算法、模拟退火算法,禁忌搜索算法等通俗详解
2019-09-28 11:15:03这些优化算法都是为针对一个目标值的最大或最小的寻找,前三种算法都属于概率性原理的算法(区别于工程优化里面的梯度下降,牛顿算法等连续直接的搜索算法,可以参考我这篇文章,求多元函数极值的情况分类与对应的...