仿真引擎核心 - 管理卫星、地面站、传输任务
| 387 | # 5. 仿真引擎 |
| 388 | # ========================================== |
| 389 | class SimulationEngine: |
| 390 | """仿真引擎核心 - 管理卫星、地面站、传输任务""" |
| 391 | |
| 392 | @property |
| 393 | def resource_usage(self): |
| 394 | return self._resources.usage |
| 395 | |
| 396 | @property |
| 397 | def resource_time_pool(self): |
| 398 | return self._resources.time_pool |
| 399 | |
| 400 | |
| 401 | def __init__(self, ground_station_count=DEFAULT_GROUND_STATION_COUNT, leo_satellite_count=DEFAULT_LEO_SATELLITE_COUNT, rng=None, autostart=True): |
| 402 | self.current_time = 0.0 |
| 403 | self.running = False |
| 404 | # 可注入随机源以保证可复现(未注入则用独立 Random 实例,不污染全局 random) |
| 405 | self.rng = rng if rng is not None else random.Random() |
| 406 | # ⭐ 使用 RLock(可重入锁)减少死锁风险 |
| 407 | self.lock = threading.RLock() |
| 408 | |
| 409 | # ⭐ LEO卫星列表 (从预定义轨道中选择指定数量) |
| 410 | self.all_leo_satellites = LEO_SATELLITES # 所有可用的LEO卫星(轨道预先已知) |
| 411 | self.leo_satellite_count = max(MIN_LEO_SATELLITE_COUNT, leo_satellite_count) |
| 412 | self.leo_satellites = self.all_leo_satellites[:self.leo_satellite_count] # 选择前N颗 |
| 413 | |
| 414 | self.meo_satellites = MEO_SATELLITES |
| 415 | self.geo_relays = GEO_RELAY_SATELLITES |
| 416 | |
| 417 | # ⭐ 波束指向约束管理器(BeamPointing) |
| 418 | # 每个 GEO 中继星与随遇接入站各持有一个 BeamPointing 实例, |
| 419 | # 用于扫描范围校验、偏轴增益损耗计算与 max_beams 并发约束。 |
| 420 | self._beam_managers: dict = {} |
| 421 | for geo in self.geo_relays: |
| 422 | self._beam_managers[geo["id"]] = from_geo_satellite(geo) |
| 423 | for opp in OPPORTUNISTIC_STATIONS: |
| 424 | self._beam_managers[opp["id"]] = from_opportunistic_station(opp) |
| 425 | |
| 426 | # 地面站列表 (从50个中随机选择指定数量) |
| 427 | self.all_ground_stations = CHINA_GROUND_STATIONS |
| 428 | self.ground_station_count = max(MIN_GROUND_STATION_COUNT, |
| 429 | min(ground_station_count, MAX_GROUND_STATION_COUNT)) |
| 430 | self.ground_stations = self.rng.sample(self.all_ground_stations, self.ground_station_count) |
| 431 | |
| 432 | # 传输请求队列 |
| 433 | self.transmission_requests = [] |
| 434 | self.request_history = [] |
| 435 | |
| 436 | # 资源占用与时间槽统一由 ResourceManager 管理 |
| 437 | self._resources = ResourceManager() |
| 438 | self._resources.init_pools(self.leo_satellites, self.all_ground_stations, self.geo_relays) |
| 439 | |
| 440 | # 链路切换控制器(迟滞 + 最小驻留 + 冷却,统一约束所有切换) |
| 441 | self.handover = HandoverController( |
| 442 | HANDOVER_RATE_RATIO, HANDOVER_MIN_DWELL, HANDOVER_COOLDOWN, HANDOVER_MIN_ELEVATION |
| 443 | ) |
| 444 | # 链路选路与重调度集中于 Scheduler(使用 QoS 感知策略) |
| 445 | from backend.scheduling.qos import QosAwareStrategy |
| 446 | self.scheduler = Scheduler(self, strategy=QosAwareStrategy()) |
no outgoing calls