第14课:任务分解

阶段三:任务分配 任务分解

1. 为什么需要任务分解?

复杂任务通常无法由单个机器人完成,也无法直接分配——它需要被分解为可执行的子任务。任务分解(Task Decomposition)是将高层目标转化为可分配、可执行子任务的过程。

🏗️ 建房子的类比

"建一栋房子"是一个复杂任务,需要分解为:地基→框架→管线→外墙→内装。每个子任务还可以进一步分解,如"管线"→"水管"+"电路"+"暖通"。

2. 任务分解方法

方法原理适用场景
层次分解递归分解为子任务树结构化任务
时序分解按执行顺序切分流水线任务
空间分解按区域划分覆盖/搜索任务
功能分解按能力需求分类异构群体

3. 层次任务网络(HTN)

复合任务 → 分解方法 → 子任务序列
原始任务 → 直接可执行
分解终止条件:所有叶节点都是原始任务

4. Python实现:层次任务分解与分配

import random, math
random.seed(42)

# 层次任务分解 - 树形任务图
class TaskNode:
    def __init__(self, name, effort=0, children=None):
        self.name = name
        self.effort = effort  # 叶子节点的工时
        self.children = children or []
    
    def total_effort(self):
        if not self.children:
            return self.effort
        return sum(c.total_effort() for c in self.children)
    
    def depth(self):
        if not self.children: return 0
        return 1 + max(c.depth() for c in self.children)
    
    def leaf_count(self):
        if not self.children: return 1
        return sum(c.leaf_count() for c in self.children)

# 构建搜索救援任务树
mission = TaskNode("搜索救援", children=[
    TaskNode("区域搜索", children=[
        TaskNode("A区扫描", effort=5),
        TaskNode("B区扫描", effort=7),
        TaskNode("C区扫描", effort=4),
    ]),
    TaskNode("目标定位", children=[
        TaskNode("信号检测", effort=3),
        TaskNode("视觉确认", effort=4),
    ]),
    TaskNode("救援执行", children=[
        TaskNode("路径规划", effort=2),
        TaskNode("物资运送", children=[
            TaskNode("医疗包", effort=3),
            TaskNode("食物水", effort=4),
        ]),
        TaskNode("人员转移", effort=6),
    ]),
])

# 分配算法:按子树工时均衡分配
n_robots = 3
leaves = []

def collect_leaves(node, path=""):
    if not node.children:
        leaves.append((path + "/" + node.name, node.effort))
    for c in node.children:
        collect_leaves(c, path + "/" + node.name)

collect_leaves(mission)

# 贪心分配(LPT:最长处理时间优先)
leaves.sort(key=lambda x: -x[1])
robot_tasks = [[] for _ in range(n_robots)]
robot_load = [0] * n_robots

for name, effort in leaves:
    min_r = min(range(n_robots), key=lambda r: robot_load[r])
    robot_tasks[min_r].append((name, effort))
    robot_load[min_r] += effort

print(f"任务树深度: {mission.depth()}")
print(f"叶节点数: {mission.leaf_count()}")
print(f"总工时: {mission.total_effort()}")
print(f"理论最优负载: {mission.total_effort()/n_robots:.1f}")
print()
for r in range(n_robots):
    print(f"机器人{r}: 负载={robot_load[r]}")
    for name, eff in robot_tasks[r]:
        print(f"  {name} (工时={eff})")

makespan = max(robot_load)
optimal = mission.total_effort()/n_robots
print(f"\\nMakespan: {makespan}")
print(f"最优下界: {optimal:.1f}")
print(f"近似比: {makespan/optimal:.3f}")
print("✅ 验证通过:层次任务分解后均衡分配,负载近似比接近1")

📊 仿真结果

任务树深度: 3
叶节点数: 9
总工时: 38
机器人0: 负载=13
  /搜索救援/区域搜索/B区扫描 (工时=7)
  /搜索救援/救援执行/物资运送/食物水 (工时=4)
  /搜索救援/救援执行/路径规划 (工时=2)
机器人1: 负载=13
  /搜索救援/救援执行/人员转移 (工时=6)
  /搜索救援/目标定位/视觉确认 (工时=4)
  /搜索救援/救援执行/物资运送/医疗包 (工时=3)
机器人2: 负载=12
  /搜索救援/区域搜索/A区扫描 (工时=5)
  /搜索救援/区域搜索/C区扫描 (工时=4)
  /搜索救援/目标定位/信号检测 (工时=3)

Makespan: 13, 最优下界: 12.7, 近似比: 1.026
✅ 验证通过:层次任务分解后均衡分配,负载近似比接近1

5. 任务依赖关系

四类依赖

6. 分解粒度权衡

粒度太粗 → 分配不灵活,负载不均衡
粒度太细 → 通信和协调开销大,调度复杂

最优粒度 ≈ 总工时 / 机器人数量 的 O(1) 倍

7. 练习

  1. 添加任务间依赖关系,实现拓扑排序调度
  2. 实现空间分解:将100×100区域分成网格子区域
  3. 设计自适应分解策略:根据机器人数量动态调整粒度
  4. 实现AND-OR任务图,处理选择性分解
  5. 比较LPT和MF(Most Fit)分配策略的性能

🏆 成就解锁

算法复杂度与性能分析

本课任务分解的计算复杂度是实际应用中的关键考量因素。在群体规模为N、迭代次数为T的情况下:

时间复杂度:O(T × N²) 或 O(T × N × K)
空间复杂度:O(N²) 或 O(N × K)
其中K为问题规模参数

对于大规模问题,可以采用以下策略降低复杂度:

相关算法对比

任务分解与其他相关方法的对比分析:

算法优势劣势适用场景
本课方法分布式、鲁棒、可扩展近似解、参数敏感大规模动态环境
集中式方法全局最优、确定性强单点故障、不可扩展小规模静态问题
分层方法兼顾全局和局部层次设计复杂中等规模问题
混合方法综合各方法优点实现复杂度高高要求场景

工程实现注意事项

从算法到系统的关键考量

  1. 参数初始化:不同问题需要不同的参数配置,建议通过小规模实验确定基准参数,然后逐步调整
  2. 终止条件:除了最大迭代次数外,还应设置收敛判断(如连续N代无改进则停止)
  3. 结果验证:多次独立运行取平均,报告最佳值、平均值和标准差
  4. 边界处理:搜索空间边界需要特殊处理(反射、吸收、随机重置等)
  5. 数值稳定性:注意除零保护、溢出保护和NaN检测
  6. 日志记录:记录每代的群体状态,便于后续分析和调试

前沿研究方向

任务分解领域的当前热点研究方向包括:

参考文献与延伸阅读

  1. Kennedy, J. & Eberhart, R. (1995). Particle Swarm Optimization. Proceedings of IEEE ICNN.
  2. Dorigo, M. & Stützle, T. (2004). Ant Colony Optimization. MIT Press.
  3. Bonabeau, E., Dorigo, M. & Theraulaz, G. (1999). Swarm Intelligence. Oxford University Press.
  4. Yang, X.S. (2010). Nature-Inspired Metaheuristic Algorithms. Luniver Press.
  5. Brambilla, M. et al. (2013). Swarm robotics: a review from the swarm engineering perspective. Swarm Intelligence, 7(1), 1-41.

任务分解的粒度控制

任务分解的粒度直接影响分配效率:

粒度的三重影响

自适应粒度策略:根据当前负载均衡度动态调整分解粒度——不均衡时细化,均衡时粗化。

代码逐行解析与调试指南

任务分解仿真代码要点

初始化阶段:所有智能体/粒子的初始位置和速度随机生成。随机初始化保证了多次运行的统计意义,但单次运行的结果可能因随机种子不同而变化。

主循环结构:每个时间步包含三个阶段——感知(获取邻居和环境信息)、决策(根据规则计算控制量)、执行(更新位置和速度)。这种"感知-决策-执行"循环是所有群体机器人算法的基本框架。

参数调优建议:先用默认参数运行一次观察基本行为,然后逐个调整关键参数。每次只改一个参数,记录变化效果。重点关注:收敛速度、稳态误差和鲁棒性。

常见问题

实验设计与结果分析

如何设计有效的仿真实验

  1. 基线对比:将本课方法与简单基线(如随机策略)和经典方法对比
  2. 参数扫描:对关键参数进行网格搜索,绘制性能热力图
  3. 多次运行:至少30次独立运行,报告均值和标准差
  4. 消融实验:移除算法的某个组件,观察性能下降,验证组件的必要性
  5. 可扩展性测试:改变群体规模,观察性能随规模的变化

本课知识图谱与延伸

任务分解在群体机器人整体知识体系中的位置和关联:

前置知识

理解本课内容需要掌握的前置概念:Python基础编程、线性代数(矩阵运算)、概率论(随机变量和分布)、图论基础(图的基本概念和遍历算法)。如果你对这些前置知识感到陌生,建议先回顾相关基础教材。

后续拓展

本课内容为后续课程奠定基础。在后续学习中,我们将把本课的算法原理与其他技术结合,构建更复杂、更实用的群体机器人系统。特别值得关注的是:如何将本课的算法从仿真环境迁移到实际机器人平台,需要考虑传感器噪声、通信延迟、执行器误差等现实因素。

跨学科联系

任务分解不仅属于机器人学,还与以下学科密切相关:

总结与要点回顾

本课核心要点

  1. 任务分解的基本原理和数学模型是群体机器人系统设计的基石
  2. 仿真验证是理解算法行为的最佳途径——建议动手修改代码参数,观察行为变化
  3. 参数调优需要系统的方法论:单变量控制、多次运行、统计检验
  4. 从仿真到实物部署需要考虑现实约束:噪声、延迟、能耗、安全
  5. 群体智能算法的真正威力在于分布式和鲁棒性,而非单次运行的最优解质量

群体机器人课程 © 2026 | 第14课/共25课