zoukankan      html  css  js  c++  java
  • 搜索进阶

      搜索进阶的话,我觉得A*,IDA*,双向BFS应该都是吧。

      双向BFS就是同时从起点和终点开始BFS,直到遇到对方标记的结点就停止(这样应该不一定是最短路),这样的话只要有解就可以减去很多种可能,从而提高效率。

    不过如果没解的话,两边的搜索没有交叉,也就。。。会更慢。。。

      然后就是A*,这算是人工智能里面的了吧。。。就是F(n)=G(n)+H(n),这里G一般就是节点的深度,也就是走了多少步走到了这里,H的话就是一个估计,估计还有差不多多少步就会走完,然后这两个加起来,作为一个依据,那么下一次要扩张的节点就是F值最小的那一个,因为这一个我们猜的可能是最优的,所以先走这个。当然可能这样的话可能并不能走到头。这样的话每次都找那个F最小的来扩张,找最小F的话可以用优先队列也就是二叉堆来优化。一般就会快不少。

      不过要想得到最优解的话,应该保证H小于等于实际需要的步数,也就是说你要走到某个地方,那么H可以为直线距离,因为不可能比他更小了。

      每次都保证H小于等于实际的话,最终一定可以拓展那个正确道路上的节点(不一定多块),因为别的点拓展到最后一定F比最优解大了,那么选最小的那个就是正确路上的那个了。

      而且对于H的设计,这应该就是A*算法的核心了,有的可以是直线距离,有的可以是曼哈顿距离(也就是两个点x坐标相减与y坐标相减的和),也可以是不符合条件的个数(不在位个数),一个好的设计可以让程序更快。而且H的设计的话应该保证H小于等于实际值,而且一般来说,不同状态的H差别越大越好,小的很小,大的够大。

      至于IDA*的话,又叫做迭代加上A*,应该是一种DFS吧,不过加了一个限制条件,设置一个期望的深度,当DFS到某一层的时候如果G+H大于这个深度了,就直接返回,因为我们要求的是深度小于等于设置值的解。IDA*的代码要短不少,写的也轻松,速度也不错。。。

      然后就是搜索的问题了,这里要说的就是Eight了,八数码问题,作为学习各种搜索算法的非常好的一个题目。这里我用的是杭电1043,而不是POJ 1077,虽然他们题目几乎一模一样,但是杭电上是多组数据,POJ上是一组,这样的话多组数据可以方便看出各种算法的效率。

      先是一篇经典的文章,八数码的八境界

      这篇文章系统的讲了八种方法,写的很好的。

      然后就是我根据那位大神自己写的,(代码好烂的。)

      链接请单击

  • 相关阅读:
    Devexpress GridView添加行号
    Devexpress GridControl 常用设置
    导入Excel部分数据导入不了的原因及处理
    GridView里面的HyperLink和ButtonField操作总结
    sybase数据表的导出与导入
    uniapp的unistarter的白名单访问模式需要绝对路径
    vue 用vif隐藏显示切换大量dom元素,导致一个页面上一个组件多次调用的created不能全部执行的修改方法
    2013腾讯编程马拉松初赛:小Q系列故事——屌丝的逆袭
    Tensorflow Federated(TFF)框架整理(上)
    Stateful TFF
  • 原文地址:https://www.cnblogs.com/whywhy/p/4230772.html
Copyright © 2011-2022 走看看