• Stars
    star
    660
  • Rank 68,297 (Top 2 %)
  • Language
    Rust
  • Created almost 8 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Pathfinding library for rust

pathfinding

Current Version Documentation License: Apache-2.0/MIT

This crate implements several pathfinding, flow, and graph algorithms in Rust.

Algorithms

The algorithms are generic over their arguments.

Directed graphs

  • A*: find the shortest path in a weighted graph using an heuristic to guide the process.
  • BFS: explore nearest successors first, then widen the search.
  • Brent: find a cycle in an infinite sequence.
  • DFS: explore a graph by going as far as possible, then backtrack.
  • Dijkstra: find the shortest path in a weighted graph.
  • Edmonds Karp: find the maximum flow in a weighted graph.
  • Floyd: find a cycle in an infinite sequence.
  • Fringe: find the shortest path in a weighted graph using an heuristic to guide the process.
  • IDA*: explore longer and longer paths in a weighted graph at the cost of multiple similar examinations.
  • IDDFS: explore longer and longer paths in an unweighted graph at the cost of multiple similar examinations.
  • strongly connected components: find strongly connected components in a directed graph.
  • topological sorting: find an acceptable topological order in a directed graph.
  • Yen: find k-shortest paths using Dijkstra.

Undirected graphs

Matching

  • Kuhn-Munkres (Hungarian algorithm): find the maximum (or minimum) matching in a weighted bipartite graph.

Miscellaneous structures

  • A Grid type representing a rectangular grid in which vertices can be added or removed, with automatic creation of edges between adjacent vertices.
  • A Matrix type to store data of arbitrary types, with neighbour-aware methods.

Using this crate

In your Cargo.toml, put:

[dependencies]
pathfinding = "4.3.1"

You can then pull your preferred algorithm (BFS in this example) using:

use pathfinding::prelude::bfs;

Example

We will search the shortest path on a chess board to go from (1, 1) to (4, 6) doing only knight moves.

use pathfinding::prelude::bfs;

#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
struct Pos(i32, i32);

impl Pos {
  fn successors(&self) -> Vec<Pos> {
    let &Pos(x, y) = self;
    vec![Pos(x+1,y+2), Pos(x+1,y-2), Pos(x-1,y+2), Pos(x-1,y-2),
         Pos(x+2,y+1), Pos(x+2,y-1), Pos(x-2,y+1), Pos(x-2,y-1)]
  }
}

static GOAL: Pos = Pos(4, 6);
let result = bfs(&Pos(1, 1), |p| p.successors(), |p| *p == GOAL);
assert_eq!(result.expect("no path found").len(), 5);

Note on floating-point types

Several algorithms require that the numerical types used to describe edge weights implement Ord. If you wish to use Rust built-in floating-point types (such as f32) that implement PartialOrd in this context, you can wrap them into compliant types using the ordered-float crate.

The minimum supported Rust version (MSRV) is Rust 1.65.0.

License

This code is released under a dual Apache 2.0 / MIT free software license.

Contributing

You are welcome to contribute by opening issues or submitting pull requests. Please open an issue before implementing a new feature, in case it is a work in progress already or it is fit for this repository.

In order to pass the continuous integration tests, your code must be formatted using the latest rustfmt with the nightly rust toolchain, and pass cargo clippy and pre-commit checks. Those will run automatically when you submit a pull request.

This repository use the imperative mode in commit messages, such as "Add IDDFS", "Fix #xxx". This style is preferred over "Added IDDFS" or "Fixed #xxx".

More Repositories

1

recoverjpeg

Recover lost JPEGs and MOV files on a bogus memory card or disk
C
69
star
2

zmq-broker

Example broker with multiple attempts and timeouts in 0MQ
Python
26
star
3

aforth

Embeddable Forth interpreter written in Ada
Ada
19
star
4

picforth

Forth compiler for Microchip PIC16Fxxx microcontrollers
Forth
15
star
5

AusweisBot

Telegram bot to generate self-authorizations for moving around during covid-19 pandemic in France
Scala
15
star
6

serialbridge

Bridge serial ports and TCP sockets
C
14
star
7

adasockets

BSD sockets in Ada
TeX
13
star
8

french-numbers

Write numbers in French from Rust
Rust
12
star
9

hibp-check

Have I been pwned
Rust
10
star
10

rforth1

Forth compiler for Microchip PIC18Fxxx microcontrollers
Python
9
star
11

findkeepassword

Find your lost keepass master password from a list of candidates
Rust
9
star
12

areadline

Ada interface to the readline library
Ada
6
star
13

harassme

HarassMe Android application
Scala
5
star
14

canape

CouchDB interface in Scala
Scala
4
star
15

factor-xbee

Factor XBee low-level library
Factor
4
star
16

homeassistant-addon-pi-cec

HomeAssistant add-on to expose Raspberry Pi HDMI CEC
Dockerfile
4
star
17

aoc2021

Quick'n dirty macro set for advent of code 2021
Rust
3
star
18

ilda-decoder

ILDA decoder with pull support
C
3
star
19

rxtelegram

Reactive Telegram API for Scala
Scala
3
star
20

blenderdist

Distribute Blender jobs
Python
2
star
21

aoc

Advent of code helpers for Rust
Rust
2
star
22

octopush-akka

Send SMS from Akka using Octopush API
Scala
1
star
23

wle

White List Email
Python
1
star
24

homeassistant-addons

Dockerfile
1
star
25

assignments

Assign projects or papers to students
Rust
1
star
26

hakyll-question

Illustration of a Hakyll related question
Haskell
1
star