最佳路径搜索算法2

问题:假如有人提出,最佳的路径是SADG,那么,将如何验证?

答:遍历其他路径,看看是否存在,比SADG更短的路径。

问题:其他路径是否需要"扩展"到最后?

答:不需要。

 

在检验其他路径的时候,如果累积路程大于SADG,即11,就不需要再扩展下去了。


 

根据上一节:https://www.cnblogs.com/pylblog/p/10287740.html

广度优先查找路径的基础上,添加:在扩展到目的点G的时候,继续扩展其他路径,除非这条路径长度大于上一条到达G的路径。

伪代码:

暂时最佳路径 P

while(T.Count>0)

{

    if ( 能T[0]的下一个节点 的数目n > 0  ) {

           foreach n 个节点  {

            if ( 节点为G) { 

               temp = T[0] + G的路径;

               if( temp的路径长度 < P的路径长度 ){

                P = temp;

               }

            }

            else {

              if(节点没有被扩展过 && T[0]+节点的扩展路径长度 < P的路径长度){

                “  T[0]+节点的扩展路径 ” 插入到T的后面

              }

            }

          } 

    } 

    移除T的第0个元素

}


 

上面的算法,面临一个问题,就是效率不高。

假设:起点和终点,如下

 

假如有很多路径,是向“左”,如果采用上述算法,会导致:

不能较快速查找一条可行线路,从而导致,有些可以中途放弃扩展的线路继续扩展。

因此,可以在上面的基础上,使用启发信息。

因此,改进的部分,是更快速的找到一条可行线路。

距离下限法:

主要区别:距离下限 =  算出到达节点的长度 + 最后一个节点到目标点的距离估计,并且将最低的放到列表的最前一个位置

1. S

2. (S,A) (S,B)

3. (S,A,D) (S,B)

4. (S,A,D,G)(S,B) 接下去查看有没更短路径

5. (S,B,C)

 

暂时最佳路径 P

while(T.Count>0)

{

    if ( 能T[0]的下一个节点 的数目n > 0  ) {

           foreach n 个节点  {

            if ( 节点为G) { 

               temp = T[0] + G的路径;

               if( temp的路径长度 < P的路径长度 ){

                P = temp;

               }

            }

            else {

              if(节点没有被扩展过 && T[0]+节点的扩展路径长度 < P的路径长度){

                “  T[0]+节点的扩展路径 ” 插入到T的后面

              }

            }

          } 

    } 

    移除T的第0个元素;

    将T中,距离下限最短的路径,放到0序号处;

}

 


 

 

上面的算法,有一个问题,就是:

如果实际距离,和估算距离,不是使用同一个数学模型,或者维度,那么会导致错误。

例如:

红色字体,代表点到G的距离估计值,那么,按上述办法:

1. (S)

2. (S,B) (S,A)   1+0=0,1+100=1

3. (S,B,C)(S,A) 1+10+0=11,1+100=1

4. (S,B,C,G)

但是,实际上,SBCG的路程,是1+10+100=111,而SACG是1+1+100=102

这就好比,拿一张只有平面二维坐标的地图,去估计山脚到山顶的最短路径,而不考虑高差一样

 

转载于:https://www.cnblogs.com/pylblog/p/10302844.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值