Case 2: the cheapest road alignment, after the rain — and where my model ran out of resolution

In short

  • I ran the same loop as the plant case on a road-alignment GD over synthetic terrain: generative design → simulation on what each design builds → OpenUSD and Omniverse Kit → AI measured against a baseline.
  • The cost table changed the winner: once standard drainage is costed, the cheapest alignment moves from R00 to R03, with no simulation needed. The simulation, at 10 m, could not add anything decision-grade. It flipped the winner again by only 0.5 %, and not under every cost assumption, on a grid that cannot resolve ditches and culverts. I do not count that as a result. A re-run at 2.5 m (16 times the cells) on the GPU gave the same pattern, so it is still not a decision claim.
  • AI gained nothing over the cheap baseline (0 of 3 splits); there was nothing to win. The method lesson: build the consequence geometry at the scale of the design element that controls the physics.

Synthetic terrain, assumed unit costs, no client data.

Three rankings

This is the second case for the method in the companion post Linking generative design to simulation in Omniverse. The first case was a water-treatment-plant layout (The "optimal" plant layout flooded on its own ground); this one is a road.

The design problem

The GD tool searches a road's plan (intersection points) and profile (vertical intersection points and curves) over a synthetic terrain of 47.9 km² with a river.

  • Constraints: a grade limit (8 %) and vertical-curve K values.
  • Objective: earthwork (cut plus fill).

I ran the tool's own JavaScript unchanged in Node with three seeds (2,320 evaluations each). A rule written before any simulation then fixed a pool of 19 alternatives.

What the earthwork objective cannot see is water. A road that follows the ground to save earthwork crosses every small valley at grade, and its cut sections sit lower than the slopes around them.

Contract 1 — the criteria, and how I had to amend them

The criteria file was fixed at 14:20, before any simulation had run (its hash is logged). The question: is the cheapest-earthwork alignment still first once rain runs over the road it creates?

A danger crossing is a stretch of road with water ≥ 0.30 m on the road surface, or a rise ≥ 0.30 m beside the embankment compared with the natural terrain.

The first run said "everything floods": 4 to 9 danger crossings on every alternative. When I split the cause, the problem turned out to be mine. On the natural terrain the road centreline had no water ≥ 0.30 m anywhere, so the flooding came from the road itself. My finished terrain had no side ditches and no culverts. Cut sections became channels, and small embankments became dams. A real road is never built that way.

So I wrote a second criteria file (v2) after seeing that run, and recorded that I had seen it.

  • Standard drainage on every alternative: side ditches along cut sections, and a culvert wherever the road crosses a natural drainage line.
  • Three ranking stages: these keep the effect of the simulation apart from the effect of the drainage cost.

The v1 file and its results are kept.

Adding drainage did not reduce the danger crossings

Adding drainage made the cost realistic, but did not reduce the danger count: the mean was 6.32 crossings per alignment before and after. That was the first sign that the grid, not the road, was speaking.

Contract 2 — simulate what the road creates

Each alternative is cut into a 10 m grid: a 20 m road formation at the design level, cut slopes 1:1.2, fill slopes 1:1.5, plus the v2 drainage. The same Warp 2D solver and design storm as the plant case run on an NVIDIA GB10, about a minute for 20 terrains.

Each danger crossing gets an extra culvert, and the road is simulated again, up to three rounds. That made 72 simulations in total: 20 first runs, then 19, 18 and 15 repair runs.

The 10 m grid forces two shortcuts, both stated in the criteria:

  • A side ditch is the first 10 m cell beside the road lowered by 1 m, so it becomes a 10 m-wide trench.
  • A culvert, standard or extra, is the road body within ±20 m put back to natural ground. That is an open gap with unlimited capacity, which flatters the road.
Where R00 and R03 flood

The map shows the two alignments that matter: R00, cheapest on earthwork, and R03, cheapest once drainage is costed. The red runs often sit on the road away from the blue channels: the road makes its own ponding.

The result, in three rankings

StageWhat is counted#1
1earthwork only (the GD objective)R00
2+ side ditches and standard culverts (design calculation, no simulation)R03
3+ culverts the simulation foundR02 at culvert cost ×1 and ×2; R03 at ×0.5
  • Drainage design changes the winner at every culvert cost. That is a design-calculation result.
    • R00 and R03 both need five standard culverts.
    • R00 has 5.4 km of cut, which needs 10.8 km of side ditch (both sides). R03 has 3.0 km of cut and 6.1 km of ditch.
    • R00's extra ditch costs 0.47 bn KRW more, against an earthwork saving of 0.15 bn.
  • The simulation changes the winner again, but I do not claim it.
    • At culvert cost ×1, R02 beats R03 by 0.5 % (3.54 vs 3.56 bn KRW, assumed costs). At ×2 it leads by about 5 %. At ×0.5, R03 stays first.
    • Adding standard drainage did not reduce the danger crossings on average (6.32 before, 6.32 after).
    • 11 of 19 alternatives still had danger after three repair rounds.
    • With the shortcuts above, the extra-culvert counts say more about the 10 m grid than about the road.

Re-run at 2.5 m: 16 times the cells on the GPU

Case 2 at a 2.5 m grid

The 10 m grid could not resolve ditches and culverts, so I re-ran the six cheapest alignments at 2.5 m. That is 7.7 M cells per terrain, 16 times as many. The rules and the repair loop were unchanged, and the criteria were written to a file before the run (hash logged). The 25 runs took 4,694 s of GPU time, about 3 minutes each.

  • The danger crossings barely moved on average: for these six alignments, 6.67 at 10 m and 6.33 at 2.5 m. Per alignment they moved both ways, for example R01 from 4 to 7 and R00 from 8 to 6.
  • The stage-3 winner follows the same pattern as at 10 m: R02 at culvert cost ×1 and ×2, R03 at ×0.5. At ×1, R02 now leads by about 3 % (3.64 vs 3.76 bn KRW, assumed costs), against 0.5 % at 10 m.
  • Still no decision claim. My rule, written before the run, was to claim only if the simulation changes the winner at all three culvert costs. It does not at ×0.5.
  • The repair did not converge. After three rounds every alignment still had 1–4 danger crossings. A culvert at each crossing did not clear them on the finer grid either. A finer grid alone did not close the gap; the next step is a drainage model with ditch capacity and culvert hydraulics.

The GPU made this re-check cheap enough to run the same evening: 16 times the cells, 25 runs, about 80 minutes.

Contract 3 — the same file in Omniverse Kit

The three alignments that won each stage are variants of one OpenUSD file.

  • Each variant carries its earthwork, drainage and stage costs.
  • Each crossing carries its water depth, rise and danger flag.

Read back in Kit, 87 values matched the pipeline with 0 mismatches. Water was computed outside Kit and stored as time samples; Kit only builds, checks and renders, as the plant case taught.

The same file in Omniverse Kit

All 16 cheapest alignments (R13, R17 and R18 left out) can also sit side by side on one stage:

  • Pad colour: the number of danger crossings.
  • Bar height: earthwork plus standard drainage cost.
  • Cyan frame: the cheapest once drainage is counted, R03 at 2.96 bn KRW.

The close-up shows the danger crossings (red) on the road body (yellow). Before repair, every one of the 16 has 3 to 9 danger crossings.

16 alignments in one Kit stage

The same 16, one at a time on one Kit stage, with terrain, flood layer and road swapped in turn:

16 alignments in Omniverse Kit

The same 16 alignments as plan-view maps. Red marks water of 0.30 m or more on the road body, which is what the repair loop counts.

16 alignments as maps

Where AI fits on this road

In the plant case, the extended GD–AI loop had enough to learn from: the virtual site turned 574 GD layouts into 574 labelled samples. The road tests the same idea at the other extreme. The pool fixed before simulation held 19 alignments, so the simulation could label only 19, and the label that mattered, the number of extra culverts, is the one a 10 m grid distorts most.

I trained gradient boosting on design-stage features to predict the number of extra culverts. The features were earthwork, length, cut length, drainage-line crossings, fill height at crossings, and catchment. I also tested a physics proxy that needs no training.

On three random half splits, neither model reached the true stage-3 winner with fewer simulations than simply simulating in stage-2 cost order: 0 of 3 for both. The proxy's correlation with the target was about zero, and the boosting error was 2–3 culverts.

Two reasons mean there was nothing to win:

  • The baseline needed only one or two simulations.
  • The target, the extra-culvert count, is the very number the grid distorts.

The lesson for the extended loop: simulation can be the AI's teacher only when GD produces many distinct alternatives and the simulation resolves the element that decides the label. The plant met both; the road met neither.

The plant case reached the same verdict for a different reason: there, one simulation cost about 0.5 s. Here, one costs about 3 s per alternative in a batch, but there are only 19 alternatives, so the cheap order is already enough.

What this case adds to the method

  1. Separate the drainage-cost effect from the simulation effect. Without the three stages, I would have credited the simulation with a ranking change that a cost table makes on its own.
  2. Amend criteria openly, once. The first run exposed a modelling gap, not a design flaw. Writing v2 with "seen before amending" on it kept the result honest; amending again to rescue a result would not have.
  3. Resolve the consequence geometry at the scale of the element that controls the physics. For the plant, that was walls and basins at 2 m. For a road, it is ditches and culverts, at about 1 m by my assumption for typical widths. A 2.5 m grid on the GPU did not settle it (above), so the next step is a drainage-network model with ditch capacity and culvert hydraulics, not more culverts.

Process and tools

StepToolWhat it does
DesignRoad-alignment GD workbench (JavaScript), run unchanged in NodePlan and profile search, earthwork objective; 3 seeds × 2,320 evaluations
CriteriaJSON files with hashesv1 before any simulation; v2 after the first run, marked as such
Finished terrainNumPy, SciPy10 m grid, road formation and slopes, v2 side ditches and standard culverts
FloodNVIDIA Warp on an NVIDIA GB10Same solver and storm as the plant case; repair loop up to 3 rounds (72 runs at 10 m; 25 runs at 2.5 m, 7.7 M cells each)
ReviewOpenUSD, Omniverse Kit 110.3VariantSet "alignment", crossing attributes, time-sampled water, 87 values read back
AIscikit-learnGradient boosting vs a physics proxy vs the stage-2 cost order
Figuresmatplotlib, Kit viewport capturesGenerated from the saved results

Synthetic terrain, assumed unit costs, no client data.

댓글

이 블로그의 인기 게시물

Structural Analysis Workflow with Dynamo and Robot

Dynamo with the Gemini Vision API test(Nano Banana)

Geometry test 0506 stair and routing