评估请求是否可以被接受 - 基于实时资源利用率和时间段决策
(self, req, satellite)
| 1480 | return True, "时间段资源可用" |
| 1481 | |
| 1482 | def _evaluate_request(self, req, satellite): |
| 1483 | """评估请求是否可以被接受 - 基于实时资源利用率和时间段决策""" |
| 1484 | |
| 1485 | # ⭐ 实验要求:测试模式下,放宽资源检查 |
| 1486 | if req.test_mode: |
| 1487 | # 测试模式:直接接受,用于快速验证功能 |
| 1488 | return True, "测试模式:直接接受" |
| 1489 | |
| 1490 | # 特殊处理:指令类型(TASK_CMD)立即接受,无需等待过境 |
| 1491 | data_config = DATA_TYPES.get(req.data_type, {}) |
| 1492 | if data_config.get("immediate", False): |
| 1493 | # 指令类型直接接受,稍后会自动寻找传输机会 |
| 1494 | return True, "指令类型立即接受" |
| 1495 | |
| 1496 | # ⭐ QoS 与安全级准入检查(在时间窗口与资源检查之前执行) |
| 1497 | qos_ctrl = QosAdmissionController(self) |
| 1498 | qos_ok, qos_reason = qos_ctrl.check_admission(req) |
| 1499 | if not qos_ok: |
| 1500 | # 将拒绝原因码记录到统计中,并直接返回 |
| 1501 | for code, msg in REJECTION_REASONS.items(): |
| 1502 | if msg == qos_reason: |
| 1503 | self._record_rejection(code) |
| 1504 | break |
| 1505 | return False, qos_reason |
| 1506 | |
| 1507 | # ⭐ 新增:检查用户指定的时间段 |
| 1508 | if req.start_time is not None and req.end_time is not None: |
| 1509 | # 用户指定了具体时间段,需要检查资源池可用性 |
| 1510 | time_check_result = self._check_time_window_resources(req, satellite) |
| 1511 | if not time_check_result[0]: |
| 1512 | self._record_rejection("TIME_WINDOW_CONFLICT") |
| 1513 | return False, time_check_result[1] |
| 1514 | |
| 1515 | # 第0步:检查资源利用率阈值 |
| 1516 | # 如果系统资源紧张,对低优先级请求(特别是背景任务)更严格 |
| 1517 | resource_util = self.stats["resource_utilization"] |
| 1518 | avg_utilization = (resource_util["satellites"] + resource_util["ground_stations"] + resource_util["geo_relays"]) / 3 |
| 1519 | |
| 1520 | # ⭐ 实验要求:自定义约束 - 强制中继 |
| 1521 | force_relay = req.custom_constraints.get("force_relay", False) |
| 1522 | |
| 1523 | # 资源紧张阈值判断 |
| 1524 | RESOURCE_TIGHT_THRESHOLD = CFG_RESOURCE_TIGHT_THRESHOLD # 资源紧张阈值(见 config) |
| 1525 | if avg_utilization > RESOURCE_TIGHT_THRESHOLD: |
| 1526 | # 背景任务在资源紧张时更容易被拒绝 |
| 1527 | if req.source == "background" and req.priority < 5: # 只拒绝低优先级背景任务 |
| 1528 | return False, f"系统资源紧张(利用率{avg_utilization*100:.1f}%),背景任务暂停" |
| 1529 | # 用户低优先级请求也可能被拒绝(但阈值更低) |
| 1530 | elif req.source == "user" and req.priority < 2: # 只拒绝优先级<2的用户请求 |
| 1531 | return False, f"系统资源紧张(利用率{avg_utilization*100:.1f}%),低优先级请求拒绝" |
| 1532 | |
| 1533 | # 第1步:检查卫星资源是否已被占用 |
| 1534 | if satellite.sat_id in self.resource_usage["satellites"] and len(self.resource_usage["satellites"][satellite.sat_id]) > 0: |
| 1535 | return False, f"卫星{satellite.sat_id}资源已被占用" |
| 1536 | |
| 1537 | sat_pos = self.get_satellite_position(satellite) |
| 1538 | |
| 1539 | # ⭐ 实验要求:自定义约束 - 指定地面站 |