# 最小机场模型（独立原型）

在本目录运行 `python server.py`，打开 <http://127.0.0.1:8770/>。首次在新电脑运行前，在本目录执行 `npm install` 安装本地 Three.js 依赖。仅监听本机；不修改、调用或部署原 A→C→B 货运模型。若端口被占用，先停止旧的 8770 服务。

交互沙盘沿用此前货运模拟器的浅绿色背景，默认显示可旋转的 3D 机场：拖动改变视角、滚轮缩放、点击飞机查看排程。点击货运库可进入仓内视图，查看卸货传送带、分拣台、装货传送带、在制货量及等待队列；点击停机坪后可选择停机位，查看当前占用飞机、预计释放时间和下一架计划。场景还标出滑行联络道、货车专用入口、地面服务车道与装卸月台；点击这些区域可查看当前场内占位或货运负荷，以及相关的模型边界。区域视图都跟随主时间轴更新，使用“返回机场全景”或“全景”退出。也可切换到平面示意图；浏览器不支持 WebGL 时自动回退。页面启动后自动运行，默认推演 00:00—24:00；可暂停、调速或逐分钟推进。仿真仍逐分钟结算，画面在相邻结算时刻之间平滑插值，不能跳到尚未发生的时间。仓内货箱位置是总货运作业的示意动画，不模拟单件包裹路径。场景不是按地理比例绘制的航迹；滑行道、道路、月台、跑道、塔台与建筑不单独参与容量计算。可导出逐机排程 CSV 和事件 JSON。

3D 全景中的跑道端标、边灯、联络道中心线、停机坪安全标线、机务调度房、消防保障房、月台门、货车检查岗、围界与照明是空间识别用的场景细节。飞行器外形采用垂起固定翼示意；其旋翼位置与尺寸不代表已确定的工程设计。以上设施及飞行器外形都不改变排程或经济指标。

页面的“实时动态视图”提供沉浸式全屏演示：可用空格播放/暂停、右方向键推进一分钟、数字键 1—4 切换全景/停机坪/货运区/塔台镜头，Esc 退出。左上角的实时净收益按当前时刻的货运收费、处理成本、排队耗电、场外作业耗电、固定运营成本、夜间卡车费用和已发生的延误罚金估算；它是过程展示值，最终收益仍以排程完成后的结果表为准。

## 定义与假设

时间为整数分钟 `t=0,1,...,H`。每架飞机 `i` 给定计划到达 `a_i`、方式（正常起降或机场外作业）、卸货量 `d_i`、装货量 `l_i`、最晚离开 `b_i` 和单位货运收费 `r_i`。动作序列：等待进入 → 进入作业位 → 等待货运团队 → 处理货物 → 等待离开 → 离开。处理时长 `max(1,ceil((d_i+l_i)/v))` 分钟，其中 `v` 是单组货运团队处理速度。即使货量为零，仍占用一分钟用于交接检查；这是情景假设。

每分钟共享空域最多执行 `A` 次进入/离开动作。正常起降机的进、离场都占一次；机场外作业是否占用共享空域由开关 `s` 指定。正常飞机从进入到离开占一个起降位，机场外飞机占一个独立作业位；两种方式共用货运团队。新航班入场与新货运任务均不得超出当时可用资源。运行中停机位故障不会驱离已占位飞机，因此故障后可能短时出现占用量高于新可用容量；此时禁止新的入场，直到占用量回落。调度规则为先完成货运、先让可离开的飞机离开（释放作业位）、再按到达时间与 ID 顺序安排进入、最后按相同顺序分配货运团队。它是**可复现的贪心排程，不是最优调度求解器**。

每架已完成飞机的经济指标为 `(d_i+l_i)(r_i-c_h) - p_e E_i - c_l max(0,exit_i-b_i)`。`E_i=(enter_i-a_i)e_h + 1[机场外](exit_i-enter_i)e_o`。逐机结果只计算直接贡献。机场总收益另外扣除昼间与夜间固定运营成本、持续维护成本、停机位故障维修成本及夜间卡车费用。固定运营成本按每个已完成仿真分钟计提：上一分钟为 06:00—22:00 时用昼间费率，否则用夜间费率；每分钟扣除对应每小时费率的 1/60。默认昼间 24 元/小时、夜间 12 元/小时，完整 24 小时为 480 元。维护费默认 6 元/小时，不论是否有航班持续计提，完整 24 小时为 144 元。停机位故障每次在发生时记 80 元维修费；天气等原因的空域关闭不记维修费。以上均为演示假设；固定运营费概括照明、值守和基础设施等开支，与单列的维护/维修费不重复。仍**不含巡航、起降和设施资本成本**，所以总收益不是完整利润。机场外无需机场共享空域的情景仍需独立空域许可和安全评估；这些没有在模型中证明。

所有默认输入均为演示假设，并非来自论文的机场实测参数。当前默认生成 116 架次的 24 小时计划：00:00—06:00 每小时 1 架，06:00—10:00 每小时 10 架，10:00—16:00 每小时 5 架，16:00—20:00 每小时 8 架，20:00—24:00 每小时 2 架。这是人为设置的早晚高峰曲线，不能据此声称真实机场一天应有 116 架次。页面可修改日架次、平均卸货量和平均装货量后重新生成，并能逐架编辑。默认每架卸货约 12 kg、装货约 10 kg，个别航班有确定性偏差。机场机位数、真实服务时间、货物流转、空域间隔和电耗需要后续调研。该模型旨在比较资源瓶颈与排队效应，不用于运行真实机场。仿真到 `H` 分钟为止，未完成飞机单独计数，不给它们虚构完成时间或收益。增加 `H` 可检查是否只是截断。

页面的“计划装卸量”定义为所有航班 `d_i+l_i` 之和，代表货运团队工作量；它**不是净运输量或去重后的货物重量**，同一批货物若先卸后装可能被计两次。累计已处理装卸量按每组团队每分钟的 `v` kg 推进，到达未处理量只统计已经到达但还没有完成装卸的工作量。货运库的“本分钟处理”取该分钟实际增加的处理量，不再把在制航班的全部货量当成本分钟产量。卸货先于装货是当前演示模型的记账假设，不代表逐件扫描数据。

夜间卡车模型独立于白天货运车辆示意。设机场备用飞机库存 N、调拨目标 Q、每车载机上限 K、车辆数 M、单程时间 T、周转时间 U、每趟费用 C。发车时库存减少、在途增加；T 分钟后在途减少、外部基地库存增加；车辆在 2T+U 分钟后可再次发车。每趟费用计入总净收益。约束为每车载机不超过 K、总调拨不超过 Q 与初始 N、同一辆车不可同时多趟。此原型未追踪当日航班机号与次日航班衔接，也未建道路容量或卡车优化；默认参数为演示假设。垂起无人机没有滑行时间或滑行道冲突变量，联络道只表达场内空间关系。

## 验证

运行 `python -m unittest discover -s tests -v`。当前检验基础资源约束、单机基线、场外共享空域开关、错误输入、逐步推进与故障响应，并验证夜间飞机库存守恒、两车运力和费用，以及关闭夜间调拨后的基线。后续接入原货运模型时应以接口传递飞机到达/离开计划与货量，不直接合并两个模型的目标函数。

### 自动突发事件与运行状态

页面默认开启自动突发事件。每个整点从固定随机种子生成三次伪随机抽样：一次决定是否发生，一次决定停机位故障或空域临时关闭，一次决定持续 10—30 分钟。默认每小时事件概率 0.35，仅为演示假设；随机种子和概率可在左侧修改。同样的种子、参数与航班计划会复现同样的事件时刻；禁用开关可运行无突发事件基线。事件改变其后的资源容量与排队；恢复时容量回到该情景的初始值。已经占用的停机位不会驱离飞机，新航班须等占用量低于可用容量才能进入。事件清单包含触发、预计恢复和实际恢复，可在事件记录 JSON 中导出。模型目前只模拟停机位临时故障与短时空域关闭，概率并非由历史事故数据估计，不能解读为安全风险预测。

页面分别提供货运实时状态与夜间转运状态窗口。货运窗口显示本分钟处理、累计处理、到达未处理、等待队列与正在处理航班；夜间窗口显示机场备用飞机、卡车在途量、外部基地已到量、费用与逐趟时间。夜间转运仅处理预置备用飞机，尚未与白天逐架航班形成车辆与飞机身份的闭环。会话保存在服务进程内，刷新网页或重启服务会从第 0 分钟重新开始。

时间观察有两个独立入口。全天总览按所选速度连续运行全日；点击“进入小时运营视图”会打开独立页面，让使用者从 0—23 时选择一个小时，查看该小时每一分钟的处理量、队列、机位与空域占用、航班、突发事件、卡车调拨和各项成本。小时页在浏览器本地读取全局页面保存的原始场景参数和随机种子，重建同一条确定性样本路径；进入小时页不会减速或中断全天总览。小时页可以在本小时内播放、逐分钟前后移动、定位下一事件或点击曲线选分钟。独立的机场动态画面同步显示飞机入场、机位作业、货物处理及夜间卡车调拨，画面在相邻整分钟排程时刻之间连续插值。小时财务与累计装卸增量采用相邻整点快照之差，使 24 个小时与全日终点对账；事件清单按事件发生时间归入对应小时，因此整点边界的清单与财务归属可能不同。直接打开小时页而未从总览进入时使用默认演示参数。两个入口的资源分配、货运处理结算与成本都以整分钟为基本步长，**没有宣称秒级离散事件求解**。




