summaryrefslogtreecommitdiffstats
path: root/_archive/neo4j-a-star-search.md
diff options
context:
space:
mode:
authorSadeep Madurange <sadeep@asciimx.com>2025-11-02 14:31:47 +0800
committerSadeep Madurange <sadeep@asciimx.com>2025-11-02 14:31:47 +0800
commiteb6497e805627137e15bf30d3ec46fb510103f56 (patch)
tree4cb4850480722113b1e79a92283bb0a64c79699e /_archive/neo4j-a-star-search.md
parent5c9f61600f3a81de6d1750b07dd609e19af4212f (diff)
downloadwww-eb6497e805627137e15bf30d3ec46fb510103f56.tar.gz
neo4J post.
Diffstat (limited to '_archive/neo4j-a-star-search.md')
-rw-r--r--_archive/neo4j-a-star-search.md48
1 files changed, 25 insertions, 23 deletions
diff --git a/_archive/neo4j-a-star-search.md b/_archive/neo4j-a-star-search.md
index ac2f35d..aae34b9 100644
--- a/_archive/neo4j-a-star-search.md
+++ b/_archive/neo4j-a-star-search.md
@@ -9,10 +9,26 @@ Back in 2018, we used the <a href="https://neo4j.com/" class="external"
target="_blank" rel="noopener noreferrer">Neo4J</a> graph database
to track the movement of marine vessels. We were interested in the shortest
path a ship could take through a network of about 13,000 route points.
-Performance issues with Neo4J’s then-available shortest-path algorithms limited
-our search to about 4,000 route points.
+Performance issues with Neo4J’s shortest-path algorithms limited our search to
+about 4,000 route points.
-The fix led to my first contribution to an open-source project:
+A graph is a finite set of vertices, and a subset of vertex pairs known as
+edges. Edges can have weights.
+
+In the case of vessel tracking, the route points can be modeled as a graph
+with the distances between them as weights. For different reasons, people are
+interested in minimizing (or maximizing) the weight of a path through a set of
+vertices. For instance, we may want to find the shortest path between two
+ports.
+
+Dijkstra's algorithm is one such algorithm that finds the shortest path between
+two vertices. The one drawback of this algorithm is that it computes all the
+shortest paths from the source to all other vertices before terminating at the
+destination vertex.
+
+The following enhancement, also known as the A* search, employs spherical
+distance between route points (which are on the earth's surface) as a heuristic
+to steer the search in the direction of the destination far more quickly:
```
package org.neo4j.graphalgo.impl;
@@ -291,26 +307,12 @@ public class ShortestPathAStar extends Algorithm<ShortestPathAStar> {
}
}
```
+The heuristic function is domain-specific. If chosen wisely, it can
+significantly speed up the search. In our case, we achieved a 300x speedup,
+enabling us to expand our search from 4,000 to 13,000 route points.
-If you are new to them, a graph is a finite set of vertices (such as ports
-ships are known to travel through), and a subset of vertex pairs (such as
-origin and destination ports) known as edges.
-
-Edges can have weights. In the case of ships and ports, the weights could be
-the distances between ports. For various reasons, people are interested in
-minimizing or maximizing the weight of a path through a set of vertices. For
-instance, we may want to find the shortest path between two ports.
-
-There's nothing spectacular about the code. It is, for the most part, a patch
-over Dijkstra's algorithm that employs spherical distance between vertices as a
-heuristic to steer the search in the right direction. Dijkstra's algorithm, on
-the other hand, explores all possible paths from the source, which is what
-makes it slower.
-
-The heuristic function is domain-specific. I planned to make it configurable,
-but didn't get around to it. With the help of my A* algorithm, we scaled our
-search to include all the route points of interest. <a
+The Neo4J graph algorithms open-source project <a
href="https://github.com/neo4j-contrib/neo4j-graph-algorithms/releases/tag/3.4.0.0"
-class="external" target="_blank" rel="noopener noreferrer">Here's</a> a link to
-the now-archived official release.
+class="external" target="_blank" rel="noopener noreferrer">v3.4</a> shipped
+with my implementation of the A* search algorithm.