#路径查找 # #路径 #mst #图节点 #图算法 #搜索算法

path-finding-lib

本库提供多种路径查找和图操作。正在进行中。

9 个版本

0.3.1 2023 年 3 月 23 日
0.2.1 2023 年 3 月 16 日
0.1.6 2023 年 3 月 14 日

#1716 in 算法

Download history 5/week @ 2024-03-29

每月 52 次下载

MIT 许可证

42KB
990

路径查找库

Rust 初学者 - 欢迎反馈!

本库将包含标准路径查找算法,并返回结果路径或图对象

使用 markdown-toc 生成的目录表

目前支持:

  • 构建图
  • 从图中创建最小生成树
  • 使用深度优先搜索查找路径
  • 使用广度优先搜索查找路径
  • 使用双向广度优先搜索查找路径
  • 使用 Dijkstra 算法查找路径
  • 使用 A* 算法查找路径,带启发式函数
    • 欧几里得距离
    • 曼哈顿距离

下载库: https://crates.io/search?q=path-finding-lib

如何使用

目前,我们有三个主要概念

  • 节点
  • 位置

您只需向图中传递边。节点将自动生成。每种路径查找方法都将接受一个图,并返回仅包含结果边和节点的图。

或者,如果您提供邻接矩阵,也可以创建图。边和节点将自动生成。

如果您想使用 A* 路径查找算法,请确保为每个节点提供位置信息。

创建图

  • 创建边
pub fn your_function() {
    graph::Edge::from(
        0 /* edge index */,
        0 /* source node */,
        1 /* destination node */,
        0.1, /* weight */
    );
}
  • 从边创建图
pub fn your_function() {
    graph::Graph::from(Vec::from([edge1, edge2]));
}
  • 从邻接矩阵创建图
pub fn your_function() {
    let mut matrix: &[&[f32]] = &[
        &[0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 8.0, 0.0],
        &[4.0, 0.0, 8.0, 0.0, 0.0, 0.0, 0.0, 11.0, 0.0],
        &[0.0, 8.0, 0.0, 7.0, 0.0, 4.0, 0.0, 0.0, 2.0],
        &[0.0, 0.0, 7.0, 0.0, 9.0, 14.0, 0.0, 0.0, 0.0],
        &[0.0, 0.0, 0.0, 9.0, 0.0, 10.0, 0.0, 0.0, 0.0],
        &[0.0, 0.0, 4.0, 14.0, 10.0, 0.0, 2.0, 0.0, 0.0],
        &[0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 1.0, 6.0],
        &[8.0, 11.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 7.0],
        &[0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 6.0, 7.0, 0.0]
    ];

    graph::Graph::from_adjacency_matrix(matrix);
}

图操作

您可能需要获取一些信息或以某种方式修改图。因此,图目前支持三个方便的函数,用于操作或为启发式函数提供数据。

按权重升序排序

pub fn your_function() {
    let edges: Vec<Edge> = graph.sorted_by_weight_asc(); // will return a vector with edges ascending by weight 
}

提供位置

pub fn your_function() {
    // provide a hashmap, mapping the node id to a position - used for a* pathfinding heuristics
    graph.offer_positions(HashMap::from([(1, Position::from(0.1, 0.2, 0.3))]));
}

最小生成树

pub fn your_function() {
    let mst_graph = graph::minimum_spanning(graph);
}
pub fn your_function() {
    let dfs = path::find(
        4 /* source */,
        1 /* target */,
        &graph,
        Box::from(DepthFirstSearch {}) /* used algorithm */
    );
}
pub fn your_function() {
    let bfs = path::find(
        4 /* source */,
        1 /* target */,
        &graph,
        Box::from(BreadthFirstSearch {}) /* used algorithm */
    );
}
pub fn your_function() {
    let bi_bfs = path::find(
        4 /* source */,
        1 /* target */,
        &graph,
        Box::from(BiBreadthFirstSearch {}) /* used algorithm */
    );
}
pub fn your_function() {
    let dijkstra = path::find(
        4 /* source */,
        1 /* target */,
        &graph,
        Box::from(Dijkstra {}) /* used algorithm */
    );
}

您可以通过提供以下所示现有的启发式函数或您自己的启发式函数来使用A*路径查找算法。如果您使用现有的启发式函数,请确保提供节点的位置信息。

pub fn your_function_with_euclidean_distance() {
    let a_star = path::find(
        4 /* source */,
        1 /* target */,
        &graph,
        Box::from( AStar { heuristic: Box::from(euclidean_distance) }), /* used algorithm + euclidean distance heuristic function */
    );
}
pub fn your_function_with_manhattan_distance() {
    let a_star = path::find(
        4 /* source */,
        1 /* target */,
        &graph,
        Box::from( AStar { heuristic: Box::from(manhattan_distance) }), /* used algorithm + manhattan distance heuristic function */
    );
}

依赖项

~3MB
~58K SLoC