一个具备科研可验证性的 LoRa 多跳算法评估基线。

This commit is contained in:
sinlatansen
2026-02-25 20:14:45 +08:00
parent 8537331c6f
commit 5ee1a16574
18 changed files with 1704 additions and 47 deletions

View File

@@ -0,0 +1,86 @@
"""
Test: Algorithm Comparison
Verify that gradient routing outperforms baseline algorithms.
"""
import pytest
from sim.experiments.runner import run_single_experiment
@pytest.fixture
def seed():
return 42
def test_gradient_outperforms_random(seed):
"""Test that gradient routing has better or equal PDR than random."""
gradient = run_single_experiment(
routing="gradient",
node_count=12,
area_size=800,
sim_time=100,
seed=seed,
)
random = run_single_experiment(
routing="random",
node_count=12,
area_size=800,
sim_time=100,
seed=seed,
)
print(f"\nGradient PDR: {gradient['pdr']:.2f}%")
print(f"Random PDR: {random['pdr']:.2f}%")
# Gradient should be at least as good as random (with small tolerance)
assert gradient["pdr"] >= random["pdr"] - 5.0, (
f"Gradient ({gradient['pdr']}%) should outperform Random ({random['pdr']}%)"
)
def test_all_algorithms_run(seed):
"""Test that all routing algorithms can run without errors."""
for routing in ["gradient", "flooding", "random"]:
result = run_single_experiment(
routing=routing,
node_count=10,
area_size=600,
sim_time=100,
seed=seed,
)
assert result["pdr"] >= 0, f"{routing} should produce valid PDR"
assert result["max_hop"] >= 0, f"{routing} should produce valid max_hop"
def test_flooding_produces_more_hops(seed):
"""Test that flooding produces more hops due to broadcast nature."""
gradient = run_single_experiment(
routing="gradient",
node_count=12,
area_size=800,
sim_time=100,
seed=seed,
)
flooding = run_single_experiment(
routing="flooding",
node_count=12,
area_size=800,
sim_time=100,
seed=seed,
)
print(f"\nGradient max_hop: {gradient['max_hop']}")
print(f"Flooding max_hop: {flooding['max_hop']}")
# Flooding should have higher max hop due to multi-path forwarding
assert flooding["max_hop"] >= gradient["max_hop"], (
"Flooding should produce more hops than gradient routing"
)
if __name__ == "__main__":
pytest.main([__file__, "-v", "-s"])