| Pillars removed | Rack rows R | Rack-fill % | Total rack run |
|---|
Module. Double block depth = 2d + f (two racks + flue), then an aisle a ≥ a_min.
A pillar is "safe" anywhere inside the block (rack or flue). The rightmost rack is single-depth (d),
flush to the right wall behind a gap c_R.
Ceiling. rack-fill_max = 2d/(2d+f+a_min); storage counts only the 2d, the flue is dead space.
R_max = (L − c − c_R + a_min)/(2d+f+a_min). Independent of width W_y (it cancels).
Pillar capture. A pillar (full width w_p) may sit anywhere inside a block — it can
touch the aisle edge, it need not be centred. If a pillar ends up in an aisle it is removed (a costed
choice), not a violation.
Optimiser (dynamic program). Sweeping right→left on a 5 cm grid, the DP chooses every block position
and every aisle width in [a_min, a_max] to maximise rows + λ·(pillars kept). So aisles vary, the
keep/remove pattern is chosen per pillar (any mix of 6/12/18/24 m spans), and λ trades racking against
saved steel. The "frontier" table above is this DP swept over λ.
Fixed: d = 1.1 m, amin = 2.05 m, flue per scenario, clearances 0.30 m, single rack at the right wall, 6 m pillar grid, L = 132 m, W = 108 m. The optimiser chooses aisle widths and the per-pillar keep/remove pattern automatically. Rows and pillars removed below are computed live.
| Scenario | Flue | Rack-fill | Rows | Removed |
|---|
Read of it: at the preferred 300 mm flue the optimiser reaches the ~29-row ceiling but must remove several pillars to do it; raise λ to trade a row or two for far fewer removals. Dropping the flue to 250 mm gives the same racking for fewer removals — the single best lever. Use the frontier table above to read exactly how many pillars you must pull for each row count, then pick the point that justifies the steel.