20、扩展人工智能规划以解决更现实的问题

扩展人工智能规划以解决更现实的问题

在现实世界中,将人工智能规划应用于解决实际问题仍然面临诸多挑战。经典规划系统只能处理有限的符号数据元素,无法充分考虑许多现实问题的数值方面。尽管一些近期的规划器已经开始尝试解决涉及资源消耗和时间管理的更现实问题,但它们大多将规划问题的数值方面作为主要符号问题的辅助特征,未能将问题的两个方面紧密结合为一个统一的问题进行处理。

1. 扩展规划的必要性

许多现实问题涉及大量甚至绝对的数值处理,因此需要扩展规划问题的表示和数据类型处理。为了应对这类问题,我们提出了多种扩展方法,使规划过程能够均匀地应用于符号和数值数据,从而构成任何现实的规划问题。

尽管规划领域定义语言(PDDL)已经进行了多次扩展,但它仍然不足以表示需要复杂动作表示和复杂状态转换表达式的现实问题。受PDDL持续扩展的启发,我们提出了第一个扩展,涉及数据表示,引入了使用不可逆函数在规划过程中更新数值和非数值数据的概念。这种函数可以轻松地将不确定性以及时间和数值知识集成到规划中。

2. 在规划中应用函数

在规划中使用函数的研究已经在Functional Strips和FSTRIPS中展开。我们支持通过用函数替换关系来减少生成的文字的观点,但我们主要关注函数处理复杂数值和条件效果以及表达复杂前提条件和目标的能力。

例如,在规划机器人在存在物理障碍物的环境中从初始位置移动到目标位置时,需要使用三角函数来避免碰撞。然而,经典的人工智能规划语言如PDDL3.0无法表达这些三角函数表达式。因此,我们扩展了人工智能规划,允许应用可以用任何编程语言编写的外部函数。

不可逆函数只能在搜索空间的正向遍历中应用。为了支持这类函数的应用,我们专注于对正向规划系统进行适配。我们展示了我们的技术可以通过对任何正向规划器进行微小扩展来使用,并详细介绍了对Graphplan结构和算法的扩展,以支持函数的执行。

3. 语言扩展

我们提出的用于定义规划问题的语言是对PDDL3.0的扩展,引入了外部函数来更新数值,除了PDDL3.0允许的算术表达式。这种扩展允许使用数学函数和用户定义的函数,而不仅仅是PDDL3.0支持的简单算术运算符。

我们还将动作定义中的约束与前提条件分离,在动作实例化之前测试约束列表,以减少无用的前提条件测试和存储地面动作所需的内存空间。

3.1 状态空间性质和转换

每个不同的世界实例称为一个状态,用s表示。所有可能状态的集合称为状态空间S,由一组逻辑命题P和一组数值变量N组成。状态转换通过应用一组动作A来实现,状态转换函数t以三种方式转换状态:添加逻辑命题、移除逻辑命题和分配新的数值变量值。

3.2 动作定义

一个动作a定义为一个元组(args, con, pre, eff),其中:
- args是由代表S中的常量符号和/或N中的数值变量的变量组成的参数列表。
- con是约束列表,在动作实例化之前进行测试,以避免使用不一致的参数实例化动作。
- pre是前提条件列表,包括命题前提条件preP和数值前提条件preN。
- eff是效果列表,包括正命题效果effP+和负命题效果effP-,以及数值效果effN。

以下是使用条件列表和外部函数定义水罐领域的示例:

(define (domain Jugs)
(:requirements :typing :fluents :external)
(:types jug int)
(:functions ((capacity ?j - jug) – int)
((fill ?j - jug) – int))
(:external java (and ( (path (int max (int, int, int)) (c:/javaplan/WaterJug.max))
(path (int min (int, int, int)) (c:/javaplan/WaterJug.min))))

(:action poor
:parameters
(? j1 ? j2 – jug)
:constraints
(not(= ?j1 ?j2))
:precondition
(and (<(fill ?j) (capacity ?j)) (> (fill ?j) 0))
:effect
(and (assign (fill ?j1) (max ((fill ?j1), (fill ?j2), (capacity ?j2)))
(assign (fill ?j2) (min ((fill ?j1), (fill ?j2), (capacity ?j2))))

外部函数用Java编写:

public class WaterJug{
public static final int max (final int v1, final int v2, final int c2){
if (v1+v2 > c2) return v1+v2-c2;
return 0;
}

public static final int min (final int v1, final int v2, final int c2){
if (v1+v2 < c2) return v1+v2;
return c2;
}
}
3.3 规划问题定义

一个规划问题定义为P = ,其中:
- S是一个非空的状态空间,是有限或可数无限的状态集合。
- 对于每个状态s ∈ S,有一个有限的适用动作集合A(s)。状态转换函数t为每个s ∈ S和适用动作A(s)产生一个状态s’ = t(s, A) ∈ S。
- sI是初始状态,由初始为真的逻辑命题和数值变量的初始值组成。
- G是一组目标条件,应在状态sG ∈ S中得到满足。

4. Graphplan扩展

Graphplan是一种解决STRIPS语言表示问题的算法,交替进行图构建和解决方案提取两个阶段。我们对Graphplan进行了扩展,使其结构能够处理外部函数的执行,从而处理不确定性并集成时间和数值知识。

4.1 Graphplan概述

Graphplan解决用STRIPS语言表示的问题。在图构建阶段,Graphplan通过前向链接扩展规划图,直到找到解决方案或确定无解。在解决方案提取阶段,Graphplan通过后向链接在规划图中搜索解决方案。

规划图由一系列级别组成,每个级别包含一组文字和一组动作。动作的前提条件由同一级别的文字满足,下一级别的文字是上一级别适用动作的效果。为了维护文字从一个级别到下一个级别的存在,Graphplan使用“无操作”动作。

为了加速解决方案提取,Graphplan在图扩展过程中使用二进制互斥关系。

4.2 Graphplan适应外部函数集成

我们对Graphplan算法进行了适配,以支持处理数值变量和执行外部函数。在我们的实现中,适配后的Graphplan由事实级别和动作级别两种类型的级别组成。

事实级别是命题和数值事实的组合,动作级别支持执行外部函数和评估算术表达式。每个属于事实级别的数值变量在规划图结构中表示为多值属性。

为了避免对所有可能值进行动作实例化,我们提出了对数值值进行动作的增量实例化。引入了隐式参数和隐式条件的概念,以维护动作与数值事实之间的前提条件边。

以下是适配后的Graphplan算法:

Algorithm-1: Adapted Graphplan with external function application
Input: S0: initial state, G: Goal conditions, Act: Set of actions  
Output: Plan: sequence of ground actions
begin
call initialization(); /* a subroutine that initializes variables*/
/*planning graph construction iterations*/
while (not Stop) do
Actioni:={};
for all a ∈ A do
InstNumeric(preN(a), Facti);
if conN(a) = true in Facti  then
if preP (a) ⊆ Facti and preN (a) are all true in Facti then
InstNumeric(effN (a), Facti);
Actioni:=Actioni ∪ a ;
PointPreconditions(a, Facti);
end if
end if
end for
Actions := Actions ∪ Actioni;
/*Add the facts of previous level with their “no-op” actions”*/
i := i+1;
Facti := Facti-1;
for each f ∈ Facti-1 do
Actioni-1:=Actioni-1 ∪ “no-op”;
end for
/*Apply the applicable instantiated actions*/
for all a ∈ Actioni-1 and a  ≠ “no-op” do
Facti:=Facti ∪ effp+ -  effp- ;
for each e ∈ effN such that e = (n := g) do
if g is an external function then
call the function g;
else
evaluate the expression g;
end if
n=n ∪ g; /*add a new value to the muli-valued attribute n*/
end for
Connect a to its added or deleted effects;
/* an updated numeric value is considered as being deleted than added*/
end for
Facts := Facts ∪ Facti;
calculate the mutex relations for Actioni−1 and add them to MutA;
calculate the mutex relations for Facti and add them to MutF;
nonStop=testForSolution(Facts, Actions, MutF, MutA, G, Plan);
end while
end
5. 启发式搜索

解决与领域无关的规划问题是PSPACE完全问题。为了降低这种复杂性,可以使用启发式函数来引导搜索空间中的规划搜索,而不是使用盲目搜索策略。

5.1 命题任务松弛

通过忽略动作的负效果可以实现命题规划任务的松弛。松弛后的命题规划任务可以在多项式时间内解决。

5.2 数值任务松弛

通过忽略使数值变量值远离目标值的动作的负效果,可以实现数值规划任务的松弛。

以下是一个距离计算的示例:
假设一个数值变量n在初始状态为0,目标状态为5。一个动作将n分别赋值为-3、-1、1、5、7、11。
- 对于v1 = -3,distance(v1, vG) = 8 > distance(vI, vG),因此(v1 = -3) ∈ effN- (a),在松弛任务中被忽略。
- 对于v2 = -1,distance(v2, vG) = 6 > distance(vI, vG),因此(v2 = -1) ∈ effN- (a),在松弛任务中被忽略。
- 对于v3 = 1,distance(v3, vG) = 4 ≤ distance(vI, vG)且distance(vI, v3) = 1 ≤ distance(vI, vG),因此(v3 = 1) ∈ effN+ (a),在松弛任务中保留。
- 对于v4 = 5,distance(v4, vG) = 0 ≤ distance(vI, vG)且distance(vI, v4) = 5 ≤ distance(vI, vG),因此(v4 = 4) ∈ effN+ (a),在松弛任务中保留。
- 对于v5 = 7,distance(v5, vG) = 2 ≤ distance(vI, vG),但distance(vI, v5) = 7 > distance(vI, vG),因此(v5 = 7) ∈ effN- (a),在松弛任务中被忽略。
- 对于v6 = 11,distance(v6, vG) = 6 > distance(vI, vG),因此(v6 = 11) ∈ effN- (a),在松弛任务中被忽略。

5.3 混合规划问题松弛

混合命题和数值规划问题的松弛通过忽略动作的负命题和负数值效果来实现。

6. 应用函数的松弛规划图

与适配后的Graphplan算法中使用的规划图结构类似,松弛规划图由事实级别和动作级别两种类型的级别组成。

6.1 松弛规划提取

一旦使用算法-2构建了松弛规划图,直到达到满足目标条件的级别,就可以通过后向链接应用提取过程。

以下是从松弛规划图中提取计划的算法:

Algorithm-3: Extract plan in backward chaining from the relaxed planning graph
Name: ExtractRelaxedPlan
Input: Facts: Set of fact levels, G: Goal conditions, Actins: Set of action levels  
Output: Plan: sequence of ground actions
begin
Plan:={};
Gfinal_level:= { g ∈ Facts[final_level] / g satisfies G};
for i = final_level to 1 do
Gi-1:={};
for each g ∈ Gi do
acts:= {actions at level final_level-1 that add g};
selAct:= get_first_element_of(acts);
if  act  ≠ “no-op” then
for act ∈ acts do
if  act= ‘no-op’ then
selAct:=act;
break;
end if
// Select the action that has the minimum number of preconditions
if nb_preconditions_of(act)< nb_preconditions_of (selAct) then
selAct:=act;
end if
end for
end if
plan:=plan ∪ selAct;
Gi-1:= Gi-1 ∪ { f ∈ Facts[i-1] s.t. f is a precondition of selAct};
end for
end for
end
6.2 基于应用函数效果的启发式规划器

我们使用的主要搜索算法是一种受启发式h引导的爬山搜索变体。启发式h为搜索空间中的每个状态s计算。在每一步,我们选择具有最低启发式值的子状态作为下一步状态,直到达到启发式值为零的状态。

如果在某个步骤中,算法-2找不到将状态s引导到目标状态的松弛计划,则该步骤的启发式h将被视为无穷大。

在所有上述情况下,如果爬山搜索超过了指定的阈值或搜索未能找到计划,则认为爬山搜索无法找到解决方案,开始A*搜索。

7. 实证结果

我们用Java语言实现了上述所有算法的原型,并在多个重要的数值领域上运行这些算法,如水瓶领域、制造领域、军队部署领域和数值渡轮领域。

我们的测试分为三个阶段:
1. 运行支持执行外部函数的盲目前向规划算法,研究将用宿主编程语言编写的函数集成到规划中的可行性和有效性。
2. 运行适配后的Graphplan算法,为所有问题获得了最优计划,但无法解决大型问题。
3. 在所有上述领域上运行启发式规划器,该规划器可以解决更大的问题,但生成的计划并不总是最优的。

尽管我们在上述阶段中对实现进行了少量优化,但可以得出结论,启发式算法是最有前途的,尽管其计划并非最优。我们认为可以向该算法添加一些额外的约束,以提高计划的质量。

总结

我们提出了多种对经典规划算法的扩展,以允许它们解决更现实的问题。这些问题可能包含任何类型的知识,需要复杂的处理,而现有规划算法尚未支持。

我们建议并测试了将用宿主编程语言编写的外部函数集成到规划中,这些函数可用于处理需要复杂数值计算和条件行为的复杂任务。我们扩展了Graphplan算法以支持执行这些函数,并提出了一种新的方法来松弛动作的数值效果。

根据我们在制造等领域的测试,我们得出结论,调度问题可以完全集成到人工智能规划中,并使用我们的扩展进行解决。未来,我们将尝试测试并可能定制我们的算法,以在一些从运动规划中改编的领域上运行,从而将人工智能规划扩展到涵盖运动规划和其他目前使用数学方法解决的机器人问题。

以下是整个流程的mermaid流程图:

graph LR
    A[开始] --> B[语言扩展]
    B --> C[Graphplan扩展]
    C --> D[启发式搜索]
    D --> E[松弛规划图]
    E --> F[实证结果]
    F --> G[总结与未来工作]
    B --> H[状态空间与动作定义]
    C --> I[Graphplan概述]
    C --> J[Graphplan适配]
    D --> K[命题任务松弛]
    D --> L[数值任务松弛]
    D --> M[混合规划问题松弛]
    E --> N[松弛规划提取]
    E --> O[启发式规划器]

通过以上的扩展和方法,我们有望在人工智能规划领域取得更大的进展,解决更多现实世界中的复杂问题。

扩展人工智能规划以解决更现实的问题

7. 实证结果(续)

在实证测试中,各个阶段都呈现出不同的特点和效果。下面通过表格详细对比各阶段的情况:
| 测试阶段 | 算法 | 解决问题规模 | 计划最优性 | 主要目的 |
| — | — | — | — | — |
| 第一阶段 | 盲目前向规划算法 | 未提及 | 未提及 | 研究集成外部函数到规划的可行性和有效性 |
| 第二阶段 | 适配后的Graphplan算法 | 小型问题 | 最优 | 为问题获取最优计划 |
| 第三阶段 | 启发式规划器 | 大型问题 | 非总是最优 | 解决更大规模的问题 |

从表格中可以清晰地看出,不同阶段的算法在解决问题的规模和计划最优性方面存在差异。第一阶段主要是探索性的,重点在于功能的集成;第二阶段能保证计划最优,但处理大规模问题能力有限;第三阶段虽然计划不一定最优,但能应对更大规模的问题。

8. 总结

我们对经典规划算法进行了多方面的扩展,旨在让其能够应对更现实的问题。这些现实问题往往包含各种类型的知识,需要复杂的处理方式,而现有的规划算法难以满足这些需求。

具体来说,我们做了以下几个关键的扩展:
- 外部函数集成 :建议并测试了将用宿主编程语言编写的外部函数集成到规划中。这些外部函数非常实用,能够处理那些需要复杂数值计算和条件行为的复杂任务。
- Graphplan算法扩展 :对Graphplan算法进行了扩展,使其能够支持外部函数的执行。在这个扩展过程中,我们提出了对数值值进行动作的增量实例化方法,有效限制了地面动作的数量。
- 数值效果松弛 :提出了一种新的方法来松弛动作的数值效果,即忽略使数值变量值远离目标值的效果。利用这种松弛方法,我们提取了启发式信息,并将其应用于启发式规划器中。

根据在制造等领域的测试结果,我们可以得出结论:调度问题能够完全集成到人工智能规划中,并借助我们所提出的扩展方法进行有效解决。

9. 未来展望

展望未来,我们有明确的研究方向和目标。我们计划尝试测试并可能定制我们的算法,使其能够在一些从运动规划中改编的领域上运行。通过这样的尝试,我们希望将人工智能规划的应用范围进一步扩展,使其能够涵盖运动规划以及其他目前主要使用数学方法解决的机器人问题。

以下是未来研究方向的列表:
1. 运动规划领域测试 :在从运动规划改编的领域中对算法进行测试,评估算法在这些领域的性能和适用性。
2. 算法定制优化 :根据测试结果,对算法进行定制和优化,使其更好地适应运动规划和机器人问题的特点。
3. 跨领域应用拓展 :探索将人工智能规划扩展到更多领域的可能性,进一步验证扩展方法的通用性和有效性。

10. 关键技术点回顾

为了帮助大家更好地理解整个扩展过程,下面我们回顾一下关键的技术点:

10.1 语言扩展
  • 外部函数引入 :在PDDL3.0的基础上,引入外部函数来更新数值,支持数学函数和用户定义函数,增强了规划语言的表达能力。
  • 约束与前提条件分离 :将动作定义中的约束与前提条件分离,减少了无用的前提条件测试和内存使用。
10.2 Graphplan扩展
  • 结构适配 :使Graphplan结构能够处理外部函数的执行,通过事实级别和动作级别的设计,支持数值变量的处理和外部函数的执行。
  • 增量实例化 :提出对数值值进行动作的增量实例化,引入隐式参数和隐式条件,维护动作与数值事实的前提条件边。
10.3 启发式搜索
  • 任务松弛 :分别对命题任务、数值任务和混合规划问题进行松弛,通过忽略负效果来简化问题,提高搜索效率。
  • 启发式计算 :利用松弛规划图计算启发式函数,引导搜索过程,降低搜索复杂度。
10.4 松弛规划图
  • 图构建 :构建由事实级别和动作级别组成的松弛规划图,应用正命题和数值效果生成下一个事实级别。
  • 计划提取 :通过后向链接从松弛规划图中提取计划,利用动作边访问所有事实。

以下是关键技术点的mermaid流程图,展示了各技术点之间的关系:

graph LR
    A[语言扩展] --> B[Graphplan扩展]
    B --> C[启发式搜索]
    C --> D[松弛规划图]
    A --> E[外部函数引入]
    A --> F[约束与前提条件分离]
    B --> G[结构适配]
    B --> H[增量实例化]
    C --> I[任务松弛]
    C --> J[启发式计算]
    D --> K[图构建]
    D --> L[计划提取]

通过对这些关键技术点的回顾和总结,我们可以更清晰地看到整个扩展过程的逻辑和架构,也为未来的研究和应用提供了坚实的基础。我们相信,随着技术的不断发展和完善,人工智能规划将在更多领域发挥重要作用,解决更多复杂的现实问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值