最佳路径搜索算法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
这就好比,拿一张只有平面二维坐标的地图,去估计山脚到山顶的最短路径,而不考虑高差一样
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现