一个具备科研可验证性的 LoRa 多跳算法评估基线。
This commit is contained in:
143
run_experiments.py
Normal file
143
run_experiments.py
Normal 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()
|
||||
Reference in New Issue
Block a user