Spaces:
Sleeping
Sleeping
| """ | |
| Configuration file for RL Traffic Signal Control project. | |
| Contains all hyperparameters and settings for the environment, | |
| agents, and training process. | |
| """ | |
| import os | |
| from pathlib import Path | |
| # ============================================================================ | |
| # PROJECT PATHS | |
| # ============================================================================ | |
| ROOT_DIR = Path(__file__).parent | |
| MODELS_DIR = ROOT_DIR / "models" | |
| MODELS_DIR.mkdir(exist_ok=True) | |
| RESULTS_DIR = ROOT_DIR / "results" | |
| RESULTS_DIR.mkdir(exist_ok=True) | |
| # ============================================================================ | |
| # ENVIRONMENT CONFIGURATION | |
| # ============================================================================ | |
| NUM_LANES = 2 # Lanes per direction at each intersection | |
| EPISODE_LENGTH = 3600 # Steps per episode (simulated 1 hour) | |
| TIME_STEP = 1 # Simulation time step in seconds | |
| # Traffic generation | |
| TRAFFIC_DENSITY = 0.02 # Drastically reduced to hit ~1000-5000 throughput per episode | |
| PEAK_HOURS = [(7, 9), (17, 19)] # Morning and evening rush hours | |
| PEAK_MULTIPLIER = 1.5 # Traffic density multiplier during peak hours | |
| # Signal timing constraints | |
| MIN_GREEN_TIME = 10 # Minimum green light duration (seconds) | |
| MAX_GREEN_TIME = 60 # Maximum green light duration (seconds) | |
| YELLOW_TIME = 3 # Yellow light duration (seconds) | |
| ALL_RED_TIME = 2 # All-red clearance time (seconds) | |
| # ============================================================================ | |
| # AGENT CONFIGURATION | |
| # ============================================================================ | |
| AGENT_TYPE = "dqn" # Options: "dqn", "q_learning" | |
| STATE_SIZE = 9 # [N_SR, N_L, E_SR, E_L, S_SR, S_L, W_SR, W_L, phase] | |
| ACTION_SIZE = 2 # 0=keep current phase, 1=switch phase | |
| # Deep Q-Network (DQN) hyperparameters | |
| DQN_CONFIG = { | |
| "learning_rate": 0.0001, # Low LR for stability | |
| "gamma": 0.99, # Discount factor | |
| "epsilon_start": 1.0, # Initial exploration rate | |
| "epsilon_end": 0.01, # Final exploration rate | |
| "epsilon_decay": 0.998, # Slow decay for thorough exploration | |
| "memory_size": 50000, # Replay buffer size | |
| "batch_size": 256, # Larger batch = better GPU utilisation | |
| "target_update": 10, # Target network update frequency (episodes) | |
| "hidden_layers": [256, 256], # Slightly larger network for 9D state space | |
| "train_frequency": 4, # Train every N env steps (reduces CPU-GPU overhead) | |
| } | |
| # Q-Learning (tabular) hyperparameters | |
| Q_LEARNING_CONFIG = { | |
| "learning_rate": 0.1, # Alpha | |
| "gamma": 0.99, # Discount factor | |
| "epsilon_start": 1.0, # Initial exploration rate | |
| "epsilon_end": 0.01, # Final exploration rate | |
| "epsilon_decay": 0.995, # Exploration decay rate | |
| "num_bins": 10, # Bins per state dimension for discretization | |
| } | |
| # ============================================================================ | |
| # TRAINING CONFIGURATION | |
| # ============================================================================ | |
| NUM_EPISODES = 1000 # Total training episodes | |
| EVAL_FREQUENCY = 50 # Evaluate every N episodes | |
| SAVE_FREQUENCY = 100 # Save checkpoint every N episodes | |
| EARLY_STOPPING_PATIENCE = 100 # Stop if no improvement for N episodes | |
| MIN_REWARD_THRESHOLD = -1000 # Minimum average reward threshold | |
| # Logging | |
| LOG_FREQUENCY = 10 # Log metrics every N episodes | |
| USE_TENSORBOARD = False # Disabled by default (no extra deps) | |
| # ============================================================================ | |
| # EVALUATION CONFIGURATION | |
| # ============================================================================ | |
| NUM_EVAL_EPISODES = 10 # Episodes for evaluation | |
| RENDER_EVAL = False # Render environment during evaluation | |
| # ============================================================================ | |
| # VISUALIZATION | |
| # ============================================================================ | |
| FIGURE_SIZE = (12, 6) | |
| DPI = 100 | |
| METRICS = [ | |
| "episode_reward", | |
| "average_waiting_time", | |
| "average_queue_length", | |
| "throughput", | |
| ] | |
| # ============================================================================ | |
| # RANDOM SEED | |
| # ============================================================================ | |
| RANDOM_SEED = 42 | |
| # ============================================================================ | |
| # DEVICE | |
| # ============================================================================ | |
| try: | |
| import torch | |
| DEVICE = "cuda" if torch.cuda.is_available() else "cpu" | |
| print(f"[Config] Device: {DEVICE}") | |
| except ImportError: | |
| DEVICE = "cpu" | |
| print("[Config] PyTorch not found, using CPU") | |