Eshit's picture
Privatize internal notes; sync openenv.yaml action enum; split training requirements
66a57c6
name: wildfire-containment-simulator
version: "1.0.0"
description: >
A grid-based wildfire propagation simulator where an AI agent dispatches
limited firefighting resources (ground crews, air tankers, firebreaks) to
contain an evolving fire before it reaches populated zones. Features
Rothermel-inspired fire spread, wind-driven dynamics, smoke-based partial
observability, and multi-objective reward balancing containment, population
safety, resource efficiency, speed, and area preservation.
author: Team Wildfire
license: MIT
environment:
class: env.wildfire_env.WildfireEnv
api:
reset:
description: "Initialize environment for a new episode"
parameters:
task_id:
type: string
enum: [easy, medium, hard]
default: easy
seed:
type: integer
default: 42
returns: Observation
step:
description: "Execute one simulation step with the given action"
parameters:
action: Action
returns: StepResult
state:
description: "Return full ground-truth state for grading (not for agent use)"
returns: dict
action_space:
type: object
description: "One action per step. Seven action types with typed parameters."
properties:
action_type:
type: string
enum:
- deploy_crew
- move_crew
- order_crew_objective
- drop_retardant
- build_firebreak
- recon_flight
- idle
crew_id:
type: string
description: "Required for deploy_crew, move_crew, build_firebreak, order_crew_objective"
tanker_id:
type: string
description: "Required for drop_retardant"
target_row:
type: integer
description: "Required for deploy_crew, drop_retardant, recon_flight"
target_col:
type: integer
description: "Required for deploy_crew, drop_retardant, recon_flight"
direction:
type: string
enum: [N, S, E, W, NE, NW, SE, SW]
description: "Required for move_crew, build_firebreak"
objective:
type: string
enum:
- hold
- advance
- retreat
- prioritize_north
- prioritize_south
- prioritize_east
- prioritize_west
description: "Required for order_crew_objective. Persistent directive that biases the crew's local policy until changed."
reason:
type: string
description: "Optional reason string for idle action"
observation_space:
type: object
properties:
grid:
type: array
description: "2D array of CellObservation with fire_state, intensity_bin, smoke, population, crew presence"
weather:
type: object
properties:
wind_speed_kmh: { type: number }
wind_direction_deg: { type: number }
humidity_pct: { type: number }
rain_active: { type: boolean }
resources:
type: object
properties:
crews: { type: array, description: "List of CrewState (id, position, deployed, active)" }
tankers: { type: array, description: "List of TankerState (id, cooldown, active)" }
firebreak_budget: { type: integer }
recon_budget: { type: integer }
stats:
type: object
properties:
cells_burned: { type: integer }
cells_burning: { type: integer }
population_lost: { type: integer }
containment_pct: { type: number }
current_step: { type: integer }
max_steps: { type: integer }
recent_events:
type: array
items: { type: string }
maxItems: 5
reward:
type: number
minimum: -8.0
maximum: 8.0
description: >
Decomposed reward: dense per-step signal (delta_containment * 0.4 +
delta_pop_safety * 0.4) plus sparse terminal reward on episode end
(+5 all-pop-safe, +0-2 efficiency bonus, +1 briefing adherence,
-3*loss_pct if pop lost, -2 crew casualty). Designed for GRPO training.
tasks:
- id: easy
name: "Flatland Grass Fire"
description: "15x15 flat grid, single ignition, constant wind, no noise. Learn basic containment."
difficulty: easy
episode_length: 80
- id: medium
name: "Canyon Terrain with Wind Shifts"
description: "25x25 mixed terrain, two ignition points, variable wind, smoke occlusion, sensor noise."
difficulty: medium
episode_length: 150
- id: hard
name: "Wildland-Urban Interface Crisis"
description: "40x40 complex terrain, three staggered ignitions, fog-of-war, crew loss, node failures."
difficulty: hard
episode_length: 300
baseline:
script: scripts/evaluate.py
agents:
- name: random
class: agents.random_agent.RandomAgent
- name: heuristic
class: agents.heuristic_agent.HeuristicAgent