6 个版本
0.3.1 | 2023年11月15日 |
---|---|
0.3.0 | 2023年11月8日 |
0.2.1 | 2023年10月22日 |
0.1.3 | 2023年4月23日 |
#126 in 性能分析
74 每月下载量
210KB
5K SLoC
pddl_rs
基于 Daniel L. Kovacs 的 BNF 定义 的 PDDL Planner。包含受 PDDL4J 库 启发的基本规划算法。可以解决简单的规划问题。
来自 PDDL4J 的 Readme
PDDL 最初由 Drew McDermott 和 1998 年规划竞赛委员会开发。它受到鼓励规划系统之间经验比较和社区内规划基准交换的需求的启发。其发展提高了研究结果的沟通,并引发了规划系统性能、表达性和鲁棒性的爆炸式增长。
PDDL 已经成为描述规划领域的事实标准语言,不仅用于竞赛,而且更广泛地,因为它为在不断增加的广泛采用的标准基准领域集合上对规划系统进行经验评估提供了机会。语言标准的出现将对整个领域产生影响,影响规划系统发展中的核心和外围。
示例
use std::fs;
use std::path::PathBuf;
use pddl_rs::{Sources, Objects, search::{a_star, AstarInternals}};
let domain_filename = PathBuf::from("sample_problems/simple_domain.pddl");
let problem_filename = PathBuf::from("sample_problems/simple_problem.pddl");
let sources = Sources::load(domain_filename, problem_filename);
let (domain, problem) = sources.parse();
let c_problem = sources.compile(&domain, &problem);
println!("Compiled problem needs {} bits of memory and uses {} actions.", c_problem.memory_size, c_problem.actions.len());
let mut args = AstarInternals::new(&c_problem.action_graph);
if let Some(solution) = a_star(&c_problem, Some(&domain), Some(&problem), &mut args) {
println!("Solution is {} actions long.", solution.len());
for action_id in &solution {
let action = c_problem.actions.get(*action_id as usize).unwrap();
println!("\t{}{:?}", domain.actions[action.domain_action_idx as usize].name(), action.args.iter().map(|(row, col)| problem.objects.get_object_name(*row,*col).1).collect::<Vec<&str>>());
}
}
代码可在 GitHub 上找到
依赖项
~2–2.7MB
~49K SLoC