14个稳定版本 (6个主要版本)
新版本 7.0.0 | 2024年8月18日 |
---|---|
6.0.1 | 2024年8月3日 |
5.0.0 | 2024年8月3日 |
4.1.0 | 2024年7月29日 |
1.0.0 | 2024年7月19日 |
#275 在 算法
998 每月下载量
56KB
1.5K SLoC
space-search
提供基本的通用深度优先、广度优先、启发式引导和基于A*的搜索空间探索算法的库。
实现Searchable
+ SolutionIdentifiable
以执行广度优先或深度优先搜索。同时实现Scoreable
以执行启发式引导的搜索空间探索。最后,额外实现CostSearchable
以执行基于A*的搜索探索。将它们传递给Searcher
以创建一个搜索解决方案的迭代器。
Searcher
需要您指定一个Manager
类型,该类型确定搜索策略、返回结果和搜索算法的优化。从search
模块的层次结构中选择一个搜索器以适应您的特定需求。
- 实现
Scoreable
以利用基于guided
的搜索策略管理器,这些管理器将优先搜索关联成本较低的状态。此外,实现CostSearchable
以使用a_star
模块中的基于A*的搜索管理器。如果实现Scoreable
过于复杂或对于您的用例不必要,则可以使用unguided
搜索管理器,这些管理器将以深度优先或广度优先的方式盲目地探索空间,可以通过管理器上的标志进行切换。 - 使用基于
route
的管理器以产生从起始状态到结束状态的步骤序列的结果。使用no_route
管理器仅产生解决方案状态。基于路线的管理器要求您的状态类型实现Clone
。 - 为您的
Searchable
类型实现Eq
+std::hash::Hash
+Clone
,以利用使用hashable
管理器的先前探索状态检查优化;如果您无法这样做,则使用unhashable
管理器,它不需要这些额外的限制,但除非循环遍历是您搜索空间的一个固有属性,否则可能会以效率较低的方式探索空间。
在实现Scoreable
时,请确保得分较低的州更接近解决方案。
use space_search::*;
use std::{vec, hash::Hash};
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
struct Pos(i32, i32);
impl Searchable for Pos {
fn next_states(&self) -> impl Iterator<Item = Self> {
let &Pos(x, y) = self;
vec![
Pos(x - 1, y),
Pos(x, y - 1),
Pos(x + 1, y),
Pos(x, y + 1),
].into_iter()
}
}
impl SolutionIdentifiable for Pos {
fn is_solution(&self) -> bool {
let &Pos(x, y) = self;
x == 5 && y == 5
}
}
let mut searcher: Searcher<search::unguided::no_route::hashable::Manager<_>> = Searcher::new(Pos(0, 0));
assert_eq!(searcher.next(), Some(Pos(5, 5)));
依赖项
~465KB