From 705fa846da402905aea4e5f05cc9ca075abed69f Mon Sep 17 00:00:00 2001 From: Maple-YZ Date: Fri, 10 Apr 2026 03:22:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A6=81=E6=AD=A2=E9=81=93=E8=B7=AF=E9=99=90?= =?UTF-8?q?=E9=80=9F=E8=A2=AB=E4=BF=AE=E6=94=B9=E8=87=B3=E8=B6=85=E8=BF=87?= =?UTF-8?q?=E4=B8=8A=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- envs/edge_vsl_env.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/envs/edge_vsl_env.py b/envs/edge_vsl_env.py index 46a897e..9bcfd12 100644 --- a/envs/edge_vsl_env.py +++ b/envs/edge_vsl_env.py @@ -127,6 +127,7 @@ class SUMOEdgeVSLEnvironment: ) self.controlled_length_km = corridor_assets.controlled_length_m / 1000.0 self.default_edge_speeds = self._build_default_segment_speeds() + self.max_segment_speeds = self.default_edge_speeds.copy() self.action_dims = [self.num_speed_actions] * self.num_edges self.features_per_edge = 3 @@ -345,14 +346,22 @@ class SUMOEdgeVSLEnvironment: self._close_sumo() def _decode_action(self, action: np.ndarray) -> np.ndarray: - return np.array([self.speed_actions_ms[int(a)] for a in action]) + requested_speeds = np.array([self.speed_actions_ms[int(a)] for a in action], dtype=float) + return np.minimum(requested_speeds, self.max_segment_speeds) def _apply_vsl(self, edge_speeds: np.ndarray): for idx, segment_id in enumerate(self.control_edges): if idx in self.passive_segment_indices: continue for edge_id in self.segment_edge_map.get(segment_id, []): - traci.edge.setMaxSpeed(edge_id, float(edge_speeds[idx])) + edge_info = self.parser.edge_info.get(edge_id) + original_edge_speed = ( + float(edge_info.speed_limit) + if edge_info is not None + else float(edge_speeds[idx]) + ) + safe_speed = min(float(edge_speeds[idx]), original_edge_speed) + traci.edge.setMaxSpeed(edge_id, safe_speed) def _get_edge_detector_data(self) -> Tuple[List[float], List[float], List[int], List[float]]: speeds, occs, counts, valid_speeds = [], [], [], []