Skip to content

Zhang-Hanliang/Logistic_AI

Repository files navigation

🚛 物流调度优化系统 (Logistics AI Dispatch)

基于启发式算法(VRP)+ 高德地图 + Bosch 内部 LLM 的智能物流调度 MVP

适用于多站点配送、异构车型调度、拆单运输与调度方案解释等本地化物流计划场景。


✨ 功能特性

  • 多车型支持:4.2t / 8.3t / 12t / 19t / 49t 厢式货车,可配置各型数量
  • 智能路径规划:最近邻 + 2-opt 启发式算法,生成前 N 个候选方案
  • 货物拆分:自动处理单点货量超出单车容量的情况(按比例拆分)
  • 时间窗约束:支持配送时间窗,支持"不限时"选项
  • 地图可视化:高德地图 2.0,路线颜色区分,POI 搜索
  • AI 助手:基于 Bosch 内部 LLM(doubao-pro-32k),提供方案解读与风险分析
  • 地址库:支持常用地址管理、Excel 批量导入
  • 输入校验:必填项检查,问题行高亮提示

🗂️ 项目结构

Log_AI/
├── app.py                    # FastAPI 后端主程序
├── config_loader.py          # 统一配置加载器(读取 config.ini)
├── config.ini.example        # 配置文件模板(复制并改名为 config.ini 后填写)
├── requirements.txt          # Python 依赖
├── 启动系统.bat              # Windows 一键启动脚本
├── Bosch_LLM_API/
│   ├── client.py             # Bosch LLM OAuth2 客户端
│   └── settings.json.example # LLM 配置模板
├── GaoDe_API/
│   ├── gaode_client.py       # 高德 Web 服务封装
│   └── gaode_config.json     # 高德 API 配置(由 config.ini 自动生成)
├── static/
│   ├── index.html            # 前端主页面(纯 HTML + CSS + JS)
│   └── js/
│       ├── app.js            # 主应用逻辑
│       ├── solver.js         # VRP 求解器(前端启发式算法)
│       ├── map.js            # 高德地图模块
│       └── ai.js             # AI 助手模块
└── data/
    └── create_template.py    # Excel 导入模板生成脚本

🏗️ 系统架构

当前系统采用 前端交互 + FastAPI 服务层 + 外部能力集成 的轻量化架构,适合本地部署、业务验证与后续逐步升级到工业级求解器。

组件职责

  • 前端界面(static/index.html + static/js/*.js:负责站点录入、地址库选择、地图展示、结果可视化、AI 交互
  • 前端求解器(static/js/solver.js:负责当前 MVP 阶段的启发式 VRP 求解
  • 后端服务(app.py:负责地理服务代理、地址库管理、Excel 导入导出、AI 调用封装、静态页面服务
  • 配置层(config_loader.py:负责从 config.ini 读取统一配置并同步到各子模块
  • 地图能力(GaoDe_API/:负责地理编码、距离矩阵和地图底图能力
  • AI 能力(Bosch_LLM_API/:负责调用 Bosch 内部 LLM 完成解释、审核和问答
  • 数据层(data/:负责地址库、Excel 模板、车型配置等本地数据文件

架构示意

┌────────────────────────────────────────────────────────────┐
│                     浏览器前端界面                         │
│  站点录入 / 地址库 / 地图可视化 / 结果卡片 / AI 对话       │
└───────────────┬───────────────────────────┬────────────────┘
                │                           │
                │ HTTP / JSON               │ 地图 JS API
                │                           │
        ┌───────▼──────────────────────────────────────┐
        │                FastAPI 后端 (`app.py`)        │
        │  geo / ai / address-book / import / export   │
        └───────┬─────────────────┬────────────────────┘
                │                 │
                │                 │
     ┌──────────▼─────────┐   ┌──▼─────────────────────┐
     │  本地数据文件       │   │   外部能力服务         │
     │  address_book.json │   │   高德地图 / Bosch LLM │
     │  vehicle_types.json│   │                        │
     │  Excel 模板        │   │                        │
     └────────────────────┘   └────────────────────────┘

                    ┌──────────────────────────────┐
                    │ 前端求解器 (`solver.js`)      │
                    │ 当前:启发式 CVRP            │
                    │ 后续:可切换 OR-Tools 后端   │
                    └──────────────────────────────┘

🚀 快速开始

环境要求

  • Windows 10/11
  • Python 3.9+(推荐 conda 环境)
  • 高德开放平台账号(申请地址
  • (可选)Bosch 内网账号,用于 AI 功能

🌐 网络说明: 高德 API 需要访问外网。公司内网无需 VPN,系统自动通过 Windows 域凭据认证代理(依赖 pywin32);已连 VPN 或家庭网络直连即可,无需额外配置。

安装步骤

1. 克隆仓库

git clone https://github.com/Zhang-Hanliang/Logistic_AI.git
cd Logistic_AI

2. 填写配置文件

# 复制模板文件
copy config.ini.example config.ini

用记事本打开 config.ini,填写以下内容:

配置项 说明 获取方式
[python] python_path Python 可执行文件路径 在 cmd 中运行 where python
[gaode_api] js_key 高德 JS API Key 高德控制台 → Web端(JS API)
[gaode_api] js_security_code JS API 安全密钥 高德控制台 → 我的Key → 数字签名
[gaode_api] web_service_key 高德 Web服务 Key 高德控制台 → Web服务
[bosch_llm] * Bosch LLM 凭证 联系 Bosch IT / AIGC 团队(非必填)

3. 启动系统

双击 启动系统.bat

脚本会自动完成:

  • ✅ Python 环境检查
  • ✅ 依赖包安装
  • ✅ 端口占用检测与释放
  • ✅ 关键文件完整性检查
  • ✅ 数据目录初始化
  • ✅ 高德 API 连通性测试
  • ✅ Bosch LLM 连通性测试

浏览器将自动打开 http://localhost:8000


📦 依赖安装(手动)

pip install -r requirements.txt

🔧 配置说明

所有配置集中在 config.ini(从 config.ini.example 复制),不要将真实的 config.ini 提交到 Git(已加入 .gitignore)。


🔌 API 接口概览

当前后端由 FastAPI 提供接口,前端通过 fetch 调用。下面是基于 app.py 的实际接口清单。

地理服务

方法 路径 说明
POST /api/geo/geocode 批量地址转经纬度
POST /api/geo/distance-matrix 构建驾车距离/时间矩阵

AI 服务

方法 路径 说明
POST /api/ai/chat 调用 Bosch LLM,支持方案解释与问答
GET /api/health 系统健康检查,返回高德 / LLM 可用状态

地址库管理

方法 路径 说明
GET /api/address-book 查询地址库,支持关键词搜索
POST /api/address-book 新增地址库条目
PUT /api/address-book/{entry_id} 更新地址库条目
DELETE /api/address-book/{entry_id} 删除地址库条目
POST /api/address-book/use/{entry_id} 标记地址已使用,更新使用次数
POST /api/address-book/batch-save 将当前规划站点批量保存到地址库

Excel 导入导出

方法 路径 说明
GET /api/import/template 下载配送明细导入模板
POST /api/import/delivery-excel 上传并解析配送站点 Excel
POST /api/export/sites-excel 将当前站点表导出为 Excel

车型配置

方法 路径 说明
GET /api/vehicle-types 获取当前车型配置
GET /api/vehicle-types/template 下载车型配置模板
POST /api/import/vehicle-types 上传并导入车型配置 Excel

页面入口

方法 路径 说明
GET / 返回前端首页
GET /static/* 返回前端静态资源

📌 版本历史

版本 日期 说明
v0.5 2026-03 高德 API 网络自适应:公司内网自动 WinHTTP 域认证,VPN/直连自动降级,无需手动配置代理
v0.4 2026-03 车型 Excel 导入、站点 Excel 导出、README 增补 OPL / 主算法与 AI 最佳实践说明
v0.3 2026-03 新增 49t 车型、货物拆分算法、时间窗不限时选项、输入校验、结果缩略卡片、统一配置文件
v0.2 2026-03 可选仓库、地图/结果/AI 三栏布局、地址库、Excel 导入
v0.1 2026-03 MVP 初版:FastAPI + 高德地图 + VRP 启发式求解器

v0.4 版本说明

本版本定位:v0.3 MVP 的基础上,补强配置化、可维护性和后续算法升级文档,为后端精确求解器接入做准备。

功能更新:

  • 支持车型配置通过 Excel 模板导入,减少手工维护默认车型参数
  • 支持将前端站点一键导出为 Excel,便于数据沉淀和复盘
  • 页面按钮分组重排,交互更接近实际业务操作流程
  • README 增补 OPL(Open Problem List),保留后续算法升级 Prompt
  • README 增补“主算法 + 二重校验 + AI 最佳实践”设计建议

当前算法结论:

  • 仍以 static/js/solver.js 中的前端启发式 CVRP 为主
  • 已支持容量约束、货物拆分、最大工时、多车型组合、基础路径优化
  • 时间窗字段已采集,但尚未进入实际求解约束

后续升级重点:

  • 接入 OR-Tools 作为主求解器
  • 增加规则校验器和影子求解器,形成二重校验链路
  • 将 AI 从“解释助手”扩展到“输入审核 + 交互式改约束”

🔬 算法现状与升级计划 (OPL — Open Problem List)

当前算法:前端启发式 CVRP(static/js/solver.js

已实现约束:

约束 状态 说明
容量约束(重量 / 体积 / 托盘) ✅ 生效 三维同时约束,超限自动拆分
最大工时约束 ✅ 生效 行驶时间 + 服务时间 ≤ 设定工时
多车型混合组合 ✅ 生效 枚举最多 15 个车型组合
最近邻路径排序 ✅ 生效 每车内按距离最近贪心排序
2-opt 路线局部优化 ✅ 生效 减少单车路线总里程 10~20%
返仓 / 不返仓 ✅ 生效 影响最后一段里程和成本
真实驾车距离矩阵 ✅ 生效 高德驾车 API,非直线距离
时间窗约束 未生效 字段已收集,算法未使用

已知局限:

  • 贪心分配不回溯,可能错过全局最优的车辆分配方案
  • 各车路线独立优化,无跨车交换站点(需 LKH / OR-Tools CVRP)
  • 车辆组合枚举上限 15 个,站点数 > 20 时质量下降

📋 待升级功能列表(留存 Prompt,后续一并实现)

OPL-01:时间窗约束(硬约束)

问题描述: 当前填写窗起/窗止对算法无影响,"不限时"勾选也只是将字段置 null,均不约束路线排序。

期望行为:

  • 在路线时间推进模拟中,检查每个站点的预计到达时间是否在 [time_window_start, time_window_end]
  • 早到则等待至窗起(增加等待时间),晚到则标记该路线为 feasible: false
  • 无时间窗(null)或勾选"不限时"的站点不做约束

升级 Prompt:

在 solver.js 的 solveForCombo() 函数中,为每辆车的路线增加时间推进模拟:
从出发时间(config.departureTime,格式 "HH:MM")开始,
按 route 顺序累加行驶时间(timeMatrix)和服务时间(service_duration_min),
对每个站点检查 time_window_start / time_window_end:
- 若提前到达,当前时间推进到 time_window_start(等待),不标记为不可行
- 若超出 time_window_end,将本车的 feasible 设为 false,并在 sites 结果里记录 tw_violated: true
整体方案的 feasible = 所有车辆均 feasible。
同时在结果详情里展示每个站点的预计到达时间和时间窗状态(✅准时 / ⏳等待Xmin / ❌超窗)。

OPL-02:后端 OR-Tools 精确求解器

问题描述: 当前求解器为前端 JS 启发式,站点数 > 20 时质量下降,无法保证最优解。

期望行为:

  • app.py 新增 POST /api/solve 接口,接收 distMatrix、sites、vehicles、config
  • 使用 Python ortools.constraint_solver (CP-SAT / Routing) 求解 CVRPTW(含时间窗)
  • 前端 solver.jssolveVRP() 接口保持不变,新增 config.useBackend = true 开关切换

升级 Prompt:

在 app.py 中新增 POST /api/solve 接口:
接收请求体 { distMatrix, timeMatrix, sites, vehicleQuotas, config },
使用 Google OR-Tools ortools.constraint_solver.routing_enums_pb2 求解 CVRPTW:
- 每辆车容量约束:weight / volume / pallets 三维
- 时间窗约束:time_window_start / time_window_end(null = 不限)
- 最大工时约束:maxWorkHours
- 目标:最小化总行驶距离(成本模式下加权)
返回与前端 solveVRP() 相同格式的 solutions 数组。
在 solver.js 中新增 async solveVRPBackend() 函数,
通过 fetch('/api/solve') 调用后端,结果格式与 solveVRP() 完全相同。
在 index.html 优化设置区增加"求解模式"切换:前端启发式 / 后端精确(OR-Tools)。

OPL-03:跨车辆站点交换优化(Cross-Route Improvement)

问题描述: 当前 2-opt 只优化单车内部路线,不同车辆之间没有协调。

升级 Prompt:

在 solver.js 的 solveForCombo() 完成各车独立 2-opt 后,
新增 crossRouteImprove() 函数:
对任意两辆车 (vi, vj) 的站点列表,尝试以下操作并检查是否降低总成本:
1. 单点转移:将 vi 的站点 s 移入 vj(需满足 vj 容量约束)
2. 两点互换:vi 的站点 s1 与 vj 的站点 s2 互换(需双方都满足容量约束)
如有改善则接受,循环直到无改善为止(最多迭代 50 次防止超时)。

OPL-04:优先级约束 / 必须首送或末送

升级 Prompt:

在站点表格增加"优先级"列(下拉:普通 / 优先 / 最后)。
在 solver.js greedyAssign() 中,优先级为"优先"的站点排在路线最前,
"最后"的站点排在路线最末(在 nearestNeighbor 排序前/后强制插入)。
收集时在 collectSitesFromTable() 读取 priority 字段并传入 site 对象。

🧭 算法选型建议:主算法 + 二重校验

对于物流计划类系统,推荐采用 “一个主算法求解 + 一个独立校验链路复核” 的架构,而不是只依赖单一求解器。

推荐架构

主算法(生产求解主链路)

正式版建议采用:

  • Google OR-Tools 作为主求解器
  • 建模方向:
    • HVRP:异构车型
    • SDVRP:允许拆单
    • VRPTW:时间窗
    • 必要时扩展 PDPTW:提货/送货先后关系

适用原因:

  • 工业界成熟,稳定性高
  • 支持容量、时间窗、最大工时、返仓等硬约束
  • 适合作为生产环境的主优化引擎
  • 后续可平滑替换当前前端启发式求解器

二重校验(独立复核链路)

建议增加一条与主算法相互独立的复核链路,用于识别“建模错误、数据错误、异常结果”。

可采用两层:

第一层:规则校验器(必须有)

对主算法输出结果逐项审核:

  • 是否超重 / 超体积 / 超托盘
  • 是否违反时间窗
  • 是否超最大工时
  • 是否违反返仓设置
  • 是否存在拆单后遗漏、重复配送
  • 是否存在提送货顺序错误
  • 是否存在不可达、异常绕路、极端偏差

第二层:影子求解器(推荐)

使用另一套较独立的启发式算法做对照,例如:

  • ALNS
  • Tabu Search
  • 更强的局部搜索(跨车 Relocate / Swap / Cross Exchange)

其目标不是替代主算法,而是用于:

  • 对比 KPI(总里程、总成本、总工时)
  • 检查主算法结果是否异常偏差
  • 在主算法不可用时提供降级方案

推荐落地方式

  • 主算法:OR-Tools
  • 校验器:规则校验器 + 影子启发式求解器
  • 告警条件示例
    • 主算法判可行,但规则校验不通过
    • 影子求解器结果比主算法低成本超过 8%~15%
    • 主算法结果出现极端空驶、超长单车路线、装载率异常偏低

结论

对于本项目,最佳实践不是“AI 直接替代算法”,而是:

确定性优化器负责求解,独立校验链路负责复核,AI 负责理解、整理、解释、交互。


🤖 AI 在物流计划中的最佳实践(Best Practice)

AI 适合插入物流计划系统,但 不建议让 AI 直接作为主优化器。 最佳实践是让 AI 作为 计划前处理 + 计划后解释 + 异常协同助手

AI 适合插入的位置

1. 计划前:输入理解与结构化

用于把人工输入、Excel、邮件、文本整理成标准结构数据:

  • 识别站点名称、地址、联系人、电话
  • 抽取重量、体积、托盘数
  • 补齐缺失字段提示
  • 标记明显异常值
  • 地址归一化、别名合并

价值:

减少人工录入错误,提高主算法输入质量。

2. 计划前:数据质量审核

AI 可作为“输入审核助手”:

  • 检查地址是否模糊或重复
  • 检查货量是否异常
  • 检查时间窗是否冲突
  • 检查车型配置是否明显不合理
  • 提示是否需要拆单、是否可能需要更多车辆

注意:

AI 只做提示,不直接改数据。

3. 计划后:方案解释

这是 AI 最适合的场景之一:

  • 用自然语言解释为什么推荐方案 1
  • 对比前 10 个方案差异
  • 解释成本、里程、工时、装载率变化
  • 标记风险点和建议人工关注项

价值:

让业务人员更容易理解优化结果。

4. 异常处置与交互式改约束

当用户提出:

  • “这个站点必须优先送”
  • “这个客户下午才能收货”
  • “这辆车今天不能跑远程”
  • “长沙和武汉单独派车”

AI 可以把自然语言转成结构化约束,再交给求解器重新计算。

原则:

AI 负责把话“翻译成规则”,不是直接给最终路线。

5. 知识沉淀与复盘

AI 可用于:

  • 总结历史调度案例
  • 归纳异常原因
  • 生成日报 / 周报
  • 形成可搜索的运营知识库

✅ 推荐的系统职责分工

不建议

  • AI 直接输出最终路线并跳过求解器
  • AI 自主修改硬约束
  • AI 直接判定是否可行而不经过规则校验

建议

  • 规则引擎 / 校验器:负责硬约束判定
  • 优化求解器:负责路线与车辆分配
  • AI:负责输入整理、异常提示、方案解释、交互改约束

🏗 推荐架构流程

业务输入 / Excel / 地址库
    ↓
AI 结构化整理 + 数据审核
    ↓
规则校验器(必填、格式、约束预检查)
    ↓
主算法求解器(OR-Tools)
    ↓
独立规则复核 + 影子求解器对照
    ↓
AI 结果解释 / 风险分析 / 对话式调整
    ↓
人工确认 / 导出执行

🗺️ Roadmap / Milestones

Milestone 1:v0.4(已完成)

  • 前端启发式求解器可完成基础多车型配送规划
  • 支持货物拆分、候选方案展示、地图可视化与 AI 解释
  • 支持地址库、配送 Excel 导入、站点导出、车型 Excel 导入
  • README 已补充 OPL、架构说明、API 清单与算法升级建议

当前阶段(v0.5)

  • 高德 API 网络层自适应:公司内网 WinHTTP 域认证 → VPN/直连自动降级
  • 前端启发式算法继续保留,适合作为 MVP 与交互验证
  • AI 主要用于输入审核、解释、问答

Milestone 2:v0.5(建议)

  • 时间窗约束正式进入求解过程
  • 增加规则校验器,对输出结果做独立复核
  • 补齐站点优先级、异常告警与更多业务校验

下一阶段

  • 后端接入 OR-Tools 作为主求解器
  • 增加规则校验器
  • 增加影子启发式求解器做二重校验
  • AI 接入“自然语言改约束 → 重新求解”流程

Milestone 3:v1.0(目标)

  • 形成“主算法 + 二重校验 + AI 协同”的生产级闭环
  • 支持更复杂的时间窗、优先级、提送货和多仓场景
  • 具备更清晰的接口边界和稳定版本维护机制

长期阶段

  • 接入历史订单与执行反馈
  • 做滚动重规划
  • 做异常预警与经验知识沉淀

⚠️ 注意事项

  • config.ini 含有密码和 API Key,绝对不要提交到公开仓库
  • 高德 API 有每日调用配额限制,测试时请避免频繁大批量地理编码
  • Bosch LLM 功能仅在 Bosch 内网环境可用,外部使用时 AI 功能自动降级
  • 公司内网访问高德 API 依赖 pywin32(已列入 requirements.txt),首次安装请执行 pip install -r requirements.txt

🤝 贡献 / 联系

项目维护:@Zhang-Hanliang

About

Smart-Logistic demo for RBCD-LOG

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors