Tasks/Transport & Logistics/Vehicle Dynamics

Suspension Hardpoint & Tuning Co-Design (K&C)

Place suspension hardpoints and pick the tuning that goes with them

suspension_kc_hardpoint_designTransport & LogisticsVehicle Dynamics
instruction.mdthis is what the agent is given

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.

anchorheld-outreward
Bfactory-default car (solve returns {})100.000.00
Rsingle-pass engineering heuristic93.710.30
Senumerate + coord descent + (1+1)-ES80.18330.60
normalisation
m >= B0
B > m >= R0.3 * (B - m) / (B - R)
R > m >= S0.3 + 0.3 * (R - m) / (R - S)
m < S1 - 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
78 81 84 87 90 $0 $0.2 $0.3 $0.5 cumulative spend on the run visible-case mean normalised score, lower is better v1 v2
keptrevertedno scoreturning point
  1. 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
  2. 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.

On the hidden set

held-out metricreward
factory-default car (solve returns {})100.000.00
single-pass engineering heuristic93.710.30
enumerate + coord descent + (1+1)-ES80.18330.60
this run80.18720.5999
32 minwall clock
$7.20spend
8.8Mtokens
11versions, 7 kept
75 80 85 90 95 100 $0 $1.5 $3 $4.5 $6 cumulative spend on the run visible-case mean normalised score, lower is better v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10
keptrevertedno scoreturning point
  1. v0Inherited factory-default car; solve() returns an empty design1001 min · $0.24
  2. 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
  3. 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
  4. 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
  5. v4Medium damper 2 robustness branch, otherwise v377.53616 min · $2.84
  6. v5Soft-damper rough-road branch sf0/sr2/d0, ARBs 2/2, bushing 084.54816 min · $3.14
  7. v6Sparse relayout: three vertical arm coordinates plus tie-rod inner height per axle75.67423 min · $4.25
  8. v7Solved the sparse coordinates exactly onto -1.5 deg/25 mm and 95/135 mm RC75.67426 min · $5.26
  9. v8Damper 2 retried under a stricter single/full, 44%-D-road holdout77.53628 min · $5.72
  10. v9Correlated-road specialist sf2/sr2/d3, no ARBs, bushing 075.82230 min · $6.46
  11. v10Submission hardening and documentation; returned design unchanged75.67431 min · $6.83

32 minutes and $7.20. v0 to v3 build the car; v4/v5/v8/v9 are damper and spring branches judged on synthetic holdouts and reverted.

On the hidden set

held-out metricreward
factory-default car (solve returns {})100.000.00
single-pass engineering heuristic93.710.30
enumerate + coord descent + (1+1)-ES80.18330.60
this run82.15670.5562
51 minwall clock
$7.98spend
7.0Mtokens
2versions, 2 kept
75.675 75.675 75.676 75.677 75.677 $0 $1.5 $3 $4.5 cumulative spend on the run visible-case mean normalised score, lower is better v1 v2
keptrevertedno scoreturning point
  1. 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
  2. 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.

On the hidden set

held-out metricreward
factory-default car (solve returns {})100.000.00
single-pass engineering heuristic93.710.30
enumerate + coord descent + (1+1)-ES80.18330.60
this run82.15950.5562
46 minwall clock
-spend
-tokens
7versions, 7 kept
77.850 77.925 78.000 78.075 78.150 0 20 40 60 80 agent step (this harness reports no tokens or timestamps) visible-case mean normalised score, lower is better v1 v2 v3 v4 v5 v6 v7
keptrevertedno scoreturning point
  1. 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
  2. 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
  3. v3Coordinate nudge of the band-edge arms, then re-fit tie rods: camber -1.498/-1.49977.882
  4. 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
  5. v5Dropped the unused multi-seed and tie-rod search; one validated hardpoint set77.851
  6. v6Rear arms interpolated 20% toward higher RCH, still inside the camber band77.845
  7. 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.

On the hidden set

held-out metricreward
factory-default car (solve returns {})100.000.00
single-pass engineering heuristic93.710.30
enumerate + coord descent + (1+1)-ES80.18330.60
this run82.21190.555
23 minwall clock
$4.68spend
5.1Mtokens
11versions, 7 kept
75 80 85 90 95 100 $0 $1 $2 $3 $4 cumulative spend on the run visible-case mean normalised score, lower is better v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11
keptrevertedno scoreturning point
  1. v1Inherited factory-default car; solve() returns an empty design1001 min · $0.19
  2. 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
  3. 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
  4. v4Joint 16-D differential evolution over arm hardpoints, then re-null the tie rods75.968 min · $1.27
  5. v5Re-enumerate the catalogue after the geometry moved: sf2/sr2/d3, no ARBs, b075.8769 min · $1.45
  6. v6Least-norm solve landing both axles on the band corners: -1.5 deg/25 mm, 95/135 mm RC75.82213 min · $2.24
  7. v7Rough-road component hedge sf0/sr3/d2/af1/ar0/b077.53617 min · $3.06
  8. v8Softer-spring / stiffer-roll compromise sf0/sr3/d3/af1/ar0/b075.67418 min · $3.24
  9. v9Conservative sf1/sr1/d0, no ARBs, ample load and deflection margin84.34620 min · $3.58
  10. v10Load-robust intermediate sf2/sr0/d2/af0/ar1/b078.4521 min · $4.01
  11. 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.

On the hidden set

held-out metricreward
factory-default car (solve returns {})100.000.00
single-pass engineering heuristic93.710.30
enumerate + coord descent + (1+1)-ES80.18330.60
this run82.63380.5457