1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| import numpy as np from datetime import datetime, timedelta
class AviationFatigueModel: """ 航空疲劳预测模型(简化版) 基于三个维度: 1. 生物节律(昼夜节律) 2. 持续清醒时间 3. 任务负荷 这三个维度同样适用于汽车驾驶员 """ def __init__(self): self.circadian_phase = 0 def circadian_alertness(self, hour: float) -> float: """ 昼夜节律驱动的警觉度 基于人体核心体温周期: - 体温最高点(~18:00)→ 最高警觉 - 体温最低点(~05:00)→ 最低警觉 Returns: alertness: 0-1, 1=最高警觉 """ phase = (hour - 18) * 2 * np.pi / 24 alertness = 0.5 + 0.3 * np.cos(phase) return max(0.1, min(1.0, alertness)) def sleep_pressure(self, hours_awake: float) -> float: """ 持续清醒的睡眠压力 航空医学:清醒>16小时≈BAC 0.05% 清醒>20小时≈BAC 0.10% Returns: sleep_pressure: 0-1, 1=最大压力 """ pressure = 1 - np.exp(-hours_awake / 12) return min(1.0, pressure) def workload_factor(self, task_complexity: float, duration_hours: float) -> float: """ 任务负荷因子 航空:巡航(低负荷) vs 起降(高负荷) 汽车:高速巡航 vs 城市驾驶 Args: task_complexity: 0-1 (0=巡航, 1=复杂) duration_hours: 持续时间 """ fatigue_rate = 0.05 + 0.15 * task_complexity workload_fatigue = fatigue_rate * duration_hours return min(1.0, workload_fatigue) def predict_fatigue(self, hour: float, hours_awake: float, task_complexity: float, duration: float) -> dict: """ 综合疲劳预测 Returns: fatigue_level: 0-1 risk_level: low/moderate/high/severe primary_factor: 主要疲劳因素 """ circadian = self.circadian_alertness(hour) sleep_p = self.sleep_pressure(hours_awake) workload = self.workload_factor(task_complexity, duration) fatigue = ( (1 - circadian) * 0.3 + sleep_p * 0.4 + workload * 0.3 ) if fatigue < 0.3: level = 'low' elif fatigue < 0.5: level = 'moderate' elif fatigue < 0.7: level = 'high' else: level = 'severe' factors = { 'circadian': (1 - circadian) * 0.3, 'sleep_pressure': sleep_p * 0.4, 'workload': workload * 0.3 } primary = max(factors, key=factors.get) return { 'fatigue_level': fatigue, 'risk_level': level, 'primary_factor': primary, 'circadian_alertness': circadian, 'sleep_pressure': sleep_p, 'workload_fatigue': workload }
if __name__ == "__main__": model = AviationFatigueModel() scenarios = [ ("汽车-日间短途", 14, 4, 0.3, 1), ("汽车-夜间长途", 2, 8, 0.5, 4), ("汽车-凌晨通勤", 6, 16, 0.4, 0.5), ("航空-跨时区航班", 3, 14, 0.6, 8), ("铁路-夜班固定线", 1, 10, 0.2, 6), ] print(f"{'场景':20s} | {'时间':>4} | {'清醒':>4} | {'负荷':>4} | {'时长':>4} | " f"{'疲劳':>6} | {'风险':>10} | {'主因'}") print("-" * 90) for name, hour, awake, complexity, duration in scenarios: result = model.predict_fatigue(hour, awake, complexity, duration) print(f"{name:20s} | {hour:4.0f}h | {awake:4.0f}h | {complexity:4.1f} | " f"{duration:4.1f}h | {result['fatigue_level']:.3f} | " f"{result['risk_level']:>10} | {result['primary_factor']}")
|