Files
2026_DesignAI/officefile/supplements/03-autonomous-design/03.5-planning-and-execution.md
T
pengxiao 219232de74 refactor: 重组项目目录结构
以讲义内容为骨架迁移到标准目录格式:
- officefile/ 主内容(12章 + 附录 + CC4SI补充)
- dofile/ 代码示例(11个Python脚本)
- data/ 图片资源
- output/ 生成输出(忽略)
- Archive/ 归档旧目录(忽略)
- .claude/skills/ 保留markdown-to-docx工具链
- .pandoc/ 保留CSL和本地化配置

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 14:00:56 +08:00

1176 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 03.5 规划与执行
## 核心问题
> Agent如何将复杂目标分解为可执行步骤?
> 当环境变化时,如何动态调整计划?
> 如何平衡规划深度与执行效率?
---
## 概念讲解
### 规划的基本概念
**规划 (Planning)** 是寻找从初始状态到目标状态的行动序列的过程:
```
规划问题的基本要素
状态空间 (State Space)
├─── 初始状态: S₀
├─── 目标状态: S_goal
└─── 中间状态: S₁, S₂, ..., Sₙ
行动 (Actions)
├─── 前置条件: preconditions
├─── 效果: effects
└─── 代价: cost
规划 = 行动序列 [a₁, a₂, ..., aₙ]
使得: S₀ ─a₁→ S₁ ─a₂→ S₂ ... ─aₙ→ S_goal
```
### 规划与执行的循环
```
┌─────────────────────────────────────────────────────┐
│ 规划-执行循环 │
│ (Plan-Execute Loop) │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ 目标 │ │
│ └────┬────┘ │
│ │ │
│ ↓ │
│ ┌─────────┐ ┌─────────────┐ │
│ │ 规划 │ ───→ │ 执行步骤 │ │
│ │ Planner│ │ Executor │ │
│ └────┬────┘ └──────┬──────┘ │
│ │ │ │
│ │ ↓ │
│ │ ┌─────────────┐ │
│ │ │ 观察结果 │ │
│ │ └──────┬──────┘ │
│ │ │ │
│ │ ↓ │
│ │ ┌─────────────┐ │
│ │ │ 监控状态 │ │
│ │ └──────┬──────┘ │
│ │ │ │
│ ↓ ↓ │
│ ┌─────────────────────────────┐ │
│ │ 是否需要重新规划? │ │
│ └─────────────┬───────────────┘ │
│ 是 否 │
│ │ │ │
│ └──────────────┘ │
│ │ │
│ ↓ │
│ ┌─────────────┐ │
│ │ 继续执行 │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
```
### 规划方法的分类
```
规划方法谱系
┌────────────────────────────────────────────────────────┐
│ │
│ 前向搜索 (Forward Search) │
│ ──────────────────────── │
│ 从初始状态向目标状态搜索 │
│ 适合:目标明确,分支因子较小 │
│ │
│ ↓ │
│ │
│ 后向搜索 (Backward Search) │
│ ─────────────────────── │
│ 从目标状态向初始状态搜索 │
│ 适合:目标状态较少,起始状态较多 │
│ │
│ ↓ │
│ │
│ 双向搜索 (Bidirectional Search) │
│ ────────────────────────────── │
│ 同时从两端搜索,在中间汇合 │
│ 适合:状态空间大,双向都可搜索 │
│ │
│ ↓ │
│ │
│ 分层规划 (Hierarchical Planning) │
│ ───────────────────────────── │
│ 先规划高层抽象,再细化具体步骤 │
│ 适合:复杂任务,有多层抽象 │
│ │
└────────────────────────────────────────────────────────┘
```
---
## 设计原理
### 前向搜索规划
```python
from typing import Callable, List, Dict, Any, Optional, Tuple
from dataclasses import dataclass
from enum import Enum
import heapq
from collections import deque
class PlanningStatus(Enum):
"""规划状态"""
SUCCESS = "success"
FAILURE = "failure"
IN_PROGRESS = "in_progress"
NO_PLAN = "no_plan"
@dataclass
class Action:
"""行动定义"""
name: str
preconditions: Callable[[Any], bool] # 前置条件检查
effects: Callable[[Any], Any] # 状态转换
cost: float = 1.0 # 行动代价
@dataclass
class Plan:
"""计划"""
actions: List[Action]
expected_final_state: Any
total_cost: float
steps: List[str]
class ForwardSearchPlanner:
"""
前向搜索规划器
从初始状态开始,逐步应用行动直到达到目标
"""
def __init__(self,
actions: List[Action],
goal_test: Callable[[Any], bool],
max_depth: int = 100,
heuristic: Callable[[Any], float] = None):
"""
Args:
actions: 可用行动列表
goal_test: 目标测试函数
max_depth: 最大搜索深度
heuristic: 启式函数(估计到目标的距离)
"""
self.actions = actions
self.goal_test = goal_test
self.max_depth = max_depth
self.heuristic = heuristic or (lambda s: 0)
# 搜索统计
self.nodes_expanded = 0
self.nodes_visited = 0
def plan(self, initial_state: Any) -> Optional[Plan]:
"""
执行前向搜索规划
支持的搜索算法:
- BFS(无启发式)
- UCSuniform cost search,无启发式但有代价)
- A*(有启发式)
"""
# 搜索节点:(f_score, g_score, state, action_sequence)
initial_node = (
self.heuristic(initial_state),
0,
initial_state,
[]
)
open_set = [initial_node]
closed_set = set()
while open_set:
# 获取最优节点
f, g, current_state, action_sequence = heapq.heappop(open_set)
# 检查是否已访问
state_hash = self._hash_state(current_state)
if state_hash in closed_set:
continue
closed_set.add(state_hash)
self.nodes_visited += 1
# 检查是否达到目标
if self.goal_test(current_state):
return Plan(
actions=action_sequence,
expected_final_state=current_state,
total_cost=g,
steps=[a.name for a in action_sequence]
)
# 深度限制
if len(action_sequence) >= self.max_depth:
continue
# 扩展节点
self.nodes_expanded += 1
for action in self.actions:
# 检查前置条件
if action.preconditions(current_state):
# 应用行动
new_state = action.effects(current_state)
# 创建新节点
new_g = g + action.cost
new_f = new_g + self.heuristic(new_state)
new_sequence = action_sequence + [action]
heapq.heappush(open_set, (
new_f,
new_g,
new_state,
new_sequence
))
return None
def _hash_state(self, state: Any) -> int:
"""状态哈希(用于去重)"""
return hash(str(state))
class BackwardSearchPlanner:
"""
后向搜索规划器
从目标状态开始,反向应用行动直到回到初始状态
"""
def __init__(self,
actions: List[Action],
initial_state: Any,
max_depth: int = 100):
"""
Args:
actions: 可用行动列表
initial_state: 初始状态
max_depth: 最大搜索深度
"""
self.actions = actions
self.initial_state = initial_state
self.max_depth = max_depth
def plan(self, goal_state: Any) -> Optional[Plan]:
"""
执行后向搜索规划
反向行动需要能够"撤销"原行动的效果
"""
# 构建反向行动
reverse_actions = self._build_reverse_actions()
# 从目标状态搜索到初始状态
planner = ForwardSearchPlanner(
actions=reverse_actions,
goal_test=lambda s: s == self.initial_state,
max_depth=self.max_depth
)
result = planner.plan(goal_state)
if result:
# 反转行动序列
result.actions = list(reversed(result.actions))
result.steps = list(reversed(result.steps))
return result
def _build_reverse_actions(self) -> List[Action]:
"""构建反向行动(简化实现)"""
# 实际实现需要更复杂的逻辑
# 这里假设行动是可逆的
return self.actions
```
### 分层规划
```python
class HierarchicalTask:
"""分层任务"""
def __init__(self, name: str,
is_primitive: bool = False,
subtasks: List['HierarchicalTask'] = None,
implementation: Callable = None):
self.name = name
self.is_primitive = is_primitive
self.subtasks = subtasks or []
self.implementation = implementation
class HierarchicalPlanner:
"""
分层规划器 (HTN - Hierarchical Task Network)
将复杂任务分解为可执行的原子任务
"""
def __init__(self, root_task: HierarchicalTask):
self.root_task = root_task
self.task_hierarchy = self._build_hierarchy(root_task)
def _build_hierarchy(self, task: HierarchicalTask,
level: int = 0) -> Dict:
"""构建任务层次结构"""
return {
'task': task,
'level': level,
'children': [
self._build_hierarchy(t, level + 1)
for t in task.subtasks
]
}
def plan(self, initial_state: Dict) -> List[Action]:
"""
执行分层规划
1. 从根任务开始
2. 递归分解非原子任务
3. 收集所有原子任务
"""
execution_plan = []
self._decompose_task(self.root_task, initial_state, execution_plan)
return execution_plan
def _decompose_task(self, task: HierarchicalTask,
state: Dict, plan: List) -> bool:
"""分解任务"""
if task.is_primitive:
# 原子任务,直接执行
if task.implementation:
result = task.implementation(state)
plan.append(Action(
name=task.name,
preconditions=lambda s: True,
effects=lambda s: result,
cost=1.0
))
return True
return False
# 非原子任务,递归分解子任务
for subtask in task.subtasks:
if not self._decompose_task(subtask, state, plan):
return False
return True
def visualize_hierarchy(self) -> str:
"""可视化任务层次"""
lines = []
def print_node(node, prefix="", is_last=True):
connector = "└── " if is_last else "├── "
lines.append(f"{prefix}{connector}{node['task'].name}")
children = node['children']
for i, child in enumerate(children):
is_last_child = (i == len(children) - 1)
extension = " " if is_last else ""
print_node(child, prefix + extension, is_last_child)
print_node(self.task_hierarchy)
return "\n".join(lines)
```
### 动态重规划
```python
class ReplanningAgent:
"""
支持动态重规划的Agent
特点:
1. 持续监控执行状态
2. 检测计划失效
3. 触发重新规划
"""
def __init__(self, planner, monitor_interval: float = 1.0):
self.planner = planner
self.monitor_interval = monitor_interval
self.current_plan: Optional[Plan] = None
self.executed_steps: List[str] = []
self.plan_status = PlanningStatus.IN_PROGRESS
def execute_with_monitoring(self,
initial_state: Any,
environment) -> Any:
"""
带监控的执行
Args:
initial_state: 初始状态
environment: 环境接口(支持 step() 和 get_state()
"""
# 初始规划
self.current_plan = self.planner.plan(initial_state)
if not self.current_plan:
self.plan_status = PlanningStatus.NO_PLAN
return None
current_state = initial_state
# 执行-监控循环
for action in self.current_plan.actions:
print(f"执行: {action.name}")
# 执行行动
try:
result = environment.execute(action.name, current_state)
self.executed_steps.append(action.name)
# 更新状态
current_state = environment.get_state()
# 检查是否需要重新规划
if self._should_replan(current_state, action, result):
print("检测到计划失效,重新规划...")
self._replan(current_state)
# 检查计划是否完成
if self._plan_complete(current_state):
self.plan_status = PlanningStatus.SUCCESS
break
except Exception as e:
print(f"执行失败: {e}")
self._replan(current_state)
return current_state
def _should_replan(self, state: Any,
last_action: Action,
result: Any) -> bool:
"""判断是否需要重新规划"""
# 检查1:行动结果是否符合预期
if not result.get('success', True):
return True
# 检查2:状态是否发生意外变化
if result.get('unexpected_change', False):
return True
# 检查3:目标是否已改变
if result.get('goal_changed', False):
return True
return False
def _replan(self, current_state: Any) -> None:
"""执行重新规划"""
# 保存已执行的步骤
executed = self.executed_steps.copy()
# 重新规划
new_plan = self.planner.plan(current_state)
if new_plan:
self.current_plan = new_plan
print(f"新计划: {''.join(new_plan.steps)}")
else:
print("无法找到新计划")
self.plan_status = PlanningStatus.FAILURE
def _plan_complete(self, state: Any) -> bool:
"""检查计划是否完成"""
return self.planner.goal_test(state)
```
---
## 代码示例
### 空间分析任务规划器
```python
"""
空间分析任务规划器
演示如何为GIS分析任务创建分层规划系统
"""
from typing import List, Dict, Any, Optional, Callable
from dataclasses import dataclass, field
from enum import Enum
import json
class TaskType(Enum):
"""任务类型"""
DATA_PREPARATION = "data_preparation"
ANALYSIS = "analysis"
VISUALIZATION = "visualization"
EXPORT = "export"
class TaskStatus(Enum):
"""任务状态"""
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
FAILED = "failed"
SKIPPED = "skipped"
@dataclass
class Task:
"""任务定义"""
id: str
name: str
type: TaskType
description: str = ""
depends_on: List[str] = field(default_factory=list)
parameters: Dict[str, Any] = field(default_factory=dict)
status: TaskStatus = TaskStatus.PENDING
result: Any = None
error: Optional[str] = None
def is_ready(self, completed_tasks: set) -> bool:
"""检查任务是否准备就绪(依赖已完成)"""
return all(dep in completed_tasks for dep in self.depends_on)
def to_dict(self) -> Dict:
"""转换为字典"""
return {
'id': self.id,
'name': self.name,
'type': self.type.value,
'description': self.description,
'depends_on': self.depends_on,
'parameters': self.parameters,
'status': self.status.value,
'error': self.error
}
class SpatialAnalysisPlanner:
"""
空间分析任务规划器
功能:
1. 定义任务依赖关系
2. 生成执行计划
3. 执行任务序列
4. 处理失败和重试
"""
def __init__(self, name: str = "Spatial Analysis"):
self.name = name
self.tasks: Dict[str, Task] = {}
self.execution_history: List[Dict] = []
def add_task(self,
task_id: str,
name: str,
task_type: TaskType,
description: str = "",
depends_on: List[str] = None,
parameters: Dict = None) -> 'SpatialAnalysisPlanner':
"""添加任务"""
self.tasks[task_id] = Task(
id=task_id,
name=name,
type=task_type,
description=description,
depends_on=depends_on or [],
parameters=parameters or {}
)
return self
def get_execution_plan(self) -> List[List[str]]:
"""
获取执行计划(分层级)
返回每层可并行执行的任务ID列表
"""
plan = []
completed = set()
remaining = set(self.tasks.keys())
while remaining:
# 找出所有准备就绪的任务
ready = [
task_id for task_id in remaining
if self.tasks[task_id].is_ready(completed)
]
if not ready:
# 循环依赖
raise ValueError("检测到循环依赖或无法满足的依赖")
plan.append(ready)
completed.update(ready)
remaining -= set(ready)
return plan
def execute(self,
executor: Callable[[Task], Any],
max_retries: int = 1) -> Dict[str, Any]:
"""
执行计划
Args:
executor: 任务执行器函数
max_retries: 最大重试次数
Returns:
执行结果摘要
"""
plan = self.get_execution_plan()
results = {}
completed = set()
for level, task_ids in enumerate(plan):
print(f"\n=== 执行层级 {level + 1}/{len(plan)} ===")
print(f"任务: {', '.join(task_ids)}")
# 可以并行执行(这里简化为顺序)
for task_id in task_ids:
task = self.tasks[task_id]
for attempt in range(max_retries + 1):
try:
print(f" 执行: {task.name} (尝试 {attempt + 1})")
task.status = TaskStatus.IN_PROGRESS
# 执行任务
result = executor(task)
task.result = result
task.status = TaskStatus.COMPLETED
completed.add(task_id)
results[task_id] = result
# 记录历史
self.execution_history.append({
'task_id': task_id,
'status': 'completed',
'attempt': attempt + 1
})
break
except Exception as e:
error_msg = str(e)
task.error = error_msg
if attempt < max_retries:
print(f" 失败,重试: {error_msg}")
else:
task.status = TaskStatus.FAILED
print(f" 最终失败: {error_msg}")
self.execution_history.append({
'task_id': task_id,
'status': 'failed',
'error': error_msg,
'attempts': attempt + 1
})
# 决定是否继续
if task_id in self._get_critical_tasks():
print("关键任务失败,终止执行")
return results
return results
def visualize_plan(self) -> str:
"""可视化执行计划(DAG"""
plan = self.get_execution_plan()
lines = [f"\n{self.name} - 执行计划"]
lines.append("=" * 50)
for level, task_ids in enumerate(plan):
lines.append(f"\n层级 {level + 1}:")
for task_id in task_ids:
task = self.tasks[task_id]
deps = f" (依赖: {', '.join(task.depends_on)})" if task.depends_on else ""
lines.append(f" - {task.name}{deps}")
return "\n".join(lines)
def _get_critical_tasks(self) -> set:
"""获取关键任务(失败会终止整个流程)"""
# 简化实现:所有数据准备任务是关键的
return {
t.id for t in self.tasks.values()
if t.type == TaskType.DATA_PREPARATION
}
# ==================== 预定义分析工作流 ====================
class CommonAnalysisWorkflows:
"""常见空间分析工作流模板"""
@staticmethod
def ecological_network_analysis() -> SpatialAnalysisPlanner:
"""
生态网络分析工作流
六阶段:
1. 数据准备
2. 源地识别
3. 阻力面构建
4. MCR分析
5. 廊道提取
6. 结果输出
"""
planner = SpatialAnalysisPlanner("生态网络分析")
# 数据准备阶段
planner.add_task("load_landcover", "加载土地覆盖数据",
TaskType.DATA_PREPARATION,
"加载研究区土地覆盖栅格数据")
planner.add_task("load_elevation", "加载高程数据",
TaskType.DATA_PREPARATION,
"加载DEM高程数据")
# 分析阶段
planner.add_task("identify_sources", "识别生态源地",
TaskType.ANALYSIS,
"基于形态空间格局分析识别核心生境斑块",
depends_on=["load_landcover"])
planner.add_task("build_resistance", "构建生态阻力面",
TaskType.ANALYSIS,
"基于土地覆盖类型赋值构建阻力面",
depends_on=["load_landcover", "load_elevation"])
planner.add_task("mcr_analysis", "最小累积阻力分析",
TaskType.ANALYSIS,
"计算从各源地到空间各点的最小累积阻力",
depends_on=["identify_sources", "build_resistance"])
planner.add_task("extract_corridors", "提取生态廊道",
TaskType.ANALYSIS,
"基于MCR结果提取潜在生态廊道",
depends_on=["mcr_analysis"])
# 输出阶段
planner.add_task("visualize", "结果可视化",
TaskType.VISUALIZATION,
"生成源地、阻力面、廊道的可视化地图",
depends_on=["extract_corridors"])
planner.add_task("export_results", "导出分析结果",
TaskType.EXPORT,
"导出矢量数据和统计报告",
depends_on=["extract_corridors"])
return planner
@staticmethod
def site_selection_analysis() -> SpatialAnalysisPlanner:
"""
选址分析工作流
1. 加载约束数据
2. 加载候选地块
3. 叠加分析
4. 适宜性评价
5. 最优选址
6. 结果导出
"""
planner = SpatialAnalysisPlanner("设施选址分析")
planner.add_task("load_constraints", "加载约束数据",
TaskType.DATA_PREPARATION,
"加载坡度、保护区、道路等约束数据")
planner.add_task("load_candidates", "加载候选地块",
TaskType.DATA_PREPARATION,
"加载候选地块矢量数据")
planner.add_task("overlay_analysis", "叠加分析",
TaskType.ANALYSIS,
"将约束数据叠加到候选地块",
depends_on=["load_constraints", "load_candidates"])
planner.add_task("suitability", "适宜性评价",
TaskType.ANALYSIS,
"基于多准则评价计算适宜性得分",
depends_on=["overlay_analysis"])
planner.add_task("select_optimal", "最优选址",
TaskType.ANALYSIS,
"选择得分最高的地块",
depends_on=["suitability"])
planner.add_task("export", "导出选址方案",
TaskType.EXPORT,
"导出选址结果和评价报告",
depends_on=["select_optimal"])
return planner
# ==================== 演示程序 ====================
def demonstrate_spatial_planning():
"""演示空间分析规划系统"""
print("=" * 70)
print("空间分析任务规划器演示")
print("=" * 70)
# 1. 创建生态网络分析工作流
print("\n1. 创建生态网络分析工作流...")
planner = CommonAnalysisWorkflows.ecological_network_analysis()
# 2. 可视化执行计划
print("\n2. 执行计划DAG:")
print(planner.visualize_plan())
# 3. 获取执行计划
print("\n3. 执行层级:")
execution_plan = planner.get_execution_plan()
for i, level in enumerate(execution_plan, 1):
task_names = [planner.tasks[t].name for t in level]
print(f" 层级 {i}: {', '.join(task_names)}")
# 4. 模拟执行
print("\n4. 模拟执行:")
def mock_executor(task: Task) -> Dict:
"""模拟任务执行"""
import time
import random
time.sleep(0.1) # 模拟执行时间
# 模拟偶尔失败
if random.random() < 0.1:
raise Exception("模拟随机失败")
return {
'task': task.name,
'status': 'success',
'output': f"{task.name}_output"
}
results = planner.execute(mock_executor, max_retries=2)
# 5. 统计结果
print("\n5. 执行统计:")
status_count = {}
for task in planner.tasks.values():
status = task.status.value
status_count[status] = status_count.get(status, 0) + 1
for status, count in status_count.items():
print(f" {status}: {count}")
# 6. 创建自定义工作流
print("\n6. 创建自定义工作流:")
custom_planner = SpatialAnalysisPlanner("自定义分析")
custom_planner.add_task("t1", "数据加载", TaskType.DATA_PREPARATION)
custom_planner.add_task("t2", "数据清洗", TaskType.ANALYSIS, depends_on=["t1"])
custom_planner.add_task("t3", "统计分析", TaskType.ANALYSIS, depends_on=["t2"])
custom_planner.add_task("t4", "并行分析A", TaskType.ANALYSIS, depends_on=["t2"])
custom_planner.add_task("t5", "并行分析B", TaskType.ANALYSIS, depends_on=["t2"])
custom_planner.add_task("t6", "结果汇总", TaskType.ANALYSIS,
depends_on=["t3", "t4", "t5"])
print(custom_planner.visualize_plan())
if __name__ == "__main__":
demonstrate_spatial_planning()
```
### RL风格的规划执行
```python
class ReinforcementLearningPlanner:
"""
基于强化学习思想的规划执行
特点:
1. 从执行中学习
2. 评估行动效果
3. 更新策略
"""
def __init__(self, actions: List[Action],
reward_fn: Callable[[Any, Any, Any], float]):
"""
Args:
actions: 可用行动
reward_fn: 奖励函数 (state, action, next_state) -> reward
"""
self.actions = actions
self.reward_fn = reward_fn
# Q值表:state -> {action: q_value}
self.q_table: Dict[str, Dict[str, float]] = {}
# 学习参数
self.learning_rate = 0.1
self.discount_factor = 0.9
self.epsilon = 0.1 # 探索率
def select_action(self, state: Any, training: bool = True) -> Action:
"""
选择行动(epsilon-greedy策略)
Args:
state: 当前状态
training: 是否在训练模式
"""
state_key = self._state_key(state)
# 初始化Q值
if state_key not in self.q_table:
self.q_table[state_key] = {a.name: 0.0 for a in self.actions}
# epsilon-greedy
import random
if training and random.random() < self.epsilon:
# 探索:随机选择
return random.choice(self.actions)
else:
# 利用:选择Q值最大的
q_values = self.q_table[state_key]
best_action_name = max(q_values, key=q_values.get)
return next(a for a in self.actions if a.name == best_action_name)
def update_q_value(self, state: Any, action: Action,
reward: float, next_state: Any) -> None:
"""
更新Q值(Q-learning更新规则)
Q(s,a) ← Q(s,a) + α[r + γ max Q(s',a') - Q(s,a)]
"""
state_key = self._state_key(state)
next_state_key = self._state_key(next_state)
# 确保初始化
if next_state_key not in self.q_table:
self.q_table[next_state_key] = {
a.name: 0.0 for a in self.actions
}
# 计算新的Q值
current_q = self.q_table[state_key][action.name]
max_next_q = max(self.q_table[next_state_key].values())
new_q = current_q + self.learning_rate * (
reward + self.discount_factor * max_next_q - current_q
)
self.q_table[state_key][action.name] = new_q
def learn_episode(self, environment,
max_steps: int = 100) -> float:
"""
执行一个学习episode
Returns:
总奖励
"""
state = environment.reset()
total_reward = 0
for _ in range(max_steps):
# 选择行动
action = self.select_action(state, training=True)
# 执行行动
next_state, done = environment.step(action)
# 计算奖励
reward = self.reward_fn(state, action, next_state)
total_reward += reward
# 更新Q值
self.update_q_value(state, action, reward, next_state)
state = next_state
if done:
break
return total_reward
def _state_key(self, state: Any) -> str:
"""生成状态键(简化)"""
return str(hash(str(state)))
```
---
## 案例分析
### LangGraph的规划执行
```python
"""
LangGraph风格的规划执行
LangGraph使用状态图来表示和执行复杂的Agent工作流
"""
from typing import TypedDict, Annotated, Sequence
import operator
class AgentState(TypedDict):
"""Agent状态定义"""
messages: Annotated[Sequence[str], operator.add]
current_plan: list[str]
executed_steps: list[str]
requires_replan: bool
def should_continue(state: AgentState) -> str:
"""
条件边:决定继续执行还是结束
类似LangGraph的条件边
"""
if not state["current_plan"]:
return "end"
if state["requires_replan"]:
return "replan"
return "continue"
class LangGraphStylePlanner:
"""LangGraph风格的规划器"""
def __init__(self):
self.state = AgentState(
messages=[],
current_plan=[],
executed_steps=[],
requires_replan=False
)
self.nodes = {
"plan": self._plan_node,
"execute": self._execute_node,
"observe": self._observe_node,
"replan": self._replan_node
}
def build_graph(self) -> Dict:
"""构建执行图"""
return {
"nodes": self.nodes,
"edges": {
"plan": "execute",
"execute": "observe",
"observe": should_continue,
"continue": "execute",
"replan": "execute"
}
}
def _plan_node(self, state: AgentState) -> AgentState:
"""规划节点:生成初始计划"""
state["current_plan"] = ["step1", "step2", "step3"]
state["messages"].append("计划已生成")
return state
def _execute_node(self, state: AgentState) -> AgentState:
"""执行节点:执行下一步"""
if state["current_plan"]:
step = state["current_plan"].pop(0)
state["executed_steps"].append(step)
state["messages"].append(f"已执行: {step}")
return state
def _observe_node(self, state: AgentState) -> AgentState:
"""观察节点:检查是否需要重新规划"""
# 检查执行结果
state["requires_replan"] = False # 简化
return state
def _replan_node(self, state: AgentState) -> AgentState:
"""重规划节点:调整计划"""
state["current_plan"] = ["new_step"] + state["current_plan"]
state["requires_replan"] = False
state["messages"].append("计划已更新")
return state
def run(self, initial_goal: str) -> AgentState:
"""运行整个图"""
self.state["messages"].append(f"目标: {initial_goal}")
graph = self.build_graph()
current_node = "plan"
while current_node != "end":
# 执行节点
self.state = self.nodes[current_node](self.state)
# 获取下一个节点
next_node = graph["edges"].get(current_node)
if callable(next_node):
next_node = next_node(self.state)
current_node = next_node
return self.state
```
---
## 反思与延伸
### 思考问题
1. **规划深度**:多深的规划是合适的?过度规划会有什么问题?
2. **不确定性**:如何在不确定环境中进行规划?
3. **多Agent协调**:多个Agent如何协调各自的规划?
4. **规划评估**:如何评估一个规划的质量?
### 延伸阅读
- **"Planning Algorithms"** (LaValle) - 规划算法权威教材
- **"Hierarchical Planning"** - 分层规划专题
- **"Reinforcement Learning"** (Sutton & Barto) - RL中的规划与学习
---
## 关键要点
1. **规划**是寻找从初始状态到目标的行动序列
2. **前向搜索**从初始状态向目标搜索,适合目标明确的场景
3. **后向搜索**从目标向初始状态搜索,适合目标较少的场景
4. **分层规划**将复杂任务分解,适合复杂多阶段任务
5. **重规划**是应对环境变化的关键机制
6. **执行-监控-调整**循环是实际系统的核心模式
7. **任务依赖管理**使用DAG表达和并行化执行