新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何把供应链装进 PyG:图神经网络供应链优化实战指南

发布时间:2026/9/5 21:57:47来源:尧图网络
如何把供应链装进 PyG:图神经网络供应链优化实战指南
如何把供应链装进 PyG图神经网络供应链优化实战指南【免费下载链接】pytorch_geometricGraph Neural Network Library for PyTorch项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric从哪个仓发货、备多少天的库存这些决策都押在同一张网络上谁供应谁、谁服务谁。这篇文章用 PyTorch GeometricPyG把这张网络装进一张图训练一个图神经网络让它输出运输成本与库存预测全程只需要四段代码。供应链为什么天然适合用一张图来表达拿确认一笔订单的发货方案来说。客户下单后你手上有三个候选仓。选哪个看的不只是距离这个仓现在有多少库存上游供应商补货要几天这条线路运费多少。你会发现这些量分散在两类地方库存、产能这类状态挂在节点上距离、运费这类代价挂在节点之间的关系上。关系型数据库里把它们拼齐要多张表 join而图神经网络的消息传递本来就是一次次沿边向邻居要信息、再汇总到自己。供应链的结构和这个过程是对得上的。 记住一句话就够了节点存状态边存代价。用 HeteroData 搭建供应链异构图定义节点类型和 3 种边关系PyG 的HeteroData相当于一个带隔间的图每种节点、每种边各自拥有独立的特征和邻接信息不用硬塞进同一张表。先定 3 种节点、3 种边产品维度先合并进仓库特征保持例子简单import torch from torch_geometric.data import HeteroData data HeteroData() # 3 类节点特征均为 16 维 data[supplier].x torch.randn(40, 16) # 供应商产能、交期 data[warehouse].x torch.randn(12, 16) # 仓库容量、当前库存 data[customer].x torch.randn(200, 16) # 客户平均单量、区域 # 3 类边edge_index 是 2 行张量[源节点 id, 目标节点 id] data[supplier, supplies, warehouse].edge_index torch.randint(0, 40, (2, 60)) data[warehouse, serves, customer].edge_index torch.randint(0, 12, (2, 300)) data[customer, orders, warehouse].edge_index torch.randint(0, 200, (2, 300)) print(data.metadata()) # 所有节点/边类型的清单后面要交给模型为什么不用单一的Data因为供应商的 16 维和客户根本不是一个语义空间强行共用一张邻接矩阵模型就得靠特征自己猜这条边是什么意思。隔间结构把这个猜测成本直接删掉了。训练一个能预测链路的图编码器写一个可复用到所有边类型的两层 GraphSAGE编码器只需要按同构图写一版。关键是SAGEConv((-1, -1), dim)里的-1输入维度自动推断你不用为每类节点硬编码。to_hetero拿到metadata()后会按边类型把每一层复制成多份每种关系各自训练一套参数from torch_geometric.nn import SAGEConv, to_hetero class GNNEncoder(torch.nn.Module): def __init__(self, dim): super().__init__() # (-1, -1)自动推断输入维度 self.conv1 SAGEConv((-1, -1), dim) self.conv2 SAGEConv((-1, -1), dim) def forward(self, x, edge_index): x self.conv1(x, edge_index).relu() return self.conv2(x, edge_index) # 按边类型展开每种关系拿到独立参数aggr 指定邻居聚合方式 encoder to_hetero(GNNEncoder(32), data.metadata(), aggrsum)跑通第一次前向输入data.x_dict和data.edge_index_dict得到每类节点一个 32 维嵌入。到此为止编码器并不知道你在做什么业务——它是通用的。用一个读边两端嵌入的小 decoder 接业务decoder 做的事很直白取出边两端的嵌入拼接过两层 MLP输出一个标量。标量是什么意思由你放在边上的标签决定——可以是运费也可以是补货天数class EdgeDecoder(torch.nn.Module): def __init__(self, dim): super().__init__() self.head torch.nn.Sequential( torch.nn.Linear(2 * dim, dim), # 边两端嵌入拼接后线性变换 torch.nn.ReLU(), torch.nn.Linear(dim, 1), # 输出单个标量 ) def forward(self, z, src, dst): # z 为节点嵌入表src/dst 是边的两端节点 id 序列 return self.head(torch.cat([z[src], z[dst]], dim-1)).view(-1)训练就是常规的 MSE loss 加 Adam 循环。数据怎么切官方示例 examples/hetero/hetero_link_pred.py 用T.RandomLinkSplit随机遮掉 20% 的边做验证和测试推理时再放回去值得照抄。把预测接到真实业务量上预测仓库 → 客户的运输成本把每条线路的历史平均运费写进edge_label用 MSE 训练上面这套 encoder decoder。训练收敛后模型对每条边都有一个预测值对刚开的新线路、还没有历史数据的路径它给出第一个估计值——链路预测在供应链里的价值就在这里先估一条还没被实测过的边。用 LinkNeighborLoader 处理会变动的网络真实的网络不是静态的线路会新增也会下线仓库容量会调整。如果训练时用的是全时间轴的图测试时模型其实见过未来。解决办法是让每条边带一个时间戳采样时只取事件发生前的边。LinkNeighborLoader原生支持这件事from torch_geometric.loader import LinkNeighborLoader # 采样前先给边写时间戳data[warehouse,serves,customer].time times loader LinkNeighborLoader( datadata, num_neighbors[8, 8], # 每跳采样 8 个邻居 batch_size128, # 要预测的边类型 对应边集 edge_label_index((warehouse, serves, customer), edge_index), edge_label_timetimes - 1, # 取事件之前那一刻的图 time_attrtime, # 边上的时间属性名 temporal_strategylast, # 同一邻居只保留最近一条边 )⚠️edge_label_timetimes - 1这一行最容易被漏掉不减 1图就会在训练时记得未来。官方推荐系统示例 examples/hetero/recommender_system.py 用的就是同一套时序采样逻辑。用指标检验模型值不值得上线上线前先回答一个更尖锐的问题模型比永远预测历史平均强多少如果基线 RMSE 是 42 元模型 43 元架构再漂亮也别上。RMSEF.mse_loss(pred, target).sqrt()和运费同单位可以直接拿去和财务对账。MAE平均绝对误差个别极端线路不容易把它拉飞适合看整体水位。Top-K业务上你多半问的是这单给前 3 个候选仓排序最优选排进前十没有。用torch_geometric.metrics里的LinkPredPrecision/LinkPredRecall设k10就能算。规模方面几万节点的网不必整图入训LinkNeighborLoader每个 batch 只算两跳邻域单机装不下时torch_geometric/distributed/ 下的DistNeighborLoader会把图切到多台机器上各自采样再汇总。收个尾整条链路就四步HeteroData定义图 →to_hetero自动展开子网 → decoder 预测边标签 → 用 RMSE 和 Top-K 跟基线对账。想换库存天数或准时率做标签改的只是edge_label那一行架构不用动。你手上哪个决策环节最想交给一张图评论区聊聊。【免费下载链接】pytorch_geometricGraph Neural Network Library for PyTorch项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

海思平台TW2868视频解码芯片Linux驱动开发全解析 2026/9/5 23:52:15

海思平台TW2868视频解码芯片Linux驱动开发全解析

简介:本资源是面向嵌入式Linux驱动开发者的海思平台TW2868视频处理芯片底层驱动源码包,适用于安防监控、数字电视接收器等音视频终端设备的系统集成与定制开发。资源共7个文件,含2个C源文件(TW2868.c、gpio_rw.c)、3个…

阅读更多 →
Active Directory 安全攻防(二十四) 2026/9/5 23:52:15

Active Directory 安全攻防(二十四)

引言 在前一篇文章中,我们讨论了AD基础防御措施——Core Server精简安装、补丁管理、域控加固等。这些措施构成了安全的"地基",但仅有地基是不够的。 回想我们在攻击系列文章中反复看到的一个场景:攻击者攻陷了一台普通工作站(Tier 2),在内存中发现了域管理员…

阅读更多 →
Matlab心电信号R波峰值检测:从预处理到Pan-Tompkins算法实现 2026/9/5 23:52:15

Matlab心电信号R波峰值检测:从预处理到Pan-Tompkins算法实现

简介:本资源是一份面向本科及硕士阶段教学与科研学习的MATLAB基础算法实践材料,聚焦心电信号处理中的R波峰值检测这一经典任务,适用于生物医学工程、信号处理等课程实验或入门级科研项目。压缩包共7个文件,包含5幅关键运行结果图&…

阅读更多 →
STM32F103驱动ATSHA204A硬件加密芯片实战:I2C与SWI接口详解 2026/9/5 23:52:15

STM32F103驱动ATSHA204A硬件加密芯片实战:I2C与SWI接口详解

简介:本资源面向嵌入式安全开发工程师及STM32初学者,提供ATSHA204A加密芯片的完整软硬件集成方案,解决物联网设备身份认证、密钥存储与挑战响应式鉴权等核心安全需求。压缩包共1020个文件,总计10.84MB,涵盖95个头文件&…

阅读更多 →
JS逆向入门:从浏览器调试到数据请求复现的正确路径 2026/9/5 23:52:15

JS逆向入门:从浏览器调试到数据请求复现的正确路径

JS逆向、Python爬虫、浏览器调试,这几个词最近容易被绑成“速成高薪入口”。实际想说清楚的是:JS逆向不是破解术,也不是单纯把请求复制到代码里再跑一遍。它是在你有权限的前提下,通过浏览器开发者工具、前端代码分析、网络请求阅…

阅读更多 →
当 AI 说起人话,数据却失语了——智能数据库的语言学 2026/9/5 23:49:14

当 AI 说起人话,数据却失语了——智能数据库的语言学

当 AI 说起人话,数据却失语了——智能数据库的语言学一句话主旨 2026 年,大模型终于把"人话"说得滴水不漏,但企业数据还没学会"被读懂"。本文借符号学的三把刀——语法学、语义学、语用学——切开数据库五十年历史&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞