pathfinding 0.6.5

Pathfinding, flow, and graph algorithms
Documentation

pathfinding

Unix build Status Windows build Status Current Version Documentation License: Apache-2.0/MIT

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

  • A*: find the shortest path in a weighted graph using an heuristic to guide the process.
  • breadth-first search (BFS): explore nearest neighbours first, then widen the search.
  • depth-first search (DFS): explore a graph by going as far as possible, then backtrack.
  • Connected components: find disjoint connected sets of vertices.
  • Dijkstra: find the shortest path in a weighted graph.
  • Edmonds Karp: find the maximum flow in a directed graph.
  • 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.
  • Kuhn-Munkres: find the maximum (or minimum) matching in a weighted bipartite graph.
  • Topological sorting: find an acceptable topological order in a directed graph.

Those algorithms are generic over their arguments.

Using this crate

In your Cargo.toml, put:

[dependencies]
pathfinding = "0.6"

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

extern crate pathfinding;

use pathfinding::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::bfs;

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

impl Pos {
  fn neighbours(&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.neighbours(), |p| *p == GOAL);
assert_eq!(result.expect("no path found").len(), 5);

License

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