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