#任务 #方法 #规划 #算子 #人工智能 #字符串 #复合

bin+lib htn_planner

HTN 解析器和规划器

1 个不稳定版本

0.1.0 2022 年 8 月 8 日

#11#composite

MIT 许可证

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 处于相同的缩进级别,并且最后一个任务之前不得有空白行。
  • orandnot - 是 |&! 布尔操作的语法糖。
  • truefalse - 是 10 文字字面量的语法糖。内部所有表达式都基于 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