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算法 分类中

Download history 27/week @ 2024-04-15 148/week @ 2024-07-01

每月下载量 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