尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于多智能体协同与时空画像的分布式交通信号控制实践

基于多智能体协同与时空画像的分布式交通信号控制实践 1. 项目概述当城市交通遇上多智能体协同堵车大概是每个都市人每天都要面对的“必修课”。红绿灯各自为政车流在路口无序交织高峰期一条主干道的瘫痪能迅速蔓延到整个片区。传统的中心化交通信号控制系统比如我们熟悉的SCATS或SCOOT依赖于路口的感应线圈和中心服务器进行统一计算和调度。这套系统在过去几十年功不可没但它有个天生的瓶颈中心服务器的计算能力和数据收集的实时性。当城市规模扩大、路网复杂度激增时中心节点很容易成为瓶颈难以对瞬息万变的局部交通状况做出最优、最快的响应。我最近花了不少时间研究一个听起来有点学术但内核非常“硬核”的方向基于时空移动画像规划的去中心化多智能体城市交通管理。说白了就是让路口的每个信号灯或者一个区域内的信号灯组都变成一个拥有一定决策能力的“智能体”。它们不再傻傻地等待中心指令而是通过与相邻“伙伴”交流本地交通的实时“画像”协同规划出一套整体更优的信号配时方案。这就像把一支只会听令行事的军队变成了一支由许多经验丰富的小队长组成的特种部队每个小队都能根据眼前战况灵活应变并与友邻默契配合。这个项目的核心价值在于它试图用分布式协同的“群体智能”去破解中心化系统在超大规模、动态复杂城市路网中面临的响应迟缓和扩展性难题。它不依赖于一个强大的“超级大脑”而是依靠众多“小脑”的协作。对于交通工程师、智慧城市领域的开发者或是研究多智能体系统、强化学习的同学来说这里面既有深厚的理论趣味也有巨大的落地潜力。接下来我将拆解这个项目的完整思路、技术实现的关键细节以及在实际模拟中会遇到的那些“坑”。2. 核心思路从中心控制到分布式协同的范式转变要理解这个项目首先要跳出“一个系统控制所有红绿灯”的思维定式。传统的中心化控制其优化目标是全局的例如最小化全网总旅行时间或总排队长度。这需要收集全路网的数据求解一个规模极其庞大的优化问题计算耗时且对通信链路可靠性要求极高。一旦中心服务器或通信网络出现故障影响面是全局性的。2.1 去中心化多智能体架构的设计逻辑我们的思路是分而治之。将整个城市交通网络划分为多个相对独立的子区域每个子区域通常包含一个或数个关键路口由一个智能体负责管理。这个智能体的“感官”是它管辖范围内的检测器数据如摄像头、雷达、地磁线圈它的“决策”是调整该区域的信号配时方案相位、绿灯时长等它的“沟通对象”是地理上相邻的其他区域智能体。为什么这么做第一** scalability可扩展性。新增一个区域只需部署一个新的智能体并与其邻居建立连接无需重构整个中心系统。第二robustness鲁棒性。单个智能体故障通常只影响局部区域不会导致全网瘫痪。第三real-time responsiveness实时响应性**。智能体基于本地实时数据进行决策无需等待中心漫长的计算和指令下发周期能更快地应对突发拥堵或事故。但这里有一个核心矛盾如果每个智能体都只自私地优化自己区域的交通流比如拼命延长绿灯放行自己方向的车可能会把拥堵转移给下游邻居导致全局状况恶化。这就引出了第二个核心概念协同。智能体之间不能是信息孤岛它们需要共享关键信息在决策时考虑到对邻居的影响追求区域联盟的整体利益而不仅仅是个人利益。2.2 时空移动画像智能体共享的“共同语言”智能体之间应该交流什么简单交换“我现在很堵”这样的定性信息是没用的。我们需要一种结构化的、能够刻画交通流时空演化特征的数据表示这就是“时空移动画像”。你可以把它想象成一份动态的、微缩的“交通流诊断报告”。对于一个智能体管辖的区域这份报告至少包含以下几个维度的信息流入/流出流量画像在未来一个规划周期如下一个5分钟内预测从各个方向进入本区域和离开本区域的车辆数。这反映了需求的时空分布。队列长度与密度画像当前各条车道上的排队车辆数以及区域内的平均车辆密度。这反映了当前的拥堵程度。行程时间画像车辆穿越本区域的预估时间。这直接关联到用户体验。瓶颈点画像识别区域内哪些路段或转向是当前的瓶颈以及其严重程度。这个“画像”是时空的它包含了空间上不同路段、转向和时间上当前状态、短期预测的信息。智能体定期例如每1-2分钟生成并广播自己的最新画像给邻居。同时它也接收邻居的画像。这样每个智能体都拥有了一个关于局部路网状态的“共享感知图”。注意生成准确的时空移动画像是整个系统有效性的基石。它依赖于可靠的短时交通流预测模型。如果预测偏差很大智能体基于错误画像做出的协同决策可能就是南辕北辙。2.3 基于画像的协同规划如何达成“共识”现在每个智能体手上有两份信息自己的本地实时数据以及邻居们的时空移动画像。决策的目标不再是单纯优化自己而是在考虑邻居状态和预期行为的前提下优化一个更大的、包含自身和邻居区域的联合目标函数。这个过程通常建模为一个多智能体强化学习问题或者一个分布式约束优化问题。以MARL为例状态智能体自身的感知数据 接收到的邻居时空移动画像。动作调整本区域的信号配时参数如周期时长、绿信比、相位差。奖励这是协同的关键。奖励函数不能只包含本区域的指标如本区域平均延误必须融入“外部性”考量。例如奖励可以设计为本区域平均速度提升 - β * 对下游邻居造成的队列增长预估。这里的β是一个权重系数用于平衡自身利益与全局利益。通过这种奖励设计智能体在追求自身效率时会主动避免将问题转嫁给伙伴。智能体通过与环境交通仿真模拟器的持续交互来学习最优策略。在训练过程中智能体不断尝试不同动作观察带来的奖励和新的状态包括邻居画像的变化最终学会在何种局部和邻居状态下应采取何种信号控制策略能使这个“协同奖励”最大化。3. 系统核心模块拆解与实现要点一个完整的去中心化多智能体交通管理系统在工程实现上可以分为几个核心模块。下面我结合常用的工具链和技术栈来详细说明每个部分该怎么搭建以及其中的关键决策点。3.1 智能体环境接口与仿真平台选型任何强化学习项目的第一步都是构建训练环境。对于交通控制我们无法在真实道路上训练AI必须依赖高保真的微观交通仿真软件。主流仿真平台对比平台类型优点缺点适用场景SUMO开源微观完全免费定制化程度极高社区活跃与Python交互友好TraCI接口。默认图形界面较弱大规模路网仿真需要优化配置。学术研究、原型验证、需要深度定制的项目。VISSIM商业微观图形界面强大仿真精度高在工程界认可度高。昂贵自动化接口COM相比TraCI稍显笨重。商业项目、工程咨询、对仿真精度有极高要求的场景。Aimsun商业宏/中/微观功能全面支持混合仿真API完善。非常昂贵学习曲线陡峭。大型交通规划、商业级动态交通分配。对于我们这个以研究和前沿验证为主的项目SUMO是毋庸置疑的首选。它通过TraCI协议提供了一套完整的Python API允许我们在仿真运行时动态获取检测器数据、控制信号灯状态完美契合强化学习智能体与环境交互的需求。环境封装要点我们需要编写一个Env类它负责启动/连接SUMO仿真。在每个仿真步长如1秒从SUMO获取所有必要数据车道占用、车辆速度、排队长度等。将这些原始数据处理成智能体可观测的状态包括为邻居生成画像所需的数据。接收智能体发出的动作信号灯指令并通过TraCI下发给SUMO。计算并返回奖励。判断当前回合是否结束如仿真时间到达预设长度。实操心得SUMO仿真速度是关键。在训练初期可以使用--no-step-log和--no-warnings选项关闭不必要的日志来提升速度。对于超大规模路网考虑使用SUMO的libsumo一种更快的库接口替代传统的TraCI TCP通信。另外仿真的随机种子要固定以确保实验可复现。3.2 时空移动画像生成器的构建这是系统的“情报部门”。它的输入是原始交通流数据输出是结构化的画像字典。技术实现路径数据聚合从SUMO中我们需要按区域、按车道、按转向聚合以下数据vehicle_count: 车辆数。mean_speed: 平均速度。waiting_time: 总等待时间速度低于0.1m/s的累计时间。queue_length: 排队长度通常定义为速度低于5km/h的车辆数。inflow/outflow: 通过虚拟检测器计算的流入/流出量。短时预测模块为了生成包含未来信息的画像我们需要预测下一个周期如T5分钟的流量和速度。这里不一定需要非常复杂的深度学习模型。对于起步和验证可以考虑历史平均法使用相同时段的历史平均数据。简单但无法应对突发事件。时间序列模型如ARIMA、LSTM。LSTM能够捕捉非线性时序特征是当前的主流选择。可以为每个关键流入/流出链路训练一个小型LSTM网络输入过去N个时间片的数据预测未来M个时间片的数据。图神经网络如果考虑路网拓扑GCN或GAT能更好地建模空间相关性但复杂度更高。画像编码将聚合的当前数据和预测数据编码成一个固定维度的向量或字典。例如# 一个简化的画像字典示例 mobility_profile { region_id: R001, timestamp: current_time, current: { inflow: {N: 120, S: 95, E: 80, W: 110}, # 各方向流入量 outflow: {N: 85, S: 105, E: 115, W: 90}, # 各方向流出量 avg_density: 22.5, # 车辆/km avg_queue: {link_1: 8, link_2: 12, ...}, # 各链路排队 }, prediction: { inflow_next_5min: {N: 130, S: 100, ...}, congestion_risk: 0.65, # 拥堵风险指数0-1 bottleneck_links: [link_2, link_5] # 预测瓶颈链路ID } }这个画像需要被序列化如用JSON或MessagePack并通过通信层发送给邻居。注意事项画像的更新频率和预测时长是两个需要仔细调优的超参数。更新太频繁会导致通信开销剧增和决策振荡更新太慢则信息滞后。预测时长需要与智能体的决策周期相匹配通常决策周期是几分钟那么预测时长也应覆盖这个范围。3.3 多智能体通信与协同机制设计智能体之间如何安全、高效、可靠地交换画像通信模式选择中心化通信所有智能体将画像发送到一个中心消息代理如Redis Pub/Sub, RabbitMQ再从代理订阅邻居的画像。实现简单但引入了单点故障风险与“去中心化”哲学略有违背不过在实际工程中常作为折中方案。点对点通信智能体之间直接建立TCP/UDP连接进行通信。更符合去中心化架构但连接管理复杂N个智能体需要维护N*(N-1)/2个连接全连接扩展性差。Gossip协议每个智能体随机选择几个邻居传播画像信息最终会扩散到全网。容错性好但信息延迟不确定。对于区域划分明确、邻居关系固定的交通控制场景采用轻量级的中心化消息队列如ZeroMQ的PUB-SUB模式是一个务实的选择。每个智能体作为一个Publisher发布自己的画像同时订阅其所有邻居的Topic来接收画像。这样逻辑清晰性能也足够。协同决策算法这是整个系统的“大脑”。我们采用基于MARL的协同。算法选型考虑到交通控制中智能体需要部分观测、彼此合作与竞争并存的特点MADDPG或其改进版本是一个强有力的候选。MADDPG为每个智能体配备一个独立的Actor网络做决策和一个Critic网络评价决策但Critic在训练时可以获取全局信息所有智能体的状态和动作从而指导Actor学习考虑他人行为的策略。这非常适合我们“拥有邻居画像”的场景。网络结构Actor网络输入自身区域状态 所有邻居的时空移动画像拼接或通过注意力机制聚合。Actor网络输出信号控制动作如相位延长10秒或切换到下一相位。Critic网络输入所有智能体的状态所有智能体的动作。在训练时这帮助Critic学习联合行动的价值。训练范式所有智能体与环境并行交互收集经验轨迹(s, a, r, s)。将经验存入一个共享的经验回放缓冲区。这是打破数据相关性、稳定训练的关键。定期从缓冲区采样一批数据更新各个智能体的Critic和Actor网络。使用目标网络和软更新技术来进一步提升训练稳定性。踩坑实录在早期实验中直接让智能体学习输出绝对的绿灯时长很容易导致策略不稳定。一个有效的技巧是让智能体学习输出相对于当前配时的调整量例如5秒或-5秒并加以范围限制。另一个坑是奖励函数的尺度。如果自身延误减少的奖励是-0.1而对邻居造成拥堵的惩罚是-10智能体很快就会学会极度保守什么也不做。需要仔细平衡奖励函数中各项的权重最好先进行归一化。4. 从零搭建一个最小可行系统实操流程理论说了这么多我们动手搭建一个最简单的两路口协同控制原型把流程跑通。4.1 环境准备与SUMO路网构建首先安装必备工具# 安装SUMO sudo add-apt-repository ppa:sumo/stable sudo apt-get update sudo apt-get install sumo sumo-tools sumo-doc # 安装Python依赖 pip install sumolib traci gym numpy torch matplotlib然后我们用netedit图形化工具或netgenerate命令生成一个简单的“十”字型路网包含两个相邻的交叉路口A和B。每个路口配备一个简单的四相位信号灯。将路网保存为two_intersections.net.xml。接着编写仿真配置文件run.sumocfg定义车辆输入流使用flow标签随机生成车辆并配置必要的检测器inductionLoop用于统计流量和排队。4.2 智能体与环境封装代码框架我们创建两个智能体分别管理路口A和B。# agent.py import torch import torch.nn as nn import torch.optim as optim import numpy as np class ActorNetwork(nn.Module): 策略网络输入状态输出动作绿灯时长调整量 def __init__(self, state_dim, action_dim, hidden_dim256): super(ActorNetwork, self).__init__() self.fc1 nn.Linear(state_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim) self.fc3 nn.Linear(hidden_dim, action_dim) self.tanh nn.Tanh() # 输出在[-1, 1]后续映射到具体调整范围 def forward(self, state): x torch.relu(self.fc1(state)) x torch.relu(self.fc2(x)) action self.tanh(self.fc3(x)) return action class CriticNetwork(nn.Module): 价值网络输入所有智能体的状态和动作输出Q值 def __init__(self, total_state_dim, total_action_dim, hidden_dim256): super(CriticNetwork, self).__init__() self.fc1 nn.Linear(total_state_dim total_action_dim, hidden_dim) self.fc2 nn.Linear(hidden_dim, hidden_dim) self.fc3 nn.Linear(hidden_dim, 1) def forward(self, states, actions): x torch.cat([states, actions], dim-1) x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) q_value self.fc3(x) return q_value class DDPGAgent: 单个智能体包含Actor和Critic及其目标网络 def __init__(self, agent_id, state_dim, action_dim, total_state_dim, total_action_dim, lr_actor1e-4, lr_critic1e-3): self.id agent_id self.actor ActorNetwork(state_dim, action_dim) self.critic CriticNetwork(total_state_dim, total_action_dim) self.target_actor ActorNetwork(state_dim, action_dim) self.target_critic CriticNetwork(total_state_dim, total_action_dim) # 复制参数 self.target_actor.load_state_dict(self.actor.state_dict()) self.target_critic.load_state_dict(self.critic.state_dict()) # 优化器 self.actor_optimizer optim.Adam(self.actor.parameters(), lrlr_actor) self.critic_optimizer optim.Adam(self.critic.parameters(), lrlr_critic) # 其他属性经验缓冲区、噪声生成器等...# env.py import traci import sumolib import numpy as np from typing import Dict class TrafficEnv: def __init__(self, sumo_cfg, sim_step1, max_steps3600): self.sumo_cfg sumo_cfg self.sim_step sim_step self.max_steps max_steps self.current_step 0 self.agents [intersection_A, intersection_B] # 智能体ID列表 self.neighbors {intersection_A: [intersection_B], intersection_B: [intersection_A]} # 邻居关系 def reset(self): traci.start([sumo, -c, self.sumo_cfg, --no-step-log, --no-warnings]) self.current_step 0 # 获取初始状态 state self._get_state() return state def _get_state(self) - Dict[str, np.ndarray]: 为每个智能体获取其局部状态 states {} for agent in self.agents: # 这里简化处理状态 [自身各车道排队长度 自身各车道流量] queue_lengths self._get_queue_lengths(agent) flows self._get_flows(agent) local_state np.concatenate([queue_lengths, flows]) states[agent] local_state return states def _get_mobility_profile(self, agent_id) - Dict: 生成指定智能体的时空移动画像简化版 # 实际项目中这里会包含更复杂的聚合和预测逻辑 profile { agent_id: agent_id, step: self.current_step, queues: self._get_queue_lengths(agent_id).tolist(), flows: self._get_flows(agent_id).tolist(), # ... 其他字段 } return profile def step(self, actions: Dict[str, np.ndarray]): 执行动作推进仿真一步 # 1. 将动作调整量应用到SUMO信号灯 for agent_id, action in actions.items(): self._apply_signal_action(agent_id, action) # 2. 仿真推进一个步长 traci.simulationStep() self.current_step 1 # 3. 获取新状态 next_states self._get_state() # 4. 计算奖励 rewards {} for agent_id in self.agents: # 奖励 - (自身区域总延误 0.3 * 对主要下游邻居造成的队列增长) delay self._get_total_delay(agent_id) neighbor_impact self._estimate_neighbor_impact(agent_id) rewards[agent_id] - (delay 0.3 * neighbor_impact) # 5. 判断是否结束 done (self.current_step self.max_steps) info {} return next_states, rewards, done, info def close(self): traci.close()4.3 训练循环与协同逻辑集成在主训练循环中我们需要集成通信和协同。# train.py import numpy as np from env import TrafficEnv from agent import DDPGAgent import zmq # 用于通信 def main(): # 初始化环境和智能体 env TrafficEnv(two_intersections.sumocfg) agents {} for aid in env.agents: # 假设状态/动作维度已定义 agents[aid] DDPGAgent(aid, state_dim8, action_dim2, total_state_dim16, total_action_dim4) # 初始化ZeroMQ通信上下文简化示例实际需更健壮 context zmq.Context() pub_socket context.socket(zmq.PUB) pub_socket.bind(tcp://*:5555) # 每个智能体应绑定不同端口此处简化 sub_socket context.socket(zmq.SUB) for neighbor in env.neighbors[intersection_A]: # 以A为例 sub_socket.connect(ftcp://localhost:{neighbor_port}) sub_socket.setsockopt_string(zmq.SUBSCRIBE, ) # 训练循环 for episode in range(1000): state env.reset() episode_reward {aid: 0 for aid in env.agents} while not done: # 1. 每个智能体生成并发布自己的时空移动画像 profiles {} for aid in env.agents: profile env._get_mobility_profile(aid) profiles[aid] profile # 发布画像序列化后发送 pub_socket.send_json(profile) # 2. 每个智能体接收邻居的画像 neighbor_profiles {} try: while True: # 非阻塞接收 profile sub_socket.recv_json(zmq.NOBLOCK) neighbor_profiles[profile[agent_id]] profile except zmq.Again: pass # 没有更多消息 # 3. 构建增强状态自身状态 邻居画像特征 augmented_states {} for aid in env.agents: local_state state[aid] neighbor_features self._extract_features_from_profiles(neighbor_profiles, env.neighbors[aid]) augmented_state np.concatenate([local_state, neighbor_features]) augmented_states[aid] augmented_state # 4. 智能体根据增强状态选择动作加入探索噪声 actions {} for aid, agent in agents.items(): action agent.select_action(augmented_states[aid]) # 调用Actor网络 actions[aid] action # 5. 环境执行动作 next_state, rewards, done, _ env.step(actions) # 6. 存储经验到缓冲区需要为每个智能体存储 (augmented_state, action, reward, next_augmented_state) for aid in env.agents: agents[aid].replay_buffer.push(augmented_states[aid], actions[aid], rewards[aid], next_augmented_state_for_agent_aid) # 7. 更新状态累计奖励 state next_state for aid in env.agents: episode_reward[aid] rewards[aid] # 8. 定期从缓冲区采样更新所有智能体的网络 if total_steps % update_interval 0: for aid, agent in agents.items(): agent.update() # 执行DDPG的更新步骤 # 每轮结束记录日志 print(fEpisode {episode}, Rewards: {episode_reward}) env.close()这个简化框架勾勒出了从环境交互、画像通信到协同决策训练的完整链路。在实际项目中每个部分都需要大量细化例如更精细的状态/画像设计、更稳定的通信协议、更高效的经验回放采样策略等。5. 挑战、调优与实战避坑指南理论很美好但实际构建和训练这样一个系统时你会遇到一系列意料之中和意料之外的挑战。5.1 多智能体训练的不稳定性与收敛难题这是MARL领域的经典问题。在交通场景中表现为信号灯策略剧烈振荡或所有智能体收敛到一个极其保守的“无为而治”策略。解决策略参数共享让所有智能体共享同一个Actor和Critic网络的参数。这相当于强制它们学习同一个策略适用于同构的路口。能大幅加速收敛并提升稳定性。在我们的场景中如果所有路口智能体结构相似强烈推荐使用。课程学习不要一开始就在复杂、高流量的路网上训练。先从简单的单路口、低流量开始让智能体学会基本的响应。然后逐步增加路口数量、车流量、甚至引入突发事件如事故。这能引导智能体学习更稳健的策略。对手建模与注意力机制在Critic网络或状态处理中引入注意力机制让智能体能更有效地从邻居画像中提取关键信息而不是简单拼接。例如智能体可以学会更关注上游拥堵严重或下游通行能力紧张的邻居的画像。奖励塑形设计奖励函数是门艺术。除了最终的延误、排队指标可以加入中间奖励例如对“平滑度”的奖励避免绿灯时长剧烈变化对“公平性”的奖励避免某个方向长时间等待。这能引导智能体学习更符合人类工程师直觉的策略。5.2 仿真与现实的鸿沟如何保证策略可部署在SUMO中训练得再好的策略直接部署到真实路口可能完全失效。这是因为仿真模型无法完全复现真实的驾驶员行为、车辆动力学和复杂的路口渠化细节。缩小鸿沟的方法高保真仿真校准使用真实的历史数据线圈、摄像头数据来校准SUMO中的车辆跟驰模型如Krauss、IDM、换道模型和驾驶员行为参数。这是一个必要但繁琐的过程。域随机化在训练时随机化仿真环境的一些参数如车辆最大加速度、期望车头时距、信号灯黄灯时间等。这相当于给策略增加了“噪声训练”使其对模型误差更具鲁棒性。在线安全学习与微调部署初期采用“人在环”或“安全护盾”模式。让AI给出建议配时由工程师审核或设定安全边界后再执行。同时可以收集真实运行数据在仿真环境中构建“数字孪生”对策略进行持续的离线微调。分层控制架构不要指望AI直接控制每一秒。可以采用“上层规划下层执行”的模式。AI智能体负责制定周期级的配时方案如每5分钟输出一套配时参数下层的传统控制器负责在周期内安全执行。这降低了实时决策的风险。5.3 通信延迟与故障的容错处理在实际网络中智能体间的画像传输必然存在延迟甚至可能丢失。系统必须能容忍这种不完美。设计考量画像有效期与预测为每个时空移动画像打上时间戳并设置一个有效期。如果收到的邻居画像已过期智能体应能基于历史数据对其进行简单预测或使用上一个有效画像而不是直接丢弃。默认协作策略当检测到与某个邻居通信完全中断时智能体应切换到一个预设的、保守的“降级模式”。例如忽略该邻居的影响仅基于自身状态进行优化或采用固定的配时方案。心跳与健康检查实现简单的通信层心跳机制让智能体能及时发现邻居故障并调整自己的协同策略。5.4 评估指标与A/B测试设计如何证明你的多智能体系统比现有的定时方案或感应线圈方案更优需要一套科学的评估体系。核心评估指标效率指标区域平均行程时间、平均速度、总通行量。公平性指标不同方向车辆等待时间的方差、最大等待时间。鲁棒性指标在流量突变或通信故障情况下的性能衰减程度。计算与通信开销智能体的决策耗时、网络带宽占用。A/B测试方法在仿真中严格控制其他条件随机种子、车流输入一致对比运行你的智能体策略和基线策略如固定配时、感应控制上述指标。进行多次独立实验使用统计检验如t检验确认性能提升是否显著。终极心得这个项目最难的不是某个算法或代码而是对复杂系统进行合理的抽象和分解。如何定义智能体的边界区域划分如何设计画像的内容信息粒度如何制定奖励函数协同目标这些决策往往比选择哪种神经网络架构影响更大。我的建议是从一个极小规模的场景两个路口开始快速搭建原型可视化每一个中间结果画像内容、动作选择、奖励变化建立直觉。然后像搭积木一样逐步增加复杂度。这个过程本身就是对城市交通这个复杂巨系统进行理解和建模的绝佳训练。
返回列表