最佳路径搜索算法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