Files
module1_3/final/README.md
2026-04-23 12:48:59 +08:00

332 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 作战体系数据清洗与网络效能评估系统
## 项目简介
本系统包含两大功能模块:
1. **数据清洗**:从 JSON 文件或达梦数据库读取实体属性表、三元组,进行去重、缺失值填充、异常值修正、噪声平滑等清洗;并按 **1125 属性需求****内容与格式的双重对齐**(格式校验 + 内容校验 + 原始字段→规范 schema 转换),**输出仅含 xlsx 定义字段**的 `nodes.json`,不保留原始其他字段。
2. **网络关系与效能评估**:基于节点与三元组数据,计算关系强度、过滤低置信边,评估任务网络效能,生成评价报告。
---
## 目录结构
```
final/
├── config/
│ ├── config.yaml # 主配置文件(推荐)
│ └── config.json # 备选配置
├── data/
│ ├── raw_data_sample.json # 原始实体数据JSON 模式)
│ ├── nodes.json # 清洗后实体(关系/网络计算用)
│ └── triples.json # 清洗后三元组(来自 run_all
├── report/
│ ├── detailed_cleaning_report.json # 实体清洗报告
│ └── triplet_cleaning_report.json # 三元组清洗报告
├── results/
│ ├── filtered_triples.json # 过滤后三元组
│ ├── triples.csv # 三元组表格
│ └── evaluation_report.txt # 效能评价报告
├── src/
│ ├── main_227.py # 主程序(清洗 + 关系 + 网络评估)
│ ├── cleaner.py # 实体清洗
│ ├── attribute_schema.py # 1125 属性规范:格式/内容校验 + 原始→规范转换
│ ├── data_loader.py # 数据加载JSON/达梦)
│ └── triplet_cleaner.py # 三元组清洗
├── scripts/
│ ├── run_all.py # 一键运行(仅清洗)
│ ├── export_triplets.py # 单独导出三元组
│ ├── inspect_dm_tables.py # 达梦表结构查看
│ ├── f_relation1125.py # 关系强度计算
│ └── f_net1125.py # 任务网络评估
├── .env.example
└── README.md
```
---
## 快速开始
### 1. 环境依赖
```bash
pip install -r requirements.txt
# 达梦模式需额外pip install dmPython
```
### 2. 运行方式
| 命令 | 功能 |
|------|------|
| `python src/main_227.py` | **完整流程**:实体清洗 → 关系强度计算 → 网络效能评估 |
| `python scripts/run_all.py` | **仅清洗**:实体 + 三元组 读取、清洗、导出 |
### 3. 开发模式(无达梦数据库)
`config/config.yaml``config/config.json` 中设置:
```yaml
source: json
```
然后运行:
```bash
python src/main_227.py
```
程序会从 `data/raw_data_sample.json` 读取实体数据并清洗;关系/网络计算则从 `data/nodes.json``data/triples.json` 读取。
---
## 配置说明
### 必须修改的配置
根据你的环境,在 `config/config.yaml``config/config.json` 中修改以下项:
| 配置项 | 说明 | 示例 |
|--------|------|------|
| `source` | 数据源:`json`(开发)或 `db`(达梦) | `json` |
| `db.host` | 达梦库地址source=db 时) | `127.0.0.1` |
| `db.port` | 达梦端口 | `5080` |
| `db.user` | 达梦用户 | `SYSDBA` |
| `db.table` | 实体表名 | `OBJECTIVE_INSTANCE` |
| `db.triplet_table` | 三元组表名 | `RELATION_INSTANCE` |
### 达梦密码(切勿写入配置)
达梦模式需设置环境变量:
```bash
export DM_PASSWORD=你的密码
```
或在 PyCharmRun → Edit Configurations → Environment variables → 添加 `DM_PASSWORD=你的密码`
### 可选配置
| 配置项 | 说明 | 默认 |
|--------|------|------|
| `json.input_file` | 实体 JSON 路径 | `data/raw_data_sample.json` |
| `json.output_file` | 清洗后实体输出 | `data/nodes.json` |
| `triplet.enabled` | 是否处理三元组 | `true` |
| `triplet.input_file` | JSON 模式下三元组路径 | `null` |
| `triplet.output_file` | 三元组输出 | `data/triples.json` |
| `triplet.clean.deduplicate` | 三元组去重 | `true` |
| `triplet.clean.filter_orphans` | 过滤悬空引用 | `false` |
| `eval.nodes_file` | main_227 读取的节点文件 | `data/nodes.json` |
| `eval.triples_file` | main_227 读取的三元组文件 | `data/triples.json`(与 triplet.output_file 一致) |
### 配置优先级
`config.json` 优先于 `config.yaml`;修改其一即可。
---
## 数据流程
### main_227.py 流程
```
1. 实体清洗
- 从 JSON 或达梦读 raw_data_sample / OBJECTIVE_INSTANCE
- 去重、缺失值填充、异常值修正、噪声平滑
- 输出 nodes.json
2. 关系与网络评估
- 按配置读取 nodeseval.nodes_file / json.output_file、tripleseval.triples_file = triplet.output_file
- 计算 5 类关系强度(情报保障、指挥控制、状态反馈、平台部署、协同作战)
- 按阈值过滤关系
- 评估 5 类任务网络效能
- 输出 results/ 下报告与表格
```
### run_all.py 流程
```
1. 实体清洗 → data/nodes.json
2. 三元组清洗 → data/triples.json格式head, head_type, relation, tail, tail_type
```
---
## 输出文件说明
| 文件 | 来源 | 说明 |
|------|------|------|
| `data/nodes.json` | 清洗 | 清洗后实体(`{nodes: {id: obj}, global_params: {mtbf_max}}`,见下文) |
| `data/triples.json` | run_all | 清洗后三元组head/head_type/relation/tail/tail_type |
| `report/detailed_cleaning_report.json` | 清洗 | 实体清洗统计(含 attribute_alignment格式/内容对齐情况) |
| `report/triplet_cleaning_report.json` | run_all | 三元组清洗统计 |
| `results/filtered_triples.json` | main_227 | 过滤后三元组(含强度) |
| `results/triples.csv` | main_227 | 三元组表格 |
| `results/evaluation_report.txt` | main_227 | 效能评价报告 |
---
## 常见问题
**Q: 运行报错「找不到文件 raw_data_sample.json」**
A: 将 `source` 改为 `json`,并确保 `data/raw_data_sample.json` 存在;或检查 `json.input_file` 路径。
**Q: 达梦模式连接失败?**
A: 检查 `DM_PASSWORD` 环境变量、`db.host`/`db.port`,以及 dmPython 与达梦客户端是否正确安装。
**Q: main_227 中 nodes.json、triples.json 从哪来?**
A: `nodes.json``triples.json` 均由清洗步骤生成run_all 或 main_227 前半段),格式需包含 `head``relation``tail` 等字段。
**Q: 如何查看达梦表结构?**
A: 运行 `python scripts/inspect_dm_tables.py`(需设置 `DM_PASSWORD`)。
**Q: nodes.json 为何没有 X、Y、ROLE_ID 等原始字段?**
A: 输出完全对齐 1125 xlsx 规范,仅保留 schema 定义的 12 个字段;原始字段在转换阶段已映射为 `spatial``org_unit` 等规范结构。
---
## 数据清洗详细逻辑
### 清洗流程概览
```
原始数据 → 去重 → 缺失值填充 → 异常值修正 → 噪声平滑 → 1125 Schema 转换 → 关系计算前净化 → nodes.json
```
| 步骤 | 说明 |
|------|------|
| **去重** | 按 `TARGET_ID` 去重,优先保留 `CREATED_TIME` 最新的记录 |
| **缺失值填充** | 数值型字段按 `ROLE_ID` 分组均值填充,兜底用全局均值 |
| **异常值修正** | 对 `TARGET_RECOGNITION_CAPABILITY``STRIKE_ACCURACY``ANTI_JAMMING_CAPABILITY``ENVIRONMENT_ADAPTABILITY``MOBILITY` 等 [0,1] 字段:负值取绝对值、>1 截断为 1 |
| **噪声平滑** | 对 `COMMUNICATION_RANGE` 做 3 点移动平均 |
| **1125 Schema 转换** | 见下文字段映射,输出仅含规范字段 |
| **关系计算前净化** | 见下文「关系计算前净化」 |
### 关系计算前净化sanitize_node_for_relation_calc
下游 `f_relation1125``utils.py` 会对节点属性做数值运算(如欧氏距离、安全等级差、历史成功率平均),若字段为 `None` 会触发 `NoneType` 运算错误。因此在写入 `nodes.json` 前,对每条节点做最终净化,确保参与运算的字段**永不为 `None`**
| 净化项 | 处理方式 |
|--------|----------|
| `spatial.position` | 必须为 `[float, float]`,含 `None`/`NaN` 的元素替换为 `0.0` |
| `spatial.effective_radius` | 若为 `None`,设为 `1.0` |
| `temporal.*` | `time_window` 缺省 `24.0`,其余缺省 `1.0` |
| `security_level` | 若为 `None` 或越界,设为 `3`15 范围) |
| `history_success` | 若为 `None`,设为 `0.8`01 范围) |
该步骤在 `attribute_schema.sanitize_node_for_relation_calc()` 中实现,由 `cleaner` 在写入前对每个节点调用。
### 输出字段说明
**nodes.json 完全对齐 xlsx 规范**,不保留原始其他字段。每条记录仅包含:
| 字段 | 类型 | 说明 |
|------|------|------|
| `TARGET_ID` | 字符串 | 节点唯一标识(三元组 head/tail 引用所需) |
| `function_vector` | 字典 | 7 维功能能力 [0,1] |
| `spatial` | 字典 | 空间位置与有效半径 |
| `temporal` | 字典 | 时间相关属性 |
| `performance` | 字典 | 核心性能、生存能力、MTBF |
| `protocol_list` | 列表 | 支持协议(字符串列表) |
| `format_list` | 列表 | 支持格式(字符串列表) |
| `interface_list` | 列表 | 支持接口(字符串列表) |
| `security_level` | 整数 | 安全等级 [1,5],缺省 3关系计算用 |
| `org_unit` | 字符串/null | 组织隶属 |
| `nation` | 字符串/null | 国家代码 |
| `history_success` | 浮点数 | 历史成功率 [0,1],缺省 0.8(关系计算用) |
**nodes.json 整体结构**`{ "nodes": { "TARGET_ID": {...}, ... }, "global_params": { "mtbf_max": number } }`,兼容 main_227 / f_relation1125 关系计算。
**单条节点记录示例:**
```json
{
"TARGET_ID": "FS-俄-情报侦-132",
"function_vector": {
"f_IC": 0.9273, "f_IA": 0.7896, "f_CS": 0.2584, "f_IT": 0.5187,
"f_DP": 0.9148, "f_CPS": 0.5619, "f_CC": 0.7822
},
"spatial": { "position": [79.36, 52.11], "effective_radius": 94.96 },
"temporal": { "response_time": 23.3891, "cycle_time": 3.7, "data_age": 1.48, "time_window": 3.7 },
"performance": { "core_performance": 0.9831, "survivability": 0.4094, "mtbf": 0.7202 },
"protocol_list": [], "format_list": [], "interface_list": [],
"security_level": 3, "org_unit": "师级", "nation": "俄", "history_success": 0.8
}
```
---
## 属性对齐与字段转换1125 规范)
依据 `1125暂时属性需求(1).xlsx`,对每条记录做 **内容与格式的双重对齐**
- **格式校验**各字段类型与结构dict/list/scalar
- **内容校验**:取值范围(如 [0,1]、[1,5]
- **转换**:原始扁平字段 → 规范 schema
清洗报告中 `details.attribute_alignment` 记录格式/内容错误统计及示例。
### 原始字段 → 目标 Schema 映射
#### function_vector功能向量
每个维度取 [0,1] 浮点数,从原始能力字段推导:
| 目标维度 | 原始字段(按优先级) | 转换方式 |
|----------|----------------------|----------|
| f_IC 情报收集 | DETECTION_ACCURACY, TARGET_RECOGNITION_CAPABILITY | 取第一个有效值clamp 到 [0,1] |
| f_IA 信息分析 | INFORMATION_FUSION_CAPABILITY, DETECTION_ACCURACY | 同上 |
| f_CS 协同作战 | MOBILITY, ENVIRONMENT_ADAPTABILITY | 同上 |
| f_IT 信息传输 | ANTI_JAMMING_CAPABILITY | 同上 |
| f_DP 数据处理 | PROCESSING_CAPACITY, INFORMATION_FUSION_CAPABILITY | **固定参考值**:见下表 |
| f_CPS 指挥控制 | DECISION_RESPONSE_TIME | **固定参考值**:见下表 |
| f_CC 综合保障 | SUPPORT_CAPACITY, LOAD_CAPACITY | **固定参考值**:见下表 |
**固定参考值转换公式**(原始值不在 [0,1] 时使用):
| 维度 | 公式 | 参数说明 |
|------|------|----------|
| **f_CPS** | `1 / (1 + t/30)` | t = 响应时间(秒),响应越快能力越高 |
| **f_DP** | `log10(1+PC) / log10(10001)` | PC = PROCESSING_CAPACITY无则用 INFORMATION_FUSION_CAPABILITY clamp [0,1] |
| **f_CC** | `0.6×support_norm + 0.4×load_norm` | support_norm = log10(1+SUPPORT)/log10(10001)load_norm = LOAD/100仅一个有时取该值 |
#### spatial空间属性
| 目标字段 | 原始字段(按优先级) | 转换 |
|----------|----------------------|------|
| position | `position`(列表 [x,y])、`X`/`x`+`Y`/`y``POSITION_X`/`POSITION_Y``LONGITUDE`/`LATITUDE` | `[round(x,2), round(y,2)]``None`/`NaN` 替为 `0.0`,兼容达梦多种列名 |
| effective_radius | COMMUNICATION_RANGE | 原值保留 4 位小数,缺省 `1.0` |
#### temporal时间属性
| 目标字段 | 原始字段 | 转换 |
|----------|----------|------|
| response_time | DECISION_RESPONSE_TIME | 原值 |
| cycle_time | REFRESH_RATE | 原值 |
| data_age | TRANSMISSION_DELAY | 原值(近似数据新鲜度) |
| time_window | REFRESH_RATE | 原值 |
#### performance性能属性
| 目标字段 | 原始字段(按优先级) | 转换 |
|----------|----------------------|------|
| core_performance | STRIKE_ACCURACY, DETECTION_ACCURACY, MOBILITY | 取第一个有效值clamp [0,1] |
| survivability | ENVIRONMENT_ADAPTABILITY, ANTI_JAMMING_CAPABILITY | 同上 |
| mtbf | RELIABILITY, SYSTEM_RELIABILITY | 取第一个有效值 |
#### 其他标量字段
| 目标字段 | 原始字段 | 转换 |
|----------|----------|------|
| protocol_list | PROTOCOL | 字符串→列表,空则 `[]` |
| format_list | FORMAT | 同上 |
| interface_list | INTERFACE | 同上 |
| security_level | security_level, SECURITY_LEVEL | 整数 [1,5],缺省 `3`(避免关系计算时 `None` 运算错误) |
| org_unit | LEVEL, ROLE_ID | 取第一个非空字符串 |
| nation | COUNTRY_REGION | 原值 |
| history_success | history_success, HISTORY_SUCCESS | clamp [0,1],缺省 `0.8`(同上) |
### 缺失与空值
- 无可映射原始值时,多数目标字段为 `null`(列表型为 `[]`
- `security_level``history_success``spatial.position` 等参与关系运算的字段**永不为 `null`**:缺省分别为 `3``0.8``[0,0]`,并在「关系计算前净化」阶段再次保证
- 可选字段(如 `org_unit``nation`)缺失不影响记录通过校验