不能滥用穷举暴力:关于几种不同图搜索算法的详细分析与思考

简介:

昨天,在女人火把过桥问题中,对图的搜索并不完美,是典型的穷举算法思想,希望能生成一棵以起点为根的“全分支树”。

结果这棵树只能在理论上是存在,因为我的机器在宇宙毁灭之前生成不了他!

不得已,我只好限制了树的深度,路线是找到了,但是并没有达到我想要的目标:找到所有路线(不包括环路的)。

那么,究竟在图中该怎么搜索,才能找到全部路线呢?下面是我关于几种不同图搜索算法的详细分析与思考。

假设起点是 A ,终点是 F



1、按照邻接关系直接搜索

这典型的穷举搜索思想,从 A 开始,依次按照邻接关系,遍历整个图
但是,一旦 邻接关系中存在环路,程序即陷入死循环,比如:
A > B > C > A
不幸,火把问题就存在环路
否决 !

2、深度优先搜索 DFS
仍然是穷举搜索思想,仍然是从 A 开始,依次按照邻接关系,遍历整个图
和方法 1 不同的是,访问过的节点做上标记,下次就不再访问了。
优点:
1)解决了环路的问题
2)只要存在路线,肯定能找到
缺点:
1)不能保证路线是最短距离
2)只能找到一条路线
否决!

3、广度优先搜索 BFS
和 DFS 基本上一样,只不过 无路可走需要回退的时候,DFS 是后进先出,BFS 是先进先出而已。
优点:
1)解决了环路的问题
2)只要存在路线,肯定能找到
3)找到的路线是最短距离(注意:这里说的距离,并不是权的和,仅仅指 A 到 F 的步骤)
缺点:
1)不能保证路线具有最小权
2)只能找到一条路线
否决

4、全分支树法
将 A 作为根,从根开始,依次将邻接点添加为自己的孩子(注意:邻接在父辈中出现过则放弃),直到生成完整的树。
依然是穷举和暴力的思想,这棵树必然包括所有的路线。
优点:
1)思路简单
2)能找到所有路线
3)能找到所有最短路线
缺点:
1)只能应用在节点数目较少、邻接不复杂的情况下
在火把问题中,节点数目为30,邻接比较复杂,个人测试了一下,到第 6 层就开是出现明显的延迟,不要说到达 30 了
否决!

5、部分分支树法
依然是穷举和暴力的思想,在方法 4 的基础上添加一个层数条件限制,超过层数则停止该分支的生长
优点:
1)只要层数设定够大,就能找到最短路线
缺点:
1)不能保证找到所有路线
2)不能保障找到所有最短路线
3)如果 A F 距离太远,就要设定较大的层数,有可能无法生成树

我在解决过桥问题时,就是用到了这种方法,设定了层数为5 ,并且找到了 2 条最短路线和 37 条其他路线(不包括环路)
然而这只是我运气好,因为最短路线就在第五层上,如果需要到达第三十层,这种方法就失效了。
另外,37条其他路线,仍然不是全部路线,还是没有达到我的目标。
否决!


6、不断增长的、明确终点的、最小生成树法
什么是生成树:如果图中任意删除一条边,就会出现一个孤立节点;添加任意一条边,则会出现环路,这个图就是一个生成树。
所谓最小生成树,就是指生成树所有的边权值总和最小。

最小生成树保证了我们可以从图中一点到达另外任意一点、没有环路、且所有边的权值总和最小

而我们的过桥问题,与最小生成树还有点不同, 不但给出了起点,而且有明确的终点,一下减少了很多运算
首先,一些节点组合根本不存在生成树
其次,一些节点组合虽然存在生成树,但构造过程中,终点要被提前加入(为了保证最小),则停止继续构造,一下节省了很多步骤
第三、一些节点组合虽然存在生成树,但构造过程中,出现分叉(为了保证最小),则停止继续构造,一下节省了很多步骤
最后,如果你不想找到所有路线,在构造生成树的过程中,如果超过了当前最小权值,则停止继续构造,又节省了很多步骤

下面以 ABCDEF 来说明算法步骤,其中 A 是起点, F 是终点
1 构造 AF 之间的最小生成树,存在,则记录
2 依次构造 ABF ACF ADF AEF,存在,则记录;如果构造过程中,F 节点被提前加入,或者出现分叉,则停止继续构造
3 依次构造 ABCF ABDF ABEF ACDF ACEF ADEF ,存在,则记录;如果构造过程中,F 节点被提前加入,或者出现分叉,则停止继续构造
4 依次构造 ABCDF ABCEF ADCEF ,存在,则记录;如果构造过程中,F 节点被提前加入,或者出现分叉,则停止继续构造
5 依次构造 ABCDEF ,存在,则记录;如果构造过程中,F 节点被提前加入,或者出现分叉,则停止继续构造
算法完成
注意:说 构造 ABCDF  的最小生成树,最后得出的 顺序不一定是 ABCDF  ,因为要保证最小,这就是为什么 F 有可能被提前加入,或者出现分叉。

对应到过桥问题,一共 30 个节点,去除起始点,就是 28 个节点,一共要构造生成树的数目是(C 表示组合):
C(28,1)+C(28,2)+C(28,3)+C(28,4)+C(28,5)+...........+C(28,26)+C(28,27)+C(28,28)
这个 数量级也就在亿次左右,比全分支树宇宙级的计算量,显得微不足道了。

针对这道题的特殊情况,我们 还可以进一步减少组合的数量
1、有 4 个节点只同出发点邻接,再不同其他任何点相连,这 4 个点可以排除
2、还有 4 个点只同目标点邻接,再不同其他任何点相连,这 4 个点也可以排除
这样就成了 20 个节点,数量一下降到了一 百万左右
3、起始点有 10 个邻居,去掉 4 个孤立的,另外 6 个邻居,每棵生成树至少包括一个,否则就无法出发
这个规则对目标点也适用,这样,组合数量又少了不少。
4、最小生成树变大的时候,每次加入的节点数目必须是偶数,而且火把在左、在右的节点数目必须相同
这个条件一限制,数量即估计就到十万了
5、如果你想找的是最短时间,那每次过河肯定是两个人,返回是肯定一个人(只有这样才能保证时间最短),
这样,就可以减少一些节点的邻接点,又减少了很多计算量
总之,最后用普通台式机就可找到全部可能的路线了,从而达到了我的目的。

结论:穷举法、暴力法只能用在场景简单的情况下,复杂情况还是要具体分析,寻找最优解法。

这两天不想再写任何程序了,从方法1 一直写到方法5 ,累着了,呵呵。
哪位兄弟要是有兴趣、有精力,可以把方法6 实现以下,相关数据在 上一篇帖子中都有,再或者等过几天还是我来写。
总之,直到知道总共有多少条路线,以及每个路线的具体走法,这个问题才算最终有了完美的解决。


本文转自左洸博客园博客,原文链接:http://www.cnblogs.com/myqiao/archive/2009/07/26/1531451.html,如需转载请自行联系原作者


目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 监控
AI算法分析,智慧城管AI智能识别系统源码
AI视频分析技术应用于智慧城管系统,通过监控摄像头实时识别违法行为,如违规摆摊、垃圾、违章停车等,实现非现场执法和预警。算法平台检测街面秩序(出店、游商、机动车、占道)和市容环境(垃圾、晾晒、垃圾桶、路面不洁、漂浮物、乱堆物料),助力及时处理问题,提升城市管理效率。
AI算法分析,智慧城管AI智能识别系统源码
|
1月前
|
算法
经典控制算法——PID算法原理分析及优化
这篇文章介绍了PID控制算法,这是一种广泛应用的控制策略,具有简单、鲁棒性强的特点。PID通过比例、积分和微分三个部分调整控制量,以减少系统误差。文章提到了在大学智能汽车竞赛中的应用,并详细解释了PID的基本原理和数学表达式。接着,讨论了数字PID的实现,包括位置式、增量式和步进式,以及它们各自的优缺点。最后,文章介绍了PID的优化方法,如积分饱和处理和微分项优化,以及串级PID在电机控制中的应用。整个内容旨在帮助读者理解PID控制的原理和实际运用。
88 1
|
1月前
|
算法 机器学习/深度学习 索引
【算法设计与分析】——搜索算法
【算法设计与分析】——搜索算法
40 1
|
1天前
|
移动开发 算法 数据可视化
数据分享|Spss Modeler关联规则Apriori模型、Carma算法分析超市顾客购买商品数据挖掘实例
数据分享|Spss Modeler关联规则Apriori模型、Carma算法分析超市顾客购买商品数据挖掘实例
|
2天前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
33 13
|
8天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
13 0
|
9天前
|
算法 定位技术 Windows
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
15 4
|
1月前
|
算法
TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析
TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析
19 1
|
1月前
|
算法
PID算法原理分析及优化
这篇文章介绍了PID控制方法,一种广泛应用于机电、冶金等行业的经典控制算法。PID通过比例、积分、微分三个部分调整控制量,以适应系统偏差。文章讨论了比例调节对系统响应的直接影响,积分调节如何消除稳态误差,以及微分调节如何减少超调。还提到了数字PID的实现,包括位置式、增量式和步进式,并探讨了积分饱和和微分项的优化策略。最后,文章简述了串级PID在电机控制中的应用,并强调了PID控制的灵活性和实用性。
39 1
|
1月前
|
存储 人工智能 算法
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)