这是一个基于图神经网络(GNN)的ODN (Optical Distribution Network) 网络建模系统,用于快速查找从指定人井到ODF的最低成本光路。
该系统实现了以下核心功能:
- ODN网络建模 - 根据电信运营商的实际网络结构,建立人井、管道、光缆、设备的完整模型
- GNN预训练 - 使用深度学习技术训练图神经网络,学习网络中的路径成本模式
- 最优路径查询 - 根据指定的人井和纤芯需求,找到成本最低的到达ODF的光路
- 智能路由 - 如果起始人井没有足够容量的设备,自动找到最近的可用设备并规划路由
-
数据模型 (
model/) - 基于真实ODN网络的实体类Facility- 人井信息Device- 设备信息(ODF、ODB、F_CLOSURE)Cable- 光缆信息Duct- 管道信息Link- 连接关系CostConf- 成本配置
-
数据生成器 (
data/) - 生成训练数据ODNDataGenerator- 模拟真实ODN网络数据ODNNetworkData- 网络数据容器
-
特征提取 (
features/) - 图特征工程GraphFeatureExtractor- 将ODN网络转换为GNN输入格式
-
路径算法 (
pathfinding/) - 传统路径查找PathFinder- 基于Dijkstra算法的最短路径查找
-
GNN模型 (
gnn/) - 深度学习模型GNNModel- 图神经网络实现,用于路径成本预测
-
查询服务 (
service/) - 业务逻辑ODNQueryService- 完整的光路查询服务
- Java 11 - 编程语言
- Maven - 依赖管理
- Deeplearning4j - 深度学习框架
- JGraphT - 图算法库
- ND4J - 数值计算库
确保已安装:
- Java 11 或更高版本
- Maven 3.6 或更高版本
cd DeepLearning
mvn clean compilemvn exec:java -Dexec.mainClass="main.java.com.example.odngnn.Main"// 创建查询服务
ODNQueryService queryService = new ODNQueryService(gnnModel, networkData);
// 查询从指定人井到ODF的8芯光路
QueryResult result = queryService.findOptimalPath("FAC_0001", 8);
if (result.isSuccess()) {
System.out.println("接入设备ID: " + result.getAccessDeviceId());
System.out.println("总成本: " + result.getTotalCost());
System.out.println("路由: " + result.getRoute());
} else {
System.out.println("查询失败: " + result.getMessage());
}运行系统会输出以下信息:
- 训练数据生成 - 显示生成的网络规模和数量
- 模型训练 - 显示训练进度和损失函数值
- 性能测试 - 比较GNN预测和传统算法的结果
- 查询演示 - 展示完整的光路查询流程
=== ODN网络GNN建模系统 ===
1. 生成ODN网络训练数据...
生成网络 1: 20人井, 15设备, 25光缆
生成网络 2: 20人井, 15设备, 25光缆
...
2. 构建并训练GNN模型...
开始GNN模型预训练...
为网络生成了 87 个训练样本
Epoch 0, 平均损失: 0.124567
...
3. 测试模型性能...
--- 测试:从 FAC_0001 查找 4芯光路 ---
传统算法结果:
找到路径: FAC_0001 -> DEV_0003 -> FAC_0005 -> DEV_0008
总成本: 1250.50
GNN预测结果:
GNN预测成本: 1180.30
预测误差: 5.62%
4. 演示查询功能...
=== 光路查询演示 ===
查询需求:
- 起始人井:FAC_0003
- 所需纤芯数:8
查询结果:
接入设备ID: DEV_0012
总成本: 2150.75
路由路径: FAC_0003 -> DEV_0007 -> FAC_0010 -> DEV_0012
系统将ODN网络转换为图结构:
- 节点 - 人井和设备
- 边 - 管道连接和光缆连接
- 权重 - 基于长度和成本计算
- 特征 - 节点类型、容量、连接数等
使用监督学习训练:
- 输入 - 起始节点和目标节点的特征向量
- 标签 - 使用Dijkstra算法计算的真实最低成本
- 损失函数 - 均方误差(MSE)
- 优化器 - Adam优化器
查询流程:
- 验证输入参数
- 检查本地设备容量
- 如需要,找到最近的可用设备
- 使用Dijkstra算法计算最优路径
- 返回完整的路由信息
系统考虑以下成本因素:
- 管道成本 - 基于直径和长度
- 光缆成本 - 基于芯数和长度
- 设备成本 - ODF、ODB、接头盒的成本
- 施工成本 - 开井盖、接续等人工成本
- 在
Device.java中添加新的resSpecId - 在
CostConf.java中添加对应的成本配置 - 更新特征提取器中的设备类型编码
- 调整网络架构(层数、神经元数量)
- 尝试不同的激活函数和优化器
- 增加更多的节点特征维度
- 使用更复杂的图卷积操作
系统目前使用模拟数据,可以通过以下方式集成真实数据:
- 添加数据库连接层
- 创建数据访问对象(DAO)
- 实现数据缓存机制
- 训练时间 - 取决于网络规模和训练轮数
- 查询速度 - GNN预测比传统算法快约10-100倍
- 预测精度 - 在测试数据上通常达到90%以上的准确率
- 内存占用 - 主要取决于网络规模和图特征维度
- 内存不足 - 增加JVM堆内存:
-Xmx4g - 训练收敛慢 - 调整学习率或增加训练数据
- 预测精度低 - 检查特征工程和网络架构
- 找不到路径 - 检查网络连通性和设备容量
添加以下JVM参数启用调试:
-Dorg.slf4j.simpleLogger.defaultLogLevel=debug欢迎提交Issue和Pull Request来改进系统。主要改进方向:
- 更复杂的GNN架构(GAT、GraphSAGE等)
- 多目标优化(成本、可靠性、延时等)
- 动态网络更新和增量学习
- 可视化界面和监控面板