1 个不稳定版本
| 0.1.0 | 2022 年 8 月 8 日 |
|---|
#11 在 #composite
185KB
3.5K SLoC
层次任务网络规划器
人工智能规划 是实现策略或动作序列的过程。层次任务网络是人工智能规划方法的一个子集,其中任务(动作)可能需要调用其他任务或由多个方法组成。
由多个方法组成的任务称为复合任务。当其中一个方法被规划为运行时,复合任务规划成功。方法和原始任务只能调用其他任务或算子。算子是底层过程的原子标识符,由字符串表示。该项目灵感来源于 AI Pro 关于 HTN 的文章
语法
许多 HTN 研究项目由 LISP 社区(例如 SHOP2)驱动,这通常会让新开发者望而却步。该项目实现了一个类似 Python 的语法解析器,以提供更友好的 HTN 体验。示例问题可以在 htn-problems 文件夹中找到。总的来说,语法使用换行符和缩进作为表达式分隔符和代码块的手段。以下关键字被识别
task- 表示任务语句的开始。完整语法:task NAME(preconditions):其中NAME是任何非关键字字符串,preconditions是一个布尔表达式method- 表示方法语句的开始。方法只能在task中定义。完整语法:method NAME(preconditions):其中NAME是任何非关键字字符串,preconditions是一个布尔表达式。else-method DontNAME(!preconditions):的语法糖 - 反转先前方法的前提条件。由于这是方法的等价物,因此else只能出现在task主体中。effects- 代表task的效果块的开始。效果通常包含变量赋值语句。必须与task处于相同的缩进级别,并且最后一个任务之前不得有空白行。or、and、not- 是|、&、!布尔操作的语法糖。true、false- 是1和0文字字面量的语法糖。内部所有表达式都基于 Rust 的i32类型。
示例
task Main:
method FindTrunk(WsTrunkHealth == 0): # precondition - can only run this is WsTrunkHealth is 0
UprootTrunk()
Main() # Supports recursion, will plan Main task again.
method Attack(WsCanSeeEnemy): # name(conditions)
AttackEnemy()
Main()
else: # syntactic sugar for "method DontAttack(!WsCanSeeEnemy)"
CheckBridge()
Main()
method Wait:
wait()
Main()
task AttackEnemy:
method AttackWithTrunk(WsTrunkHealth > 0):
NavigateToEnemy()
DoTrunkSlam()
task DoTrunkSlam(WsTrunkHealth > 0):
DoTrunkSlamOperator()
effects:
WsTrunkHealth -= 1
依赖关系
~3–12MB
~128K SLoC