新增修改

This commit is contained in:
2026-04-23 12:48:59 +08:00
parent df46812eff
commit 92b856b622
60 changed files with 18623 additions and 398 deletions

331
final/README.md Normal file
View File

@@ -0,0 +1,331 @@
# 作战体系数据清洗与网络效能评估系统
## 项目简介
本系统包含两大功能模块:
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`)缺失不影响记录通过校验