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

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

 

posted on   耀礼士多德  阅读(831)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示