4个版本 (2个破坏性版本)
0.3.0 | 2024年7月2日 |
---|---|
0.2.0 | 2023年3月20日 |
0.1.1 | 2022年9月9日 |
0.1.0 | 2022年9月7日 |
#454 在 算法 分类中
每月下载量 148次
32KB
839 行
tree_traversal
一个Rust库,用于在树结构中找到最佳(成本最低)的叶子节点。此包实现了多种树遍历算法来找到树中的最佳叶子节点。
算法
- 广度优先搜索
- 深度优先搜索
- 光束搜索
- 分支和界限搜索
- 贪婪搜索
使用此包
cargo add tree_traversal
示例
use tree_traversal::bbs::bbs;
type Node = Vec<bool>;
fn main() {
let weights = [4, 2, 6, 3, 4];
let profits = [100, 20, 2, 5, 10];
let capacity = 8 as u32;
let total_items = weights.len();
let successor_fn = |n: &Node| {
if n.len() == total_items {
return vec![];
}
let total_weight: u32 = n
.iter()
.copied()
.enumerate()
.map(|(i, b)| {
if b {
return weights[i];
} else {
return 0;
}
})
.sum();
let mut childrean = vec![];
let next_idx = n.len();
if capacity >= total_weight + weights[next_idx] {
let mut c1 = n.clone();
c1.push(true);
childrean.push(c1);
}
let mut c2 = n.clone();
c2.push(false);
childrean.push(c2);
childrean
};
let total_profit = |n: &Node| {
let s: u32 = n
.iter()
.copied()
.enumerate()
.map(|(i, b)| {
if b {
return profits[i];
} else {
return 0;
}
})
.sum();
s
};
let lower_bound_fn = |n: &Node| {
let current_profit = total_profit(n);
let max_remained_profit: u32 = profits[n.len()..].into_iter().sum();
Some(u32::MAX - (current_profit + max_remained_profit))
};
let cost_fn = |n: &Node| Some(u32::MAX - total_profit(n));
let leaf_check_fn = |n: &Node| n.len() == total_items;
let max_ops = usize::MAX;
let (cost, best_node) = bbs(
vec![],
successor_fn,
lower_bound_fn,
cost_fn,
leaf_check_fn,
max_ops,
)
.unwrap();
let cost = u32::MAX - cost;
dbg!((best_node, cost));
}
注意
API来自优秀的 pathfinding 包。
依赖项
~150KB