neo4j路径发现算法(Path finding algorithms)-5.The A* algorithm

本文深入解析A*算法,一种高效求解最短路径的直接搜索方法,适用于静态路网及多种问题场景。阐述算法核心原理,包括估价函数f(n)=g(n)+h(n),并详细描述其实施步骤。通过neo4j图数据库实例演示如何应用A*算法寻找地铁站间的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 介绍:
  A star 算法 是一种静态路网中求解最短路径最有效的直接搜索方法,也是许多其他问题的常用启发式算法。
  它使用估价函数f(n)=g(n)+h(n)来进行选择路径,其中f(n)是节点n的估价的函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。

算法步骤(看的csdn中的讲解,然后自己理解写的,若有错误还请大佬指正):

1)设定一个open list和close list 用来存放节点
2) 把起点加入open list,同时将起始节点可达的节点也放入open list
3)遍历open list ,查找f值最小的节点s,把它作为当前要处理的节点,把这个节点s移动close list.
4)对于s的相邻节点,若不可通行或已经在close list 中,则忽略,若可以通行,并且不在open list,则把它添加进去,并把s作为当前节点的父节点,并重新计算它的g和f值,若在open list中,用g值为参考检查新的路径是否可以更好。更低的g值意味着更好的路径。
5)重复操作,直至把终点加入到open list,此时已经找到路径,或者查找终点失败,并且open list是空的,此时没有路径。
6)保存路径,从终点开始,每个节点沿着父节点移动直至起点,便是找到的路径。

二. neo4j算法:

CALL algo.shortestPath.astar.stream((startNode:Node, endNode:Node,
weightProperty:String, propertyKeyLat:String, propertyKeyLon:String,
{nodeQuery:'labelName', relationshipQuery:'relationshipName', direction:'BOTH',
defaultValue:1.0})
YIELD nodeId, cost

三.实例:

MERGE (a:Station{name:"King's Cross St. Pancras"})
SET a.latitude = 51.5308,a.longitude = -0.1238
MERGE (b:Station{name:"Euston"})
SET b.latitude = 51.5282, b.longitude = -0.1337
MERGE (c:Station{name:"Camden Town"})
SET c.latitude = 51.5392, c.longitude = -0.1426
MERGE (d:Station{name:"Mornington Crescent"})
SET d.latitude = 51.5342, d.longitude = -0.1387
MERGE (e:Station{name:"Kentish Town"})
SET e.latitude = 51.5507, e.longitude = -0.1402
MERGE (a)-[:CONNECTION{time:2}]->(b)
MERGE (b)-[:CONNECTION{time:3}]->(c)
MERGE (b)-[:CONNECTION{time:2}]->(d)
MERGE (d)-[:CONNECTION{time:2}]->(c)
MERGE (c)-[:CONNECTION{time:2}]->(e);

在这里插入图片描述

MATCH (start:Station{name:"King's Cross St. Pancras"}),(end:Station{name:"Kentish Town"})
CALL algo.shortestPath.astar.stream(start, end, 'time', 'latitude', 'longitude',
{defaultValue:1.0})
YIELD nodeId, cost
RETURN algo.getNodeById(nodeId).name as station,cost

得到从 King’s Cross St. Pancras ----Kentish Town的最短路径
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值