Autonomous Vessel Navigation · COLREGs Benchmark

vesselnav-bench v2

A transparent, reproducible benchmark where rule-based, optimization and learning agents navigate the same seas under the same collision-avoidance rules — every number backed by a replayable episode log.

4agents11scenarios1320seeded episodes
View the leaderboard

→ VesselNav-Bench v1 (archived)

Seeded navigation suite for comparing autonomous-vessel navigation policies under identical physics, scenarios, and scoring: canonical COLREGs encounters, coastal planning, and randomized worlds, in calm, disturbed (current + wind gust + sea state), degraded-perception, and shoaling (depth / under-keel clearance) conditions.

generated 2026-06-23T08:22:10 11 scenarios × 20 seeded episodes × 6 conditions config hash per condition (physics fingerprint, not a seed): calm: 16e87b9cbe01a104disturbed: 8eb3fc5d0e399f8bdegraded: 73438db0aa38ecacshoaling: 9f29bc10527d6257hull_randomized: 284c51f7d6bc18f4restricted_visibility: a9551fd639e0949d

Benchmark score = 100 × (0.6 × success rate + 0.25 × COLREGs compliance + 0.15 × path efficiency). Rates carry Wilson 95% CIs, means carry seeded bootstrap 95% CIs; all metrics are computed from ground-truth episode logs. Scores are comparable only between runs with identical config hashes.

The agents

classicalrule-based (layered)

by V. Ravendranathan (VesselNav-Bench baseline)

A* plans the route, ILOS guidance tracks it, and a predictive COLREGs-inspired avoider overrides the helm when rollouts with the real vessel dynamics predict a conflict on the route.

mpcoptimization (model predictive control)

by V. Ravendranathan (VesselNav-Bench baseline)

Solves a local optimal-control problem each second: candidate maneuver plans are rolled out with the real dynamics and scored by one cost combining progress, separation, effort, and a COLREGs prior.

rl_ppolearning (deep reinforcement learning)

by V. Ravendranathan (VesselNav-Bench baseline)

PPO policy over a labeled 35-feature observation (goal vector, own dynamics, land lidar, nearest traffic); each decision logs the full action probability distribution and value estimate.

rl_ppo_shieldedhybrid (learning + runtime safety filter)

by V. Ravendranathan (VesselNav-Bench baseline)

The PPO policy proposes; a classical predictive filter vets every proposal with real-dynamics rollouts and substitutes the nearest safe course when needed. Every intervention is logged.

What is being tested

All agents steer the same own-ship model: a 3-DOF surge–sway–yaw maneuvering model (first-order Nomoto yaw response, sideslip toward −k·u·r, turn-induced speed loss, first-order surge), an IMO-standard rudder actuator (35° limit, 70°-in-11-s slew rate), and a course-over-ground PD autopilot. Disturbed episodes add a scenario-seeded water current (drifting the traffic too) and wind gusts. Agents command intent (desired course and speed); the physics decides what the hull does.

Scenario COLREGs ruleSituation
open_waterNo obstaclesPure route following, no rule applies
head_onRule 14 — head-onReciprocal courses; both vessels must alter to starboard and pass port-to-port
crossing_starboardRule 15/16 — give-wayTraffic crosses from starboard; own ship must take early, substantial action to keep clear
crossing_portRule 17 — stand-onTraffic crosses from port; own ship should hold course while it remains safe
overtakingRule 13 — overtakingSlow vessel ahead on the same course; overtaking vessel keeps clear, either side
coastalMixedLandmasses forming a channel plus two traffic vessels; planning and avoidance together
multi_vesselRules 14+15 combinedTwo simultaneous conflicts timed to overlap, plus a third vessel passing by
narrow_channelRule 14 in a fairway (Rule 9 flavor)Oncoming vessel inside a narrow channel; limited sea room on both sides
randomMixedSeeded random islands and wandering traffic

Each scenario runs 20 seeded episodes per condition; calm has no disturbances, disturbed adds a scenario-seeded random current (up to 0.3 cells/s) and wind gusts. Every agent faces the identical episodes.

Podium — Overall

Ranked by the unweighted mean benchmark score across all 6 conditions (each carries the same episode count), so all-round competence wins.

2
classical
93.5
overall score
94% mean success · 6 conditions
1
mpc
93.9
overall score
97% mean success · 6 conditions
3
rl_ppo_shielded
87.7
overall score
93% mean success · 6 conditions

Condition: calm

Baseline physics — no current, wind, sea state or perception noise. Isolates pure navigation and COLREGs skill and anchors every robustness comparison.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 classical V. Ravendranathan (VesselNav-Bench baseline) 96.8 99.6% [97.5%, 99.9%] 0.0% [0.0%, 1.7%] 0.4% [0.1%, 2.5%] 0.92 (n=212) 210.2 [204.7, 215.7] 10.84 [9.97, 11.85]
2 mpc V. Ravendranathan (VesselNav-Bench baseline) 95.7 100.0% [98.3%, 100.0%] 0.0% [0.0%, 1.7%] 0.0% [0.0%, 1.7%] 0.87 (n=230) 209.9 [204.2, 216.0] 11.17 [10.30, 12.19]
3 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 85.4 90.9% [86.4%, 94.0%] 0.0% [0.0%, 1.7%] 0.0% [0.0%, 1.7%] 0.70 (n=223) 256.6 [246.4, 266.9] 9.92 [8.75, 11.21]
4 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 60.5 61.4% [54.8%, 67.5%] 27.3% [21.8%, 33.5%] 11.4% [7.8%, 16.2%] 0.35 (n=243) 203.7 [198.7, 209.0] 7.15 [5.85, 8.54]
Episode outcomes
classicalgoal: 219/220 (100%)100%grounding: 1/220 (0%)mpcgoal: 220/220 (100%)100%rl_ppo_shieldedgoal: 200/220 (91%)91%out_of_bounds: 20/220 (9%)9%rl_ppogoal: 135/220 (61%)61%collision: 60/220 (27%)27%grounding: 25/220 (11%)11%goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%classical: 210.2s, 100% successclassicalmpc: 209.9s, 100% successmpcrl_ppo_shielded: 256.6s, 91% successrl_ppo_shieldedrl_ppo: 203.7s, 61% successrl_ppomean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
classicalmpcrl_ppo_shieldedrl_ppoopen waterclassical · open water: 100% (20 episodes)100%mpc · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%head onclassical · head on: 100% (20 episodes)100%mpc · head on: 100% (20 episodes)100%rl_ppo_shielded · head on: 100% (20 episodes)100%rl_ppo · head on: 0% (20 episodes)0%crossing starboardclassical · crossing starboard: 100% (20 episodes)100%mpc · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 100% (20 episodes)100%rl_ppo · crossing starboard: 100% (20 episodes)100%crossing portclassical · crossing port: 100% (20 episodes)100%mpc · crossing port: 100% (20 episodes)100%rl_ppo_shielded · crossing port: 100% (20 episodes)100%rl_ppo · crossing port: 0% (20 episodes)0%overtakingclassical · overtaking: 100% (20 episodes)100%mpc · overtaking: 100% (20 episodes)100%rl_ppo_shielded · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 100% (20 episodes)100%coastalclassical · coastal: 100% (20 episodes)100%mpc · coastal: 100% (20 episodes)100%rl_ppo_shielded · coastal: 0% (20 episodes)0%rl_ppo · coastal: 0% (20 episodes)0%multi vesselclassical · multi vessel: 100% (20 episodes)100%mpc · multi vessel: 100% (20 episodes)100%rl_ppo_shielded · multi vessel: 100% (20 episodes)100%rl_ppo · multi vessel: 100% (20 episodes)100%narrow channelclassical · narrow channel: 100% (20 episodes)100%mpc · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 0% (20 episodes)0%tss transitclassical · tss transit: 100% (20 episodes)100%mpc · tss transit: 100% (20 episodes)100%rl_ppo_shielded · tss transit: 100% (20 episodes)100%rl_ppo · tss transit: 100% (20 episodes)100%tss crossingclassical · tss crossing: 100% (20 episodes)100%mpc · tss crossing: 100% (20 episodes)100%rl_ppo_shielded · tss crossing: 100% (20 episodes)100%rl_ppo · tss crossing: 100% (20 episodes)100%randomclassical · random: 95% (20 episodes)95%mpc · random: 100% (20 episodes)100%rl_ppo_shielded · random: 100% (20 episodes)100%rl_ppo · random: 75% (20 episodes)75%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
classical0.76 (n=68)1.00 (n=84)1.00 (n=60)
mpc0.72 (n=106)0.98 (n=64)1.00 (n=60)
rl_ppo_shielded0.65 (n=81)0.58 (n=82)0.93 (n=60)
rl_ppo0.48 (n=81)0.40 (n=102)0.07 (n=60)

Condition: disturbed

Environmental robustness — scenario-seeded water current (up to 0.3 cells/s) and wind gusts, plus a moderate sea state (Hs ≈ 1.25 m, sea state 3–4) that adds speed loss from added resistance and a first-order yaw oscillation at the wave encounter frequency. Wave direction is drawn per episode.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 88.1 91.8% [87.4%, 94.8%] 0.9% [0.2%, 3.2%] 2.7% [1.3%, 5.8%] 0.76 (n=202) 269.7 [251.6, 290.1] 12.01 [10.74, 13.45]
2 mpc V. Ravendranathan (VesselNav-Bench baseline) 86.3 86.4% [81.2%, 90.3%] 1.8% [0.7%, 4.6%] 0.0% [0.0%, 1.7%] 0.81 (n=225) 208.8 [200.4, 218.6] 10.73 [9.67, 11.91]
3 classical V. Ravendranathan (VesselNav-Bench baseline) 84.0 80.5% [74.7%, 85.2%] 1.8% [0.7%, 4.6%] 0.9% [0.2%, 3.2%] 0.88 (n=227) 247.5 [234.3, 262.0] 12.01 [10.96, 13.18]
4 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 71.3 74.1% [67.9%, 79.4%] 13.6% [9.7%, 18.8%] 10.4% [7.1%, 15.2%] 0.47 (n=211) 216.3 [204.6, 231.3] 10.94 [9.37, 12.54]
Episode outcomes
rl_ppo_shieldedgoal: 202/220 (92%)92%collision: 2/220 (1%)grounding: 6/220 (3%)out_of_bounds: 5/220 (2%)timeout: 5/220 (2%)mpcgoal: 190/220 (86%)86%collision: 4/220 (2%)timeout: 26/220 (12%)12%classicalgoal: 177/220 (80%)80%collision: 4/220 (2%)grounding: 2/220 (1%)out_of_bounds: 19/220 (9%)9%timeout: 18/220 (8%)8%rl_ppogoal: 163/220 (74%)74%collision: 30/220 (14%)14%grounding: 23/220 (10%)10%out_of_bounds: 2/220 (1%)timeout: 2/220 (1%)goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%rl_ppo_shielded: 269.7s, 92% successrl_ppo_shieldedmpc: 208.8s, 86% successmpcclassical: 247.5s, 80% successclassicalrl_ppo: 216.3s, 74% successrl_ppomean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
rl_ppo_shieldedmpcclassicalrl_ppoopen waterrl_ppo_shielded · open water: 90% (20 episodes)90%mpc · open water: 90% (20 episodes)90%classical · open water: 90% (20 episodes)90%rl_ppo · open water: 90% (20 episodes)90%head onrl_ppo_shielded · head on: 95% (20 episodes)95%mpc · head on: 85% (20 episodes)85%classical · head on: 85% (20 episodes)85%rl_ppo · head on: 45% (20 episodes)45%crossing starboardrl_ppo_shielded · crossing starboard: 100% (20 episodes)100%mpc · crossing starboard: 85% (20 episodes)85%classical · crossing starboard: 85% (20 episodes)85%rl_ppo · crossing starboard: 100% (20 episodes)100%crossing portrl_ppo_shielded · crossing port: 95% (20 episodes)95%mpc · crossing port: 85% (20 episodes)85%classical · crossing port: 80% (20 episodes)80%rl_ppo · crossing port: 70% (20 episodes)70%overtakingrl_ppo_shielded · overtaking: 100% (20 episodes)100%mpc · overtaking: 80% (20 episodes)80%classical · overtaking: 65% (20 episodes)65%rl_ppo · overtaking: 100% (20 episodes)100%coastalrl_ppo_shielded · coastal: 45% (20 episodes)45%mpc · coastal: 90% (20 episodes)90%classical · coastal: 85% (20 episodes)85%rl_ppo · coastal: 0% (20 episodes)0%multi vesselrl_ppo_shielded · multi vessel: 95% (20 episodes)95%mpc · multi vessel: 85% (20 episodes)85%classical · multi vessel: 80% (20 episodes)80%rl_ppo · multi vessel: 70% (20 episodes)70%narrow channelrl_ppo_shielded · narrow channel: 95% (20 episodes)95%mpc · narrow channel: 85% (20 episodes)85%classical · narrow channel: 85% (20 episodes)85%rl_ppo · narrow channel: 60% (20 episodes)60%tss transitrl_ppo_shielded · tss transit: 100% (20 episodes)100%mpc · tss transit: 90% (20 episodes)90%classical · tss transit: 70% (20 episodes)70%rl_ppo · tss transit: 100% (20 episodes)100%tss crossingrl_ppo_shielded · tss crossing: 100% (20 episodes)100%mpc · tss crossing: 85% (20 episodes)85%classical · tss crossing: 80% (20 episodes)80%rl_ppo · tss crossing: 100% (20 episodes)100%randomrl_ppo_shielded · random: 95% (20 episodes)95%mpc · random: 90% (20 episodes)90%classical · random: 80% (20 episodes)80%rl_ppo · random: 80% (20 episodes)80%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
rl_ppo_shielded0.68 (n=75)0.73 (n=66)0.88 (n=61)
mpc0.73 (n=80)0.85 (n=85)0.87 (n=60)
classical0.74 (n=79)0.96 (n=88)0.95 (n=60)
rl_ppo0.54 (n=76)0.56 (n=74)0.28 (n=61)

Condition: degraded

Perception robustness at AIS/GPS-grade sensing — noisy target position (~12 m), course (6°) and speed, fixes only every 4 s (staleness on moving targets) and occasional target dropout. Physics stays calm to isolate sensing.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 mpc V. Ravendranathan (VesselNav-Bench baseline) 95.6 100.0% [98.3%, 100.0%] 0.0% [0.0%, 1.7%] 0.0% [0.0%, 1.7%] 0.85 (n=237) 203.6 [198.8, 208.6] 9.83 [8.98, 10.88]
2 classical V. Ravendranathan (VesselNav-Bench baseline) 92.7 93.6% [89.6%, 96.2%] 2.3% [1.0%, 5.2%] 0.9% [0.2%, 3.2%] 0.91 (n=230) 263.7 [255.5, 272.6] 11.35 [10.48, 12.37]
3 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 89.5 95.5% [91.8%, 97.5%] 2.3% [1.0%, 5.2%] 0.4% [0.1%, 2.5%] 0.75 (n=224) 278.8 [261.3, 299.0] 9.71 [8.52, 11.04]
4 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 59.6 60.0% [53.4%, 66.2%] 28.6% [23.1%, 34.9%] 11.4% [7.8%, 16.2%] 0.34 (n=242) 201.5 [197.0, 206.0] 6.59 [5.30, 7.98]
Episode outcomes
mpcgoal: 220/220 (100%)100%classicalgoal: 206/220 (94%)94%collision: 5/220 (2%)grounding: 2/220 (1%)out_of_bounds: 7/220 (3%)rl_ppo_shieldedgoal: 210/220 (95%)95%collision: 5/220 (2%)grounding: 1/220 (0%)out_of_bounds: 4/220 (2%)rl_ppogoal: 132/220 (60%)60%collision: 63/220 (29%)29%grounding: 25/220 (11%)11%goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%mpc: 203.6s, 100% successmpcclassical: 263.7s, 94% successclassicalrl_ppo_shielded: 278.8s, 95% successrl_ppo_shieldedrl_ppo: 201.5s, 60% successrl_ppomean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
mpcclassicalrl_ppo_shieldedrl_ppoopen watermpc · open water: 100% (20 episodes)100%classical · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%head onmpc · head on: 100% (20 episodes)100%classical · head on: 100% (20 episodes)100%rl_ppo_shielded · head on: 100% (20 episodes)100%rl_ppo · head on: 0% (20 episodes)0%crossing starboardmpc · crossing starboard: 100% (20 episodes)100%classical · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 100% (20 episodes)100%rl_ppo · crossing starboard: 100% (20 episodes)100%crossing portmpc · crossing port: 100% (20 episodes)100%classical · crossing port: 95% (20 episodes)95%rl_ppo_shielded · crossing port: 100% (20 episodes)100%rl_ppo · crossing port: 0% (20 episodes)0%overtakingmpc · overtaking: 100% (20 episodes)100%classical · overtaking: 75% (20 episodes)75%rl_ppo_shielded · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 95% (20 episodes)95%coastalmpc · coastal: 100% (20 episodes)100%classical · coastal: 100% (20 episodes)100%rl_ppo_shielded · coastal: 75% (20 episodes)75%rl_ppo · coastal: 0% (20 episodes)0%multi vesselmpc · multi vessel: 100% (20 episodes)100%classical · multi vessel: 100% (20 episodes)100%rl_ppo_shielded · multi vessel: 75% (20 episodes)75%rl_ppo · multi vessel: 100% (20 episodes)100%narrow channelmpc · narrow channel: 100% (20 episodes)100%classical · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 0% (20 episodes)0%tss transitmpc · tss transit: 100% (20 episodes)100%classical · tss transit: 95% (20 episodes)95%rl_ppo_shielded · tss transit: 100% (20 episodes)100%rl_ppo · tss transit: 100% (20 episodes)100%tss crossingmpc · tss crossing: 100% (20 episodes)100%classical · tss crossing: 80% (20 episodes)80%rl_ppo_shielded · tss crossing: 100% (20 episodes)100%rl_ppo · tss crossing: 90% (20 episodes)90%randommpc · random: 100% (20 episodes)100%classical · random: 85% (20 episodes)85%rl_ppo_shielded · random: 100% (20 episodes)100%rl_ppo · random: 75% (20 episodes)75%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
mpc0.76 (n=92)0.90 (n=85)0.92 (n=60)
classical0.73 (n=72)0.99 (n=98)1.00 (n=60)
rl_ppo_shielded0.64 (n=85)0.72 (n=79)0.96 (n=60)
rl_ppo0.44 (n=86)0.42 (n=96)0.07 (n=60)

Condition: shoaling

Depth instead of binary land — a charted depth field that shoals toward shore, so grounding becomes depth < draft + under-keel clearance. Coastal scenarios gain a realistic shoal apron while open water stays deep.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 classical V. Ravendranathan (VesselNav-Bench baseline) 96.8 99.6% [97.5%, 99.9%] 0.0% [0.0%, 1.7%] 0.4% [0.1%, 2.5%] 0.92 (n=212) 210.2 [204.7, 215.7] 10.84 [9.97, 11.85]
2 mpc V. Ravendranathan (VesselNav-Bench baseline) 95.7 100.0% [98.3%, 100.0%] 0.0% [0.0%, 1.7%] 0.0% [0.0%, 1.7%] 0.87 (n=230) 209.9 [204.2, 216.0] 11.17 [10.30, 12.19]
3 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 85.4 90.9% [86.4%, 94.0%] 0.0% [0.0%, 1.7%] 0.0% [0.0%, 1.7%] 0.70 (n=223) 256.6 [246.4, 266.9] 9.92 [8.75, 11.21]
4 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 60.5 61.4% [54.8%, 67.5%] 27.3% [21.8%, 33.5%] 11.4% [7.8%, 16.2%] 0.35 (n=243) 203.7 [198.7, 209.0] 7.15 [5.85, 8.54]
Episode outcomes
classicalgoal: 219/220 (100%)100%grounding: 1/220 (0%)mpcgoal: 220/220 (100%)100%rl_ppo_shieldedgoal: 200/220 (91%)91%out_of_bounds: 20/220 (9%)9%rl_ppogoal: 135/220 (61%)61%collision: 60/220 (27%)27%grounding: 25/220 (11%)11%goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%classical: 210.2s, 100% successclassicalmpc: 209.9s, 100% successmpcrl_ppo_shielded: 256.6s, 91% successrl_ppo_shieldedrl_ppo: 203.7s, 61% successrl_ppomean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
classicalmpcrl_ppo_shieldedrl_ppoopen waterclassical · open water: 100% (20 episodes)100%mpc · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%head onclassical · head on: 100% (20 episodes)100%mpc · head on: 100% (20 episodes)100%rl_ppo_shielded · head on: 100% (20 episodes)100%rl_ppo · head on: 0% (20 episodes)0%crossing starboardclassical · crossing starboard: 100% (20 episodes)100%mpc · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 100% (20 episodes)100%rl_ppo · crossing starboard: 100% (20 episodes)100%crossing portclassical · crossing port: 100% (20 episodes)100%mpc · crossing port: 100% (20 episodes)100%rl_ppo_shielded · crossing port: 100% (20 episodes)100%rl_ppo · crossing port: 0% (20 episodes)0%overtakingclassical · overtaking: 100% (20 episodes)100%mpc · overtaking: 100% (20 episodes)100%rl_ppo_shielded · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 100% (20 episodes)100%coastalclassical · coastal: 100% (20 episodes)100%mpc · coastal: 100% (20 episodes)100%rl_ppo_shielded · coastal: 0% (20 episodes)0%rl_ppo · coastal: 0% (20 episodes)0%multi vesselclassical · multi vessel: 100% (20 episodes)100%mpc · multi vessel: 100% (20 episodes)100%rl_ppo_shielded · multi vessel: 100% (20 episodes)100%rl_ppo · multi vessel: 100% (20 episodes)100%narrow channelclassical · narrow channel: 100% (20 episodes)100%mpc · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 0% (20 episodes)0%tss transitclassical · tss transit: 100% (20 episodes)100%mpc · tss transit: 100% (20 episodes)100%rl_ppo_shielded · tss transit: 100% (20 episodes)100%rl_ppo · tss transit: 100% (20 episodes)100%tss crossingclassical · tss crossing: 100% (20 episodes)100%mpc · tss crossing: 100% (20 episodes)100%rl_ppo_shielded · tss crossing: 100% (20 episodes)100%rl_ppo · tss crossing: 100% (20 episodes)100%randomclassical · random: 95% (20 episodes)95%mpc · random: 100% (20 episodes)100%rl_ppo_shielded · random: 100% (20 episodes)100%rl_ppo · random: 75% (20 episodes)75%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
classical0.76 (n=68)1.00 (n=84)1.00 (n=60)
mpc0.72 (n=106)0.98 (n=64)1.00 (n=60)
rl_ppo_shielded0.65 (n=81)0.58 (n=82)0.93 (n=60)
rl_ppo0.48 (n=81)0.40 (n=102)0.07 (n=60)

Condition: hull_randomized

Own-ship model mismatch — the hull's maneuvering parameters (Nomoto K/T and the 3-DOF constants) are jittered ±25% per episode while the controller still plans with the nominal model. Tests robustness to an imperfectly known ship.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 classical V. Ravendranathan (VesselNav-Bench baseline) 96.5 99.1% [96.8%, 99.8%] 0.0% [0.0%, 1.7%] 0.9% [0.2%, 3.2%] 0.92 (n=212) 220.5 [214.4, 227.0] 10.83 [9.97, 11.83]
2 mpc V. Ravendranathan (VesselNav-Bench baseline) 95.7 100.0% [98.3%, 100.0%] 0.0% [0.0%, 1.7%] 0.0% [0.0%, 1.7%] 0.87 (n=230) 210.6 [204.7, 216.8] 11.03 [10.18, 12.04]
3 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 89.4 97.7% [94.8%, 99.0%] 0.0% [0.0%, 1.7%] 0.4% [0.1%, 2.5%] 0.70 (n=223) 282.2 [263.9, 301.6] 9.86 [8.67, 11.16]
4 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 60.5 61.4% [54.8%, 67.5%] 27.3% [21.8%, 33.5%] 11.4% [7.8%, 16.2%] 0.35 (n=243) 203.8 [198.7, 209.0] 7.17 [5.88, 8.56]
Episode outcomes
classicalgoal: 218/220 (99%)99%grounding: 2/220 (1%)mpcgoal: 220/220 (100%)100%rl_ppo_shieldedgoal: 215/220 (98%)98%grounding: 1/220 (0%)out_of_bounds: 3/220 (1%)timeout: 1/220 (0%)rl_ppogoal: 135/220 (61%)61%collision: 60/220 (27%)27%grounding: 25/220 (11%)11%goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%classical: 220.5s, 99% successclassicalmpc: 210.6s, 100% successmpcrl_ppo_shielded: 282.2s, 98% successrl_ppo_shieldedrl_ppo: 203.8s, 61% successrl_ppomean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
classicalmpcrl_ppo_shieldedrl_ppoopen waterclassical · open water: 100% (20 episodes)100%mpc · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%head onclassical · head on: 100% (20 episodes)100%mpc · head on: 100% (20 episodes)100%rl_ppo_shielded · head on: 100% (20 episodes)100%rl_ppo · head on: 0% (20 episodes)0%crossing starboardclassical · crossing starboard: 100% (20 episodes)100%mpc · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 100% (20 episodes)100%rl_ppo · crossing starboard: 100% (20 episodes)100%crossing portclassical · crossing port: 100% (20 episodes)100%mpc · crossing port: 100% (20 episodes)100%rl_ppo_shielded · crossing port: 100% (20 episodes)100%rl_ppo · crossing port: 0% (20 episodes)0%overtakingclassical · overtaking: 100% (20 episodes)100%mpc · overtaking: 100% (20 episodes)100%rl_ppo_shielded · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 100% (20 episodes)100%coastalclassical · coastal: 100% (20 episodes)100%mpc · coastal: 100% (20 episodes)100%rl_ppo_shielded · coastal: 80% (20 episodes)80%rl_ppo · coastal: 0% (20 episodes)0%multi vesselclassical · multi vessel: 100% (20 episodes)100%mpc · multi vessel: 100% (20 episodes)100%rl_ppo_shielded · multi vessel: 95% (20 episodes)95%rl_ppo · multi vessel: 100% (20 episodes)100%narrow channelclassical · narrow channel: 100% (20 episodes)100%mpc · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 0% (20 episodes)0%tss transitclassical · tss transit: 100% (20 episodes)100%mpc · tss transit: 100% (20 episodes)100%rl_ppo_shielded · tss transit: 100% (20 episodes)100%rl_ppo · tss transit: 100% (20 episodes)100%tss crossingclassical · tss crossing: 100% (20 episodes)100%mpc · tss crossing: 100% (20 episodes)100%rl_ppo_shielded · tss crossing: 100% (20 episodes)100%rl_ppo · tss crossing: 100% (20 episodes)100%randomclassical · random: 90% (20 episodes)90%mpc · random: 100% (20 episodes)100%rl_ppo_shielded · random: 100% (20 episodes)100%rl_ppo · random: 75% (20 episodes)75%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
classical0.76 (n=68)1.00 (n=84)1.00 (n=60)
mpc0.73 (n=106)0.97 (n=64)1.00 (n=60)
rl_ppo_shielded0.66 (n=81)0.58 (n=82)0.90 (n=60)
rl_ppo0.49 (n=81)0.40 (n=102)0.07 (n=60)

Condition: restricted_visibility

Fog / Rule 19 — radar-only perception (coarser noise, slower 6 s fixes, heavier dropout than degraded) and a scorer that drops the give-way / stand-on roles of Rules 14–17 for Rule 19: act in ample time, no turn to port for a vessel forward of the beam.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 mpc V. Ravendranathan (VesselNav-Bench baseline) 94.1 97.7% [94.8%, 99.0%] 2.3% [1.0%, 5.2%] 0.0% [0.0%, 1.7%] 0.84 (n=241) 202.7 [197.7, 207.9] 8.96 [8.03, 10.02]
2 classical V. Ravendranathan (VesselNav-Bench baseline) 94.0 94.5% [90.7%, 96.9%] 2.7% [1.3%, 5.8%] 0.4% [0.1%, 2.5%] 0.94 (n=232) 285.5 [275.5, 296.1] 11.58 [10.62, 12.63]
3 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 88.5 94.1% [90.1%, 96.5%] 5.0% [2.8%, 8.7%] 0.0% [0.0%, 1.7%] 0.74 (n=225) 275.3 [256.1, 297.9] 9.29 [8.06, 10.67]
4 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 57.4 55.5% [48.9%, 61.9%] 33.2% [27.3%, 39.6%] 11.4% [7.8%, 16.2%] 0.37 (n=228) 197.0 [192.8, 201.4] 7.48 [6.02, 8.99]
Episode outcomes
mpcgoal: 215/220 (98%)98%collision: 5/220 (2%)classicalgoal: 208/220 (95%)95%collision: 6/220 (3%)grounding: 1/220 (0%)out_of_bounds: 5/220 (2%)rl_ppo_shieldedgoal: 207/220 (94%)94%collision: 11/220 (5%)out_of_bounds: 1/220 (0%)timeout: 1/220 (0%)rl_ppogoal: 122/220 (55%)55%collision: 73/220 (33%)33%grounding: 25/220 (11%)11%goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%mpc: 202.7s, 98% successmpcclassical: 285.5s, 95% successclassicalrl_ppo_shielded: 275.3s, 94% successrl_ppo_shieldedrl_ppo: 197.0s, 55% successrl_ppomean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
mpcclassicalrl_ppo_shieldedrl_ppoopen watermpc · open water: 100% (20 episodes)100%classical · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%head onmpc · head on: 100% (20 episodes)100%classical · head on: 100% (20 episodes)100%rl_ppo_shielded · head on: 100% (20 episodes)100%rl_ppo · head on: 0% (20 episodes)0%crossing starboardmpc · crossing starboard: 95% (20 episodes)95%classical · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 100% (20 episodes)100%rl_ppo · crossing starboard: 100% (20 episodes)100%crossing portmpc · crossing port: 95% (20 episodes)95%classical · crossing port: 95% (20 episodes)95%rl_ppo_shielded · crossing port: 100% (20 episodes)100%rl_ppo · crossing port: 25% (20 episodes)25%overtakingmpc · overtaking: 100% (20 episodes)100%classical · overtaking: 80% (20 episodes)80%rl_ppo_shielded · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 45% (20 episodes)45%coastalmpc · coastal: 100% (20 episodes)100%classical · coastal: 100% (20 episodes)100%rl_ppo_shielded · coastal: 85% (20 episodes)85%rl_ppo · coastal: 0% (20 episodes)0%multi vesselmpc · multi vessel: 100% (20 episodes)100%classical · multi vessel: 95% (20 episodes)95%rl_ppo_shielded · multi vessel: 55% (20 episodes)55%rl_ppo · multi vessel: 100% (20 episodes)100%narrow channelmpc · narrow channel: 100% (20 episodes)100%classical · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 0% (20 episodes)0%tss transitmpc · tss transit: 100% (20 episodes)100%classical · tss transit: 100% (20 episodes)100%rl_ppo_shielded · tss transit: 95% (20 episodes)95%rl_ppo · tss transit: 100% (20 episodes)100%tss crossingmpc · tss crossing: 85% (20 episodes)85%classical · tss crossing: 75% (20 episodes)75%rl_ppo_shielded · tss crossing: 100% (20 episodes)100%rl_ppo · tss crossing: 65% (20 episodes)65%randommpc · random: 100% (20 episodes)100%classical · random: 95% (20 episodes)95%rl_ppo_shielded · random: 100% (20 episodes)100%rl_ppo · random: 75% (20 episodes)75%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
mpc0.79 (n=93)0.86 (n=88)0.88 (n=60)
classical0.89 (n=77)0.96 (n=95)0.98 (n=60)
rl_ppo_shielded0.72 (n=83)0.75 (n=82)0.74 (n=60)
rl_ppo0.38 (n=84)0.54 (n=84)0.10 (n=60)

Robustness: calm vs disturbed, degraded, shoaling, hull_randomized, restricted_visibility

How much does each model lose (or gain) when conditions get harder? Solid = calm (baseline), hollow = disturbed, degraded, shoaling, hull_randomized, restricted_visibility; the printed delta is the success-rate change vs baseline.

Success rate by condition
25%50%75%100%classicalcalm: 100%disturbed: 80%degraded: 94%shoaling: 100%hull_randomized: 99%restricted_visibility: 95%dist -19% · degr -6% · shoa +0% · hull -0% · rest -5%mpccalm: 100%disturbed: 86%degraded: 100%shoaling: 100%hull_randomized: 100%restricted_visibility: 98%dist -14% · degr +0% · shoa +0% · hull +0% · rest -2%rl_ppo_shieldedcalm: 91%disturbed: 92%degraded: 95%shoaling: 91%hull_randomized: 98%restricted_visibility: 94%dist +1% · degr +5% · shoa +0% · hull +7% · rest +3%rl_ppocalm: 61%disturbed: 74%degraded: 60%shoaling: 61%hull_randomized: 61%restricted_visibility: 55%dist +13% · degr -1% · shoa +0% · hull +0% · rest -6%calm (baseline, solid)disturbed, degraded, shoaling, hull_randomized, restricted_visibility (hollow)

Submit your model

Implement the Agent contract (reset(obs) / decide(obs) → Decision) and run:

python main.py benchmark --suite benchmarks/v2.yaml \
    --agent your_package.your_module:YourAgent

See the repository and docs/SUBMITTING.md. Every leaderboard number is backed by a replayable per-step episode log.