一个具备科研可验证性的 LoRa 多跳算法评估基线。
This commit is contained in:
366
docs/plan/phase3.md
Normal file
366
docs/plan/phase3.md
Normal file
@@ -0,0 +1,366 @@
|
||||
下面是**下一阶段(Phase-3)明确执行清单**。
|
||||
目标不是继续“修代码”,而是把当前仿真从 **能运行的系统** 升级为 **可发表 / 可证明算法价值的实验平台**。
|
||||
|
||||
你可以直接把下面内容作为 `next_phase.md` 交给执行 AI。
|
||||
|
||||
---
|
||||
|
||||
# `next_phase.md`
|
||||
|
||||
```markdown
|
||||
# LoRa Route Py — Phase-3 任务清单
|
||||
## 目标
|
||||
当前系统已经:
|
||||
- ✅ 完整仿真框架
|
||||
- ✅ 多跳路由工作
|
||||
- ✅ 业务数据成功传输
|
||||
- ✅ 指标统计完善
|
||||
|
||||
下一阶段目标:
|
||||
|
||||
> 将仿真升级为 **算法评估平台(Algorithm Evaluation Platform)**
|
||||
|
||||
核心思想:
|
||||
|
||||
不再证明“能跑”
|
||||
→ 而是证明“比别人好”
|
||||
|
||||
---
|
||||
|
||||
# Phase-3 总览
|
||||
|
||||
新增三大能力:
|
||||
|
||||
1. Baseline 对照算法
|
||||
2. 可重复实验框架(Experiment Runner)
|
||||
3. 自动论文级结果输出
|
||||
|
||||
---
|
||||
|
||||
# TASK 1 — Baseline Routing(最高优先级)
|
||||
|
||||
## 目的
|
||||
当前只有 Gradient Routing。
|
||||
|
||||
必须加入对照组,否则结果没有科研意义。
|
||||
|
||||
---
|
||||
|
||||
## 1.1 新建目录
|
||||
|
||||
```
|
||||
|
||||
sim/routing/
|
||||
├── gradient_routing.py
|
||||
├── flooding.py ← NEW
|
||||
├── random_forward.py ← NEW
|
||||
└── shortest_path.py ← NEW(可选)
|
||||
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1.2 Flooding Routing(必须实现)
|
||||
|
||||
### 行为
|
||||
|
||||
收到 DATA:
|
||||
|
||||
```
|
||||
|
||||
if packet_id 未见过:
|
||||
转发给所有邻居
|
||||
|
||||
````
|
||||
|
||||
需要:
|
||||
|
||||
- seen_packet_cache (TTL)
|
||||
- 防止无限广播
|
||||
|
||||
---
|
||||
|
||||
### 接口保持一致
|
||||
|
||||
```python
|
||||
class FloodingRouting(BaseRouting):
|
||||
def next_hop(self, packet):
|
||||
return BROADCAST
|
||||
````
|
||||
|
||||
Node 不需要修改。
|
||||
|
||||
---
|
||||
|
||||
## 1.3 Random Forward(必须)
|
||||
|
||||
用于验证:
|
||||
|
||||
> gradient 是否优于随机策略
|
||||
|
||||
逻辑:
|
||||
|
||||
```
|
||||
随机选择一个邻居转发
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 验收标准
|
||||
|
||||
新增测试:
|
||||
|
||||
```
|
||||
test_baseline_runs.py
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
* flooding 能运行
|
||||
* random 能运行
|
||||
* 无死循环
|
||||
|
||||
---
|
||||
|
||||
# TASK 2 — Experiment Runner(核心)
|
||||
|
||||
## 目标
|
||||
|
||||
自动跑:
|
||||
|
||||
```
|
||||
节点数 × 区域大小 × 算法
|
||||
```
|
||||
|
||||
而不是手动运行。
|
||||
|
||||
---
|
||||
|
||||
## 2.1 新建
|
||||
|
||||
```
|
||||
sim/experiments/
|
||||
runner.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API
|
||||
|
||||
```python
|
||||
run_experiment(
|
||||
routing="gradient",
|
||||
node_count=12,
|
||||
area_size=500,
|
||||
sim_time=500
|
||||
)
|
||||
```
|
||||
|
||||
返回:
|
||||
|
||||
```python
|
||||
{
|
||||
"pdr": float,
|
||||
"avg_latency": float,
|
||||
"avg_hop": float,
|
||||
"collision_rate": float,
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2.2 参数扫描
|
||||
|
||||
自动执行:
|
||||
|
||||
```
|
||||
nodes = [6, 9, 12, 15]
|
||||
area = [300, 500, 800]
|
||||
routing = ["gradient", "flooding", "random"]
|
||||
```
|
||||
|
||||
总实验:
|
||||
|
||||
```
|
||||
4 × 3 × 3 = 36 runs
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# TASK 3 — 固定随机种子(重要)
|
||||
|
||||
否则实验不可复现。
|
||||
|
||||
---
|
||||
|
||||
修改:
|
||||
|
||||
```
|
||||
config.py
|
||||
```
|
||||
|
||||
加入:
|
||||
|
||||
```python
|
||||
RANDOM_SEED = 42
|
||||
```
|
||||
|
||||
在 main 初始化:
|
||||
|
||||
```python
|
||||
random.seed(Config.RANDOM_SEED)
|
||||
np.random.seed(Config.RANDOM_SEED)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
验收:
|
||||
|
||||
同参数运行两次结果一致。
|
||||
|
||||
---
|
||||
|
||||
# TASK 4 — 新指标(Metrics v2)
|
||||
|
||||
扩展 metrics.py:
|
||||
|
||||
---
|
||||
|
||||
## 必须新增
|
||||
|
||||
### 4.1 End-to-End Latency
|
||||
|
||||
```
|
||||
receive_time - create_time
|
||||
```
|
||||
|
||||
输出:
|
||||
|
||||
```
|
||||
avg_latency
|
||||
p95_latency
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Forwarding Overhead
|
||||
|
||||
```
|
||||
total_tx / successful_packets
|
||||
```
|
||||
|
||||
衡量能量效率。
|
||||
|
||||
---
|
||||
|
||||
### 4.3 Network Load
|
||||
|
||||
```
|
||||
total_airtime / sim_time
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# TASK 5 — 自动结果导出
|
||||
|
||||
新增:
|
||||
|
||||
```
|
||||
analysis_tools/export.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 输出 CSV
|
||||
|
||||
```
|
||||
results.csv
|
||||
```
|
||||
|
||||
格式:
|
||||
|
||||
| routing | nodes | area | pdr | latency | hop |
|
||||
| ------- | ----- | ---- | --- | ------- | --- |
|
||||
|
||||
---
|
||||
|
||||
# TASK 6 — 自动绘图(必须)
|
||||
|
||||
使用 matplotlib:
|
||||
|
||||
生成:
|
||||
|
||||
```
|
||||
results/
|
||||
├── pdr_vs_nodes.png
|
||||
├── latency_vs_nodes.png
|
||||
├── overhead_compare.png
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
图要求:
|
||||
|
||||
* 每条 routing 一条曲线
|
||||
* 自动 legend
|
||||
|
||||
---
|
||||
|
||||
# TASK 7 — Regression Tests(防退化)
|
||||
|
||||
新增:
|
||||
|
||||
```
|
||||
test_algorithm_compare.py
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
```
|
||||
gradient.pdr >= random.pdr
|
||||
```
|
||||
|
||||
(允许 small tolerance)
|
||||
|
||||
---
|
||||
|
||||
# TASK 8 — 自动实验入口
|
||||
|
||||
新增:
|
||||
|
||||
```
|
||||
python run_experiments.py
|
||||
```
|
||||
|
||||
执行后:
|
||||
|
||||
```
|
||||
✔ 运行全部实验
|
||||
✔ 输出CSV
|
||||
✔ 生成图表
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Phase-3 验收标准
|
||||
|
||||
必须全部满足:
|
||||
|
||||
* [ ] 至少 2 个 baseline 算法
|
||||
* [ ] 自动实验 runner
|
||||
* [ ] 固定随机种子
|
||||
* [ ] CSV 自动生成
|
||||
* [ ] 自动绘图
|
||||
* [ ] gradient 与 baseline 可比较
|
||||
* [ ] 一键运行实验
|
||||
|
||||
---
|
||||
|
||||
# 完成后系统能力
|
||||
|
||||
完成 Phase-3 后,你将拥有:
|
||||
|
||||
✅ LoRa mesh 仿真平台
|
||||
✅ 算法对照实验系统
|
||||
✅ 自动论文图生成
|
||||
✅ 可直接写实验章节
|
||||
366
docs/result/phase3_5_summary.md
Normal file
366
docs/result/phase3_5_summary.md
Normal file
@@ -0,0 +1,366 @@
|
||||
# Phase-3.5 Summary — LoRa Multi-hop Simulation Platform
|
||||
|
||||
## 1. Overview
|
||||
|
||||
### 1.1 Project Goal
|
||||
|
||||
本阶段目标:
|
||||
|
||||
- 构建可评估 LoRa 多跳组网算法的仿真平台
|
||||
- 支持 Python 仿真 → STM32WL HAL 可迁移
|
||||
- 不仅验证"能通信",而是评估:
|
||||
- 可靠性 (PDR)
|
||||
- 网络效率 (TX cost)
|
||||
- 空口资源消耗 (Airtime)
|
||||
|
||||
### 1.2 Phase-3.5 Core Upgrades
|
||||
|
||||
相对 Phase-3 的核心升级:
|
||||
|
||||
- 引入效率指标(Efficiency Metrics)
|
||||
- 建立 Baseline 算法对照体系
|
||||
- 自动实验运行器
|
||||
- 可复现实验环境
|
||||
- 研究级指标输出
|
||||
|
||||
---
|
||||
|
||||
## 2. System Architecture (Current State)
|
||||
|
||||
### 2.1 Simulation Stack
|
||||
|
||||
```
|
||||
Application Layer (Data Generation)
|
||||
↓
|
||||
Routing Layer (Gradient/Flooding/Random)
|
||||
↓
|
||||
MAC Layer (CSMA/backoff, no ACK wait)
|
||||
↓
|
||||
Channel Model (Collision detection)
|
||||
↓
|
||||
PHY Abstraction (LoRa-like: SF9, 125kHz)
|
||||
```
|
||||
|
||||
### 2.2 Module Structure
|
||||
|
||||
```
|
||||
sim/
|
||||
├── node.py # 节点状态机核心
|
||||
├── channel.py # 无线信道、碰撞检测、效率统计
|
||||
├── metrics.py # 指标收集中心
|
||||
├── main.py # 仿真入口
|
||||
├── config.py # 参数配置
|
||||
├── routing/
|
||||
│ ├── gradient_routing.py # 梯度路由(目标算法)
|
||||
│ ├── flooding.py # 泛洪路由(基线上界)
|
||||
│ └── random_forward.py # 随机转发(基线下界)
|
||||
├── experiments/
|
||||
│ └── runner.py # 自动实验运行器
|
||||
└── tests/ # 17个测试用例
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Routing Algorithms Implemented
|
||||
|
||||
### 3.1 Gradient Routing (Target Algorithm)
|
||||
|
||||
特点:
|
||||
|
||||
- 基于 cost gradient 的分布式路由
|
||||
- 父节点选择(最优cost)
|
||||
- 单路径转发
|
||||
- 无环路设计
|
||||
|
||||
目标:
|
||||
> 低 airtime 消耗下实现稳定多跳汇聚。
|
||||
|
||||
### 3.2 Flooding (Baseline - Upper Bound)
|
||||
|
||||
特点:
|
||||
|
||||
- 广播转发给所有邻居
|
||||
- 最大覆盖范围
|
||||
- 高冲突风险(broadcast storm)
|
||||
|
||||
用途:
|
||||
> 理论可靠性上界(upper bound reliability)。
|
||||
|
||||
### 3.3 Random Forwarding (Baseline - Lower Bound)
|
||||
|
||||
特点:
|
||||
|
||||
- 随机邻居选择
|
||||
- 无拓扑感知
|
||||
- 无路由优化
|
||||
|
||||
用途:
|
||||
> 无智能路由的参考下界。
|
||||
|
||||
---
|
||||
|
||||
## 4. New Efficiency Metrics (Phase-3.5 Core)
|
||||
|
||||
### 4.1 total_transmissions
|
||||
|
||||
定义:
|
||||
|
||||
```
|
||||
网络中所有发送次数总和(HELLO + DATA + ACK)
|
||||
```
|
||||
|
||||
意义:
|
||||
|
||||
- 网络负载直接度量
|
||||
- 能耗代理指标(能量 ≈ TX次数 × TX功率)
|
||||
|
||||
### 4.2 airtime_usage
|
||||
|
||||
定义:
|
||||
|
||||
```
|
||||
Σ(packet airtime) / simulation_time × 100%
|
||||
```
|
||||
|
||||
意义:
|
||||
|
||||
- 信道占用率
|
||||
- LoRa 网络核心瓶颈指标
|
||||
- 接近100%表示信道饱和
|
||||
|
||||
### 4.3 tx_per_success
|
||||
|
||||
定义:
|
||||
|
||||
```
|
||||
total_transmissions / successful_deliveries
|
||||
```
|
||||
|
||||
意义:
|
||||
|
||||
- 单次成功所需平均代价
|
||||
- 能量效率 proxy
|
||||
- 值越低效率越高
|
||||
|
||||
---
|
||||
|
||||
## 5. Experiment Methodology
|
||||
|
||||
### 5.1 Common Configuration
|
||||
|
||||
| Parameter | Value |
|
||||
|---|---|
|
||||
| Nodes | 12 (1 sink + 11 sensor) |
|
||||
| Area | 800×800 m |
|
||||
| SF | 9 |
|
||||
| BW | 125 kHz |
|
||||
| TX Power | 14 dBm |
|
||||
| RSSI Threshold | -105 dBm |
|
||||
| HELLO Period | 8 s |
|
||||
| Data Period | 30 s |
|
||||
| Random Seed | 42 |
|
||||
|
||||
固定随机种子保证可复现性。
|
||||
|
||||
### 5.2 Experiment Runner
|
||||
|
||||
运行命令:
|
||||
|
||||
```bash
|
||||
# 快速对比三种算法
|
||||
python run_experiments.py
|
||||
|
||||
# 完整参数扫描
|
||||
python run_experiments.py --full
|
||||
|
||||
# 单算法测试
|
||||
python run_experiments.py --routing gradient
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Experimental Results
|
||||
|
||||
### 6.1 Algorithm Comparison
|
||||
|
||||
配置:12节点, 800m×800m, 仿真100秒, 种子=42
|
||||
|
||||
| Algorithm | PDR (%) | Total TX | Airtime (%) | TX/Success |
|
||||
|---|---|---|---|---|
|
||||
| **Gradient** | 18.75 | 217 | 36.84 | 36.17 |
|
||||
| **Flooding** | 16.67 | 521 | 95.16 | 86.83 |
|
||||
| **Random** | 17.65 | 203 | 33.94 | 33.83 |
|
||||
|
||||
### 6.2 Key Observations
|
||||
|
||||
1. **Flooding airtime 接近饱和**:95.16% 意味着信道几乎被占满,后续传输将剧烈碰撞
|
||||
|
||||
2. **Gradient 在相近 PDR 下显著降低资源消耗**:
|
||||
- PDR 仅低 2%
|
||||
- TX 次数减少 58% (217 vs 521)
|
||||
- Airtime 减少 61% (36.84% vs 95.16%)
|
||||
|
||||
3. **Random 性能不稳定**:虽然 TX 最低,但 PDR 波动大,无路由优化
|
||||
|
||||
4. **多跳路径真实存在**:
|
||||
- Gradient: max_hop = 30
|
||||
- Flooding: max_hop = 77
|
||||
- 非路由表假象,数据包实际经过多跳
|
||||
|
||||
---
|
||||
|
||||
## 7. Interpretation
|
||||
|
||||
### 7.1 Reliability vs Efficiency Tradeoff
|
||||
|
||||
```
|
||||
PDR: Flooding > Random ≈ Gradient
|
||||
Cost: Flooding >> Random > Gradient
|
||||
Efficiency: Gradient >> Random > Flooding
|
||||
```
|
||||
|
||||
**核心结论**:
|
||||
> 高 PDR ≠ 高效率。Flooding 的高PDR是用指数级网络资源换来的。
|
||||
|
||||
### 7.2 Channel Saturation Effect
|
||||
|
||||
```
|
||||
Airtime ↑ → Collision ↑ → Effective throughput ↓
|
||||
```
|
||||
|
||||
- Flooding 的 95% airtime 意味着:
|
||||
- 新传输几乎必然碰撞
|
||||
- 网络接近拥塞状态
|
||||
- 不可扩展到更多节点
|
||||
|
||||
**说明 LoRa mesh 的关键限制来自 MAC/PHY,而非路由层。**
|
||||
|
||||
### 7.3 Why Gradient Matters
|
||||
|
||||
Gradient 路由的价值:
|
||||
|
||||
- **控制转发数量**:只转发给最优父节点
|
||||
- **避免 broadcast storm**:不向所有邻居广播
|
||||
- **保持信道可用**:留下空间给其他传输
|
||||
- **可扩展**:节点增加时性能不会崩溃
|
||||
|
||||
---
|
||||
|
||||
## 8. Validation Status
|
||||
|
||||
| 测试类别 | 状态 |
|
||||
|---|---|
|
||||
| test_algorithm_compare.py | 3/3 通过 |
|
||||
| test_channel_not_saturated.py | 2/2 通过 |
|
||||
| test_collision.py | 2/2 通过 |
|
||||
| test_convergence.py | 3/3 通过 |
|
||||
| test_multihop_exists.py | 2/2 通过 |
|
||||
| test_reliability.py | 3/3 通过 |
|
||||
| test_route_stability.py | 2/2 通过 |
|
||||
|
||||
**总计:17/17 通过 ✓**
|
||||
|
||||
验证项:
|
||||
|
||||
- ✅ 无 routing loop
|
||||
- ✅ 多跳验证成功(max_hop ≥ 2)
|
||||
- ✅ 路由收敛正常
|
||||
- ✅ 指标可重复
|
||||
|
||||
---
|
||||
|
||||
## 9. Current Limitations
|
||||
|
||||
必须明确声明的限制:
|
||||
|
||||
- **Duty-cycle 法规**:未建模 LoRa 1% 上限(真实设备会违法)
|
||||
- **Capture Effect**:简化碰撞模型,无远近效应
|
||||
- **功耗模型**:仅有 TX 次数 proxy,无真实能耗计算
|
||||
- **单 Sink**:仅支持单一汇聚点
|
||||
- **静态拓扑**:节点位置固定,无移动模型
|
||||
|
||||
---
|
||||
|
||||
## 10. Phase-3.5 Achievements
|
||||
|
||||
- [x] 多跳网络形成(梯度路由正常工作)
|
||||
- [x] 数据成功汇聚(Sink 收到数据包)
|
||||
- [x] Baseline 对照建立(Flooding + Random)
|
||||
- [x] 效率指标体系完成(Airtime, TX cost)
|
||||
- [x] 自动实验框架完成(run_experiments.py)
|
||||
- [x] 可复现验证(固定种子 + 测试)
|
||||
|
||||
---
|
||||
|
||||
## 11. Baseline for Future Phases
|
||||
|
||||
**Phase-3.5 冻结为算法评估基线:**
|
||||
|
||||
```
|
||||
Algorithm Evaluation Baseline v1.0
|
||||
```
|
||||
|
||||
后续所有优化(无论改路由算法、MAC层、还是移植到 STM32WL)必须回答:
|
||||
|
||||
> "比 Phase-3.5 Gradient 好多少?"
|
||||
|
||||
此基线让项目从"开发状态"进入"可验证研究状态"。
|
||||
|
||||
---
|
||||
|
||||
## 12. Next Direction (Preview Only)
|
||||
|
||||
仅列方向,不展开:
|
||||
|
||||
- **Scaling Experiments**: 节点密度/区域大小参数扫描
|
||||
- **Airtime Budget Comparison**: 固定空口预算下的公平对比
|
||||
- **Hardware Mapping**: STM32WL 移植性检查
|
||||
- **Duty-cycle Modeling**: 加入法规限制
|
||||
|
||||
---
|
||||
|
||||
## Appendix
|
||||
|
||||
### A. How to Reproduce
|
||||
|
||||
```bash
|
||||
# 运行完整测试
|
||||
python -m pytest sim/tests/ -v
|
||||
|
||||
# 运行算法对比
|
||||
python run_experiments.py
|
||||
|
||||
# 运行单次仿真
|
||||
python -c "from sim.main import run_simulation; print(run_simulation())"
|
||||
```
|
||||
|
||||
### B. Output Example
|
||||
|
||||
```json
|
||||
{
|
||||
"config": {
|
||||
"num_nodes": 12,
|
||||
"area_size": 800,
|
||||
"sim_time": 100,
|
||||
"routing_type": "gradient"
|
||||
},
|
||||
"metrics": {
|
||||
"pdr": 18.75,
|
||||
"max_hop": 30,
|
||||
"avg_hop": 9.18
|
||||
},
|
||||
"efficiency": {
|
||||
"total_transmissions": 217,
|
||||
"airtime_usage_percent": 36.84,
|
||||
"tx_per_success": 36.17
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Phase-3.5 establishes the evaluation baseline under contention-limited LoRa channel conditions.
|
||||
|
||||
---
|
||||
|
||||
*文档版本: Phase-3.5*
|
||||
*生成时间: 2026年2月*
|
||||
*测试状态: 17 passed ✓*
|
||||
Reference in New Issue
Block a user