尚硅谷-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 协议》,转载必须注明作者和本文链接
IT爱知识
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!