Search vs. Planning
• What happens when we try to search in the real world?
• Consider the task of buying a book with ISBN 1234567890.
• The agent has actions of the form Buy(X) where X is a ISBN number.
• Using search, all 10 billion states have to be examined to see if one contains
Have(1234567890), which is the goal test.
• A sensible agent should reason as follows:
I have the goal Have(X) where X = 1234567890. Now Buy(Y ) → Have(Y ).
Therefore
Buy(1234567890) → Have(1234567890).
Therefore, I have to execute Buy(1234567890)
- 我的目标是 Have(X),其中 X = 1234567890。
- 知道 Buy(Y) → Have(Y)(购买Y会导致拥有Y)。
- 因此,Buy(1234567890) → Have(1234567890)(购买ISBN 1234567890的书会导致拥有这本书)。
- 因此,我需要执行 Buy(1234567890)。
-
搜索(Search):
- 在搜索中,智能体通常会从当前状态开始,探索所有可能的状态转换,直到找到满足目标的状态。
- 在上述例子中,这意味着智能体可能会尝试所有可能的购买操作,直到找到正确的ISBN号码。
- 这种方法在状态空间很大时非常低效。
-
规划(Planning):
- 规划则是一种更加高效的方法。在规划中,智能体会首先考虑目标,然后推理出达到目标的行动序列。
- 在购买书的例子中,智能体通过逻辑推理直接得出需要执行的操作,而不需要探索所有可能的状态。
- 规划允许智能体跳过不必要的搜索,直接制定出达到目标的行动计划。
结论:
在现实世界中,规划通常比搜索更为高效,因为它允许智能体利用先验知识和逻辑推理来减少需要探索的状态数量。规划使得智能体能够以一种更为直接和智能的方式达到目标,而不是盲目地搜索整个状态空间。
Problem 1: overwhelming number of irrelevant actions 无关操作
Problem 2: Identifying a good heuristic function 启发式函数确定
Problem 3: Problem decomposition 问题分解
• What if we are trying to buy 4 rather than 1 book?
There are 1040 plans of 4 steps, we need a heuristic function.
• But each domain needs a new new heuristic function
• We need to use a domain-independent heuristic to allow the agent to function in any
situation.
• If we have goals of the form
Have(A) ∧ Have(B) ∧ Have(C) ∧ Have(D),
a state containing Have(A) ∧ Have(C) would have cost 2.
Representing our domain in this way automatically gives us a useful heuristic
计划的数量
- 如果每本书的购买是一个单独的步骤,那么在4个步骤内完成购买的计划数量是巨大的。具体来说,如果每本书的购买都是独立的,那么可能的计划组合数量是 10401040(假设每本书有10种选择)。
需要启发式函数
- 在这样的巨大搜索空间中,智能体需要一种方法来有效地选择最有可能成功的路径。这就是启发式函数的用武之地。启发式函数可以估计从当前状态到目标状态的代价,从而指导搜索过程。
启发式函数的领域依赖性
- 每个不同的领域可能需要不同的启发式函数。例如,购买书籍的启发式函数可能与机器人导航或任务调度的启发式函数完全不同。
需要领域无关的启发式函数
- 为了让智能体能够在任何情况下都能有效地工作,我们需要一个领域无关的启发式函数。这样的启发式函数不依赖于特定领域的知识,可以在多种不同的环境中使用。
目标的表示
- 如果我们的目标是形式化的,这意味着我们需要同时拥有A、B、C和D四本书。
启发式函数的应用
- 在这个例子中,如果某个状态包含了 Have(A) ∧ Have(C),那么距离目标状态的估计代价是2,因为还缺少 Have(B) 和 Have(D)。
- 将我们的领域表示为这种形式,自动为我们提供了一个有用的启发式函数。这个启发式函数可以是“未满足的目标数量”。在这种情况下,启发式函数的值就是剩余需要购买的书籍数量。
启发式函数的具体例子
- 未满足目标数量启发式:这个启发式函数简单地计算当前状态下未满足的目标数量。在上面的例子中,如果一个状态已经拥有了A和C,那么启发式函数的值就是2,因为还有两个目标(B和D)没有满足。
- 最大剩余成本启发式:这个启发式函数可以估计完成所有未满足目标所需的最大成本。
• Problem: delivering packages to various locations
• It makes sense to decompose the problem, finding the nearest airport for each
destination and dividing the overall problem into one subproblem for each airport.
• If it takes O(n!) time to find the best plan in the original case, it will only take
(O(n/k)! × k) time if we can decompose the problem into k equal parts
- 假设我们有 10 个包裹需要递送(n = 10),并且我们可以将问题分解成 2 个子问题(k = 2)。
- 在没有分解的情况下,找到最佳计划的时间复杂度可能是 O(10!)。
- 分解后,每个子问题处理 5 个包裹,时间复杂度是 O(5!)。
- 因此,总时间复杂度将是 O(5! × 2),这比 O(10!) 要小得多。
• A standard representation of the planning problem – states, actions and goals –
make it possible for algorithms to take advantage of the structure of the problem.
— We need to find a representation that is expressive enough to describe many problems.
— But this representation must be restrictive enough to allow efficient algorithms to exist.
态、动作和目标的表示
- 状态:描述了问题在特定时间点的配置,包括所有相关的变量和它们的值。
- 动作:定义了智能体可以执行的操作,这些操作能够将问题从一种状态转换到另一种状态。
- 目标:描述了智能体试图达到的状态或条件。
表示方法的要求
-
足够的表现力:
- 表示方法必须足够丰富,能够描述许多不同类型的问题。
- 这意味着表示方法应该能够处理各种复杂性和多样性,包括不同的变量、约束和目标。
-
适当的限制性:
- 虽然表示方法需要具有表现力,但它也必须足够限制,以便存在高效的算法来解决这些问题。
- 过于复杂的表示方法可能会导致算法的搜索空间过大,从而使得找到解决方案变得不切实际。
平衡表现力和限制性
-
表达力的需求:
- 我们需要一个能够描述多种问题的表示方法,例如从简单的机器人导航到复杂的供应链管理。
- 这种表示方法应该允许我们定义各种状态、动作和目标,以及它们之间的关系。
-
限制性的需求:
- 表示方法需要有一定的结构,这样算法才能利用这种结构来高效地搜索解决方案。
- 例如,通过限制动作的格式或状态转换的规则,算法可以更快地排除不可能的路径。
例子
- 在STRIPS(Stanford Research Institute Problem Solver)表示法中,规划问题被表示为一组状态变量、初始状态、动作和目标状态。
- 状态变量可以是布尔值,表示某种条件是否成立。
- 动作被定义为预条件和效果,预条件是执行动作之前必须满足的条件,效果是执行动作后状态的变化。
• Planning systems do the following:
— open up action and goal representation to allow selection
— divide-and-conquer by subgoaling
— relax requirement for sequential construction of solutions
-
动作和目标表示的开放性:
- 规划系统中的动作和目标表示必须是可访问的,以便系统能够在不同的规划阶段进行评估和选择。
- 例如,系统可能需要根据当前状态选择一个动作,该动作能够最大限度地减少到目标的距离。
-
子目标的划分:
- 子目标划分是一种常见的技术,它将大问题分解为更小、更易于管理的问题。
- 例如,如果一个目标要求智能体同时完成多个任务,规划系统可能会将这些任务作为独立的子目标来处理。
-
放宽顺序构建要求:
- 在传统规划中,解决方案的构建通常是顺序的,每一步都基于前一步的结果。
- 然而,通过放宽这一要求,规划系统可以采用更灵活的方法,如并行规划或启发式搜索,这些方法可以在不完全了解整个解决方案的情况下进行规划。
STRIPS
• One basic language is STRIPS
(Stanford Research Institute Problem Solver).
• There have been many extensions and variations of this basic language.
• PDDL (version 3.1) is a more modern planning language, but at its heart, there are
still many similarities to STRIPS.
• Tidily arranged action descriptions, restricted language
Action: Buy(x)
Precondition: At(p), Sells(p,x)
Effect: Have(x)
• Restricted language ⇒ efficient algorithms
TRIPS的基本概念
- 动作描述:在STRIPS中,动作被清晰地排列和组织。每个动作都有一个名称和与之相关的前提条件(preconditions)和效果(effects)。
- 受限语言:STRIPS使用一种受限的语言来描述动作,这意味着动作的描述遵循严格的格式,这有助于算法理解和处理。
动作描述的例子
- 动作:Buy(x)
- 前提条件:At(p), Sells(p,x)
- 效果:Have(x)
- 这个例子中,动作“Buy(x)”表示购买某个物品x。要执行这个动作,必须满足两个前提条件:智能体必须在位置p(At(p)),并且位置p有销售物品x(Sells(p,x))。执行这个动作的效果是智能体将拥有物品x(Have(x))。
受限语言的优势
- 高效算法:由于STRIPS语言受限,它为开发高效规划算法提供了便利。受限的语言意味着算法可以:
- 更容易地解析和验证动作描述。
- 快速地确定哪些动作在给定的状态下是可应用的。
- 高效地搜索从当前状态到目标状态的动作序列。
States
• A state is represented as a conjunction of positive literals
• We can consider propositional literals (e.g. Rich ∧ Happy)
• Typically, we will use first order literals, e.g.
At(Plane1, Melbourne) ∧ At(Plane2, Sydney)
• Within a state description, such first order literals must be ground and function free
• The closed world assumption is used; any condition not mentioned is false
At(x, y), At(Father (Fred ), Sydney))
Father (Fred , Bob) ∧ At(Bob, Sydney)
态的表示
-
作为肯定文字的合取:
- 在规划问题中,状态被表示为一组肯定文字(literals)的合取(conjunction)。
- 文字是逻辑表达式的基本单位,它可以是一个原子命题或其否定。
-
命题文字:
- 命题文字是没有变量的简单布尔值表达式,例如 “Rich” 和 “Happy”。
- 在状态表示中,可以组合这些命题文字,如 “Rich ∧ Happy”,表示智能体同时是富有的和快乐的。
-
一阶文字:
- 通常情况下,规划问题使用一阶文字,这些文字包含变量和谓词,例如 “At(Plane1, Melbourne)” 和 “At(Plane2, Sydney)”。
- 这些文字提供了更丰富的表达方式,可以描述更复杂的状态。
一阶文字的规则
-
地面文字和无函数:
- 在状态描述中,一阶文字必须是地面文字(ground literals),这意味着它们不能包含任何未绑定的变量。
- 此外,这些文字应该是无函数的,即它们不包含任何函数符号。
-
封闭世界假设:
- 在规划中,通常使用封闭世界假设(closed world assumption),这意味着任何在状态描述中未明确提及的条件都被假定为假。
- 例如,如果状态描述中没有提及 “At(x, y)”,那么就假设 “¬At(x, y)” 为真。
例子
- 状态描述:
- “At(Plane1, Melbourne) ∧ At(Plane2, Sydney)” 表示飞机1在墨尔本,飞机2在悉尼。
- “Father(Fred, Bob) ∧ At(Bob, Sydney)” 表示Fred是Bob的父亲,且Bob在悉尼。
注意事项
- 在状态描述中,所有的文字都应该清晰且无歧义,以确保规划算法能够正确理解和处理这些信息。
- 封闭世界假设简化了规划问题,因为它减少了需要考虑的状态空间。然而,这也意味着规划器不能处理那些可能在未明确提及的情况下为真的情况。
Goal Representation
• Goals are partially specified states, represented as conjunctions of positive ground
literals
Rich ∧ Famous
At(Plane2, Johannesburg)
• A state s satisfies a goal if s contains all the atoms in the goal (and possibly others).
Rich ∧ Famous ∧ Miserable
Rich ∧ Famous ∧ Happy
目标的表示
-
部分指定状态:
- 目标在规划问题中被表示为部分指定的状态,这意味着它们只描述了智能体希望达到的某些条件,而不是整个世界的完整状态。
-
作为肯定地面文字的合取:
- 目标通常被表示为一组肯定地面文字(positive ground literals)的合取。
- 地面文字是指不包含任何变量的文字,这使得目标具体且明确。
目标的例子
- 简单目标:
- “Rich ∧ Famous” 表示智能体的目标是要同时变得富有和出名。
- “At(Plane2, Johannesburg)” 表示智能体的目标是要让飞机2到达约翰内斯堡。
目标满足条件
- 状态满足目标:
- 一个状态 s 满足一个目标,如果 s 包含目标中所有的原子(atoms)。
- 这意味着,只要状态 s 中存在目标中所有的条件,那么就认为目标已经达成,无论状态 s 中是否还有其他条件。
例子
- 状态与目标的关系:
- 假设目标为 “Rich ∧ Famous”。
- 状态 “Rich ∧ Famous ∧ Miserable” 满足该目标,因为尽管它还包含额外的条件 “Miserable”,但它包含了目标中所有的条件 “Rich” 和 “Famous”。
- 同样,状态 “Rich ∧ Famous ∧ Happy” 也满足该目标。
Actions
• An action is specified in terms of
— The preconditions that must hold before it can be executed. The effects that occur
when it is executed
Action(Fly(p, from, to),
PRECOND: At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)
EFFECTS: ¬At(p, from) ∧ At(p, to))
• Positive literals are added to the state, negative literals are removed
• Some planning systems use an add and delete lists
动作的指定
-
前提条件(Preconditions):
- 动作执行之前必须为真的条件。如果前提条件不满足,动作就不能被执行。
- 前提条件通常用肯定文字(positive literals)表示。
-
效果(Effects):
- 动作执行后发生的状态变化。效果可以是添加新的状态条件或删除现有的状态条件。
- 效果可以包含肯定文字和否定文字(negative literals)。
动作的例子
- 动作定义:
- 例如,一个动作 “Fly(p, from, to)” 可以表示飞机 p 从一个机场 from 飞行到另一个机场 to。
- 该动作的前提条件是 “At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)”,表示飞机 p 必须在机场 from,p 必须是一架飞机,from 和 to 必须是机场。
- 该动作的效果是 “¬At(p, from) ∧ At(p, to)”,表示飞机 p 将不再在机场 from,而是到达机场 to。
状态变化的处理
- 添加和删除文字:
- 在执行动作时,肯定文字被添加到当前状态中,而否定文字则从当前状态中移除。
- 例如,在上述 “Fly” 动作中,“At(p, to)” 是被添加到状态中的肯定文字,而 “¬At(p, from)” 是从状态中移除的否定文字。
规划系统中的实现
- 添加和删除列表:
- 一些规划系统使用添加列表(add list)和删除列表(delete list)来管理动作的效果。
- 添加列表包含所有在执行动作后应该添加到状态中的文字。
- 删除列表包含所有在执行动作后应该从状态中移除的文字。
动作的表示是自动规划中的关键组成部分,它们通过定义前提条件和效果来描述如何从一种状态转换到另一种状态。规划器使用这些动作定义来生成从当前状态到目标状态的一系列步骤。通过明确地表示哪些条件必须为真才能执行动作,以及执行动作后状态如何变化,规划器可以有效地搜索出达到目标的路径。
Actions vs. Action Schemas
Action(Fly(p, from, to),
PRECOND: At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)
EFFECTS: ¬At(p, from) ∧ At(p, to))
• This is an action schema; it captures a set of actions that can be obtained by
instantiating the variables to different constants
— Action name and parameter list
— Precondition
— Effect
动作(Action)
- 定义:动作是一个具体的操作,它描述了智能体在特定情境下可以执行的单个行为。
- 例子:在之前的例子中,“Fly(p, from, to)” 是一个具体的动作,它表示飞机 p 从机场 from 飞行到机场 to。
动作模式(Action Schema)
- 定义:动作模式是一个更为通用的模板,它通过变量来表示动作的参数,可以用来生成多个具体的动作实例。
- 组成部分:
- 动作名称和参数列表:动作模式包括一个动作名称(如 “Fly”)和一组参数(如 p, from, to),这些参数在具体实例化时会被赋予不同的常量。
- 前提条件:动作模式中的前提条件(如 “At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)”)定义了执行该动作所需满足的条件。
- 效果:动作模式中的效果(如 “¬At(p, from) ∧ At(p, to)”)描述了执行动作后状态的变化。
动作模式与动作的关系
- 实例化:动作模式通过将变量实例化为具体的常量来生成动作。例如,动作模式 “Fly(p, from, to)” 可以实例化为 “Fly(Plane1, Melbourne, Johannesburg)”,这是一个具体的动作。
- 通用性:动作模式提供了一种通用的方式来描述一类动作,而不必为每个可能的具体动作单独定义。
例子
- 动作模式的实例化:
- 假设有一个动作模式 “Fly(p, from, to)”,其中 p 是飞机的编号,from 和 to 是机场的名称。
- 通过将 p 实例化为 “Plane1”,from 实例化为 “Melbourne”,to 实例化为 “Johannesburg”,我们可以得到一个具体的动作 “Fly(Plane1, Melbourne, Johannesburg)”。
结论
动作模式是自动规划中表示动作的一种强大工具,因为它允许规划器通过实例化参数来生成多个具体的动作,而不需要为每个可能的动作单独定义。这种方法提高了规划表示的灵活性和可扩展性,使得规划系统能够处理更广泛的问题。通过使用动作模式,规划器可以更加高效地搜索解决方案,因为它可以基于模式来推理,而不是处理每个单独的动作。
Syntax and Semantics
• We have defined the syntax of STRIPS.
• What are its semantics?
• We specify these by describing how actions affect states.
Semantics
• An action is applicable in any state that satisfies the precondition.
• For the first order action schema, determining applicability requires determining
whether a legal substitution exists for variables in the precondition.
— At(P1 , JFK ) ∧ At(P2 , SFO) ∧ Plane(P1 ) ∧ Plane(P2 ) ∧ Airport(JFK ) ∧
Airport(SFO)
— At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)
{p/P1, from/JFK , to/SFO}
• The concrete action Fly(P1 , JFK , SFO) is applicable.
• Starting in a state s, the result of executing an applicable action a is a new state s′,
which is identical except
— Any positive literal P in the effects of a is added to s′
— Any negative literal ¬P in the effects of a is removed from s′
• States are sets, if a positive effect is already there, we don’t re-add it; if a negative
effect is not present, then that part of the effect is ignored.
• The STRIPS assumption: any literal not mentioned in the effect remains unchanged.
— STRIPS thus overcomes the frame problem.
STRIPS的语义
-
动作适用性:
- 动作在满足其前提条件的状态中是适用的。
- 对于一阶动作模式,确定动作的适用性需要确定在前提条件中是否存在合法的变量替换。
-
一阶动作模式的适用性:
- 例如,对于动作模式 “Fly(p, from, to)”,其前提条件是 “At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)”。
- 在这个例子中,我们需要找到一组合法的替换,使得这些替换后的文字在当前状态中为真。
- 如果存在这样的替换,那么具体的动作 “Fly(P1, JFK, SFO)” 就是适用的。
动作执行的结果
-
状态转换:
- 如果在状态 s 中,一个动作 a 是适用的,那么执行 a 会导致状态 s 变为一个新的状态 s′。
- s′ 除了在效果中提到的正文字 P 被添加到 s′ 中,负文字 ¬P 从 s′ 中被移除外,与 s 完全相同。
-
状态集的特性:
- 如果 s′ 中已经存在正效果 P,那么 P 不会被重新添加;如果 s′ 中不存在负效果 ¬P,那么 ¬P 将被忽略。
STRIPS假设
- 封闭世界假设:
- STRIPS假设任何在效果中未提及的文字保持不变。
- 这意味着如果一个文字不在效果中,那么它在状态转换后仍然保持不变。
解决框架问题
- STRIPS与框架问题:
- STRIPS通过其动作的语义,解决了框架问题(Frame Problem)。
- 框架问题是指在规划中如何处理状态变化时,哪些信息应该被保留,哪些信息应该被忽略的问题。
- STRIPS通过封闭世界假设,确保了状态中的信息在执行动作后不会丢失,从而有效地解决了框架问题。
结论
STRIPS的语义定义了动作在何种状态下是适用的,以及它们如何影响状态。通过描述动作如何改变状态,STRIPS提供了一种机制来评估动作的适用性,并基于这些评估来生成规划解决方案。这种方法使得规划器能够有效地处理复杂的问题,并找到从初始状态到目标状态的路径。STRIPS的语义设计使得规划系统能够避免框架问题,确保状态信息在规划过程中的正确处理。
Example
• Action
Action(Fly(p, from, to),
P RE C ON D : At(p, f rom) ∧ P lane(p) ∧ Airport(f rom) ∧ Airport(to)
E F F E C T S : ¬At(p, f rom) ∧ At(p, to))
• State
At(C1, S F O) ∧ At(C2, J F K) ∧ At(P1, S F O) ∧ At(P2, J F K) ∧ C arg o(C1) ∧
C arg o(C2) ∧ P lane(P1) ∧ P lane(P2) ∧ Airport(S F O) ∧ Airport(J F K)
• Result of applying F ly(P1, S F O, J F K) to previous state
示例中的动作和状态
-
动作定义:
- “Fly(p, from, to)” 是一个具体的动作,表示飞机 p 从机场 from 飞行到机场 to。
- 前提条件是 “At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)”,表示飞机 p 必须在机场 from,p 必须是一架飞机,from 和 to 必须是机场。
- 效果是 “¬At(p, from) ∧ At(p, to)”,表示飞机 p 将不再在机场 from,而是到达机场 to。
-
状态描述:
- “At(C1, SFO) ∧ At(C2, JFK) ∧ At(P1, SFO) ∧ At(P2, JFK) ∧ Cargo(C1) ∧ Cargo(C2) ∧ Plane(P1) ∧ Plane(P2) ∧ Airport(SFO) ∧ Airport(JFK)” 描述了当前的状态。
- 其中,C1 和 C2 是货物,P1 和 P2 是飞机,它们分别在 SFO 和 JFK 机场。
应用动作的结果
-
动作适用性:
- 在给定的状态中,动作 “Fly(P1, SFO, JFK)” 是适用的,因为前提条件 “At(P1, SFO) ∧ Plane(P1) ∧ Airport(SFO) ∧ Airport(JFK)” 在当前状态中为真。
-
状态转换:
- 执行 “Fly(P1, SFO, JFK)” 会导致状态发生以下变化:
- 添加 “¬At(P1, SFO)” 到状态中,表示 P1 不再在 SFO。
- 添加 “At(P1, JFK)” 到状态中,表示 P1 已经到达 JFK。
- 由于状态中已经存在 “At(P1, SFO)”,所以 “¬At(P1, SFO)” 会被添加,而 “At(P1, JFK)” 不会被重新添加。
- 状态中的其他条件保持不变。
- 执行 “Fly(P1, SFO, JFK)” 会导致状态发生以下变化:
示例的完整结果
- 应用动作后的状态:
- 执行 “Fly(P1, SFO, JFK)” 后,状态变为 “At(C1, SFO) ∧ At(C2, JFK) ∧ At(P1, JFK) ∧ At(P2, JFK) ∧ Cargo(C1) ∧ Cargo(C2) ∧ Plane(P1) ∧ Plane(P2) ∧ Airport(SFO) ∧ Airport(JFK)”。
• A solution for a planning problem is an action sequence that, when executed in the
initial state, results in a state that satisfies the goal.
• This is a simple form of the solution concept, we will encounter more complex ones later.
-
动作序列:
- 解决方案由一系列的动作组成,这些动作按照特定的顺序执行。
- 每个动作都有其自己的前提条件和效果,这些条件和效果定义了动作如何改变状态。
-
初始状态:
- 解决方案开始于规划问题的初始状态,这是规划过程的起点。
- 初始状态描述了问题开始时的世界状态,包括所有相关的变量和它们的值。
-
目标状态:
- 解决方案的最终目标是达到一个状态,这个状态满足规划问题的目标。
- 目标状态定义了智能体需要达成的条件,它是规划过程的终点。
Example
Init(At(C1, SFO) ∧ At(C2, JFK ) ∧ At(P1, SFO) ∧ At(P2, JFK )
∧ Cargo(C1) ∧ Cargo(C2) ∧ Plane(P1) ∧ Plane(P2)
∧ Airport (JFK ) ∧ Airport(SFO))
Goal (At(C1, JFK ) ∧ At(C2, SFO))
Action(Load (c, p, a),
PRECOND: At(c, a) ∧ At(p, a) ∧ Cargo(c) ∧ Plane(p) ∧ Airport (a)
EFFECT: ¬ At(c, a) ∧ In(c, p))
Action(Unload (c, p, a),
PRECOND: In(c, p) ∧ At(p, a) ∧ Cargo(c) ∧ Plane(p) ∧ Airport(a)
EFFECT: At(c, a) ∧ ¬ In(c, p))
Action(Fly (p, from, to),
PRECOND: At(p, from) ∧ Plane(p) ∧ Airport(from) ∧ Airport(to)
EFFECT: ¬ At(p, from) ∧ At(p, to))
示例中的初始状态和目标
-
初始状态:
- “Init(At(C1, SFO) ∧ At(C2, JFK) ∧ At(P1, SFO) ∧ At(P2, JFK) ∧ Cargo(C1) ∧ Cargo(C2) ∧ Plane(P1) ∧ Plane(P2) ∧ Airport(JFK) ∧ Airport(SFO))” 描述了问题开始时的状态。
- 其中,C1 和 C2 是货物,P1 和 P2 是飞机,它们分别在 SFO 和 JFK 机场,且都装有货物。
-
目标状态:
- “Goal (At(C1, JFK) ∧ At(C2, SFO))” 定义了规划问题的目标。
- 智能体的目标是将 C1 货物从 JFK 机场转移到 SFO 机场,同时将 C2 货物从 SFO 机场转移到 JFK 机场。
示例中的动作
-
动作定义:
- “Load(c, p, a)” 动作表示在机场 a 处将货物 c 装载到飞机 p 上。
- “Unload(c, p, a)” 动作表示在机场 a 处将货物 c 从飞机 p 上卸载下来。
- “Fly(p, from, to)” 动作表示飞机 p 从机场 from 飞到机场 to。
-
动作的前提条件和效果:
- 这些动作都有特定的前提条件和效果,这些条件和效果定义了动作如何改变状态。
解决方案
-
可能的解决方案:
- 智能体可以通过执行一系列的动作来达到目标状态。
- 一个可能的解决方案是:
- 执行 “Load(C1, P1, JFK)” 和 “Load(C2, P2, SFO)”,将 C1 货物装载到 P1 飞机上,并将 C2 货物装载到 P2 飞机上。
- 执行 “Fly(P1, JFK, SFO)”,将 P1 飞机从 JFK 机场飞到 SFO 机场。
- 执行 “Unload(C1, P1, SFO)”,将 C1 货物从 P1 飞机上卸载下来。
- 执行 “Fly(P2, SFO, JFK)”,将 P2 飞机从 SFO 机场飞到 JFK 机场。
- 执行 “Unload(C2, P2, JFK)”,将 C2 货物从 P2 飞机上卸载下来。
-
状态转换:
- 执行这些动作后,状态将按照预期的目标状态变化。