PPO-swap(图上设施选址强化学习)
Skill-PPO_swap · 04-供应链
1. 解决的问题
PPO-swap 解决的是在真实道路网络(加权图)上,如何快速决定把哪个仓库/站点搬去哪里,使全局配送成本最低。传统 Gurobi 在大图上算不动(千节点场景需数小时),贪心启发式又容易陷入局部最优。PPO-swap 以"从初始布局出发、反复微调"取代"从零开始构建",每一步只做一次交换(Swap):关掉一个现有设施,在另一个节点重开,直到整体成本无法再降。
2. 核心算法逻辑
PPOswap 解决的是在真实道路网络(加权图)上,如何快速决定把哪个仓库/站点搬去哪里,使全局配送成本最低。传统 Gurobi 在大图上算不动(千节点场景需数小时),贪心启发式又容易陷入局部最优。PPOswap 以"从初始布局出发、反复微调"取代"从零开始构建",每一步只做一次交换(Swap):关掉一个现有设施,在另一个节点重开,直到整体成本无法再降。
3. 业务应用场景
某母婴出海公司在上海有 8 个自营快递服务站,每季度随城市开发会有 2-3 个站点的位置变得不再最优(如所在小区拆迁、周边大型社区新建)。重新规划 8 个站的全局布局,人工需要数周,算法(Gurobi)需要数小时,且无法实时响应季度需求热力图更新。
| 字段 | 说明 | 来源 | |------|------|------| | `node_id` | 候选站点/小区节点编号 | 地图 API | | `coord_x/y` | 节点坐标(WGS84) | 地图 API | | `demand` | 过去 30 天订单量(权重) | OMS | | `road_dist[i][j]` | 节点间道路距离矩阵 | 高德/百度路网 | | `current_facility` | 当前站点节点 ID 列表 | 运营台账 |
预期产出 - 毫秒级输出:哪个站搬到哪个位置,附带搬迁后全局配送距离下降幅度 - 批量评估:对季度 10 个候选站点调整方案自动排优先级 - 基准对比报告:vs 现状、vs 随机重选
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- 需要道路距离矩阵(高德/百度 API 可获取)
- 无需 GPU,CPU 上推理毫秒级
- 需要标注节点需求权重(订单热力图)
- 从 Mock Agent 测试到真实 PPO 训练需要 2-4 周工程投入
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
快速使用示例:PPO-swap 快递站点搬迁
"""
import sys
sys.path.insert(0, "paper2skills-code/04-供应链/facility_location_rl_2025")
from model import FacilityLocationGraph, FacilityLocationEnv, MockPPOSwapAgent
# ① 构建城市路网图(30 个候选位置,选 5 个站点)
graph = FacilityLocationGraph(n_nodes=30, n_facilities=5, seed=42)
# ② 初始化环境(物理启发式初始布局)
env = FacilityLocationEnv(graph, max_steps=30)
facilities, initial_cost = env.reset(init_method="physics")
print(f"初始成本: {initial_cost:.2f},初始站点: {facilities}")
# ③ 使用 Mock Agent 运行优化(生产环境换成训练好的 PPOSwapTrainer)
agent = MockPPOSwapAgent(graph, n_candidates=10)
for step in range(30):
remove_idx, add_node = agent.select_action(facilities)
reward, done, info = env.step(remove_idx, add_node)
facilities = env.facilities.copy()
if info.get("valid") and info.get("delta_cost", 0) > 0:
print(f"Step {step+1}: 将站点 {facilities[remove_idx]} → {add_node},"
f"成本下降 {info['delta_cost']:.2f}")
if done:
break
final_cost = graph.shortest_path_cost(facilities)
print(f"\n优化完成,成本从 {initial_cost:.2f} → {final_cost:.2f},"
f"下降 {(initial_cost - final_cost) / initial_cost:.1%}")
print(f"最优站点配置: {facilities}")
8. 论文来源
未自动抽取;请查看原始 Skill 卡片。