DROID//OMEGA

procedural walls · lidar obs · key-gate · interceptor · 3 tiers · 7 algorithms, from scratch
idle
Arena — procedural layout regenerates every episode
solid walls (scrape −1.5/step) · gaps randomised per episode key — arms the +300 gate bonus interceptor (Tier II+)
Env steps
0
Episodes
0
Explore
Finish (50)
0%
Key (50)
0%
Best clean
Learning curves — mean return vs env steps (25-ep MA)
Tier · algorithm · training
compute: CPU typed-array kernels · probing WebGPU…
Value field V(x,y) — this episode's walls, live phases
LOW VALUEHIGH VALUE
demo trajectory probe carries the demo droid's key state
Spec sheet — why this one doesn't saturate

Environment

A \(120\times48\) field crossed by three solid walls (impassable — sliding contact costs −1.5/step), each pierced by a single gap whose vertical position is resampled every episode (consecutive gap centers stay within ±12, so every layout is traversable) — there is no fixed trajectory to memorise; the policy must read its sensors. Between the walls, sinusoidal patrol drones with per-episode random phase; from Tier II a pursuit interceptor spawns behind the droid once it passes midfield and steers toward it (a phantom — walls don't stop it); Tier III adds a third drone, Ornstein–Uhlenbeck lateral wind, and a tighter \(v_{\text{safe}}\).

Observations (24-dim)

Proprioception \((x,y,v_x,v_y)\); a 9-ray lidar fan over \([-100^\circ,100^\circ]\) (range 25, returns \(1-d/R\)) that sees walls, bounds, drones and the interceptor; nearest-hazard relative position and velocity; key possession flag and key-relative vector; interceptor-active flag; next-gap relative offset and half-height; and normalised time remaining. The lidar is what makes procedural generalisation possible — the net learns gap-seeking behaviour, not a route.

Two-plateau reward (the anti-saturation core)

Per-step \(-1+1.0\,\Delta x\) (potential-based, \(\Phi=x\), computed on actual post-collision displacement so wall-ramming can't farm it). Crossing the endline under \(v_{\text{safe}}\) pays +80 bare, but +300 if the key was collected (+40 on pickup) — the key sits at a random spot midfield, off the direct route. Agents first learn the bare finish (return plateaus near +80⁠–⁠120), then must discover that a detour raises return — a second, much harder credit-assignment problem on top of the first. Even at 100% finish rate, the return curve keeps moving until key-rate saturates too — and then Tiers II and III are waiting. The pickup bonus is an explicit (non-potential) reward: it mildly reshapes the optimum toward key-taking, which is the designed behaviour, stated honestly.

Algorithms

Same seven as before — tabular Q-learning / SARSA / Expected SARSA on a 200k-cell reduced discretisation (position, velocity, key bit, next-gap offset, hazard bearing — heavily aliased, they flounder here by design), Double DQN (replay 60k, target sync/1000, rewards ÷50 into the net), REINFORCE with baseline, A2C, and PPO (clip 0.2, GAE 0.95, 2048-step buffers, 3 epochs, advantage normalisation, grad-norm clip). Networks are 24→64→64 tanh (~6.2k params), hand-rolled batched backprop + Adam over Float32Arrays.

Compute path

Still CPU: at 6.2k parameters a single WebGPU dispatch's overhead exceeds the whole batch's FLOPs, so a GPU path would slow training. The kernels stay batched; a WGSL port becomes worthwhile only with a much bigger trunk (pixel lidar → conv). The header reports adapter availability.

Wind (Tier III)

\(w_{t+1}=w_t+\theta(0-w_t)+\sigma\varepsilon_t\), \(\varepsilon_t\sim\mathcal N(0,1)\) — an OU process injected into \(v_y\). Stochastic dynamics put a hard ceiling below 100%: some gusts are unrecoverable near a gap edge, so the optimal policy's success rate is itself <1.

ANTHROPIC · CLAUDE ARTIFACT · ALL POLICIES LEARNED LIVE FROM REWARD — NO PRETRAINED WEIGHTS