#!/usr/bin/env python3 """Evaluate a fixed deployment (no optimization).""" from __future__ import annotations import argparse from pathlib import Path import matplotlib.pyplot as plt from uavsearch.geometry import RectRegion from uavsearch.problem import CoverageProblem, evaluate_deployment, random_deployment from uavsearch.sim import PatrolVisualizer def main() -> None: parser = argparse.ArgumentParser(description="Evaluate one UAV deployment") parser.add_argument("--width", type=float, default=1000.0) parser.add_argument("--height", type=float, default=800.0) parser.add_argument("--uavs", type=int, default=4) parser.add_argument("--radius", type=float, default=50.0) parser.add_argument("--speed", type=float, default=15.0) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--partition", choices=["uniform", "voronoi"], default="uniform") parser.add_argument("--grid-density", type=float, default=4.0) parser.add_argument("--save", type=str, default=None) args = parser.parse_args() region = RectRegion.from_size(args.width, args.height) problem = CoverageProblem( region=region, n_uavs=args.uavs, sensor_radius=args.radius, speed=args.speed, partition_mode=args.partition, grid_density=args.grid_density, ) positions = random_deployment(problem, seed=args.seed) result = evaluate_deployment(problem, positions) print(f"Objective T_max = {result.objective_value:.2f}s") print(result.summary_line()) from uavsearch.sim import PatrolSimulator sim = PatrolSimulator( region, result.solution.paths, args.speed, args.radius, grid_density=args.grid_density ) sim.run(result.max_patrol_period * 2.5) viz = PatrolVisualizer(region) fig = viz.plot_simulation_snapshot( sim, result.solution.paths, result.solution.metrics, title="Deployment Evaluation", partition=result.solution.partition, ) if args.save: Path(args.save).parent.mkdir(parents=True, exist_ok=True) fig.savefig(args.save, dpi=150, bbox_inches="tight") else: plt.show() if __name__ == "__main__": main()