From a6a2e5a62639954e25619f01656b3dce467574f3 Mon Sep 17 00:00:00 2001 From: Maple-YZ Date: Thu, 23 Apr 2026 11:58:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=BD=A6=E6=A3=80=E5=99=A8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config_sumo_vsl.yaml | 4 ++-- envs/edge_vsl_env.py | 2 ++ envs/network_parser.py | 3 ++- envs/reward_system.py | 8 ++++---- utils/experiment_corridor.py | 32 +++++++++++++++++++++++++------- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/config_sumo_vsl.yaml b/config_sumo_vsl.yaml index c6242f4..3458ac6 100644 --- a/config_sumo_vsl.yaml +++ b/config_sumo_vsl.yaml @@ -53,8 +53,8 @@ environment: free_flow_speed: 30.56 reward: - efficiency_alpha: 2.19 - safety_beta: 9.19 + efficiency_alpha: 2.1159 + safety_beta: 7.8553 efficiency_exponent: 0.50 safety_exponent: 0.50 ttc_threshold_s: 2.3 diff --git a/envs/edge_vsl_env.py b/envs/edge_vsl_env.py index 669f003..fd24324 100644 --- a/envs/edge_vsl_env.py +++ b/envs/edge_vsl_env.py @@ -215,6 +215,8 @@ class SUMOEdgeVSLEnvironment: str(self.end_time), "--collision.action", "warn", + "--no-step-log", + "true", "--quit-on-end", "true", ] diff --git a/envs/network_parser.py b/envs/network_parser.py index e4b1257..85f5055 100644 --- a/envs/network_parser.py +++ b/envs/network_parser.py @@ -199,7 +199,8 @@ class SUMONetworkParser: for lane in lane_nodes: lane_idx = int(lane.get("index", "0")) allow = (lane.get("allow") or "").strip() - if allow != "emergency": + allow_tokens = {token for token in allow.split() if token} + if allow_tokens != {"emergency"}: traffic_lanes.append(lane_idx) if not traffic_lanes: diff --git a/envs/reward_system.py b/envs/reward_system.py index 5ccd0f4..f5a7986 100644 --- a/envs/reward_system.py +++ b/envs/reward_system.py @@ -36,8 +36,8 @@ def average_reward_components(totals: Mapping[str, float], steps: int) -> Dict[s @dataclass(frozen=True) class RewardConfig: - efficiency_alpha: float = 2.19 - safety_beta: float = 9.19 + efficiency_alpha: float = 2.1159 + safety_beta: float = 7.8553 efficiency_exponent: float = 0.50 safety_exponent: float = 0.50 ttc_threshold_s: float = 2.3 @@ -55,8 +55,8 @@ class RewardConfig: _ = speed_actions_ms return cls( - efficiency_alpha=float(raw_cfg.get("efficiency_alpha", 2.19)), - safety_beta=float(raw_cfg.get("safety_beta", 9.19)), + efficiency_alpha=float(raw_cfg.get("efficiency_alpha", 2.1159)), + safety_beta=float(raw_cfg.get("safety_beta", 7.8553)), efficiency_exponent=float(raw_cfg.get("efficiency_exponent", 0.50)), safety_exponent=float(raw_cfg.get("safety_exponent", 0.50)), ttc_threshold_s=float(raw_cfg.get("ttc_threshold_s", 2.3)), diff --git a/utils/experiment_corridor.py b/utils/experiment_corridor.py index f228a1e..d0b2b6b 100644 --- a/utils/experiment_corridor.py +++ b/utils/experiment_corridor.py @@ -30,6 +30,7 @@ EPS = 1e-6 BUILD_LOCK_TIMEOUT_S = 300.0 BUILD_LOCK_STALE_S = 900.0 BUILD_LOCK_POLL_S = 0.2 +DERIVED_ASSET_VERSION = 2 @dataclass @@ -191,6 +192,7 @@ def _build_signature( detector_start_offset_m: float, ) -> str: payload = { + "derived_asset_version": DERIVED_ASSET_VERSION, "net_file": str(net_path), "net_mtime_ns": net_path.stat().st_mtime_ns, "route_file": str(route_path), @@ -206,6 +208,28 @@ def _build_signature( return digest[:16] +def _lane_permission_tokens(lane: sumolib.net.lane.Lane) -> set[str]: + permissions = lane.getPermissions() + if permissions is None: + return set() + if isinstance(permissions, str): + return {token for token in permissions.split() if token} + return {str(token).strip() for token in permissions if str(token).strip()} + + +def _is_emergency_only_lane(lane: sumolib.net.lane.Lane) -> bool: + return _lane_permission_tokens(lane) == {"emergency"} + + +def _get_traffic_lane_indices(edge: sumolib.net.edge.Edge) -> List[int]: + traffic_lane_indices = [ + lane.getIndex() for lane in edge.getLanes() if not _is_emergency_only_lane(lane) + ] + if traffic_lane_indices: + return traffic_lane_indices + return [lane.getIndex() for lane in edge.getLanes()] + + def _load_ready_corridor_artifacts( manifest_path: Path, project_root: Path, @@ -756,13 +780,7 @@ def _build_detector_additional( continue edge = derived_net.getEdge(edge_range["edge_id"]) - traffic_lane_indices = [ - lane.getIndex() - for lane in edge.getLanes() - if "emergency" not in lane.getPermissions() - ] - if not traffic_lane_indices: - traffic_lane_indices = [lane.getIndex() for lane in edge.getLanes()] + traffic_lane_indices = _get_traffic_lane_indices(edge) local_position = global_distance - edge_range["start_m"] edge_pos_index = per_edge_pos_index.get(edge_range["edge_id"], 0)