diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2025-11-02 14:31:47 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2025-11-02 14:31:47 +0800 |
| commit | eb6497e805627137e15bf30d3ec46fb510103f56 (patch) | |
| tree | 4cb4850480722113b1e79a92283bb0a64c79699e /_site/archive/neo4j-a-star-search/index.html | |
| parent | 5c9f61600f3a81de6d1750b07dd609e19af4212f (diff) | |
| download | www-eb6497e805627137e15bf30d3ec46fb510103f56.tar.gz | |
neo4J post.
Diffstat (limited to '_site/archive/neo4j-a-star-search/index.html')
| -rw-r--r-- | _site/archive/neo4j-a-star-search/index.html | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/_site/archive/neo4j-a-star-search/index.html b/_site/archive/neo4j-a-star-search/index.html index f37d00b..92d350d 100644 --- a/_site/archive/neo4j-a-star-search/index.html +++ b/_site/archive/neo4j-a-star-search/index.html @@ -46,10 +46,26 @@ <div class="twocol justify"><p>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.</p> +Performance issues with Neo4J’s shortest-path algorithms limited our search to +about 4,000 route points.</p> -<p>The fix led to my first contribution to an open-source project:</p> +<p>A graph is a finite set of vertices, and a subset of vertex pairs known as +edges. Edges can have weights.</p> + +<p>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.</p> + +<p>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.</p> + +<p>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:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>package org.neo4j.graphalgo.impl; @@ -327,26 +343,12 @@ public class ShortestPathAStar extends Algorithm<ShortestPathAStar> { } } </code></pre></div></div> +<p>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.</p> -<p>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.</p> - -<p>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.</p> - -<p>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.</p> - -<p>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 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.</p> +<p>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">v3.4</a> shipped +with my implementation of the A* search algorithm.</p> </div> <p class="post-author right">by Wickramage Don Sadeep Madurange</p> |
