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 = [], [], [], []