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

一. 介绍:
  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);

neo4j路径发现算法(Path finding algorithms)-5.The A* algorithm_第1张图片

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的最短路径
neo4j路径发现算法(Path finding algorithms)-5.The A* algorithm_第2张图片

你可能感兴趣的:(neo4j-图数据库)