25、搜索算法与因果图启发式方法详解

搜索算法与因果图启发式方法详解

1. 搜索组件概述

在完成翻译和知识编译的准备步骤后,搜索组件开始执行寻找计划的实际工作。Fast Downward 的搜索组件有多种执行方式,主要有三种基本搜索算法可供选择:
1. 贪心最佳优先搜索 :这是一种标准的教科书算法,通过延迟启发式评估技术进行了改进,以减轻宽分支的负面影响。该算法还进行了扩展,以处理首选操作符,类似于 FF 的有用动作。Fast Downward 将此算法与因果图启发式方法结合使用。
2. 多启发式最佳优先搜索 :这是贪心最佳优先搜索的一种变体,使用多个启发式估计器评估搜索状态,并为每个估计器维护单独的开放列表。它也支持使用首选操作符。Fast Downward 将此算法与因果图和 FF 启发式方法结合使用。
3. 聚焦迭代扩展搜索 :这是一种简单的搜索算法,不使用启发式估计器,而是通过关注从因果图派生的有限操作符集来减少搜索可能性。这是一种实验性算法,未来有望进一步发展。

对于前两种启发式搜索算法,还需要对首选操作符的使用做出选择,有以下五种选项:
1. 不使用首选操作符。
2. 使用因果图启发式的有用转换作为首选操作符。
3. 使用 FF 启发式的有用动作作为首选操作符。
4. 使用有用转换作为首选操作符,如果当前搜索状态中没有有用转换,则退而使用有用动作。
5. 同时使用有用转换和有用动作作为首选操作符。

这五种选项可以与两种启发式搜索算法任意组合,因此搜索组件总共有十一种可能的设置,其中十种使用启发式算法,一种使用聚焦迭代扩展搜索。此外,搜索组件还可以通过内部调度器并行执行多个替代配置。

搜索算法 首选操作符选项
贪心最佳优先搜索 不使用、因果图有用转换、FF 有用动作、有用转换优先、两者都用
多启发式最佳优先搜索 不使用、因果图有用转换、FF 有用动作、有用转换优先、两者都用
聚焦迭代扩展搜索

下面是搜索组件选择流程的 mermaid 流程图:

graph LR
    A[选择搜索算法] --> B{是否为启发式算法}
    B -- 是 --> C[选择首选操作符选项]
    B -- 否 --> D[聚焦迭代扩展搜索]
    C --> E[确定最终配置]
    D --> E

2. 因果图启发式方法

2.1 因果图启发式的概念视图

因果图启发式是 Fast Downward 启发式搜索引擎的核心。对于每个状态变量 v 以及每对值 d, d′ ∈ Dv,因果图启发式计算将 v 的值从 d 更改为 d′ 的启发式估计成本 costv(d, d′),假设所有其他状态变量的值与当前状态相同。给定状态 s 的启发式估计是所有定义了目标条件 s⋆(v) 的变量 v 的成本 costv(s(v), s⋆(v)) 之和。

概念上,成本估计是逐个变量计算的,并以自底向上的方式遍历(修剪后的)因果图。对于因果图中没有前驱的变量,costv(d, d′) 等于(修剪后的)域转换图 DTG(v) 中从 d 到 d′ 的最短路径成本。对于其他变量,成本估计也通过域转换图中的图搜索计算,但在路径规划时必须考虑转换条件。

以下是计算成本的伪代码:

algorithm compute-costs-bottom-up(Π, s):
    for each variable v in a bottom-up traversal of the pruned causal graph:
        Let V′ be the set of immediate predecessors of v
            in the pruned causal graph.
        for each pair of values ⟨d, d′⟩∈Dv × Dv:
            Generate the following planning task Πv,d,d′:
                — Variables: V′ ∪{v}.
                — Initial state: v = d and v′ = s(v′) for all v′ ∈V′.
                — Goal: v = d′.
                — Axioms and operators:
                    1. Those corresponding to transitions
                        in the pruned DTG of v.
                    2. For all variables v′ ∈V′ and values e, e′ ∈Dv′,
                        an operator with precondition v′ = e,
                        effect v′ = e′, and cost cost′
                        v(e, e′).
                    { All variables v′ ∈V′ have been considered
                        previously, so their cost values are known. }
            Set costv(d, d′) to the cost of a plan π that solves Πv,d,d′.

2.2 因果图启发式的计算

实际计算因果图启发式时,从目标变量开始以自顶向下的方式遍历因果图,这也是 Fast Downward 名称的由来。在自顶向下遍历中计算成本估计时,算法通常还不知道其因果前驱状态变化的成本,通过递归调用自身来评估依赖变量的成本值。

对于给定的变量 - 值对 v = d,会同时计算所有 d′ ∈ Dv 的成本 costv(d, d′),类似于 Dijkstra 算法计算从单个源到所有可能目标顶点的最短路径。计算所有 d′ 的成本并不比只计算一个值贵多少,并且一旦确定了所有成本值,就可以缓存并在后续计算中重用。

计算成本的实现遵循 Dijkstra 算法,优先队列实现为桶向量以实现最大速度,并使用缓存避免为同一状态生成相同的 costv(d, d′) 值。此外,还使用了一个全局缓存,对于修剪后因果图中祖先较少的变量 v,只需计算一次 costv(d, d′) 值。

以下是具体的实现代码:

algorithm compute-costs(Π, s, v, d):
    Let V′ be the set of immediate predecessors of v
        in the pruned causal graph of Π.
    Let DTG be the pruned domain transition graph of v.
    costv(d, d) := 0
    costv(d, d′) := ∞ for all d′ ∈Dv \ {d}
    local-stated := s restricted to V′
    unreached := Dv
    while unreached contains a value d′ ∈Dv with costv(d, d′) < ∞:
        Choose such a value d′ ∈unreached minimizing costv(d, d′).
        unreached := unreached \ {d′}
        for each transition t in DTG from d′ to some d′′ ∈unreached:
            transition-cost := 0 if v is derived; 1 if v is a fluent
            for each pair v′ = e′ in the condition of t:
                e := local-stated′(v′)
                call compute-costs(Π, s, v′, e).
                transition-cost := transition-cost + costv′(e, e′)
            if costv(d, d′) + transition-cost < costv(d, d′′):
                costv(d, d′′) := costv(d, d′) + transition-cost
                local-stated′′ := local-stated′
                for each pair v′ = e′ in the condition of t:
                    local-stated′′(v′) := e′

2.3 具有无限启发式值的状态

由于 Fast Downward 使用的是不完全规划算法来确定局部规划任务的解决方案,因此可能存在 costv(s(v), s⋆(v)) = ∞ 的状态,但目标条件 v = s⋆(v) 仍然可以达到。所以不能信任因果图启发式返回的无限值。在实际经验中,从具有无限启发式评估的状态仍能到达目标的情况很少,因此将此类状态视为死路。

如果搜索前沿的所有状态都是死路,则无法使用因果图启发式继续进行搜索。此时,使用可靠的死路检测程序验证启发式评估。如果所有前沿状态确实都是死路,则报告任务不可解;否则,使用 FF 启发式重新启动搜索。

2.4 有用转换

受 Hoffmann 在 FF 规划器中成功使用有用动作的启发,在计算因果图启发式的算法中进行了扩展,使其除了启发式估计外,还生成一组被认为有助于引导搜索朝着目标前进的适用操作符。

计算有用转换的方法是,在计算定义了目标条件的变量 v 的启发式估计 costv(s(v), s⋆(v)) 后,查看 v 的域转换图,追踪从 s(v) 到 s⋆(v) 的转换路径。特别是考虑这条路径上的第一个转换,如果该转换对应一个适用的操作符,则将该操作符视为有用转换;如果转换由于其关联条件 v′ = e′ 未满足而不对应适用操作符,则递归地在每个此类变量 v′ 的域转换图中查找有用转换。

递归过程会一直持续,直到找到所有有用转换。与 FF 不同,在某些情况下可能根本找不到有用转换,但有用转换仍然是引导最佳优先搜索算法的有用工具。

3. 搜索算法与启发式方法的组合与应用

3.1 搜索算法与首选操作符的组合

前面提到搜索组件有三种基本搜索算法和五种首选操作符的使用选项,它们可以组合出多种配置。具体组合情况如下表所示:
|搜索算法|不使用首选操作符|使用因果图有用转换|使用 FF 有用动作|有用转换优先|两者都用|
| ---- | ---- | ---- | ---- | ---- | ---- |
|贪心最佳优先搜索|配置 1|配置 2|配置 3|配置 4|配置 5|
|多启发式最佳优先搜索|配置 6|配置 7|配置 8|配置 9|配置 10|
|聚焦迭代扩展搜索|配置 11| - | - | - | - |

这些不同的配置可以根据具体的问题场景和需求进行选择,以达到更好的搜索效果。例如,对于某些问题,使用多启发式最佳优先搜索并结合两种启发式的有用操作符(配置 10)可能会更快地找到解决方案;而对于另一些问题,简单的贪心最佳优先搜索不使用首选操作符(配置 1)可能就足够了。

3.2 并行执行配置

搜索组件还可以通过内部调度器并行执行多个替代配置。例如,在某些情况下,会同时运行启发式搜索算法的一种配置和聚焦迭代扩展搜索。以下是并行执行配置的 mermaid 流程图:

graph LR
    A[开始搜索] --> B{选择并行配置}
    B -- 是 --> C[并行执行启发式搜索和聚焦迭代扩展搜索]
    B -- 否 --> D[选择单一配置执行]
    C --> E{是否找到解决方案}
    D --> E
    E -- 是 --> F[输出解决方案]
    E -- 否 --> G[结束搜索,无解决方案]

在并行执行时,不同的配置可以同时探索不同的搜索路径,提高找到解决方案的概率和效率。例如,在某些比赛中,就采用了这种并行执行的方式,不同的配置在各自的搜索空间中进行探索,一旦有一个配置找到解决方案,整个搜索过程就可以结束。

4. 总结与实际应用考虑

4.1 搜索算法的特点总结

不同的搜索算法具有不同的特点和适用场景:
- 贪心最佳优先搜索 :通过延迟启发式评估和处理首选操作符,在处理宽分支问题和引导搜索方向上有一定优势。它结合因果图启发式方法,能够利用因果图的信息来估计成本,从而更有针对性地进行搜索。
- 多启发式最佳优先搜索 :使用多个启发式估计器,能够从不同的角度评估搜索状态,增加了搜索的多样性和灵活性。结合因果图和 FF 启发式方法,可以充分利用两种启发式的优势,提高搜索效率。
- 聚焦迭代扩展搜索 :不依赖启发式估计器,而是通过聚焦因果图派生的有限操作符集来减少搜索空间。虽然是实验性算法,但对于某些特定问题可能具有独特的优势。

4.2 实际应用中的选择建议

在实际应用中,选择合适的搜索算法和配置需要考虑以下因素:
- 问题的复杂度 :对于简单的问题,贪心最佳优先搜索可能就足够了;而对于复杂的问题,多启发式最佳优先搜索或并行执行多种配置可能更合适。
- 搜索空间的大小 :如果搜索空间非常大,聚焦迭代扩展搜索可以通过限制操作符集来减少搜索的可能性;如果搜索空间相对较小,启发式搜索算法可以更有效地利用启发式信息进行搜索。
- 目标的明确性 :如果目标比较明确,因果图启发式方法可以更好地引导搜索;如果目标不太明确,FF 启发式或多种启发式的组合可能更有帮助。

4.3 启发式方法的重要性

因果图启发式和 FF 启发式在搜索过程中都起着重要的作用。因果图启发式通过分析因果图的结构和变量之间的关系,能够更准确地估计达到目标的成本;FF 启发式则通过生成松弛规划任务的计划来提供有用的动作信息。有用转换和有用动作的引入,进一步增强了启发式方法在引导搜索方向上的能力,使得搜索算法能够更快地找到解决方案。

总之,在实际应用中,需要根据具体的问题特点和需求,综合考虑搜索算法和启发式方法的选择和组合,以达到最佳的搜索效果。同时,不断探索和改进这些算法和方法,也是提高规划效率和解决复杂问题能力的关键。

Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑用户体验的优化,从而提升整体开发效率软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值