AI 中的分层任务网络 (HTN)



我无法理解HTN是什么。我认为,我们希望将计划的所有小动作分解为更高层次的计划。

例如:

"乘坐公共汽车">

是"去公共汽车","买票","坐下"等的HLA。

我错了吗?希望得到一个简单的解释。

我知道这是一个旧帖子,但我把头撞在这堵墙上很长时间,希望我学到的东西能节省别人的时间。

从广义上讲,HTN使用非常人性化的规划方法解决问题,该方法以抽象和替代方案为中心。

替代方案:让我们使用著名的SHOP HTN Planner(http://www.cs.umd.edu/projects/shop/description.html)中的旅行示例。想象一下,你问我如何从市中心到公园。我可能会说,"嗯,它有2公里远,但如果它很好,我会走它。但是,如果下雨并且你有出租车费,我会打车。否则,如果你有公交车费,就坐公交车吧。你完成的一件抽象的事情,比如"从一个地方到另一个地方",在HTN中被称为"任务"。我给出的 3 种实现它的替代方案在 HTN 中被称为"方法"。 请注意,每种方法都有一个随之而来的"条件":如果出去很好就走,如果有车费,就打车,等等。

抽象:请注意,这 3 种方法处于相当高的抽象级别。你可能会进一步问我如何完成"TakeABus"方法。我会这样说,"好吧,在'市中心'公交车站等#1公交车,付给司机1美元,然后骑到'公园'站。这三个任务在HTN中被称为"TakeABus"方法的"子任务"。在 HTN 中,方法通过分解为子任务来执行它们所做的事情。现在,这对人类来说是一个非常完整的答案,但如果我们与机器人交谈,也许就不行了。在这种情况下,我们可能需要进一步将"PayTheDriver$1"的任务分解为"伸手到口袋里,拿起一张1美元的钞票,手交给司机"。这些中的每一个都可以进一步分解,直到我们最终有机器人可以做的事情。HTN 的最后一步,即实际完成的部分,称为"操作员"。在完成之前需要获得多详细程度(并拥有操作员)取决于您正在构建的系统类型。设计 HTN 模型的一个重要部分是了解正确的抽象是什么。

因此,HTN 具有以下部分:

  • 世界状况:你在市中心。出租车费为2美元。巴士票价为1美元。从市中心到公园的距离是2公里。 任务:世界上可以抽象地做什么(可能有几种方法可以做到!):从A到B旅行,从A到B.向司机支付X$。在 B 站等候巴士 A。

  • 运算符:如何在没有进一步解释的情况下"完成抽象任务"。它们实际上改变了世界的状况。如果你是人类,这些可能是运营商:付给司机1美元,乘坐#1巴士到"公园"站。如果您是机器人,这些可能是: 将步进电机向前移动 100 步,打开聚光灯

  • 方法:当抽象任务涉及几个步骤或更详细的计划时,如何完成抽象任务。它们有一个何时可以使用它们的条件和一组如何完成它们的子任务: 方法:"从A到B旅行" 条件:天气不好,你有公交车费, 子任务:在公交车站等公交车,付钱给司机,然后骑到车站

算法本身非常简单。您从任务或目标列表开始,例如从市中心到公园的 Go 和一个空的计划列表:

  • 移除目标列表中的第一个目标并从第一个目标开始
  • 看看是否有一个操作员知道如何做到这一点。如果是这样,请将运算符添加到计划列表的末尾(因为运算符可以"完成")并继续 #1
  • 看看是否有知道如何做到这一点的方法。如果是这样,请将他们的子任务添加到目标列表的前面,然后继续#1 如果有多个方法,请复制世界的当前状态并独立运行每个方法的算法。每个成功完成的都将是不同的解决方案
  • 重复直到目标列表为空
  • 完成后,计划列表中的内容就是解决方案

我有一个博客系列,非常详细地介绍了这个问题,包括源代码和更多示例,如果你想要更多详细信息:https://blog.inductorsoftware.com/blog/htnoverview

首先,分层任务网络是给定计划的解析器。在示例中,计划:

1 takebus
1.1 gotobus
1.2 buyticket
1.3 sitdown

可以针对 HTN 网络进行测试,它将用"计划有效"和"执行 30 分钟"来回答请求。另一个稍作修改的计划也可以针对 HTN 网络执行。

围绕ICAPS会议的规划社区正在做的是弄清楚如何建立分层任务网络。他们经常使用Prolog方言PDDL来创建复杂的行为树。例如,解析有关码头工人机器人问题的计划或从块世界域解析计划。

其次,如果目的是为给定领域找到最佳计划,则也会使用术语分层任务网络规划。在这里,我们已经有了 PDDL 描述,我们有兴趣找到最短的计划。这在控制任务中很有用,主要是为了自主游戏。

总的来说,可以说分层任务网络是每个认知架构的基本构建块。它结合了游戏 AI 编程、知识工程和启发式规划等学科。

最新更新