Skip to main content

A simple implementation of the A* algorithm for path-finding on a two-dimensional grid.

Project description

Build Status Coverage Status PyPI version

PyAstar2D

This is a very simple C++ implementation of the A* algorithm for pathfinding on a two-dimensional grid. The solver itself is implemented in C++, but is callable from Python. This combines the speed of C++ with the convenience of Python.

I have not done any formal benchmarking, but the solver finds the solution to a 1802 by 1802 maze in 0.29s and a 4008 by 4008 maze in 0.83s when running on my nine-year-old Intel(R) Core(TM) i7-2630QM CPU @ 2.00GHz. See Example Results for more details.

See src/cpp/astar.cpp for the core C++ implementation of the A* shortest path search algorithm, src/pyastar2d/astar_wrapper.py for the Python wrapper and examples/example.py for example usage.

When determining legal moves, 4-connectivity is the default, but it is possible to set allow_diagonal=True for 8-connectivity.

Installation

Instructions for installing pyastar2d are given below.

From PyPI

The easiest way to install pyastar2d is directly from the Python package index:

pip install pyastar2d

From source

You can also install pyastar2d by cloning this repository and building it yourself. If running on Linux or MacOS, simply run

pip install .

from the root directory. If you are using Windows you may have to install Cython manually first:

pip install Cython
pip install .

To check that everything worked, run the example:

python examples/example.py

As a dependency

Include pyastar2d in your requirements.txt to install from pypi, or add this line to requirements.txt:

pyastar2d @ git+git://github.com/hjweide/pyastar2d.git@master#egg=pyastar2d

Usage

A simple example is given below:

import numpy as np
import pyastar2d
# The minimum cost must be 1 for the heuristic to be valid.
# The weights array must have np.float32 dtype to be compatible with the C++ code.
weights = np.array([[1, 3, 3, 3, 3],
                    [2, 1, 3, 3, 3],
                    [2, 2, 1, 3, 3],
                    [2, 2, 2, 1, 3],
                    [2, 2, 2, 2, 1]], dtype=np.float32)
# The start and goal coordinates are in matrix coordinates (i, j).
path = pyastar2d.astar_path(weights, (0, 0), (4, 4), allow_diagonal=True)
print(path)
# The path is returned as a numpy array of (i, j) coordinates.
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3],
       [4, 4]])

Note that all grid points are represented as (i, j) coordinates. An example of using pyastar2d to solve a maze is given in examples/maze_solver.py.

Example Results

To test the implementation, I grabbed two nasty mazes from Wikipedia. They are included in the mazes directory, but are originally from here: Small and Large. I load the .png files as grayscale images, and set the white pixels to 1 (open space) and the black pixels to INF (walls).

To run the examples specify the input and output files using the --input and --output flags. For example, the following commands will solve the small and large mazes:

python examples/maze_solver.py --input mazes/maze_small.png --output solns/maze_small.png
python examples/maze_solver.py --input mazes/maze_large.png --output solns/maze_large.png

Small Maze (1802 x 1802):

time python examples/maze_solver.py --input mazes/maze_small.png --output solns/maze_small.png
Loaded maze of shape (1802, 1802) from mazes/maze_small.png
Found path of length 10032 in 0.292794s
Plotting path to solns/maze_small.png
Done

real	0m1.214s
user	0m1.526s
sys	0m0.606s

The solution found for the small maze is shown below: Maze Small Solution

Large Maze (4002 x 4002):

time python examples/maze_solver.py --input mazes/maze_large.png --output solns/maze_large.png
Loaded maze of shape (4002, 4002) from mazes/maze_large.png
Found path of length 783737 in 0.829181s
Plotting path to solns/maze_large.png
Done

real	0m29.385s
user	0m29.563s
sys	0m0.728s

The solution found for the large maze is shown below: Maze Large Solution

Motivation

I recently needed an implementation of the A* algorithm in Python to find the shortest path between two points in a cost matrix representing an image. Normally I would simply use networkx, but for graphs with millions of nodes the overhead incurred to construct the graph can be expensive. Considering that I was only interested in graphs that may be represented as two-dimensional grids, I decided to implement it myself using this special structure of the graph to make various optimizations. Specifically, the graph is represented as a one-dimensional array because there is no need to store the neighbors. Additionally, the lookup tables for previously-explored nodes (their costs and paths) are also stored as one-dimensional arrays. The implication of this is that checking the lookup table can be done in O(1), at the cost of using O(n) memory. Alternatively, we could store only the nodes we traverse in a hash table to reduce the memory usage. Empirically I found that replacing the one-dimensional array with a hash table (std::unordered_map) was about five times slower.

Tests

The default installation does not include the dependencies necessary to run the tests. To install these, first run

pip install -r requirements-dev.txt

before running

pytest

The tests are fairly basic but cover some of the more common pitfalls. Pull requests for more extensive tests are welcome.

Code Formatting

It's recommended that you use pre-commit to ensure linting procedures are run on any code you write. See pre-commit.com for more information.

Reference pre-commit's installation instructions for software installation on your OS/platform. After you have the software installed, run pre-commit install on the command line. Now every time you commit to this project's code base the linter procedures will automatically run over the changed files. To run pre-commit on files preemtively from the command line use:

pip install -r requirements-dev.txt
pre-commit run --all-files

The code base has been formatted by Black. Furthermore, try to conform to PEP8. You should set up your preferred editor to use flake8 as its Python linter, but pre-commit will ensure compliance before a git commit is completed. This will use the flake8 configuration within .flake8, which ignores several errors and stylistic considerations.

References

  1. A* search algorithm on Wikipedia
  2. Pathfinding with A* on Red Blob Games

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyastar2d-1.1.0.tar.gz (13.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pyastar2d-1.1.0-cp38-abi3-win_amd64.whl (15.2 kB view details)

Uploaded CPython 3.8+Windows x86-64

pyastar2d-1.1.0-cp38-abi3-win32.whl (14.6 kB view details)

Uploaded CPython 3.8+Windows x86

pyastar2d-1.1.0-cp38-abi3-musllinux_1_2_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ x86-64

pyastar2d-1.1.0-cp38-abi3-musllinux_1_2_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ ARM64

pyastar2d-1.1.0-cp38-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (57.2 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

pyastar2d-1.1.0-cp38-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (57.3 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

pyastar2d-1.1.0-cp38-abi3-macosx_11_0_arm64.whl (12.2 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

pyastar2d-1.1.0-cp38-abi3-macosx_10_9_x86_64.whl (11.8 kB view details)

Uploaded CPython 3.8+macOS 10.9+ x86-64

File details

Details for the file pyastar2d-1.1.0.tar.gz.

File metadata

  • Download URL: pyastar2d-1.1.0.tar.gz
  • Upload date:
  • Size: 13.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyastar2d-1.1.0.tar.gz
Algorithm Hash digest
SHA256 6d39b5ae030dc9b5758e9367689438b9beaf62156c33e06c84d65f4041dd7568
MD5 38a9d799b5094ebc65f74d8d0be075ee
BLAKE2b-256 430079f8fb05e707a53872fcdd5188c3d5d9834a12c030395a4e8ae606271158

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: pyastar2d-1.1.0-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f58e27b5923153f4f37c884fd9d750bc2b84ec7406ca20d5ff9e1a653431f132
MD5 9e88ede4e0fb6e1c9a10735d28a1433f
BLAKE2b-256 1886c5c0a6aca51d48a619d3bd93df25dd0929369637651e57272cd74dd22bb6

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-win32.whl.

File metadata

  • Download URL: pyastar2d-1.1.0-cp38-abi3-win32.whl
  • Upload date:
  • Size: 14.6 kB
  • Tags: CPython 3.8+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 675972009223881a839e5667891a1fb9303c71ebb9a932b979fadb3dce1f7227
MD5 f362daf5f13fbf37df3133389eb3673b
BLAKE2b-256 f069d0ca2e3471d7ae1b11c3507ed1ac7b5b4cef7e1f2922d2b3bdaa1f97bc5a

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 79c1ea9ad487bc2aa292659d9723ac6cdc9d93e2a58c56e99d51f85750543e94
MD5 84707a404b2574dd62822008201a0cd0
BLAKE2b-256 45c1d3c548119f5bd556f3bfb7edddcbe78232d771771c11d11f7add4b414346

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 692583fc22e0060b3257c795adb0fe363368430cfa3b535d6c3727a08ab5b9f6
MD5 58ffeb5ad203301b44cf2c372711cfe9
BLAKE2b-256 31063c26df502a81842f7b322fb7a2efc7a00354f93c8f7384ad0acffa83475c

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a4b12835f55ec41165997c083c498c9f83c6e86073c4ea2d437d3786e755230c
MD5 f251c816850ecae8d3747c5c59d024d0
BLAKE2b-256 011c7dcd92e5dc3abbec7ab692ece627a30fefac822385a28809363a58f08b33

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f15025034861edfc79ee460d0d6d2598d065f04670dc72410280e9a821bbb4fc
MD5 669abfe13521258c5e833de0826b69a0
BLAKE2b-256 6b63ea9d5919dc9753b52d9a1ef3c248729cdc0c03861ad7a035ea12dbd00064

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 81fefd438f839e0bc6b640c165eff3f8ddaebc5738f924f9cf228e6c2e925e83
MD5 00437eae31cf1d3d22be3e8bc9e5e5b9
BLAKE2b-256 1298a1587bb47fdaa9bd05b220d78d4a4adedad6d20bb2cd318b51e5bc421838

See more details on using hashes here.

File details

Details for the file pyastar2d-1.1.0-cp38-abi3-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for pyastar2d-1.1.0-cp38-abi3-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6d6f04574f3be4572fea7fee13f61c82ed44117f1ecaf4cdcf511e2da9b0cc92
MD5 9248aae821959e6658c69c1139023af8
BLAKE2b-256 f5ebb118bd0c0592390d048c675cd5fea4b03683b011076916bf7a429607f39d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page