假设你要在家里办一场十人规格的答谢宴。站在厨房门口,你面对的是十几口锅、一张长长的采购清单和四小时的倒计时。如果“办一场好饭”整件事直直压在头上,几乎没人能直接动手——它太模糊、太庞大了。真正的大厨会先把它拆成冷菜、热菜、汤和甜点四个子目标,再给每道菜写下步骤:买菜、清洗、腌制、炖煮、摆盘。每一层都比上一层更具体,直到最底层是能直接上手的小任务。这棵从总目标长出来、越往下越细的“树”,就是今天的主角——GOAL 分解树。 AI Agent 面对的正是同样的问题。用户丢来一句“帮我调研竞品并写一份周报”,如果 Agent 把它当成单一任务硬啃,很快就会迷失。GOAL 分解树让 Agent 像大厨一样:先立住根目标,逐层拆出子目标与叶子任务;标出“先腌后炖”式的依赖关系;排出时间表;在突发状况下动态重排。掌握了它,你就掌握了让 Agent 从“听懂指令”到“真正办成事”的核心能力。

岗位关联

对 AI 从业者而言,学会 GOAL 分解树等于给 Agent 装上“执行大脑”,它决定了你的智能体面对复杂目标时是手忙脚乱还是条理从容,是进阶 Agent 开发者的必修课。

目录
  1. 可视化演示
  2. 目标层次化拆解
  3. 子任务依赖建模
  4. 执行顺序规划
  5. 动态调整策略
  6. 分解粒度控制
  7. 质量评估优化
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示GOAL分解树的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

GOAL分解树:GOAL GOAL分解树的核心概念与层次 目标层次化拆解策略与方法 核心机制可视化 GOAL分解树整体架构与关键组件

目标层次化拆解

家宴总目标“办一场十人宴”太大,大到让人无从下手。大厨会在白板上先写下四个盘子:冷菜、热菜、汤、甜点。这还不算完,每道菜下面还要继续写流程:糖醋小排要先腌、再炸、最后收汁。从“宴席”到“收汁”,目标被拆成一个比一个更小的单位,直到帮厨看一眼就知道该干什么。

在 Agentic AI 中,这个动作被称为目标层次化拆解。Agent 收到总目标后,先识别出根目标——它通常只有一个,稳稳坐在分解树的顶部;然后按领域或阶段拆出子目标,直到每个分支末端都是“不需要再拆”的叶子任务。叶子任务是可以直接调用工具、执行 API 的最小动作,比如“查询数据库”或“发送邮件”。

层次化的价值在于分治:高层负责战略选择,低层负责具体战术。规划器只关心当前层的可选动作,不必一次性看到全部细节,这恰好也顺应大模型上下文窗口的约束——把整棵树一次性塞进去会爆上下文,逐层展开才能把开销控制在合理范围。拆解时还要记录每层的目标描述与层间归属关系,保证任意一条叶子路径都能回溯到根目标,出现问题时可以顺藤摸瓜。

就像大厨不会盯着“办好宴席”发呆,而是低头切黄瓜一样,Agent 也只有把目标拆到叶子,才能从“想”走向“做”。树的高度决定了它看到多远的全局,叶子的密度则决定了它能不能真正落地。

Cost(Goal)=∑i=1nCost(SubGoali)+Overhead(n)\displaystyle \text{Cost}(\text{Goal}) = \sum_{i=1}^{n} \text{Cost}(\text{SubGoal}_i) + \text{Overhead}(n)
这个公式说:总目标的成本,约等于各子目标成本之和,再加上因为“拆得碎”而多出来的协调开销。
  1. 总成本定义把一个总目标的花费定义为一个整体量,对应“整个家宴的总预算”。
    Cost(Goal)\displaystyle \text{Cost}(\text{Goal})
  2. 子目标求和对全部 n 个子目标逐一计算成本并累加,好比把冷菜、热菜、汤、甜点各自的预算加起来。
    ∑i=1nCost(SubGoali)\displaystyle \sum_{i=1}^{n} \text{Cost}(\text{SubGoal}_i)
  3. 分解开销拆得越多,协调、追踪、交接的额外开销 Overhead(n) 也越大,这就是“指挥成本”,也是粒度不能无限细的原因。
    +Overhead(n)\displaystyle + \text{Overhead}(n)

子任务依赖建模

大厨很快发现,任务之间不是孤立的。排骨不腌三小时,炖出来就不入味;蛋糕不提前一晚冷藏,上桌前就来不及定型;而烤箱只有一个,烤蛋糕和烤鸡翅不能同时进行。这些“先与后”“你用完我才用”的关系,就是任务的依赖。

GOAL 分解树本身只表示“谁包含谁”,要真正排期,还得在叶子或子任务之间补上依赖边。常见类型有三种:顺序依赖(数据或前置条件未就绪)、资源依赖(共享同一个工具或数据库连接)、互斥约束(同一时刻只能执行其一)。Agent 需要为每个任务显式记录 prerequisite(前置任务)列表。

把这些依赖画出来,分解树就升级为有向无环图 DAG。依赖建模要防两类错误:一是漏标,导致执行到一半发现缺数据;二是成环,A 等 B、B 等 A,计划直接死锁。工程上常用“前置条件列表 + 状态检查器”实现:任务只有在前置全部完成时才进入就绪队列,其余时间静静等待。

依赖边就像家宴菜谱上的注脚——腌多久、冷藏多久、谁等谁。没有这些注脚,菜单再漂亮也只是纸上谈兵;有了它们,厨房里的每个人才知道自己此刻该站在哪口锅前。

G=(V,E),E={(vi,vj)∣vi 是 vj 的前置任务}\displaystyle G = (V, E),\quad E = \{(v_i, v_j) \mid v_i \text{ 是 } v_j \text{ 的前置任务}\}
这是依赖图的形式化定义:顶点是任务,有向边表示“必须先完成谁”。
  1. 顶点集合 V每个任务(炖排骨、腌排骨、烤蛋糕)都是图中的一个顶点。
    V={v1,v2,…,vm}\displaystyle V = \{v_1, v_2, \dots, v_m\}
  2. 边集合 E若 v_i 是 v_j 的前置任务,就画一条从 v_i 指向 v_j 的有向边。
    E={(vi,vj)∣vi 是 vj 的前置任务}\displaystyle E = \{(v_i, v_j) \mid v_i \text{ 是 } v_j \text{ 的前置任务}\}
  3. 有向图 G分解树搭配依赖边后成为有向无环图,后续的排序与调度都在这张图上进行。
    G=(V,E)\displaystyle G = (V, E)

执行顺序规划

有了依赖关系,大厨开始排时间表:早晨腌肉、上午慢炖汤、下午烤蛋糕、开饭前三十分钟爆炒热菜。他从不凭空定顺序,而是顺着依赖走:能先做的先做,能并行的同时开火,最耽误不起的关键环节单独盯梢。

在 Agent 里,这叫执行顺序规划。规划器拿到 DAG 后做三件事:拓扑排序,保证每个任务执行时前置已完成;识别关键路径,也就是从起点到终点耗时最长的那条链路,它决定整场“家宴”的总时长;挖掘并行机会,把互不依赖的分支交给并发执行器同时推进。

拓扑排序的经典算法是 Kahn 算法:统计每个任务的入度(依赖数量),把入度为 0 的任务放进就绪队列;执行完一个任务,就把它的后继入度减 1,新产生的入度 0 任务继续入队。关键路径则用最长路径动态规划求出,路径上的任务优先级极高,一旦延误会直接拖慢全局。

大厨从不做“想到哪做到哪”的即兴表演,而是像列车调度员一样按图发车。GOAL 分解树加上依赖图和拓扑排序,就是 Agent 手里的列车时刻表,让每个子任务都在对的时刻出发。

vi≺vj  ⇒  rank(vi)<rank(vj)\displaystyle v_i \prec v_j \;\Rightarrow\; \text{rank}(v_i) < \text{rank}(v_j)
这条式子的意思是:只要 v_i 必须先于 v_j 完成,那么 v_i 的执行序号就必须小于 v_j。
  1. 先后关系v_i 先于 v_j,这是依赖图给我们的硬约束,好比腌肉必须排在炖肉之前。
    vi≺vj\displaystyle v_i \prec v_j
  2. 执行序号为每个任务分配一个整数 rank 作为执行次序,同一时刻优先做序号最小且就绪的任务。
    rank(vi)\displaystyle \text{rank}(v_i)
  3. 约束蕴含依赖一旦存在,前驱序号就必须小于后继,否则会出现“菜没腌好就下锅”的执行乌龙。
    rank(vi)<rank(vj)\displaystyle \text{rank}(v_i) < \text{rank}(v_j)

动态调整策略

家宴当晚,意外总比惊喜先到:一位客人突然说虾过敏,糖醋小排烧糊了锅,烤箱临时罢工。大厨的应对从来不是重写整本菜单,而是局部调整——虾换成鱼、排骨改红烧、蛋糕改用蒸锅。计划是活的,不是碑文。

Agent 在真实环境里同样要面对失败、超时与输入变化。动态调整策略包含四板斧:实时监控执行反馈,判断任务失败或进度停滞;局部重规划,只重排受影响的分支,不推倒整棵树;失败回退机制,撤销失败任务的后效,回到最近的安全状态;增量更新,保留大部分已完成任务,把新变化拼接进旧计划。

重规划时,Agent 会评估候选动作的效用,优先选择“单位成本内进度收益最大”的那一个,而不是机械地重跑整棵分解树。工程上还会对任务设置超时与重试上限,连续失败时向上抛出求助信号,让更高层策略介入。

好的家宴不是没有意外,而是意外发生时每一步都有预案。GOAL 分解树让 Agent 在动荡中保持“局部修复、整体不乱”,这正是它比一次性脚本可靠得多的原因。

Utility(a)=ΔProgress(a)Cost(a)\displaystyle \text{Utility}(a) = \frac{\Delta \text{Progress}(a)}{\text{Cost}(a)}
重规划时挑任务的标准:优先选“每花一分成本,进度推进最多”的动作。
  1. 进度增量ΔProgress(a) 表示执行任务 a 后,总目标推进了多少,类比“这道菜做完,宴席完成了几成”。
    ΔProgress(a)\displaystyle \Delta \text{Progress}(a)
  2. 动作代价Cost(a) 是执行 a 所需的时间、资源或上下文开销,相当于做这道菜占用的锅和人力。
    Cost(a)\displaystyle \text{Cost}(a)
  3. 效用比值两者相除得到效用分,重规划时优先选效用最高的任务,就像厨师先救最省时又能快速上桌的那道菜。
    ΔProgress(a)Cost(a)\displaystyle \frac{\Delta \text{Progress}(a)}{\text{Cost}(a)}

分解粒度控制

切菜是有讲究的:姜切末、葱切段、肉切片。如果大厨把“洗一根葱”都当成一个任务来跟踪,光写菜谱就要写一天;但若只写一句“准备配料”,新手帮厨根本无从下手。粒度,决定了任务是“指令”还是“纸上废话”。

分解粒度指的是叶子任务的精细程度。粒度太粗,叶子仍是一个复合目标,Agent 执行时缺乏可操作性;粒度太细,子任务数量爆炸,规划开销和上下文占用随之飙升,还引入大量琐碎调度成本。工程上需要判断任务原子性——它能否被一个工具、一次 API 调用或一个模型步骤完整完成。

用成本模型看更清楚:总成本等于规划成本加执行成本。规划成本随粒度变细而上升,因为要维护的节点更多;执行成本随粒度变粗而上升,因为任务模糊导致试错返工。最优粒度在两条曲线的交汇处。实践中还要考虑大模型上下文窗口限制:当某一层分支过多,就应插入中间节点来压缩视野。

顶尖大厨的菜谱既能让新人看懂,又不会把厨师的双手绑死,这就是“恰到好处的粒度”。Agent 的分解粒度决定了它既不会因任务模糊而卡死,也不会因指令太碎而耗尽算力。

Total(d)=Planning(d)+Execution(d),d∗=arg⁡min⁡dTotal(d)\displaystyle \text{Total}(d) = \text{Planning}(d) + \text{Execution}(d),\quad d^* = \arg\min_d \text{Total}(d)
总成本随粒度 d 变化:太细规划贵,太粗执行贵,最优粒度 d* 让两边之和最小。
  1. 规划成本粒度越细(d 越大),需要记录和调度的子任务越多,规划开销越高,像菜谱写满每根葱的去向。
    Planning(d)\displaystyle \text{Planning}(d)
  2. 执行成本粒度越粗,单个任务描述越模糊,执行时反复试错和返工的成本越高,像只说“做道硬菜”让帮厨发呆。
    Execution(d)\displaystyle \text{Execution}(d)
  3. 寻优粒度求使总成本最小的 d*,即两线交叉的均衡点,类比把肉切成“能一口吃下但不用一刀一刀数”的块。
    d∗=arg⁡min⁡d(Planning(d)+Execution(d))\displaystyle d^* = \arg\min_d \left( \text{Planning}(d) + \text{Execution}(d) \right)

质量评估优化

家宴结束,客人散去,大厨不会立刻躺下,而是对着空盘子复盘:客人最爱的菜下次保留,剩得最多的菜说明口味判断失误;有没有两道菜味道重复?有没有漏掉某位客人点名要的菜?这份复盘,决定了下一次宴席的质量上限。

对分解树的评估是常被忽视但极重要的环节。核心指标有三个:覆盖率,检查根目标的所有要求是否都被叶子任务覆盖;冗余度,是否存在重复或近似重复的子任务;平衡度,各分支大小是否均匀。评估完成后做迭代优化:补漏、删重、合并过细的任务。

工程上可以给分解树打质量分,用权重把正向覆盖率与负向冗余度合成一个标量。大型 Agent 系统还会把评估做成离线评测:用一批标准任务跑规划器,统计成功率、平均执行步数与无效任务占比,用数据驱动分解策略持续改进。

分解树不是一次成型的大理石像,而是不断修订的菜谱。Agent 团队迭代的不只是模型参数,更是这棵树的形状——每优化一次,Agent 离“值得信赖的搭档”就更近一步。

Quality(T)=α×Coverage(T)−β×Redundancy(T)\displaystyle \text{Quality}(T) = \alpha \times \text{Coverage}(T) - \beta \times \text{Redundancy}(T)
一棵好分解树 = 覆盖目标多、重复劳动少,两个指标用权重合并成单一质量分。
  1. 覆盖率Coverage(T) 表示被叶子任务覆盖的目标比例,好比家宴是否照顾到每位客人的忌口。
    Coverage(T)=∣covered goals∣∣all goals∣\displaystyle \text{Coverage}(T) = \frac{|\text{covered goals}|}{|\text{all goals}|}
  2. 冗余度Redundancy(T) 衡量重复劳动的总量,比如两道菜都在熬几乎一样的糖醋汁。
    Redundancy(T)\displaystyle \text{Redundancy}(T)
  3. 加权综合用权重 α、β 加权相减得到质量分,数值越高说明这棵分解树越值得沿用。
    α×Coverage(T)−β×Redundancy(T)\displaystyle \alpha \times \text{Coverage}(T) - \beta \times \text{Redundancy}(T)

AI 应用场景

智能客服工单处理 Agent

阶段:任务规划与执行

解决的问题:面对“处理客户投诉”这类模糊目标,传统规则脚本只会机械答复,遇到复杂工单就遗漏关键步骤。Agent 用 GOAL 分解树把目标拆为“读取工单→识别意图→检索知识库→生成方案→回访确认”五层,标注“生成方案”依赖前两步完成,再按拓扑序执行;客户中途补充信息时,仅重排后续分支。

具体案例:某电商平台客服 Agent 每日处理上千工单,接入 GOAL 分解树后平均处理时长下降 32%,漏答率下降 47%。

自动化研究报告生成 Agent

阶段:目标拆解与并行调度

解决的问题:“写一份竞品分析报告”是典型复杂目标,直接让 LLM 生成长文会严重遗漏数据来源。Agent 将根目标拆为“采集数据→清洗→统计分析→图表生成→撰写报告→审核发布”,其中清洗与分析是依赖链,图表与撰写可跨分支并行,失败任务自动重试并记录日志。

具体案例:投研团队的日报 Agent 每天自动拆解 40 余个数据源任务,通过并行调度和动态重试在 15 分钟内产出可发布报告,传统人工流程需要 3 小时。

园区配送机器人的任务协同

阶段:实时重规划

解决的问题:“把包裹送到 B 栋”必须分解为“全局路径规划→局部避障→速度控制”三层,每层依赖上层输出。传统方案遇到临时封路就整条规划作废,Agent 仅重规划避障与路径分支,不影响速度控制层的稳定运行。

具体案例:园区配送机器人遇到障碍物时,依托分解树局部重规划,15ms 内恢复运动,全程配送成功率从 91% 提升至 99%。

Python 演示

python69 行
from collections import deque class GoalNode:    def __init__(self, name, subtasks=None):        self.name = name        self.subtasks = subtasks if subtasks else []        self.depends_on = []     def is_leaf(self):        return not self.subtasks  def collect_leaves(root):    leaves = []     def walk(node):        if node.is_leaf():            leaves.append(node)        else:            for child in node.subtasks:                walk(child)     walk(root)    return leaves  def build_execution_order(root):    leaves = collect_leaves(root)    indeg = {t.name: 0 for t in leaves}    graph = {t.name: [] for t in leaves}    for t in leaves:        for pre in t.depends_on:            graph[pre].append(t.name)            indeg[t.name] += 1    ready = deque(t.name for t in leaves if indeg[t.name] == 0)    order = []    while ready:        name = ready.popleft()        order.append(name)        for nxt in graph[name]:            indeg[nxt] -= 1            if indeg[nxt] == 0:                ready.append(nxt)    return order  def replan(failed_task, plan):    if failed_task not in plan:        return plan    new_plan = [t for t in plan if t != failed_task]    new_plan.append(failed_task + '_retry')    return new_plan  if __name__ == '__main__':    root = GoalNode('dinner_party', [        GoalNode('cold_dish', [GoalNode('cut_veggies'), GoalNode('mix_sauce')]),        GoalNode('hot_dish', [GoalNode('marinate_ribs'), GoalNode('braise_ribs')]),        GoalNode('dessert', [GoalNode('bake_cake'), GoalNode('chill_cake')]),    ])    for leaf in collect_leaves(root):        if leaf.name == 'braise_ribs':            leaf.depends_on = ['marinate_ribs']        if leaf.name == 'chill_cake':            leaf.depends_on = ['bake_cake']    plan = build_execution_order(root)    print('执行顺序: ' + ' -> '.join(plan))    plan = replan('chill_cake', plan)    print('动态调整后: ' + ' -> '.join(plan))
目的:演示一棵家宴风格的 GOAL 分解树如何收集叶子任务、按依赖关系做拓扑排序,并在任务失败时动态重排执行计划。
  1. self.depends_on = []每个节点预留前置任务列表,供依赖建模使用。
  2. def collect_leaves(root)深度优先遍历收集所有叶子任务,它们是真正的可执行单元。
  3. indeg = {t.name: 0 for t in leaves}记录每个任务的入度,即尚未满足的前置条件数量。
  4. graph[pre].append(t.name)把“前置完成→后继就绪”的关系固化到邻接表。
  5. ready = deque(t.name for t in leaves if indeg[t.name] == 0)入度为 0 的任务进入就绪队列,类比“不依赖任何人的活先开工”。
  6. while ready:Kahn 算法主循环:弹出就绪任务、更新后继入度、发现新的就绪任务。
  7. plan = replan('chill_cake', plan)动态调整示例:失败任务被移除,重试版本追加到队尾。

常见误区

误区“我把目标拆到几十个叶子任务,模型肯定执行得更准吧?拆得越细,Agent 就越不可能出错。”

正解粒度并非越细越好。每个叶子任务都要被记录、调度、监控,任务数量膨胀后,规划开销与上下文占用会反超收益,甚至出现“为了拆而拆”的空转任务。就像大厨若把“切姜”拆成“拿姜—洗姜—去皮—切片—摆盘”五个任务,厨房会陷入记账而不是做菜。最优粒度是让叶子任务恰好能被一个工具或一次模型调用完成。

为何常见:初学时直观认为“细致等于可靠”,却忽略了调度系统自身随规模增长的开销成本。

误区“依赖不就是先后顺序吗?我只要把任务排成一条线,先做 A 再做 B 就行了。”

正解依赖建模至少包含三类:顺序依赖(数据前置)、资源依赖(共享同一个工具或数据库连接)、互斥依赖(同一时刻只能执行其一)。只排先后会漏掉资源冲突,导致两个任务同时抢占唯一资源而互相等待,这正是“烤箱只有一个,烤蛋糕和烤鸡翅却同时开烤”的翻版。

为何常见:教程多强调 DAG 与拓扑排序,容易让人忽略资源维度的约束。

误区“Agent 拿到分解树和顺序后,按部就班执行就行,中间改计划说明设计失败了。”

正解现实执行充满不确定性:任务超时、外部输入变化、依赖结果不合格,都需要触发局部重规划。动态调整是分解树设计的一部分而非缺陷,关键在于把“重规划”限制在受影响分支,而不是推倒整棵树重来。大厨烧糊一道菜,绝不会扔掉整本菜单。

为何常见:把静态规划的成功案例当成了常态,忽略了真实环境的噪声。

误区“只要做一次拓扑排序,得到的顺序就是最好的执行顺序,照着跑准没错。”

正解拓扑排序只保证“前置在前、后继在后”,满足这个条件的序列通常有多个,它不保证总耗时最短。要优化效率,必须结合关键路径识别(决定全局瓶颈)和并行机会分析(把互不依赖的分支同时推进)。腌肉和烤蛋糕谁先谁后都合法,但聪明的排期能让总时长最短。

为何常见:拓扑排序给出了一个确定性结果,容易误以为确定性就等于最优。

面试题

Q1. GOAL 分解树中,叶子任务指的是?

单选题 · easy

  • A.不必再拆的最原子任务← 正确答案
  • B.需要优先执行的任务
  • C.依赖关系的源头节点
  • D.并行执行的任务集合

答案:A。叶子任务是分解树的末端,指“不需要再拆”的最小可执行动作,对应菜谱里“切片”“收汁”这类具体步骤。B、C、D 描述的是任务的优先级、依赖源与并行性,都不是叶子的定义。

Q2. 下面哪类依赖属于“资源互斥”?

单选题 · mid

  • A.腌肉必须先于炖肉完成
  • B.两台菜都要用同一个烤箱← 正确答案
  • C.买菜之后才有肉可腌
  • D.甜点必须最后才能上桌

答案:B。两台菜抢同一个烤箱是典型的共享资源互斥约束。A 和 C 是顺序依赖,D 是服务顺序偏好而非资源冲突。区分关键在于冲突对象是“资源”还是“数据前提”。

Q3. 拓扑排序保证的约束是?

单选题 · mid

  • A.总执行耗时必须最短
  • B.前置任务先于后置任务← 正确答案
  • C.所有任务都要并行执行
  • D.任务总数达到最少

答案:B。拓扑排序只保证依赖序:只要有边 v_i → v_j,v_i 就排在 v_j 前面。它不承诺总耗时最短,也不强制并行或减少任务数,后者属于关键路径与并行调度解决的问题。

Q4. 哪些情况需要动态调整计划?

多选题 · mid

  • A.某任务执行失败← 正确答案
  • B.新增了临时约束← 正确答案
  • C.输入数据完全不变
  • D.资源被其他进程抢占← 正确答案

答案:ABD。任务失败、新约束出现、资源被抢占都属于环境变化,需要触发局部重规划或回退。输入完全不变且一切正常时,计划无需调整,继续按原序执行即可。

Q5. 任务粒度过细的主要代价是?

单选题 · easy

  • A.目标描述更加清晰
  • B.规划和追踪开销增大← 正确答案
  • C.依赖关系自动消失
  • D.执行时间随之缩短

答案:B。每个颗粒都要被记录、调度、监控,节点越多规划开销越大,这正是公式中 Overhead(n) 的含义。目标更清晰是收益而非代价,依赖不会自动消失,执行时间也不会因拆碎而缩短。

Q6. 关键路径对应的含义是?

单选题 · hard

  • A.决策分支最多的路径
  • B.总耗时最长的路径← 正确答案
  • C.依赖关系最少的路径
  • D.任务数量最少的路径

答案:B。关键路径是从起点到终点总耗时最长的那条链路,它决定整个项目的工期,也是家宴中“最耽误不起”的环节。分支数、依赖数、任务数都不是关键路径的定义。

Q7. GOAL 分解树的根节点代表?

单选题 · easy

  • A.最底层的叶子任务
  • B.最顶层的总目标← 正确答案
  • C.任一层的子目标
  • D.执行完成的标记

答案:B。根节点是整棵树的起点,承载用户最初交付的总目标,比如“办一场十人家宴”。叶子任务在末端,子目标在中间层,根节点与执行完成与否无关。

Q8. 提高分解树质量的做法包括?

多选题 · hard

  • A.检查目标覆盖率← 正确答案
  • B.消除冗余子任务← 正确答案
  • C.刻意增加层级深度
  • D.评估分支负载均衡← 正确答案

答案:ABD。覆盖率确保无遗漏,冗余消除剔除重复劳动,负载均衡避免某分支过重,三者共同提升质量。刻意增加层级深度只会放大规划开销,不是质量手段。

Q9. 关于优先级设定的说法正确的是?

单选题 · mid

  • A.只由任务尺寸决定
  • B.关键路径任务优先← 正确答案
  • C.所有任务优先级相同
  • D.拓扑排序唯一决定

答案:B。关键路径上的任务延误会拖慢全局,因此应优先调度。优先级由影响度、资源稀缺度共同决定,不是只看尺寸;拓扑排序只给合法序,不唯一也不直接等价于优先级。

Q10. 子任务依赖关系的来源包括?

多选题 · mid

  • A.前置数据条件约束← 正确答案
  • B.共享资源使用约束← 正确答案
  • C.随机生成的执行顺序
  • D.外部环境施加限制← 正确答案

答案:ABD。数据前置、共享资源、外部环境限制都是真实依赖来源,它们决定任务能否开始。随机顺序与依赖无关,依赖应来自领域规则而非随机抽样。