Fact-checked by Grok 2 weeks ago

Jump point search

Jump Point Search (JPS) is a pathfinding algorithm that optimizes the A* search method for uniform-cost grid maps by selectively expanding only specific nodes known as "jump points," thereby pruning symmetric paths on the fly to achieve optimal solutions without preprocessing or additional memory overhead. Developed by Daniel Harabor and Alban Grastien, it was introduced in as an online symmetry-breaking technique specifically designed for grids supporting cardinal and diagonal movements with costs of 1 and √2, respectively. The core mechanism of JPS involves a macro-step operator that allows the search to "jump" from a in a fixed direction—either straight or diagonal—until it reaches a point or encounters an , skipping intermediate nodes that would inevitably lie on any optimal path. points are identified through local rules based on forced neighbors ( that constrain movement) or proximity to the , ensuring that no optimal path is overlooked. This approach guarantees optimality, as proven in the original formulation, while reducing the search space dramatically compared to standard A*. In empirical evaluations on benchmark grid maps such as those from the Moving AI Lab (including Adaptive Depth, Baldur’s Gate, , and Rooms datasets), JPS demonstrated speedups over A* ranging from 20.37 times on Adaptive Depth to 215.36 times on , with corresponding reductions in node expansions. It also outperformed other symmetry-exploiting methods like Swamps (up to 20.37x vs. 1.89x speedup) and was competitive with hierarchical techniques such as HPA* (e.g., 35.95x vs. 9.63x on ). Subsequent improvements, including online and offline optimizations, have further enhanced its efficiency for applications in , video games, and planning.

Overview

Definition and purpose

Jump Point Search (JPS) is an optimized designed for uniform-cost environments, serving as a symmetry-reducing enhancement to the by expanding only specific nodes known as "jump points" rather than all neighboring cells. This approach identifies and prunes redundant paths that arise due to the symmetric structure of grids, where multiple equivalent routes exist between points, thereby focusing the search on directionally significant nodes that could lead to optimal paths. The primary purpose of JPS is to efficiently compute optimal paths in obstacle-filled rectangular grids, minimizing computational overhead while preserving the optimality and guarantees of A*. By exploiting the inherent symmetries in grid maps—such as straight-line traversals where intermediate nodes offer no unique routing advantages—JPS skips over these redundant expansions, potentially accelerating searches by an in large, open spaces compared to standard A*. It assumes a uniform-cost model where movements (up, down, left, right) cost 1 unit and diagonal movements cost √2 units, operating on undirected grids with cells designated as either traversable or obstacles, and allowing up to eight possible neighbors per . For instance, consider a simple scenario with no obstacles, where the start point is at the bottom-left and the goal is at the top-right, forming a straight diagonal line. In standard A*, the algorithm would expand every intermediate cell along this path. JPS, however, identifies the direction of travel and "jumps" directly to the next jump point—such as the goal itself or a point where a deviation becomes possible—bypassing the in-between nodes and adding only the jump point as a successor. This illustrates how JPS reduces the search space in symmetric, linear traversals without missing the optimal route. Jump point search (JPS) is an optimized variant of the specifically designed for uniform-cost grid maps, retaining A*'s core framework, including the use of open and closed sets to manage explored nodes and an such as the or to guide the search toward the goal. This integration allows JPS to inherit A*'s guarantees of optimality and completeness when the heuristic is consistent, without altering the fundamental f(n) = g(n) + h(n), where g(n) is the path cost from the start to node n and h(n) is the estimated cost from n to the goal. The primary modification in JPS lies in the successor generation phase, where instead of expanding all neighboring nodes (typically up to 8 in a ), the algorithm applies symmetry-breaking pruning rules to identify only "jumpable" directions and advances directly to the next relevant , known as a jump point, thereby skipping intermediate symmetric s that would not lead to optimal paths. This jumping mechanism dramatically reduces the number of expansions compared to standard A*, often achieving speedups of an or more in open terrains by eliminating redundant searches along straight-line or diagonal paths. consistency is preserved in JPS by ensuring that the remains unchanged and that pruned s do not affect the monotonicity required for optimality, allowing the algorithm to find the shortest without relaxation or . At a high level, JPS integrates with A* by replacing the standard with a specialized one that incorporates pruning and jumping, as illustrated in the following outline:
function JPS(start, goal):
    open_set = PriorityQueue()  // prioritized by f(n) = g(n) + h(n)
    closed_set = Set()
    g_scores = {start: 0}
    open_set.insert(start, h(start))
    
    while open_set is not empty:
        current = open_set.extract_min()
        if current == goal:
            return reconstruct_path(current)
        
        closed_set.add(current)
        
        for successor in identify_successors(current, goal):  // JPS-modified: prunes and jumps
            tentative_g = g_scores[current] + distance(current, successor)
            if successor in closed_set or tentative_g >= g_scores[successor]:
                continue
            
            came_from[successor] = current
            g_scores[successor] = tentative_g
            f_score = tentative_g + h(successor)
            open_set.insert_or_update(successor, f_score)

function identify_successors([node](/page/Node), [goal](/page/Goal)):  // Key JPS modification
    successors = []
    for [direction](/page/Direction) in possible_directions([node](/page/Node)):
        if is_jumpable([direction](/page/Direction)):
            jump_point = jump([node](/page/Node), [direction](/page/Direction), [goal](/page/Goal))
            if jump_point is valid:
                successors.append(jump_point)
    return successors
This structure maintains A*'s efficiency while leveraging grid-specific optimizations, ensuring that only where paths can deviate or encounter obstacles are fully expanded.

Background

Grid-based pathfinding

Grid-based pathfinding refers to the process of finding the shortest path between two points in a discrete lattice composed of , where certain are designated as obstacles that cannot be traversed. This approach models the environment as a , with each free (or grid point) serving as a node and possible movements between adjacent as edges. It is commonly applied in domains such as , , and simulations to enable around barriers while minimizing path length or cost. Movement in grid-based pathfinding is governed by specific models that define allowable directions and associated costs. The cardinal (or 4-neighbor) model permits movement only in four orthogonal directions—north, , east, and —resulting in uniform costs for and vertical steps. The 8-directional (or octile) model extends this by including four diagonal directions, allowing for more natural, shorter paths in open spaces, with costs of 1 for orthogonal moves and √2 for diagonal moves. These models assume a regular structure where each cell connects to its immediate neighbors based on the chosen . Grids are typically represented using 2D to store cell states, with free spaces marked as traversable and as impassable to prevent expansion into blocked areas. Adjacency can be implicitly defined through indexing for efficiency, or explicitly via lists that enumerate neighbors according to the movement model, facilitating search operations. This representation simplifies but requires careful handling of conditions and integration. A key challenge in grid-based arises from the potentially high node count in large environments, such as expansive maps with thousands of cells, which can generate spaces during exploration without targeted optimizations. Obstacles further complicate this by fragmenting the space and increasing the , demanding efficient pruning or heuristic guidance to maintain computational feasibility. A* search serves as a standard informed method for addressing these issues in grid environments.

Limitations of standard A* on grids

In uniform-cost grid maps, the standard A* algorithm encounters substantial inefficiencies stemming from the inherent of the grid structure. Numerous paths between the start and goal nodes are equivalent in cost but differ merely in the sequence of moves, prompting A* to generate and evaluate a large number of redundant states. This symmetry arises because uniform edge weights make detours and alternative routings indistinguishable in terms of path length until later in the search, causing the algorithm to explore unnecessary branches that do not contribute to the optimal solution. A key manifestation of this issue occurs during straight-line pathfinding, where A* expands intermediate nodes along the route while checking all possible symmetric continuations, such as diagonal or orthogonal deviations that could be pruned if topology were better exploited. In an empty without obstacles, for instance, A* generates a diamond-shaped expansion front (under distance) or approximately elliptical front (under octile ), evaluating every within the bounding defined by the goal's initial f-value and wasting effort on or circuitous paths that renders suboptimal. This leads to excessive generations, as dominated states—those reachable via multiple equivalent routes—are not inherently identified and discarded. The expansion overhead exacerbates these problems, with A* routinely examining up to 8 neighbors per in 8-connected grids, resulting in a worst-case of O(b^d), where b = 8 is the and d is the solution depth. Even when employing consistent and admissible like the octile distance—which computes \max(|x_2 - x_1|, |y_2 - y_1|) + (\sqrt{2} - 1) \min(|x_2 - x_1|, |y_2 - y_1|) to provide a tight lower bound on costs in grids allowing diagonal traversal with costs of 1 and \sqrt{2}—A* fails to prune symmetric successors, as the does not leverage the grid's regular structure to eliminate equivalent paths . These limitations motivate symmetry-breaking techniques, such as , which address redundant expansions by pruning successors based on grid-specific rules.

Core Algorithm

Successor pruning

Successor pruning in (JPS) is a symmetry-reduction technique applied during node expansion to eliminate redundant successor candidates in grid-based , focusing only on "natural" neighbors that cannot be reached via equally optimal symmetric paths from the node's parent. This pruning leverages the uniform cost structure of grids, where intermediate nodes along straight, obstacle-free paths are unnecessary to expand individually, as optimal paths would not deviate symmetrically. By discarding these dominated successors, JPS significantly reduces the from up to 8 neighbors in standard to as few as 4, enhancing efficiency without sacrificing optimality. Natural neighbors are the direct adjacent cells that remain after applying pruning rules, representing the minimal set required to preserve all possible optimal paths; these are typically the cells in the four cardinal directions (up, down, left, right) relative to the expansion direction, unless symmetry allows further reduction. In contrast, forced neighbors are additional successors that must be considered due to obstacles blocking alternative symmetric paths; these arise when the path through the current node is strictly shorter than any detour around obstacles, ensuring no optimal path is overlooked. For instance, in an open grid, forced neighbors are rare, but near walls or barriers, they can appear in up to four positions, such as when a diagonal move is compelled by an adjacent blockage. Pruning rules differ by movement type. For horizontal or vertical (cardinal) moves, a neighbor is pruned if an alternative path from the parent to that neighbor exists with length less than or equal to the path via the current node, which occurs in straight-line scenarios without obstacles; thus, only the immediate neighbor in the direction away from the parent typically survives as natural. For diagonal moves, pruning is stricter: a neighbor is eliminated if an alternative path of equal length includes an earlier diagonal step, or if a shorter path exists; this often leaves up to three natural diagonal neighbors, but forced ones may be retained if cardinal paths adjacent to the diagonal are obstructed. Algorithmically, during the expansion of a with parent p, JPS first identifies the incoming direction from p and applies to generate only natural and forced successors in the eight possible directions, skipping pruned ones entirely. This step checks for obstacle-induced forces by verifying if adjacent cells block symmetric alternatives, ensuring the search proceeds only to viable candidates before identifying jump points as the endpoints of these pruned paths.

Jump point identification

Jump points in Jump Point Search (JPS) are defined as from which an optimal path can first deviate from the straight-line inherited from its parent , typically due to obstacles, the , or branching opportunities that force a turn. Specifically, a y is a jump point from a x in \vec{d} if y = x + k \vec{d} for some positive integer k that minimizes k, and y satisfies one of the following: it is the ; it has a forced (a not reachable via a natural extension of the incoming ); or, if \vec{d} is diagonal, a successor in one of the cardinal directions from y leads to another jump point. This definition ensures that only these pivotal are considered for expansion, allowing the search to skip intermediate symmetric along straight-line paths. The identification of jump points relies on a recursive scanning function called jump, which traverses the grid in a specified direction until a jump point is encountered or the scan terminates without finding one. The function takes as input the current node x, the direction vector \vec{d} (one of eight possible moves: four cardinal or four diagonal), the start node s, and the goal g. Directions are represented by unit vectors, such as (1,0) for right or (1,1) for northeast. For diagonal directions, the function also considers the two orthogonal cardinal components \vec{d_1} and \vec{d_2} (e.g., right and up for northeast) to check for potential deviations. Pruning ensures that only these identified jump points are added to the open set during search. Step-by-step, the jump function proceeds as follows: from the current node x, it advances to the next node n by stepping in direction \vec{d}; if n is an obstacle or outside the grid boundaries, it returns null to indicate no jump point; if n is the goal, it returns n; if n has any forced neighbor (a neighbor that cannot be reached symmetrically from the parent direction), it returns n as the jump point; for diagonal \vec{d}, it recursively calls jump on n in directions \vec{d_1} and \vec{d_2}, returning n if either yields a non-null result indicating a deviation; otherwise, it recurses on n in the original direction \vec{d}. This process continues linearly until a termination condition is met, effectively "jumping" over non-branching cells. For example, consider a grid with a wall blocking a straight path; starting from node x moving northeast (\vec{d} = (1,1)), the scan proceeds diagonally until reaching a node y adjacent to the wall, where a forced neighbor (e.g., a cell around the wall's corner) exists, making y the jump point just before the obstacle forces a turn. The pseudocode for the jump function is as follows:
Function jump(x, \vec{d}, s, g):
    n ← step(x, \vec{d})  // Advance one step in direction \vec{d}
    if n is [obstacle](/page/Obstacle) or outside [grid](/page/The_Grid) then
        return [null](/page/Null)
    if n = g then
        return n
    if ∃ n' ∈ neighbors(n) such that n' is forced then
        return n
    if \vec{d} is diagonal then
        for i ∈ {1, 2} do
            if jump(n, \vec{d_i}, s, g) ≠ [null](/page/Null) then
                return n
    return jump(n, \vec{d}, s, g)
Here, step computes the adjacent , neighbors checks the eight possible adjacent cells, and a neighbor is "forced" if it lies in a direction not aligned with the incoming \vec{d}.

Overall search procedure

Jump Point Search (JPS) operates as a variant of the A* , where the core search loop remains similar—maintaining an prioritized by the f(n) = g(n) + h(n), where g(n) is the cost from the start to n and h(n) is a estimate to the goal—but the successor generation is replaced by a specialized procedure that identifies and jumps to relevant jump points rather than enumerating all immediate neighbors. This integration allows JPS to prune symmetric paths on-the-fly during the search, expanding only nodes that represent necessary turning points or the goal. The high-level steps begin with initializing the to contain the start , setting its g-score to 0 and to . While the is not empty, the with the lowest f-score is dequeued as the current . If the current is the goal, the search terminates successfully, and the path is reconstructed by through pointers. Otherwise, successors are generated by first the eight possible of the current based on from the to avoid revisiting symmetric paths, then for each unpruned , invoking a function to identify the next point in that , which may span multiple cells. These identified points are then evaluated: if they offer a better or equal path cost and have not been processed with a lower cost, they are added to or updated in the with updated g-scores, f-scores, and parents pointing back to the current . In 8-directional grids, the procedure explicitly handles both cardinal (up, down, left, right) and diagonal movements, with diagonal steps costing \sqrt{2} times the cardinal cost. Pruning ensures that only promising directions are explored, and the jump function checks for forced neighbors or goal convergence separately for diagonal cases by briefly scanning perpendicular cardinal directions to detect potential jump points that would force a deviation. This maintains consistency across movement types without altering the underlying A* priority mechanism. The search terminates upon dequeuing the goal node, yielding an optimal path via reconstruction, or when the open set empties, indicating no path exists. Edge cases include scenarios where the start coincides with the goal, resulting in an immediate trivial path of length zero; where the start or goal is an obstacle, in which case the search either fails immediately or cannot reach the goal, respectively; and grids with no feasible path due to obstacles, exhausting the open set without success. The complete procedure can be expressed through the following key components integrated into A*, as detailed in the original formulation: Algorithm 1: IdentifySuccessors(x, s, g)
Input: Current node x, start s, goal g
Output: Set of jump point successors of x
successors(x) ← ∅
PruneNeighbours(x)
for each neighbour n of x do
    jp ← [Jump](/page/Jump)(x, [Direction](/page/Direction)(x,n), s, g)
    if jp ≠ null then
        successors(x) ← successors(x) ∪ {jp}
return successors(x)
Algorithm 2: Jump(x, ~d, s, g)
Input: x, ~d, start s, goal g
Output: Nearest point from x in ~d, or null
n ← Step(x, ~d)
if n is [obstacle](/page/Obstacle) or outside [grid](/page/Grid) then
    return null
if n = g then
    return n
if HasForcedNeighbour(n, ~d) then
    return n
if ~d is diagonal then
    if Jump(n, ~d1, s, g) ≠ null or Jump(n, ~d2, s, g) ≠ null then
        return n  // where ~d1, ~d2 are [cardinal](/page/Cardinal) components of ~d
return Jump(n, ~d, s, g)
These functions are invoked within the A* loop for each expanded , ensuring that only verifiable jump points are enqueued, with the of each jump point set to the originating x rather than intermediate steps.

Properties and Analysis

Optimality and completeness

Jump Point Search (JPS) maintains the optimality guarantees of the A* algorithm when applied to uniform-cost grid maps, provided the is admissible and consistent. By symmetric paths that cannot lead to shorter routes, JPS eliminates suboptimal expansions without overlooking any potential optimal paths, ensuring the first solution found is the shortest in terms of path length. The optimality of JPS stems from its pruning rules, which preserve all necessary s on an optimal . Specifically, each along an optimal diagonal-first is a jump point, allowing the algorithm to "jump" over straight-line segments that contain no deviations or better alternatives. This is formalized in the proof that jump point always returns an optimal solution, as the jumped segments are symmetric and cannot hide shorter paths due to the uniform cost structure. JPS is also complete, meaning it will find a path if one exists between the start and goal in a finite, traversable . The algorithm explores all relevant directions from each jump point, ensuring exhaustive coverage of the search space without infinite loops in bounded environments. However, these guarantees hold only for uniform-cost ; in non-uniform cost environments with varying edge weights, standard JPS may fail to produce optimal paths without modifications, as its pruning rules assume equal costs for traversable tiles. Adaptations such as Weighted Jump Point Search are required to restore optimality in such cases.

Computational complexity

Jump point search (JPS) shares the same worst-case time complexity as A* search, which is exponential in the depth of the solution path, denoted as O(b^d) where b is the and d is the depth, due to the potential for exploring a large portion of the state space in pathological cases. However, in practice, JPS achieves near-linear , O(d), in open grid environments because the jumping mechanism allows traversal of long straight-line segments without expanding intermediate nodes, significantly reducing the number of expansions through . The of JPS is equivalent to that of A* in the worst case, O(b^d), as it maintains open and closed sets for operations. In typical scenarios, however, JPS stores fewer nodes overall—often on the order of O(d)—since and eliminate many redundant entries in the , resulting in lower memory usage without any additional overhead beyond standard A*. Empirical evaluations demonstrate substantial speedups for JPS over A* on large uniform grids. For instance, in benchmarks using maps from , JPS achieved up to 215 times fewer node expansions and 25-30 times faster search times compared to A* on 1000x1000 grids. Similar results hold for maps, with node expansion reductions of about 36 times, confirming 10-100x overall improvements in pathfinding efficiency on game-like terrains. Performance varies with environmental factors, particularly obstacle density. JPS excels in open areas where long jumps minimize expansions, but its benefits diminish in maze-like structures with high obstacle density and narrow corridors, where jumps are shorter and more forced neighbors increase computational overhead relative to A*.

Variants and Extensions

JPS+ and symmetric pruning

JPS+ represents an advanced variant of the Jump Point Search (JPS) algorithm, designed for static uniform-cost grids, where it employs offline precomputation to accelerate by eliminating runtime recursion in jump identification. By precomputing the distance to the nearest jump point or wall in each of the eight possible directions from every , JPS+ enables constant-time successor generation during search, significantly reducing computational overhead compared to the online of base JPS. This preprocessing step, which requires quadratic time but linear space, allows jumps to be resolved instantly, pruning more aggressively and minimizing the number of nodes expanded. A key enhancement in JPS+ involves integrating goal bounding, which incorporates the goal's direction into the process to further reduce false positives in jump point detection. For each potential , goal bounding checks whether the goal lies within an axis-aligned bounding box associated with the direction from the current ; if not, the is pruned early, ensuring that only goal-relevant paths are explored. This goal-aware mechanism builds on base JPS's successor by adding directional constraints, effectively narrowing the search space in open areas while maintaining optimality. Symmetric , a foundational extended in JPS+ variants, exploits the inherent symmetries of uniform to avoid redundant explorations of equivalent paths, such as those that mirror each other across axes. In base JPS, this pruning discards successors that cannot lead to shorter paths due to grid uniformity, focusing expansions on "forced" neighbors near obstacles; JPS+ enhances this by precomputing symmetric equivalents during preprocessing, allowing runtime checks to skip mirrored explorations entirely. For instance, if a path segment is symmetric to another already evaluated, it is pruned without further scanning, preventing duplicate work in bidirectional or multi-query scenarios. The primary differences between JPS+ and base JPS lie in their handling of computation: base JPS performs symmetry breaking via recursive scans, while JPS+ shifts this to offline precomputation with goal-aware jumps, and adds runtime mirroring checks to both for duplicate avoidance. JPS+ requires static maps unsuitable for dynamic environments, whereas can be applied without preprocessing. These distinctions make JPS+ ideal for repeated queries on fixed grids, with providing orthogonal optimizations for efficiency. In benchmarks on game maps like those from StarCraft and , JPS+ achieves up to 10x speedup over base JPS and over 100x over standard A* in open terrains, with symmetric contributing an additional 20-50% reduction in expansions by eliminating mirrored paths. Performance gains are less pronounced in maze-like maps, where gains drop to 2-2.5x over A*, but remain significant for real-time applications.

Adaptations for 3D and non-uniform grids

Jump Point Search (JPS) has been extended to three-dimensional () environments, particularly cubic grids that support 26-directional movement, encompassing orthogonal, face-diagonal, and space-diagonal neighbors. In this adaptation, known as JPS-3D, jump point identification occurs across three axes by detecting forced neighbors that break path symmetries, allowing the algorithm to skip over symmetric regions while preserving optimality. Pruning in 3D shifts from linear scans in to volumetric explorations, where unnecessary successor expansions are eliminated by limiting scan depths adaptively, resulting in significant speedups—often over an compared to standard A* on large 3D maps. For non-uniform or weighted grids, where cell traversal costs vary (e.g., due to elevation or differences), Weighted Jump Point Search (JPSW) modifies the original JPS by incorporating a tiebreaking policy to handle asymmetric costs and adjusting jump costs accordingly. Heuristics are updated to reflect weighted distances, ensuring the algorithm remains admissible and optimal. This adaptation has demonstrated substantial performance gains, reducing expanded nodes by orders of magnitude relative to weighted A* in benchmarks on game-like weighted maps. Recent extensions as of include improvements to JPS for weighted maps using artificial potential fields to further enhance in complex , and adaptations for conflict-free in multi-unmanned aerial (UAV) scenarios with incremental updates to handle dynamic environments. Extensions to other grid types include adaptations for hexagonal grids, where JPS rules are reformulated to account for the six-directional and rotational symmetries, enabling efficient in environments like strategy games or modeling. For dynamic obstacles, JPS supports recomputation by incrementally updating jump points upon environmental changes, avoiding full replanning in time-sensitive scenarios such as UAV . Adapting JPS to 3D introduces challenges due to the exponential increase in directions (from 8 in to 26 in ), leading to higher computational overhead in jump identification and symmetry pruning. Partial solutions, such as of jumps—where full successor scans are deferred until necessary—help mitigate this by reducing immediate processing demands, though they require careful implementation to maintain completeness.

Applications

Video game AI

Jump point search (JPS) has been implemented in third-party plugins and assets for popular game engines such as and to enhance (NPC) navigation in grid-based level designs, particularly through preprocessing of static environments to identify key jump points and reduce search space during runtime. In these implementations, developers preprocess uniform-cost grids to store directional data, enabling faster A* searches for NPC around obstacles in tile-based worlds. The primary benefits of JPS in AI include real-time performance on large-scale maps, such as those in open-world games, where it achieves up to 100 times the speed of standard A* by pruning symmetric paths and minimizing node expansions. This efficiency supports low CPU overhead for coordinating multiple agents, ensuring smooth gameplay without frame drops during intensive AI computations. For instance, in titles like a , JPS facilitates rapid unit movement around dynamic obstacles, optimizing paths in scenarios. A key trade-off involves reliance on precomputation for static levels, which excels in unchanging environments but requires additional runtime processing for dynamic elements, such as destructible , potentially reverting closer to A* costs without full preprocessing. JPS maintains optimality on uniform grids, ensuring AI paths are as fair and direct as possible for competitive or gameplay.

Robotics and autonomous navigation

In robotics and autonomous navigation, Jump Point Search (JPS) is applied to physical systems where environments are approximated as discrete grids to facilitate efficient path planning. Sensor data from or is discretized into grids, with cells classified as free (value 0) or occupied (value 1) based on detected obstacles, providing a structured input for JPS to identify optimal jump points while avoiding unnecessary node expansions. This mapping process enables robots to navigate complex indoor or outdoor spaces by converting continuous sensor measurements into a searchable or lattice representation. JPS supports real-time path planning in mobile robots, such as warehouse automation bots, where it enables rapid obstacle avoidance by pruning symmetric paths and focusing on key , achieving times under 500 ms on maps up to 2000×2000 cells. It is frequently combined with localization methods like (SLAM) to update grids dynamically as the robot moves, ensuring robust in partially unknown or changing environments. JPS has been applied in wheeled , with improvements like for enhanced efficiency in complex environments. Extensions to grids support volumetric for aerial robots in confined spaces.

History

Initial development

Jump Point Search (JPS) was developed by Daniel Harabor and Alban Grastien at the National ICT Australia (NICTA) laboratory between 2011 and 2012. The algorithm emerged as a response to the inefficiencies of the in uniform-cost grid environments, where A* often expands numerous redundant nodes due to the inherent symmetries of grid maps. The primary motivation for JPS stemmed from the need to accelerate in applications such as and , drawing inspiration from techniques for reduction in search problems. Harabor and Grastien aimed to prune symmetric paths online during the search process without compromising the optimality of the resulting paths, addressing a key bottleneck in real-time navigation scenarios. The first prototype of JPS was designed specifically for 2D uniform grids supporting 8-directional movement, with initial testing conducted on benchmark maps derived from video game levels, such as those from and . Early development focused on identifying "jump points" to skip over symmetric regions efficiently, demonstrating significant speedups over standard A* in these environments. A central challenge in this initial phase was maintaining path optimality while aggressively pruning the search space, requiring formal proofs that the reduced graph preserved all shortest paths. The researchers successfully addressed this by ensuring that jump points represented the only necessary expansion points, thus guaranteeing completeness and optimality under uniform costs.

Key publications and advancements

The foundational work on Jump Point Search (JPS) was introduced in the 2011 paper "Online Graph Pruning for Pathfinding on Grid Maps" by Daniel Harabor and Alban Grastien, presented at the , which proposed an online symmetry-reduction technique for on uniform-cost grids, demonstrating speedups of up to two orders of magnitude on standard game maps. This was followed by their 2012 paper "The JPS Pathfinding System," published in the International Symposium on Combinatorial Search (SoCS), which formalized the JPS algorithm, including detailed successor pruning rules and empirical validation showing consistent performance gains over on diverse grid benchmarks. A significant advancement came in 2014 with the paper "Improving Jump Point Search" by Harabor and Grastien at the International Conference on (ICAPS), introducing JPS+ as an offline preprocessing variant that precomputes jump points to further accelerate searches on static maps, achieving up to 5-10 times faster query times compared to online JPS while maintaining optimality. Extensions to three-dimensional environments were detailed in the 2022 SoCS paper "The JPS Pathfinding System in " by Daniel Harabor, Thomas K. Nobes, Michael Wybrow, and Simon D. C. Walsh, adapting the pruning rules for cubic grids and reporting reduced node expansions by factors of 10-100 on 3D benchmarks, enabling efficient in volumetric spaces like urban simulations. More recent optimizations include the 2023 work "Reducing Redundant Work in Jump Point Search" by Shizhe Zhao, Daniel Harabor, and Peter J. Stuckey, published on and at SoCS, which proposes techniques to eliminate duplicate jumps in complex terrains, yielding 20-50% runtime reductions on large-scale grids without sacrificing completeness. In 2023, the AAAI paper "Optimal Pathfinding on Weighted Grid Maps" by Mark Carlson, Sajjad K. Moghadam, Daniel D. Harabor, Peter J. Stuckey, and Morteza Ebrahimi introduced Weighted Jump Point Search (JPSW), extending JPS to non-uniform cost grids while preserving optimality. Empirical evaluations of JPS and its variants have been extensively conducted using the Moving AI Lab's benchmark datasets, comprising real-world game maps (e.g., from Dragon Age and Starcraft), where JPS consistently demonstrates speedups of 10-100 times over standard A* in terms of expanded nodes and search time, particularly on sparse obstacle layouts. Open-source implementations, such as the C++ library jps3d on GitHub, have facilitated widespread adoption and further experimentation, supporting both 2D and 3D variants with modular extensions for custom grids. Ongoing research explores integrating JPS with learning-based planners, as seen in the 2019 paper "Integrating a Path Planner and an Adaptive Motion Controller for Navigation in Dynamic Environments" by J. Zhang, L. Qin, Y. Huang, Q. Yang, and C. Huang in Applied Sciences, which combines JPS for global paths with for local adjustments, achieving high success rates in dynamic scenarios. Efforts toward on massive grids continue, with approaches addressing high-dimensional environments through precomputation and neural guidance to handle grids exceeding 10^6 cells efficiently.

References

  1. [1]
    [PDF] Online Graph Pruning for Pathfinding on Grid Maps - Daniel Harabor
    Symmetry in this case manifests itself as paths (or path segments) which share the same start and end point, have the same length and are otherwise identical ...
  2. [2]
    Improving Jump Point Search
    May 10, 2014 · Abstract. We give online and offline optimisation techniques to improve the performance of Jump Point Search (JPS): a recent and very effective ...
  3. [3]
    None
    ### Summary of Grid-Based Path Planning on 2D Grids with Obstacles
  4. [4]
    [PDF] Grid-Based Path-Finding
    Grid-based path-finding uses a grid superimposed over a region, often with tiles, to find the best path using graph search, such as A*.Missing: definition 2D lattice cardinal
  5. [5]
    [PDF] Fast Approximate Pathfinding Based on 2D Convolution
    The two classical ways to connect the neighboring tiles for a grid map are 4-way (cardinal directions) and 8-way (cardinal and diagonal directions).Missing: definition lattice<|control11|><|separator|>
  6. [6]
    [PDF] A Formal Basis for the Heuristic Determination of Minimum Cost Paths
    HART, MEMBER, IEEE, NILS J. NILSSON, MEMBER, IEEE, AND BERTRAM RAPHAEL. Abstract-Although the problem of determining the minimum cost path through a graph ...
  7. [7]
    Heuristics - Stanford CS Theory
    Sep 23, 2025 · On a square grid that allows 8 directions of movement, use Diagonal distance (L∞). On a square grid that allows any direction of movement, you ...
  8. [8]
    [PDF] Uninformed Search - cs.wisc.edu
    ○ Time and space complexity: O(bd) (i.e., exponential). – d is the depth of the solution. – b is the branching factor at each non-leaf node. ○ Very slow to ...
  9. [9]
    [PDF] Online Graph Pruning for Pathfinding on Grid Maps
    If we find a node such as y (a jump point) we generate it as a successor of x and assign it a g-value (or cost-so-far) of g(y) = g(x) + dist(x, y).
  10. [10]
    [PDF] The JPS Pathfinding System
    Abstract. We describe a pathfinding system based on Jump Point. Search (JPS): a recent and very successful search strategy that.
  11. [11]
    [PDF] Optimal Pathfinding on Weighted Grid Maps
    Jump Point Search (JPS) (Harabor and Grastien. 2012) is an online and optimal algorithm that prunes sym- metric grid paths and which can be orders of magnitude.
  12. [12]
    [PDF] Improving Jump Point Search - The Australian National University
    Portal-based true-distance heuristics for path finding. In SoCS. Harabor, D., and Grastien, Al. 2011. Online graph prun- ing for pathfinding on grid maps.
  13. [13]
    [PDF] JPS+: An Extreme A* Speed Optimization for Static Uniform Cost Grids
    JPS+ is an extreme A* speed optimization for static uniform cost grids, speeding up searches by up to two orders of magnitude over traditional A*.
  14. [14]
    SteveRabin/JPSPlusWithGoalBounding: JPS+ and Goal Bounding
    This project implements 2D grid pathfinding using JPS+ with Goal Bounding. JPS+ is an optimized preprocessed version of the Jump Point Search pathfinding ...
  15. [15]
  16. [16]
  17. [17]
  18. [18]
    (PDF) An Improved Jump Point Search Pathfinding Algorithm for ...
    This paper presents an adaptation of the JPS algorithm for hexagonal grid maps and presents a comparative analysis of its efficiency against the widely-used A- ...
  19. [19]
    3D JPS Path Optimization Algorithm and Dynamic-Obstacle ... - MDPI
    This paper extends the jump point search algorithm (JPS) in three dimensions for the drone to generate collision-free paths based on static environments.
  20. [20]
    juhgiyo/EpPathFinding.cs: A jump point search algorithm ... - GitHub
    A jump point search algorithm for grid based games in C#. For 3D Environment. You may take a look at EpPathFinding3D.cs.Missing: engine | Show results with:engine
  21. [21]
    SBStudio - Ultimate Grid Path Finder - Unreal Engine Forum
    Apr 14, 2025 · A powerful and modular pathfinding plugin for grid-based system in Unreal Engine. Designed for flexibility and performance.
  22. [22]
    An Optimized Pathfinding in a 2D Zombie Survival Game Using the ...
    In this paper, uses Jump Point Search (JPS) algorithm for path finding in a 2D Zombie Survival Game. JPS is an optimal, heuristic-based algorithm for finding ...
  23. [23]
  24. [24]
    Path Planning with Modified a Star Algorithm for a Mobile Robot
    ... mobile robot with functional and reliable reactive navigation and SLAM. ... Keywords. Path planning. A* algorithm. Basic Theta*. Phi*. Jump Point Search.
  25. [25]
    Design and Implementation of ROS-Based Autonomous Mobile ...
    Design and Implementation of ROS-Based Autonomous Mobile Robot Positioning and Navigation System ... Through combining the improved jump point search (JPS) and ...
  26. [26]
  27. [27]
    [2306.15928] Reducing Redundant Work in Jump Point Search - arXiv
    Jun 28, 2023 · ... Jump Point Search, by Shizhe Zhao and 2 other authors. View PDF. Abstract:JPS (Jump Point Search) is a state-of-the-art optimal algorithm for ...
  28. [28]
    KumarRobotics/jps3d: A C++ implementation of Jump Point ... - GitHub
    Jump Point Search for path planning in both 2D and 3D environments. Original jump point seach algorithm is proposed in D. Harabor and A. Grastien.Missing: extensions 2016
  29. [29]
    Integrating a Path Planner and an Adaptive Motion Controller ... - MDPI
    JPS-IA3C combines a geometrical path planner and a learning-based motion planner to navigate robots in dynamic environments. To verify the performances of the ...