一个具备科研可验证性的 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

143
run_experiments.py Normal file
View File

@@ -0,0 +1,143 @@
#!/usr/bin/env python
"""
LoRa Mesh Experiment Runner
Usage:
python run_experiments.py # Quick comparison
python run_experiments.py --full # Full parameter sweep
python run_experiments.py --routing gradient # Single algorithm
"""
import argparse
import os
import sys
# Add sim to path
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from sim.experiments.runner import (
run_parameter_sweep,
run_quick_comparison,
save_results_csv,
compute_averages,
)
def main():
parser = argparse.ArgumentParser(description="LoRa Mesh Experiment Runner")
parser.add_argument(
"--full",
action="store_true",
help="Run full parameter sweep (slower)",
)
parser.add_argument(
"--routing",
choices=["gradient", "flooding", "random"],
help="Run only specific routing algorithm",
)
parser.add_argument(
"--nodes",
type=int,
nargs="+",
default=[6, 9, 12, 15],
help="Node counts to test",
)
parser.add_argument(
"--area",
type=float,
nargs="+",
default=[500, 800, 1000],
help="Area sizes to test",
)
parser.add_argument(
"--time",
type=float,
default=200,
help="Simulation time per experiment",
)
parser.add_argument(
"--output",
default="results.csv",
help="Output CSV file",
)
args = parser.parse_args()
print("=" * 60)
print("LoRa Mesh Experiment Runner")
print("=" * 60)
if args.full:
# Full parameter sweep
print("\nRunning full parameter sweep...")
routings = ["gradient", "flooding", "random"]
seeds = [42, 123, 456]
results = run_parameter_sweep(
routings=routings,
node_counts=args.nodes,
area_sizes=args.area,
sim_time=args.time,
seeds=seeds,
)
# Compute averages
averaged = compute_averages(results)
# Save both raw and averaged
save_results_csv(results, args.output)
save_results_csv(averaged, args.output.replace(".csv", "_averaged.csv"))
print("\n=== Averaged Results ===")
for r in averaged:
print(
f"{r['routing']:10s} nodes={r['nodes']:2d} area={r['area']:4.0f}m "
f"PDR={r['avg_pdr']:5.2f}% max_hop={r['avg_max_hop']:.1f}"
)
elif args.routing:
# Single routing algorithm
print(f"\nRunning {args.routing} algorithm...")
results = run_parameter_sweep(
routings=[args.routing],
node_counts=args.nodes,
area_sizes=args.area,
sim_time=args.time,
seeds=[42],
)
save_results_csv(results, args.output)
print("\n=== Results ===")
for r in results:
print(
f"{r['routing']:10s} nodes={r['nodes']:2d} area={r['area']:4.0f}m "
f"PDR={r['pdr']:5.2f}% max_hop={r['max_hop']}"
)
else:
# Quick comparison (default)
print("\nRunning quick comparison (3 algorithms)...")
results = run_quick_comparison()
print("\n=== Results ===")
for routing, data in results.items():
print(f"\n{routing.upper()}:")
print(f" PDR: {data['pdr']:.2f}%")
print(f" Max Hop: {data['max_hop']}")
print(f" Avg Hop: {data['avg_hop']:.2f}")
print(f" Sent: {data['total_sent']}, Received: {data['total_received']}")
print(f" Collisions: {data['collisions']}")
# Save quick results
save_results_csv([data for data in results.values()], args.output)
print(f"\n✓ Results saved to {args.output}")
if __name__ == "__main__":
main()