model-evaluation.md 9.8 KB

配送机车模型评估结论

日期:2026-10-12。范围:本轮用户确认的基线核对、规则对照、小样本验证、最终结论四项评估。

结论

继续使用 OSRM v5.27.1 是当前静态配送路线需求的可行方向;没有证据要求立即换成 Valhalla,也不需要先把它的 C++ 全部翻译成 Lua。 现有模型已有机车通行与转向能力,可优先补充路面、信号灯和转向的静态软权重,并校准速度和距离偏好。

真实 OSRM 合成路网试验验证了这些机制。但这不是台湾全境导航验收,也没有运行 Valhalla 引擎做路线等价比较。按时间变化的通行限制、实时交通、请求级动态偏好和完整两段式转弯不能凭本次试验宣称支持。

1. 代码与部署基线

对象 固定基线 / 实际核对
地图本地 master / 远端 master f8d104a4fd9a12d4197593e711135c2b9662db72,只有汽车配置
地图双车型分支 8906fe1d49d7304e6ea3a579bea2d81d0bd31db6,已有机车 Lua
测试服务器部署 /opt/foodie-map-tw-20260909,汽车、机车为两个 OSRM v5.27.1 容器
部署机车 Lua SHA-256 6f8741c9a6130434074be06302a28c204ed25ed9f5b760f776ac9f6b3bedbe26,与双车型分支完全一致
实际 API 文件 宿主机 settings/routing 与 API 容器对应文件哈希一致;但两者均不等于上述任一分支的对应版本
路网指纹 已构建路网指纹等于镜像内 car.lua 与部署 motorcycle.lua 拼接指纹;PBF 指纹见机器证据
Valhalla 参考源码 固定提交 34639a33510eb0764da77650e91f6efbb70e8daa;两模型、LICENSE.md、COPYING 均记录下载哈希

不能把部署代码整体认定为双车型分支的原样发布。 机车 Lua 可按已核对的分支文件研究,但后续修改 API 前需要整合已部署的车型、多站点能力,不能盲目覆盖文件或切换到旧 master。

实际测试服务器请求同一组台北公开坐标(25.0330,121.5654 → 25.0375,121.5637):

接口 汽车 profile=car 机车 profile=motorcycle
GET /api/route 693 米 / 63 秒 693 米 / 87 秒
GET /api/route/multi 693 米 / 63 秒 693 米 / 87 秒

两个接口都接受 profile 并切到相应引擎,traffic_aware=false。因此 foodie 无需另造地图车型接口,但其 SelfHostedRouteDistanceProvider 当前仍未把 vehicleType 映射后传过去。

2. 规则对照:借鉴什么,不照搬什么

规则 Valhalla 机制 当前 OSRM / 本轮判断
车型通行权限 motorcycle 使用机车 access mask;motor_scooter 使用 moped access mask 已读 motorcycle/motor_vehicle/vehicle/access,可复用;模型名称不能直接等同台湾机车类别
高速/快速道路 通行 mask 与道路偏好分离,motorcycle 的 use_highways 是软偏好 当前硬排除 motorway/link;trunk/motorroad 明确 motorcycle=yes 等许可时仍放行。不能把“避开高速”当作所有禁行路段的完整保证
单行与转向禁止 道路方向、简单及复杂限制 已有 oneway:motorcycle、restriction:motorcycle 和通用 restriction;真实夹具通过,优先保留而非重写
路面不佳的偏好 motorcycle 对路面加成本;scooter 还影响速度 可用 forward/backward_rate 调整权重,也可另校准实际速度;本轮验证权重变化不必同步扩大时间
信号灯和转向 通过公共转向时间及独立成本估算 OSRM process_turn 可分别改 weight/duration;本轮验证信号灯与转向软权重,不能把固定灯等待值当作实时信号周期
时间/距离偏好 use_distance/shortest 与其它成本组合 OSRM 可构建固定的 rate/weight 策略;需要选择静态业务权重,不保证最短距离、最少灯和最短时间同时成立
最高速度与道路速度 top_speed 截断并配合速度惩罚 当前仅部分道路速度及机车 maxspeed 覆盖;max_speed_for_map_matching 不是算路最高速度上限,后续需单独校准
坡度与道路密度 使用图中的 weighted_grade、density 等属性 当前没有相同数据链;静态扩展需可靠的坡度/密度数据,不能复制 C++ 常量就获得这些能力
请求时动态偏好 在请求时使用 costing_options OSRM Lua 主要在预处理执行;固定配置可以迁移,请求级任意组合不能仅靠一份静态 Lua 等价复刻
条件通行、实时封路 EvaluateRestrictions、日期/时间和交通数据 当前 Lua 未处理测试中的 motorcycle:conditional;生产若要求预约时间条件导航或实时交通,应另设计时间数据/引擎方案
两段式转弯 需实际路网和当地转向规则共同支持 源码阅读未证明存在通用台湾待转实现;禁止某个转向不等于完整待转流程,本轮不宣称达标

参考的是规则思路与机制,不是模型的全部常量。motor_scooter 的默认 45 km/h 等参数面向其 moped 模型,不直接作为我们的配送机车默认值。motorcycle 的旅游/越野偏好也不应原样加入外卖配送。

固定参考链接:摩托车源码、踏板/轻便机车源码、API 文档、OSRM 5.27.1 Lua 文档。Valhalla COPYING 声明 MIT,实际复制源码时需保留相应版权与许可声明;本轮未复制其 C++ 实现。

3. 小样本验证结果

Windows 本机 Docker daemon 未运行,因此复用已配置 SSH 到测试服务器运行一次性隔离试验。没有安装依赖、修改正式配置或重启原服务。

  • 生成合成 OSM XML,并分别构建汽车、部署机车基线、一次性机车候选三份小路网。
  • 构建容器无网络;算路容器仅绑定 127.0.0.1 的随机端口,每容器限制 0.5 CPU / 256MB,单线程。
  • 候选只在拥有的 /tmp 临时目录生成:保留硬通行规则,gravel 的 rate ×0.2、信号灯 weight +8、较大转向 weight +3。数值由本次探针选择,仅验证机制,不是 Valhalla 原值或生产批准参数。
  • 35 项常规断言通过,另 1 项限制探针确认了条件禁行未生效;无脚本错误。 “限制探针通过”表示成功复现不足,不表示该功能受支持。
验证内容 实际结果
motorcycle=no;motorcar=no 但 motorcycle=yes 汽车与机车按不同权限选路;基线和候选均正确
motorway/link、无许可 trunk/motorroad 基线和候选均绕行;明确许可的 trunk/motorroad 均能通行,说明当前是该保守策略而非无条件全部排除
单行、机车特定单行覆盖 两个机车版本均按预期选路
通用及机车专属转向关系 均绕过禁止的直接转向,约 653.6 米
车型限速 同一路段约 221.6 米,汽车 11 秒、机车 49.8 秒,证明车型限速参与实际时间计算
固定碎石路:权重与估时分离 距离 221.6 米、时间均 20 秒,权重由 20 变 99.6
固定信号路口:权重与估时分离 时间均 34 秒,权重由 34 变 42
固定转向:权重与估时分离 时间均 29.6 秒,权重由 29.6 变 32.6
有替代路线时的路面偏好 基线 221.6 米/20 秒;候选改走铺装绕路 423.1 米/60.9 秒。这是实际路径变化,不是把原路径 ETA 乘惩罚系数
道路吸附失败、不同连通分量 分别 NoSegment、NoRoute,未伪造直线成功
按序三站点往返 保留两条 leg 并返回整线距离
全天禁止的 motorcycle:conditional 基线仍走约 221.6 米直路,确认当前没有执行该条件

试验同时说明:软偏好设得过强可能明显绕远,不能把“借鉴路面权重”直接等同于“配送最优”。正式参数需用实际订单、骑手入口和运营目标校准。

证据与复现

  • 脚本,仅使用 Python 标准库、已有 SSH 和服务器现成 OSRM 镜像。
  • 机器证据,保存固定来源哈希、全部断言、实际指标及清理核对结果。
  • 按 plan.md 的命令复现。此脚本会创建临时文件和临时容器;只停止本次创建的容器 ID,不操作生产 Compose 项目。
  • 检查确认:生产文件前后哈希一致,三个原服务容器仍运行,临时容器及临时目录均已移除。无业务库读写,无凭据入库或入文档。

4. 后续生产实施的最小范围

本节是评估建议,不是本次已执行的生产改造:

  1. 保留部署机车通行/单行/转向规则,先明确适用机车类别及快速道路保守策略,避免照搬通用 moped 或旅游摩托车模型。
  2. 仅补充经业务确认的静态距离、路面、信号灯、转向权重与速度上限;时间和偏好分开,不直接采用试验常量。
  3. foodie 将 vehicleType=1/2 映射为 profile=motorcycle/car,透传到已经支持车型的 GET /route/multi;同步校准 032 的历史 car-only 假设与 ETA 口径。
  4. 在版本对齐后重建独立机车路网,按真实台湾取送点回归、性能压测和回退验收,再决定上线。

当前基础静态需求无需改 OSRM C++ 的结论有机制与夹具证据;完整复刻 Valhalla 或实现动态时间导航则没有这一保证。 本轮没有部署/运行 Valhalla,没有验证两引擎同图同参数的等价路线、台湾机车法规全覆盖、实际配送 ETA、P99 或长期运行容量。

本轮四项评估已验证;生产实现、全量路网更新与线上切换仍未开始。未自动 commit/push。