尚硅谷-ITS多智能体
ITS是多智能体协作最典型的落地场景之一——路口信号灯、自动驾驶车辆、路侧感知单元、交通指挥中心各自是独立Agent,需要去中心化协同决策。
一、ITS多智能体的核心架构认知
| 传统集中式控制 | 2026年多智能体协作 |
|---|---|
| 一个大脑发号施令 | 每个路口/车辆都是智能体,拥有局部决策权 |
| 全局最优解(计算慢) | 局部共识+全局协调(实时性强) |
| 单点故障导致系统瘫痪 | 去中心化容错,任意节点离线不影响整体 |
| 依赖高精度地图预置 | 实时感知+动态协商,适应突发路况 |
🧠 核心范式:交通信号灯Agent、自动驾驶车辆Agent、路侧单元Agent之间通过消息总线交换意图,形成”协商-承诺-执行-反思“循环。
二、技术选型(2026年7月最新)
| 层级 | 推荐方案 | 说明 |
|---|---|---|
| 智能体框架 | LangGraph + 自定义多Agent协作 | 每个路口是独立Graph实例 |
| 消息通信 | MQTT + 自定义Agent协议 | 轻量级、低延迟、支持断网重连 |
| 状态同步 | Redis (Pub/Sub) | 实时路况状态共享 |
| 仿真环境 | SUMO + Carla联合仿真 | SUMO做宏观交通流,Carla做微观车辆控制 |
| 共识机制 | 改进型Raft(轻量级投票) | 解决相位冲突时的决策仲裁 |
三、零基础实战:构建”十字路口多智能体协作系统”
场景目标
两个相邻路口(路口A和路口B),各有一个信号灯Agent和一个路侧感知Agent。当路口A发生拥堵时,自动协商调整路口B的信号灯相位,避免溢出。
步骤1:定义每个Agent的基础结构(基于LangGraph)
每个路口Agent是一个独立的LangGraph实例,拥有自己的状态和决策逻辑:
python
from langgraph.graph import StateGraph, MessagesState, START, END
from langchain_openai import ChatOpenAI
import json
===== 路口Agent的专用状态 =====
class IntersectionState(MessagesState):
intersection_id: str # 路口ID
phase: str # 当前相位: “NS” / “EW” / “ALL_RED”
queue_length: int # 排队车辆数(感知获取)
pressure: float # 压力值(排队×等待时间)
neighbor_pressure: dict # 邻居路口的压力广播
action: str # 待执行动作
===== 创建单个路口Agent的工厂函数 =====
def create_intersection_agent(intersection_id: str):
model = ChatOpenAI(model=”gpt-4o-mini”)
1. 感知节点:读取本地传感器数据
def perceive(state: IntersectionState):
实际项目里这里调用SUMO API或摄像头数据
模拟:随机生成排队长度
import random
queue = random.randint(0, 30)
return {
“queue_length”: queue,
“pressure”: queue * (1 + state.get(“wait_time”, 0) / 60)
}
2. 协商节点:向邻居广播自己的压力,并接收邻居压力
def negotiate(state: IntersectionState):
广播自己的压力到Redis(模拟MQTT)
import redis
r = redis.Redis(host=’localhost’, decode_responses=True)
r.publish(f”intersection/{intersection_id}/pressure”,
json.dumps({“id”: intersection_id, “pressure”: state[“pressure”]}))
从Redis读取邻居压力(实际用订阅回调)
此处简化:直接硬编码邻居压力
return {“neighbor_pressure”: {“B”: 0.85}} # 0-1归一化压力值
3. 决策节点:根据自身+邻居压力,决定是否调整相位
def decide(state: IntersectionState):
my_pressure = state[“pressure”]
neighbor_p = state.get(“neighbor_pressure”, {}).get(“B”, 0)
决策规则(可让LLM生成更复杂策略)
if my_pressure > 0.7 and neighbor_p > 0.6:
双方向都堵 → 不调整(维持现状)
action = “HOLD”
elif my_pressure > 0.7 and neighbor_p < 0.4:
自己堵、邻居不堵 → 请求邻居让行
action = “REQUEST_GREEN_EXTENSION”
elif my_pressure < 0.3 and neighbor_p > 0.7:
自己不堵、邻居堵 → 给邻居让行
action = “YIELD_TO_NEIGHBOR”
else:
action = “HOLD”
return {“action”: action}
4. 执行节点:执行动作(调用SUMO API改信号灯)
def execute(state: IntersectionState):
action = state[“action”]
if action == “REQUEST_GREEN_EXTENSION”:
print(f”🚦 路口{intersection_id}: 请求延长绿灯”)
实际调用 SUMO 的 traci.trafficlight.setPhase()
elif action == “YIELD_TO_NEIGHBOR”:
print(f”🚦 路口{intersection_id}: 让行邻居,切换为黄灯”)
else:
print(f”🚦 路口{intersection_id}: 保持当前相位”)
return {“phase”: “ADJUSTED” if action != “HOLD” else “HOLD”}
5. 构建图
builder = StateGraph(IntersectionState)
builder.add_node(“perceive”, perceive)
builder.add_node(“negotiate”, negotiate)
builder.add_node(“decide”, decide)
builder.add_node(“execute”, execute)
builder.add_edge(START, “perceive”)
builder.add_edge(“perceive”, “negotiate”)
builder.add_edge(“negotiate”, “decide”)
builder.add_edge(“decide”, “execute”)
builder.add_edge(“execute”, END)
return builder.compile()
步骤2:多Agent协作的”共识仲裁层”
当多个路口Agent的决策冲突时(例如两个路口都想抢绿灯),需要一个轻量级共识协议:
python
from typing import List, Dict
import random
class ConsensusCoordinator:
“””分布式共识协调器(去中心化投票)”””
def init(self, agent_ids: List[str]):
self.agent_ids = agent_ids
self.proposals = {} # {agent_id: proposal}
def collect_proposals(self, agent_id: str, proposal: str, priority: float):
“””收集各Agent的提案,priority越高越优先”””
self.proposals[agent_id] = {“proposal”: proposal, “priority”: priority}
def reach_consensus(self) -> Dict[str, str]:
“””基于优先级加权投票,返回每个Agent最终执行的动作”””
如果所有提案都是HOLD,保持现状
if all(p[“proposal”] == “HOLD” for p in self.proposals.values()):
return {aid: “HOLD” for aid in self.agent_ids}
选出优先级最高的非HOLD提案
best = max(
[(aid, p) for aid, p in self.proposals.items() if p[“proposal”] != “HOLD”],
key=lambda x: x[1][“priority”]
)
最佳提案的Agent执行,其他Agent配合(让行或等待)
result = {}
for aid in self.agent_ids:
if aid == best[0]:
result[aid] = best[1][“proposal”]
else:
result[aid] = “YIELD” # 配合模式
return result
使用示例
coordinator = ConsensusCoordinator([“A”, “B”])
路口A提案:请求绿灯延长(优先级0.9)
coordinator.collect_proposals(“A”, “REQUEST_GREEN_EXTENSION”, 0.9)
路口B提案:保持(优先级0.3)
coordinator.collect_proposals(“B”, “HOLD”, 0.3)
final_actions = coordinator.reach_consensus()
print(final_actions) # {‘A’: ‘REQUEST_GREEN_EXTENSION’, ‘B’: ‘YIELD’}
步骤3:集成SUMO仿真(让Agent”活”在真实交通流中)
python
import traci # SUMO的Python接口
from sumo_rl import SumoEnvironment # 强化学习环境封装
1. 启动SUMO仿真
sumo_cmd = [“sumo-gui”, “-c”, “intersection.sumocfg”]
traci.start(sumo_cmd)
2. 主循环:每个仿真步长执行多智能体决策
step = 0
while step < 10000:
每个路口Agent独立感知、决策
for intersection_id in [“A”, “B”]:
获取排队长度(从SUMO读取)
queue = traci.edge.getLastStepVehicleNumber(f”edge_{intersection_id}”)
调用Agent决策(上面定义的LangGraph实例)
agent = create_intersection_agent(intersection_id)
result = agent.invoke({
“intersection_id”: intersection_id,
“queue_length”: queue,
“neighbor_pressure”: get_neighbor_pressure(intersection_id) # 从Redis读
})
执行动作(通过SUMO设置信号灯)
if result[“action”] == “REQUEST_GREEN_EXTENSION”:
traci.trafficlight.setPhase(intersection_id, 2) # 延长绿灯
elif result[“action”] == “YIELD”:
traci.trafficlight.setPhase(intersection_id, 1) # 黄灯
… 其他动作
traci.simulationStep()
step += 1
traci.close()
四、2026年ITS多智能体的前沿特性
| 特性 | 说明 | 代码示例 |
|---|---|---|
| 联邦学习协作 | 各路口模型不共享原始数据,只共享梯度 | flwr (Flower) 框架 + 本地模型 |
| V2X通信 | 车辆-基础设施直接通信,缩短反应时间 | 使用 MQTT over 5G + protobuf 序列化 |
| 数字孪生回放 | 历史交通场景作为”训练记忆” | LangGraph Checkpointer 保存每轮状态,随时回溯 |
| 异常检测Agent | 专门监控”失控”路口,主动介入 | 独立Agent监听所有路口状态,触发interrupt() |
五、零基础学习路线(ITS方向)
| 阶段 | 学习内容 | 工具/资源 |
|---|---|---|
| 第1周 | 单路口Agent + 信号灯控制 | SUMO入门 + 本文步骤1代码 |
| 第2周 | 双路口协商 + 共识协议 | 步骤2代码 + Redis消息队列 |
| 第3周 | 集成仿真环境(SUMO) | 步骤3完整代码跑通 |
| 第4周 | 引入LLM作为”高级规划器” | 用GPT-4生成动态策略而非硬编码规则 |
| 进阶 | 加入自动驾驶车辆Agent | Carla仿真 + 车辆运动规划 |
六、避坑指南(ITS多智能体特有)
| 坑 | 表现 | 解决 |
|---|---|---|
| 通信延迟 | Agent拿到的是过时路况,决策滞后 | 用时间戳+预测模型(如卡尔曼滤波)补偿 |
| 共识风暴 | 多个路口频繁提案,系统震荡 | 设置cooldown冷却期,10秒内不能连续提案 |
| LLM响应慢 | 用GPT决策导致500ms+延迟 | 分层设计:高频决策用规则引擎,LLM只做”战略层”(每5分钟调用一次) |
| 仿真与现实差距 | 仿真跑通,实车测试失败 | 加入域随机化(Domain Randomization)训练策略 |
如果你今天就想动手,建议先跑通步骤1的单路口Agent代码(不依赖SUMO,纯逻辑模拟),感受Agent”感知-协商-决策-执行”的循环。完成后,我可以为你提供SUMO环境配置文件,让代码接入真实交通仿真。😊
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu