example_common_benchmarks.md
October 21, 2025 · View on GitHub
POMCGS for Common Benchmarks
This section provides recommended settings for the benchmarks reported in the POMCGS paper.
Users can further tune parameters.
For example, by increasing max_planning_secs or num_sim_per_sa, or decreasing max_b_gap, to derive an offline policy with higher performance.
Reference computation time for each domain is also provided given an modern i7 CPU.
RockSample(7,8)
using POMCGraphSearch
using POMDPs
using RockSample
pomdp = RockSamplePOMDP(7, 8)
pomcgs = SolverPOMCGS(pomdp;
max_b_gap = 0.2 # belief merging threshold
)
fsc = solve(pomcgs, pomdp)
run_batch_simulations(pomdp, fsc; n_simulations=10000)
POMCGS typically solves RockSample(7,8) within 1–3 minutes (depending on hardware).
The resulting policy achieves near-optimal performance, comparable to SARSOP on the same instance.
RockSample(11,11)
pomdp = RockSamplePOMDP(11, 11)
pomcgs = SolverPOMCGS(pomdp;
max_b_gap = 0.3,
max_search_depth = 40,
num_sim_per_sa = 20
)
fsc = solve(pomcgs, pomdp)
run_batch_simulations(pomdp, fsc; n_simulations=10000)
For RockSample(11,11), POMCGS will reach to a good offline policy comparable to SARSOP in around 1 hour.
RockSample(15,15)
pomdp = RockSamplePOMDP(15, 15)
pomcgs = SolverPOMCGS(pomdp;
max_b_gap = 0.4,
max_search_depth = 40,
num_sim_per_sa = 20,
max_planning_secs = 36000.0,
nb_particles = 50000,
nb_sim_VMDP = 50000,
epsilon_VMDP = 0.01
)
fsc = solve(pomcgs, pomdp)
run_batch_simulations(pomdp, fsc; n_simulations=10000)
For RockSample(15,15), POMCGS typically obtains a good offline policy(for example, lower bound value ≈ 10–15) within 6 hours of computation. We recommend using at least 64 GB of RAM, as this problem is large scale and memory intensive.
LightDark
using POMCGraphSearch, POMDPs, POMDPModels
pomdp = LightDark1D()
pomcgs = SolverPOMCGS(pomdp;
max_b_gap = 0.15,
state_grid = [1.0, 1.0], # discretization for continuous states
num_fixed_observations = 20, # number of observation clusters
max_search_depth = 30,
num_sim_per_sa = 1000
)
fsc = solve(pomcgs, pomdp)
run_batch_simulations(pomdp, fsc; n_simulations=10000)
For LightDark, POMCGS typically reaches a lower bound value > 3.0 within 10–30 seconds.
Note: state_grid is required for continuous-state POMDPs to perform belief discretization.
Lidar Roomba
using POMCGraphSearch, POMDPs, RoombaPOMDPs
num_x_pts, num_y_pts, num_th_pts = 25, 16, 10
sspace = DiscreteRoombaStateSpace(num_x_pts, num_y_pts, num_th_pts)
# Define a large discrete action set for continuous action approximation
max_speed, speed_interval = 5.0, 0.2
max_turn_rate, turn_rate_interval = 1.0, 0.2
action_space = vec([RoombaAct(v, ω)
for v in 0:speed_interval:max_speed,
ω in -max_turn_rate:turn_rate_interval:max_turn_rate])
pomdp = RoombaPOMDP(sensor=Lidar(),
mdp=RoombaMDP(config=3, aspace=action_space,
v_max=max_speed, sspace=sspace))
pomcgs = SolverPOMCGS(pomdp;
max_search_depth = 40,
max_b_gap = 0.2,
bool_APW = true,
num_fixed_observations = 10
)
fsc = solve(pomcgs, pomdp)
run_batch_simulations(pomdp, fsc; n_simulations=10000)
Note that rand(actions(pomdp)) is not properly implemented in the current RoombaPOMDP.jl package. In this example, we use a large number of discrete actions (286 actions) and then apply action progressive widening (APW) on this action space. For Lidar Roomba, with APW enabled, POMCGS often reaches a good lower bound (0.5~1.0) in about 1 hours.
Bumper Roomba
using POMCGraphSearch, POMDPs, RoombaPOMDPs
num_x_pts, num_y_pts, num_th_pts = 25, 16, 10
sspace = DiscreteRoombaStateSpace(num_x_pts, num_y_pts, num_th_pts)
max_speed, speed_interval = 5.0, 0.2
max_turn_rate, turn_rate_interval = 1.0, 0.2
action_space = vec([RoombaAct(v, ω)
for v in 0:speed_interval:max_speed,
ω in -max_turn_rate:turn_rate_interval:max_turn_rate])
pomdp = RoombaPOMDP(sensor=Bumper(),
mdp=RoombaMDP(config=3, aspace=action_space,
v_max=max_speed, sspace=sspace))
pomcgs = SolverPOMCGS(pomdp;
max_search_depth = 80,
max_b_gap = 0.05,
bool_APW = true,
C_star = 1000,
num_sim_per_sa = 500,
max_planning_secs = 20000.0
)
fsc = solve(pomcgs, pomdp)
run_batch_simulations(pomdp, fsc; n_simulations=10000)
Bumper Roomba is a much harder problem than Lidar Roomba, as the robot relies only on a bumper sensor. For Bumper Roomba, with APW enabled, POMCGS generally finds a complete offline policy that outperforms online planners (value > 0.0) around 3 hours of computation.
General Notes
- Default solver settings are designed to be robust and general, while these configurations are recommanded for the listed domains.
- Hardware and random seeds may cause runtime or minor performance variations.
- This POMCGS implementation is single-threaded.