You inherit a weak but legal chassis-design pipeline and must improve its solve() so
that it chooses a passenger car's front and rear suspension hardpoint coordinates
(within packaging envelopes, left/right symmetric) together with its spring / damper /
anti-roll-bar / bushing selections, to minimise a weighted cost that trades handling,
ride comfort, rollover safety, kinematic quality and component cost. Your submitted
solve() returns one car (shared across all cases); it is re-scored on a set of
sealed hidden load cases, and lower total cost is better.
Hard Constraints
Implement solve(problem: dict) -> dict. It is called once and must return within
600 seconds of wall time; if it has not returned by then the run is scored 0.
problem gives you visible_cases (score them locally with the public
simulator as often as you like), envelope_mm (per-hardpoint half-box), and catalog
(the available part ids).
Returned fields are clamped to legal ranges; anything missing falls back to the
factory default, so a partial design is always legal:
hardpoints: {name: [y, z]} in metres, front-view. Each point is clamped into its
envelope box around the baseline (see envelope_mm). Movable points are the upper/
lower arm inner pivots, the upper/lower ball joints and the tie-rod inner/outer.
spring_f, spring_r, damper, arb_f, arb_r, bushing: catalogue integer
ids (see catalog). Left/right are forced symmetric by the simulator.
You may only change the design your solve() returns — not the simulator, the load
cases, or the scoring.
A design that is kinematically infeasible over ±80 mm of wheel travel, that lifts
an inside wheel in the fishhook (rollover), or whose static deflection leaves the
travel window (bottoms out / rides too high) is scored as the weak baseline on that
case — so robustness matters, it is not a soft penalty.
What You Have
methods/main/solver.py — the weak baseline you edit in place (returns {}, i.e. the
factory-default car).
sim/sim.py (+ sim/geometry.py) — the exact quasi-static K&C + reduced vehicle-
dynamics simulator used for scoring. It is public: read it to understand the physics
(double-wishbone kinematics → camber gain / roll centre / bump steer; a two-DOF quarter
car on an ISO-8608 road with ISO-2631 weighting for comfort; a roll / load-transfer /
camber-compensation model for the double-lane-change speed and the fishhook margin).
data/visible_cases.json — the visible (half-load) cases you can score against locally.
selfcheck.py — runs your current solve() on the visible cases and prints the mean
score. Iterate against it.
What You Submit
Your edited methods/main/solver.py (plus any helper modules under methods/). The
verifier re-runs solve() and scores the returned design on the hidden cases; only the
solve(problem) -> design contract above is relied upon.
How It Is Judged
The sealed verifier calls your solve(), then re-applies the returned design and re-runs
the same simulator on each hidden case, computing 100 × cost / cost_default per case
(the factory-default car scores 100). The hidden mean is your score; lower is better,
and your reward rises as it drops. The hidden cases add full and single-occupant load, rougher roads
and higher speeds, so a car tuned only for the soft half-load visible cases will not
transfer.
Metric
mean normalised cost over the sealed load cases · lower is better
100 x cost/cost_default per hidden case; cost mixes lane-change speed, ride, roll margin, kinematics, parts.
anchor
held-out
reward
B
factory-default car (solve returns {})
100.00
0.00
R
single-pass engineering heuristic
93.71
0.30
S
enumerate + coord descent + (1+1)-ES
80.1833
0.60
normalisation
m >= B
0
B > m >= R
0.3 * (B - m) / (B - R)
R > m >= S
0.3 + 0.3 * (R - m) / (R - S)
m < S
1 - 0.4 * y ** -0.75, y = (R - m) / (R - S)
m = this run's held-out metric · B = factory-default car (solve returns {}) · R = single-pass engineering heuristic · S = enumerate + coord descent + (1+1)-ES
B/R/S = 100, 93.71, 80.1833, sealed. No UPPER: past SOTA reward soft-caps, k = 0.75 keeps density continuous. Cases averaged, mapped once.
Rollouts
33 minwall clock
$0.70spend
3.3Mtokens
2versions, 2 kept
keptrevertedno scoreturning point
v1Tie-rod inner/outer points solved for zero bump steer on the factory wishbonesThe tie rods move only bump steer, leaving camber gain, roll-centre height and linkage feasibility untouched.91.1952 min · $0.17
v2Bilevel search: 16 wishbone coordinates outside, tie-rod null plus catalogue insideJudged on 8 robust cases - the 3 visible plus 5 synthetic full/solo/rough/high-speed loads - not the visible mean.77.45432 min · $0.57
Two snapshots, 33 min, $0.70 - the cheapest run and the best: hidden mean 80.1872 lands 0.0039 above the sealed SOTA anchor of 80.1833.
v0Inherited factory-default car; solve() returns an empty design1001 min · $0.24
v1Exhaustive 4,800-way catalogue search at factory geometry: sf0/sr1/d3/af2/ar2/b0The catalogue is small enough to enumerate exactly; took the best zero-DQ pick across a declared load grid.87.0732 min · $0.56
v2Both linkages to band-edge camber/RCH, tie-rod inners nulling bump steerCost reaches geometry only through camber gain, roll-centre height and bump steer, so drive each to its zero-penalty edge.75.68110 min · $1.76
v3Re-enumerated the catalogue at the new geometry: sf0/sr3/d3, ARBs 1/0, bushing 0The component optimum moves once geometry does, and the new pick widens the legal static-deflection mass range to 1206-2326 kg.75.67412 min · $2.10
v4Medium damper 2 robustness branch, otherwise v377.53616 min · $2.84
v1Exact 2-D geometry reduction plus full 4,800-pick enumeration on a 48-case gridThe 24 hardpoints reach cost only through camber gain, roll-centre height and bump steer, so geometry is a smooth 2-D problem.75.67517 min · $2.42
v2Same optimum re-inverted just inside every kinematic band; nearest-id fallback75.67735 min · $5.33
Two snapshots, 51 min, $7.98; only v1 changes the car. The rest is validation: bit-exact sim replica, 441-case zero-DQ screen, 123 restarts.
v1SLA hardpoints at camber -1.40, RCH 101/139, nulled bump steer, plus catalogue searchSearched on a synthetic full/solo/D-road/GVWR mix, not the visible half-load three; damper 3 wins visible and loses hold-out.78.173
v2Re-seeded in band: camber -1.495/-1.484, RCH 89/131, kinematic penalty zeroRoll-centre height pushed past the band costs more kinematic penalty than it returns in roll.77.921
v3Coordinate nudge of the band-edge arms, then re-fit tie rods: camber -1.498/-1.49977.882
v4New front arms at RCH 94; roll-margin floor added to the search objectiveWithout the floor the search takes stripped-ARB picks that win visible half-load and lose the full-load hold-out.77.851
v5Dropped the unused multi-seed and tie-rod search; one validated hardpoint set77.851
v6Rear arms interpolated 20% toward higher RCH, still inside the camber band77.845
v7Re-fit the rear outer tie rod: bump steer 0.099 to 0.010 deg/m77.845
46 minutes, seven snapshots, nothing reverted. The whole run spans 0.33 on the visible mean: v1 and v2 set the car, v3 to v7 are polish.
v1Inherited factory-default car; solve() returns an empty design1001 min · $0.19
v2Exhaustive 4,800-combination catalogue search at baseline geometryThe catalogue is small enough to enumerate exactly. Took the best zero-DQ pick, not the lower one that disqualifies at heavy load.87.0741 min · $0.27
v3Move the tie-rod inner/outer points to null front and rear bump steerRear bump steer is 2.784 deg/m at baseline, and the tie-rod points drive it under 1e-6 without touching the arm geometry.78.2693 min · $0.46
v4Joint 16-D differential evolution over arm hardpoints, then re-null the tie rods75.968 min · $1.27
v5Re-enumerate the catalogue after the geometry moved: sf2/sr2/d3, no ARBs, b075.8769 min · $1.45
v6Least-norm solve landing both axles on the band corners: -1.5 deg/25 mm, 95/135 mm RC75.82213 min · $2.24
v7Rough-road component hedge sf0/sr3/d2/af1/ar0/b077.53617 min · $3.06
v8Softer-spring / stiffer-roll compromise sf0/sr3/d3/af1/ar0/b075.67418 min · $3.24
v9Conservative sf1/sr1/d0, no ARBs, ample load and deflection margin84.34620 min · $3.58
v10Load-robust intermediate sf2/sr0/d2/af0/ar1/b078.4521 min · $4.01
v11Restore the v7 component set on the v6 geometry after a shifted final matrixJudged on the worst case of a mass/CG-shifted 30-35 m/s matrix, not the development mean. That reversed the v7 rejection.77.53623 min · $4.33
23 minutes and $4.68, the cheaper run. v1 to v6 build the design; v7 to v10 are component swaps on the v6 geometry, all reverted, then v11 took v7.