1 个不稳定版本

使用旧 Rust 2015

0.1.0 2017 年 4 月 21 日

#601机器学习

MIT 许可证

12KB
151

rgoap

crates.io Build Status Coverage Status

这是一个基于 Orkin 的面向目标的动作规划器 (GOAP) 的简单 Rust 实现,如他在他的网站上所述。

docs.rs此处 在 Github 上查找 crate 文档。

这个实现很简单,因为它不处理许多功能,例如程序性的前条件和后条件、动态动作成本、非二进制世界状态等。但它非常短(多亏了 Samuel Tardieu 的 pathfinding crate)。它被编写为一个学习更多关于 Rust 的项目 - 请谨慎使用。

用法

将 rgoap 依赖项添加到 Cargo.toml

[dependencies]
rgoap = "0.1"

并按如下方式使用 crate

extern crate rgoap;

use rgoap::{State, Action, plan};

fn main() {
    // The actions your planner will be allowed to use.
    let mut walk_to_dog = Action::new("walk_to_dog".to_string(), 1);
    walk_to_dog.pre_conditions.insert("dog_person".to_string(), true);
    walk_to_dog.post_conditions.insert("near_dog".to_string(), true);

    let mut dog_wiggles_tail = Action::new("dog_wiggles_tail".to_string(), 1);
    dog_wiggles_tail.pre_conditions.insert("dog_happy".to_string(), true);
    dog_wiggles_tail.post_conditions.insert("tails_wiggling".to_string(), true);

    let mut pet_dog = Action::new("pet_dog".to_string(), 1);
    pet_dog.pre_conditions.insert("near_dog".to_string(), true);
    pet_dog.post_conditions.insert("dog_happy".to_string(), true);

    let possible_actions = [walk_to_dog, pet_dog, dog_wiggles_tail];

    // This is the initial state of the world.
    let mut initial_state = State::new();
    initial_state.insert("near_dog".to_string(), false);
    initial_state.insert("dog_person".to_string(), true);
    initial_state.insert("dog_happy".to_string(), false);
    initial_state.insert("tails_wiggling".to_string(), false);

    // And this is the target state. Note that it doesn't have to include all of the states.
    let mut goal_state = State::new();
    goal_state.insert("tails_wiggling".to_string(), true);

    // Let's find which actions needs to happen to get there.
    let planned_actions = plan(&initial_state, &goal_state, &possible_actions).unwrap();

    // Are the actions what we expected?
    let planned_actions_names: Vec<String> =
        planned_actions.iter().map(|&action| action.name.clone()).collect();
    let expected_actions_names =
        vec!["walk_to_dog".to_string(), "pet_dog".to_string(), "dog_wiggles_tail".to_string()];

    assert_eq!(planned_actions_names, expected_actions_names);
}

许可证

MIT - 见 LICENSE 文件。

依赖关系

~3MB
~63K SLoC